2016-05-11 4 views
0

J'ai recherché au sujet de la mesure du temps d'exécution pour l'application Java et je reçois ce code:Mesure du temps d'exécution pour multithread Java Application

long start= System.currentTimeMillis(); 
//TODO 
long stop= System.currentTimeMillis(); 

différence entre le début et l'arrêt me donne le temps d'exécution.

REMARQUE: Je suis conscient que ce n'est pas le temps d'exécution EXACT. J'ai juste besoin de temps pour la comparaison entre les applications multithread et single thread.

Et si je change mon code comme ceci:

long start= System.currentTimeMillis(); 
//something... 
Thread t1= new Thread(new blabla(0, 10), "T - 1"); 
t1.start(); 
Thread t2= new Thread(new blabla(10, 20), "T - 2"); 
t2.start(); 
//Consider I've 10 threads like this 
//something more 
long stop = System.currentTimeMillis(); 

10 thread exécute. Peu importe ce qu'ils font. Disons qu'ils remplissent aléatoirement un tableau 2D. Maintenant, stop-start me donne le temps d'exécution "entier"? Ou dois-je mesurer les fils par eux-mêmes?

+0

quelle version de Java utilisez-vous? –

Répondre

1

Votre exemple multithread ne fonctionnera pas comme vous le souhaitez, car lorsque vous appelez start() sur un thread, il s'exécutera simultanément. Donc, ce qui se passe essentiellement est de commencer tous les 10 fils de discussion et il est possible qu'aucun d'entre eux a effectivement commencé ses travaux avant que vous avez appelé

long stop = System.currentTimeMillis(); 

Si vous voulez mesurer le temps d'exécution complet qu'il faut pour vos tâches vous compléter devez attendre que toutes les discussions pour terminer premier, que vous pouvez faire comme ceci:

long start = System.currentTimeMillis(); 

List<Thread> threads = new ArrayList<>(); 

for (int i = 0; i < 10; ++i) { 
    Thread t = new Thread(new blabla(i * 10, (i + 1) * 10), "T - " + (i + 1)); 
    t.start(); 
    threads.add(t); 
} 

// and now wait for all of them to complete 
for (Thread t : threads) { 
    t.join(); 
} 

long stop = System.currentTimeMillis(); 

Notez que cela ne fonctionne que si votre fils se terminent après l'exécution (votre blabla runnable ne fonctionne pas dans une boucle sans fin ou quelque chose).

Vous pouvez également utiliser un service ExecutorService (par exemple Executors.newFixedThreadPool(10), voir the Java API) auquel vous pouvez soumettre des tâches et attendre la fin de toutes les tâches.

+0

J'étais assez sûr que mes résultats de 1-5 ms sont faux. Également, la console eclipse écrit - par exemple - 5 ms. Mais le bouton Terminer était toujours disponible. Les fils travaillaient, bien sûr. Maintenant, j'ai essayé votre méthode et les résultats ont du sens. Bien sûr, je ne suis pas à 100% de mesurer mais même si je tords le nombre de threads, je vois des différences. Merci. – Diga

+1

Il y a une autre façon de mesurer l'exécution de votre application, mais cela ne fonctionnerait que si vous voulez mesurer la performance de manière isolée, c'est-à-dire avec une méthode 'main()' dédiée: au démarrage de la main puis vous enregistrez un hook de fermeture via 'System.getRuntime(). addShutdownHook()'. Il est appelé lorsque la JVM se termine et vous pouvez alors reprendre le temps et imprimer le runtime en soustrayant l'heure de début. – svenpanko