2010-01-18 8 views
2

Je crée de façon répétée un objet qui a 20 champs. Cet objet est construit et utilisé par un seul thread.pool d'objets OU Passer par référence les objets sans état

Je prévois d'utiliser un pool ou de construire l'objet une fois et de le transmettre en tant que paramètre aux méthodes pertinentes. Une fois cela fait, définissez tous les champs à NULL. Réutilisez le même objet encore et encore.

Ma question est, cette approche permettra d'améliorer les performances. Comme je pouvais différer la création de 100 000 objets (parfois même plus). Mais j'ai besoin de mettre null à chaque champ, cette overahead est-elle par comparaison égale à la création de l'objet.

Répondre

4

S'il n'y a aucune initialisation coûteuse qui doit être faite sur la création d'objet, je ne dérangerais pas. Faites confiance à l'exécution pour gérer efficacement la mémoire. Si vous trouvez finalement que le goulot d'étranglement dans votre application est l'allocation réelle des objets, vous pouvez essayer d'optimiser cela (bien que je doute que la réinitialisation de tous les champs à leur valeur par défaut soit plus rapide, probablement pas).

La règle générale est: ne pas prématurément (micro) :-) optimiser

1

Ne fais pas ça. Votre micro-optimisation pourrait bien être plus lente.

La création d'objets a peut-être été un goulot d'étranglement au niveau de Java 1.0, mais plus maintenant. La seule raison pour regrouper des objets de nos jours est pour les choses qui ont des ressources significatives qui leur sont associées, telles que les connexions DB et les threads.

+0

En outre, avoir la classe autour seulement quand nécessaire empêchera probablement tous les bogues subtils. – gpampara

0

Je recommande de ne pas utiliser de pools de mémoire pour autre chose qu'une ressource externe très coûteuse à mettre en place, comme une connexion à une base de données ou un thread. Les GC sont très efficaces pour traiter des objets de courte durée, donc créer et supprimer (oubli) des objets est très efficace.

La création de nouveaux éléments et le maintien des anciens éléments en vie entraînent des coûts associés. La mise en place des champs (affectation de valeur) sera similaire dans les deux cas, ce que vous devez comparer sont les autres coûts associés.

Pour un objet nouvellement alloué, le deuxième coût est, bien, l'allocation de mémoire. L'environnement de mémoire gérée Java avec les garbage collectors actuels est vraiment efficace dans l'allocation de la mémoire. En comparant avec C/C++ où le système d'exploitation doit trouver le bloc de mémoire approprié à assigner, le GC générationnel garantit que la mémoire est contiguë et que cette allocation est vraiment rapide. Dans certaines implémentations Java 1.4, il était nécessaire de prendre moins de 10 instructions CPU. La désallocation des jeunes objets (ceux qui ne passent pas par le premier passage du GC) est également rapide: ils sont simplement ignorés - à moins qu'ils n'aient des finaliseurs, ce qui devrait être évité autant que possible. D'autre part, les jeunes objets qui survivent aux passages GC doivent être déplacés dans chaque cycle GC d'une partie de la mémoire à l'autre. Cela peut arriver plusieurs fois avant que l'objet ne soit considéré comme assez vieux pour se déplacer dans les générations plus anciennes, où il y a des chances qu'il bouge moins (il peut encore se déplacer dans un GC de compactage sur les anciennes générations).

Un autre problème avec les objets à vie longue est qu'ils ne peuvent pas avoir de références dans des objets de génération plus jeune. Lorsque cela se produit (attribuez new X() à un ancien objet), l'objet de longue durée doit être réaffecté à la nouvelle génération, ce qui peut également impliquer des coûts, car il peut nécessiter de déplacer l'objet de l'ancienne génération vers la nouvelle génération. Laisser un trou dans la mémoire de l'ancienne génération qui pourrait forcer les objets en mouvement dans la GC de l'ancienne génération à fonctionner en mémoire compacte.

Dans l'ensemble, l'important est qu'il y a beaucoup de gens très intelligents qui travaillent dans les langages, les compilateurs et les éboueurs. Toutes ces personnes vont travailler pour améliorer la performance des idiomes les plus communs, et essayer de déjouer le système vous mettra probablement hors du chemin où les choses vont doucement et doucement.

0

Je l'essayerais certainement. Bien que l'on sache maintenant que la création d'objets ne devrait pas être un problème, en fait, l'utilisation de pools d'objets et de classes spécifiques peut générer beaucoup de performances. Pour un framework de traitement de fichiers, j'ai gagné 5% en performance de lecture de la mise en pool des objets object [].

Questions connexes