J'essaie de réduire les coûts de performance/récupération de place des instructions de consignation. Je veux avoir beaucoup d'instructions de journalisation que je pourrais activer pour le débogage, mais aussi avoir un moyen de les désactiver pour une production rapide.Frais généraux (vitesse et ordures) des fonctions d'appel qui ne font rien
Je couru une référence à appeler les méthodes suivantes:
public static final isLogging = false;
public static logObjs(Object[] params) {
if(isLogging)
System.out.println(params[0]);
}
public static log3Obj(Object a, Object b, Object c) {
if(isLogging)
System.out.println(a);
}
public static logInts(int a, int b, int c) {
if(isLogging)
System.out.println(a);
}
I étalonnées les fonctions d'un procédé d'attaque
long sum = 0;
for(int i = 0; i < 100000000; ++i) {
int a = i; int b = i+1; int c = i+2;
logFoo(a,b,c);
sum += a; }
logObjs (i, i + 1, i + 2) prend environ 2 secondes pour les itérations 1e8 et produit beaucoup d'ordures. Les sources sont, je suppose, autoboxing d'entiers et la création Object [] pour la variable # de paramètres. Log3Obj produit beaucoup (mais moins) de déchets et prend environ 1,2 secondes; encore une fois, je suppose que l'autoboxing se produit encore. LogInts est très rapide (0,2 sec), tout aussi rapide que la boucle sans appel de fonction. Donc, le problème est que même si la fonction ne fait rien de déterministe, l'autoboxing arrive toujours. Dans mon code, je préférerais que isLogging ne soit pas final, mais plutôt qu'il soit un paramètre d'exécution, mais pour ce faire, ce cas plus simple (où le compilateur peut prouver que la fonction ne fait rien) devrait courir. Bien sûr, je peux remplacer tous mes relevés d'enregistrement avec
if(isLogging)
logObjs(a, b, c);
mais c'est très inélégant. Je pensais que c'est quelque chose que le JIT devrait prendre en charge. J'ai essayé pas mal de réglages du compilateur, mais il y a peut-être quelque chose qui me manque? Comment puis-je faire que le code ne génère pas autant de déchets sans rien faire?
"Comment est-ce que je fais que le code ne génère pas autant de déchets sans rien faire?" arrête de faire un autoboxing –
Je ne ferais pas confiance à un "benchmark" slapdash comme celui-ci. Lire la suite: http://code.google.com/p/caliper/wiki/JavaMicrobenchmarks –