L'analyse comparative à l'intérieur du code Java
J'ai été à la recherche dans l'analyse comparative dernièrement, j'ai toujours été intéressé par le programme d'enregistrement de données, etc. J'ai été intéressé de savoir si nous pouvons mettre en œuvre notre propre utilisation de la mémoire de code et de mettre en œuvre notre propre temps code de la consommation efficacement à l'intérieur de notre programme. Je sais comment vérifier de temps il faut pour une exécution de code:
public static void main(String[]args){
long start = System.currentTimeMillis();
//code
System.out.println(System.currentTimeMillis() - start);
}
J'ai aussi regardé dans Robuste Java analyse comparative, Partie 1: Questions, ce tutoriel est très complet. Affiche les effets négatifs de la System.currentTimeMillis();
. Le tutoriel puis suggère que nous utilisons System.nanoTime();
(le rendre plus précis?).
J'ai aussi regardé La détermination de l'Utilisation de la Mémoire en Java pour l'utilisation de la mémoire. Le site montre comment vous pouvez la mettre en œuvre. Le code qui a été fourni regarde inefficent parce que la personne appelle
long L = Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory();
Après ce qu'il appelle System.gc();
(4 * 4) = 16 fois. Puis répéter le processus à nouveau.
N'est-ce pas aussi prendre de la mémoire?
Donc, en résumé, est-il possible de mettre en œuvre efficace d'analyse comparative de code à l'intérieur de votre programme java?
La mesure de la performance du Système.currentTimeMillis() doit être évitée en faveur du Système.nanoTime(), parce que currentTimeMillis peut aller "dans le temps" par exemple, si le serveur NTP va corriger l'heure actuelle pour la machine.
Voir cette réponse, trop.
OriginalL'auteur Jeel Shah | 2011-12-07
Vous devez vous connecter pour publier un commentaire.
Oui, il est possible de mettre en œuvre efficacement des tests de performances dans du code java. La question importante est que n'importe quel type de test de performances va ajouter ses propres frais généraux et combien en voulez-vous. Système.currentMill..() est assez bonne référence en la matière et, dans la plupart des cas nanoTime() est inutile.
De la mémoire Système.gc va vous montrer des résultats divers et variés pour les différentes pistes (gc exécuter n'est jamais garantis.) Je l'utilise Visual VM pour le profilage de la mémoire (c'est gratuit) et ensuite utiliser TDA pour les vidages de l'analyse.
Une façon de le faire moins invasive est à l'aide de la programmation orientée Aspects. Vous pouvez créer qu'un seul Aspect qui s'exécute sur une Annotation ou un ensemble de méthodes et d'écrire @Autour de conseils pour collecter des données de performances.
Voici un petit extrait:
OriginalL'auteur Vivek
Il peut être impossible de référence sans Heisenberg effet, c'est à dire votre doivent être coupées code également être mesurée. Toutefois, si vous mesurez à un haut assez de granularité, l'effet est négligeable.
currentTimeMillis
ànanoTime()
, la deuxième propriété va devenir moins précis. Quelle est la deuxième propriété dans le cas de la mesure d'une méthode Java (delta entre la méthode de début et de fin)?OriginalL'auteur Garrett Hall
Toute analyse comparative code va être moins efficace que non étalonnés au code juste, fondée sur le fait d'avoir plus de choses à faire. Cela dit, Java, en particulier, provoque des problèmes comme l'indique l'article en raison de la collecte des ordures qui se passe à chaque fois que le jre se sent comme il. Même la documentation pour le Système.gc dit qu'il fait un "best effort".
Comme pour vos questions spécifiques:
Système.gc ne devrait pas prendre plus de mémoire, mais il faudra des ressources du processeur.
Il est peu possible en fonction de ce que vous essayez de référence. Il y aura toujours des interférences. Si vous êtes prêt à aller à l'extérieur de votre code, il y a des outils comme VisualVM à surveiller l'utilisation de la mémoire de l'extérieur de votre application.
Edit: Corrigé le texte de ce Système.gc docs dire.
OriginalL'auteur Thomas