Dans mon projet, il existe des usines «prototypes» qui créent des instances en clonant une dernière instance privée. P>
L'auteur de ces usines indique que ce modèle offre de meilleures performances que d'appeler «nouvel» opérateur. P>
Utiliser Google pour obtenir des indices à ce sujet, je n'ai rien trouvé de pertinent. Voici un petit extrait trouvé dans un Javdoc d'un inconnu Projet P>
Malheureusement, clone () est plutôt plus lent que appeler nouveau. Cependant c'est beaucoup plus rapide que d'appeler java.lang.class.newinstance (), et un peu plus rapide que de rouler notre propre Méthode "Cloner". P> blockQuote>
Pour moi, il ressemble à une vieille meilleure pratique du Java 1.1 fois. Est-ce que quelqu'un en savoir plus à ce sujet? Est-ce une bonne pratique à utiliser avec «moderne» JVM? P>
6 Réponses :
Absolument, ce type de pratique est complètement obsolète. La machine virtuelle Java s'est considérablement améliorée depuis lors. La création d'objets est extrêmement bon marché. Une autre pratique connexe, la mise en commun des objets, est également obsolète car le coût de la création et du nettoyage d'objets est tellement plus efficace maintenant. Pour certains cas, il pourrait être utile ( Jon Skeet donne quelques exemples de bons exemples ici ), mais sans Way devrait faire partie d'une bibliothèque-cadre de base telle que ceci. P>
Je suggérerais de trouver de nouvelles bibliothèques et / ou un nouveau projet pour travailler; -) p>
Découvrez cet article de classe Java Urban Performance Legends pour plus de perspicacité. P>
Merci pour le lien, je savais qu'il y avait quelque chose de mal avec ce design mais j'avais besoin de preuves «académiques»!
Je dois juste atténuer la réponse: Ceci n'est pas valide pour Android Dev: Google Meilleure pratique favorise le clone / la mise en commun d'utilisation vs la création d'objets
Oui, Android est écrit avec Java, mais n'est pas vraiment Java, c'est donc techniquement correct. Il est plus précis de dire que la mise en commun de l'objet n'est plus nécessaire pour le hotspot jvm de Sun (et d'autres comme celui-ci). Dalvik est son propre animal et la création d'objets et GC peut être coûteuse et douloureuse sur les périphériques contraints de ressources, alors suivez toujours les meilleures pratiques de votre plate-forme cible / JVM. (Cependant, j'aimerais que ce n'était pas le cas, c'est pour l'instant.)
Non. P>
Oh, j'ai besoin de plus de caractères pour une réponse. Alors laissez-moi développer et dire qu'une telle micro-optimisation est inappropriée à moins qu'il y ait un problème, et s'il y en a, vous devriez être en mesure de mesurer si cela rend les choses mieux. P>
gee. C'est l'une des pires idées que j'ai jamais entendues. p>
Ne faites pas de choses étranges. Même si vous avez mesuré et que vous voyez une amélioration apparente (bien, zéro chance de cela dans ce cas), pensez longtemps avant de le faire. Qui sait qu'il sera corrigé dans la prochaine JVM. Ensuite, vous êtes laissé avec un peu de code étrange qui fonctionne pire, est difficile à lire et de bugs à cause de cela. p>
Je veux dire, ce n'est pas comme si les gens développent que les Jvm sont des idiots! Utilisez Je pense que vous devriez vous débarrasser de cet étrange morceau de code. p> nouveau code>! p>
Comme d'autres l'ont dit, il s'agit d'une pratique vieille. C'est un motif obsolète qui malheureusement avec les nouveaux JVMS ajoutera plus de BLOAT au code sans donner un coup de pouce de performance. P>
J'aimerais avoir toujours le code afin que je puisse partager, mais de retour, j'ai fait un test de performance simple de ce modèle à l'aide de l'opérateur "Nouveau" et j'ai constaté que l'utilisation du "nouveau" opérateur était au moins aussi vite que ce modèle, et au mieux plus rapidement et plus efficace. Il peut y avoir un cas de bord mon test ne couvre pas où cela pourrait toujours être une approche valide, mais en général, je dirais éviter ce modèle. P>
Une autre note cependant, je vous suggérerais de ne pas trop vous inquiéter de cela si elle est présente dans une base de code existante. Mais aussi, je n'écrirais pas un nouveau code pour étendre ce modèle pour plus de parties de votre projet, à moins que ce ne soit pas fait de la clarté et de la cohérence de votre base de code, à quel point vous devriez évaluer ou non que ce serait intelligent dans le Longue course au refacteur de ce code de votre projet. Par "SMART" Je veux dire, refacterait ce code de votre projet gagnerait du temps à l'avenir sur le développement et le débogage> le temps nécessaire pour le refactoriser. P>
J'ai créé une référence simple pour la classe personne code>. J'utilise le dernier OpenJDK 8:
Benchmark Mode Cnt Score Error Units
MyBenchmark.viaClone avgt 10 10.041 ± 0.059 ns/op
MyBenchmark.viaNew avgt 10 7.617 ± 0.113 ns/op
Mes tests avec Decimalformat (OpenJDK 8 / Windows / JMH 1.19) représentent une image complètement opposée:
Benchmark Mode Cnt Score Error Units Format.everyTimeCreate avgt 10 9326.967 ± 199.511 us/op Format.useClone avgt 10 5102.397 ± 72.993 us/op Format.useGlobalWithTL avgt 10 4605.604 ± 59.000 us/op