J'utilise ce petit morceau de code pour tester quelle méthode est plus rapide:Grande différence sur System.currentTimeMillis()
public void test() {
long start = System.currentTimeMillis();
MyDate date = new MyDate();
int max = 5000;
for (int i = 0; i < max; i++) {
Calendar.getInstance().getTimeInMillis(); // <--
}
System.out.println("Calendar instance delay: " + (System.currentTimeMillis() - start));
start = System.currentTimeMillis();
for (int i = 0; i < max; i++) {
date.getMillis(); // <--
}
System.out.println("My date delay: " + (System.currentTimeMillis() - start));
}
Donc, au fond, je suis essayer de comparer les performances entre Calendar.getInstance().getTimeInMillis()
et MyDate.getMillis()
(MyDate est une classe créée par moi).
Eh bien, quand je courais le code ci-dessus, la sortie était:
Calendar instance delay: 413
My date delay: 2
MAIS, quand j'inversé l'ordre (d'abord appelé MaDate, et après le calendrier), je me suis:
My date delay: 247
Calendar instance delay: 119
J'ai essayé d'utiliser System.nanoTime()
, mais la même chose s'est produite: le premier code à tester est celui qui a pris le plus de temps.
Quelqu'un sait pourquoi cette différence se produit? Ou, existe-t-il un moyen de profiler les codes avec précision sans utiliser une application de profileur externe (juste du code Java pur)?
Merci.
Eh bien d'abord, vous initialisez l'objet date dans le premier bloc de synchronisation. Deuxièmement, vous pourriez frapper GC - 5000 n'est probablement pas assez d'appels. Enfin, est-ce vraiment un problème de performance dans votre application? –
Quelle est votre objection contre l'utilisation d'un profileur? – Torious
@PhilipWhitehouse Non, je l'utilise juste à des fins de test. – BloodShura