Le code suivant prouve que la méthode1 est plus rapide que la méthode2. Quelqu'un peut-il s'il vous plaît commenter quelle est la raison de ce comportement?
class Trial {
String _member;
void method1() {
for(int i=0;i<30480;i++) {
_member += "test";
}
}
void method2() {
String temp="";
for(int i=0;i<30480;i++) {
temp += "test";
}
_member = temp;
}
public static void main(String args[]) {
Trial t = new Trial();
long startTime1 = System.currentTimeMillis();
t.method1();
long endTime1 = System.currentTimeMillis();
long startTime2 = System.currentTimeMillis();
t.method2();
long endTime2 = System.currentTimeMillis();
System.out.println(endTime1 - startTime1);
System.out.println(endTime2 - startTime2);
}
}
3 Réponses :
Le code suivant prouve que la méthode1 est plus rapide que la méthode2 p>
non. Il n'est pas
prouver fort>. P> Cela dépend de nombreux facteurs. Quand j'exécute ce code, j'obtiens p>
xxx pré> donc dans mon environnement, votre code "prouve" que la méthode1 est
plus lente forte> que la méthode2. P > Lorsque vous effectuez une analyse comparative, vous devez prendre en charge les effets tels que la mise en cache et l'échauffement JVM. p>
Voir aussi p>
- Comment puis-je écrire une micro-repère correcte en Java? li>
- Évitez JVM Warmup Li> ul>
Pour plus d'informations. P>
J'ai légèrement refactore le
Méthode code> Méthode: P>1396 1133 ---- 1052 1070 ---- 688 711 ---- 728 726 ---- 715 709 ---- ...
Encore la même question, pourquoi la méthode2 est plus rapide que la méthode1 ... lol .... + 1 pour analyse comparative .....
Je suppose que j'ai besoin de vérifier à nouveau mes conclusions en utilisant un outil de référence. Je posterai la réponse dès que j'aurai fini avec ça.
Après avoir réchauffé la JVM pendant quelques reprises, vous verrez que Voici mon code retégoré: P> ----
2910
2894
----
Eh bien, vous avez fait la même erreur que je l'ai fait lors de mon refactoring: D afin de comparer réellement les méthodes, vous devez ré-instancier essai code> à l'intérieur du pour code> -Loop. Sinon, vous travaillez avec l'ancien contenu dans la chaîne _member code> variable. Comme il existe déjà du contenu, les concatenations supplémentaires prendront beaucoup plus de temps.
J'ai modifié le nombre de tests, mais pas la méthode, ici avec method1 then method2 with += in MILLIisecond
5563
5844
............................................
5437
6344
method2 then method1 with += in MILLIisecond
4625
5969
------------------
6531
4891
=====================================================
method1 then method2 with StringBuilder in NANOsecond
3530337
2074286
------------------
2058641
1983493
.....................................................
method2 then method1 with StringBuilder in NANOsecond
3430883
1698819
------------------
2065626
2144406
Combien de fois avez-vous exécuté votre test? Avez-vous essayé de courir les deux variantes plusieurs fois dans une boucle? Avez-vous essayé d'inverser l'ordre de vos appels?
Essayez de mettre en œuvre une référence en utilisant JMH . C'est un outil spécial conçu par les développeurs JVM. Vous pouvez éviter de nombreuses erreurs à l'aide de cet outil au lieu de votre propre référence.
Je l'ai essayé 10 fois et la seconde tourne toujours plus vite.
De plus, à ce que dit Nicola, Method2 met beaucoup de mémoire usée (le contenu précédent de _member) pour la collecte des ordures. Cela pourrait ruiner votre timing.
Vous semble faire du travail supplémentaire dans la méthode2 _member = TEMP;
@Nicolamusatti J'ai couru le test presque 20 fois avec un résultat constant. Je pourrais supposer que cela peut être dépendant du matériel mais encore une fois, il peut y avoir une réponse logique à elle.
@Junedahsan Même sans la dernière étape de la dernière étape1 est plus rapide pour moi.
J'ai un test il y a quelques mois et j'ai constaté que le getCurrenttimemillis () ne peut pas montrer le vrai temps d'exécution de la CPU.
Pas encore de réponse à la question. Membre local est plus rapide ou membre d'instance? B> Avons-nous vraiment besoin de repasser pour savoir ce qui est rapide? Personne ici connaît les internes de Java? J'attends avec impatience une réponse qui explique le fonctionnement exact de Java et quoi préférer l'amélioration de la performance.
@Niranjan
Avons-nous vraiment besoin de comparaître pour savoir ce qui est rapide? Code> - Oui. Ce n'est pas seulement le compilateur Java ou JVM qui influence les résultats, mais également d'autres parties de la pile technologique comme le compilateur JIT et le matériel sous-jacent. Lorsque vous analysez le bytecode pour les deux variantes, vous trouverez des instructions supplémentaires dans lepour () code> -loop deméthodal1 () code> - mais qu'ils ont un impact significatif sur la performance dépend des facteurs supplémentaires, par exemple Comment le compilateur JIT traduit le byTecode vers des instructions natives.