2009-04-08 9 views

risposta

16

L'idioma standard è:

long startTime = System.nanoTime(); 
doSomething(); 
long elapsedTime = System.nanoTime() - startTime; 
+0

è possibile che non appena si ottiene il tempo di inizio, il thread perde il controllo e richiede un po 'di tornare indietro. –

+0

Ti aspetti che scriva sul disco quando è bloccato? ciò che di solito conta nel tempo del muro compreso il blocco. –

5

non testato, ma qualcosa di simile:

long delta = System.nanoTime(); 
try { 
    // do your stuff 
} finally { 
    delta = System.nanoTime() - delta; 
} 
+0

Sono nuovo di Java. Perché hai usato un blocco try combinato con finaly? :) –

+0

Il blocco try ... finally assicura che il delta sia calcolato anche se viene generata un'eccezione durante la parte di lavoro effettiva. Quale può o non può essere utile a te. –

+2

Vorrei suggerire un fermo e gestire l'eccezione. Il tuo tempo non significa nulla se l'operazione non è stata completata come previsto. – uriDium

2

C'è un esempio di codice qui:

http://www.goldb.org/stopwatchjava.html

/* 
    Copyright (c) 2005, Corey Goldberg 

    StopWatch.java is free software; you can redistribute it and/or modify 
    it under the terms of the GNU General Public License as published by 
    the Free Software Foundation; either version 2 of the License, or 
    (at your option) any later version. 
*/ 


public class StopWatch { 

    private long startTime = 0; 
    private long stopTime = 0; 
    private boolean running = false; 


    public void start() { 
     this.startTime = System.currentTimeMillis(); 
     this.running = true; 
    } 


    public void stop() { 
     this.stopTime = System.currentTimeMillis(); 
     this.running = false; 
    } 


    //elaspsed time in milliseconds 
    public long getElapsedTime() { 
     long elapsed; 
     if (running) { 
      elapsed = (System.currentTimeMillis() - startTime); 
     } 
     else { 
      elapsed = (stopTime - startTime); 
     } 
     return elapsed; 
    } 


    //elaspsed time in seconds 
    public long getElapsedTimeSecs() { 
     long elapsed; 
     if (running) { 
      elapsed = ((System.currentTimeMillis() - startTime)/1000); 
     } 
     else { 
      elapsed = ((stopTime - startTime)/1000); 
     } 
     return elapsed; 
    } 




    //sample usage 
    public static void main(String[] args) { 
     StopWatch s = new StopWatch(); 
     s.start(); 
     //code you want to time goes here 
     s.stop(); 
     System.out.println("elapsed time in milliseconds: " + s.getElapsedTime()); 
    } 
} 
2

Il modo Lo farei è solo eseguirlo in loop un certo numero di volte. Ad esempio, se lo fai girare 1000 volte e lo fa partire, questo ti dà millisecondi. Eseguilo 1.000.000 di volte e ti dà microsecondi.

Se si desidera scoprire il motivo per cui è necessario tanto tempo, è possibile sospenderlo un certo numero di volte (ad esempio 10) mentre è in esecuzione, e questo vi dirà cosa sta facendo e perché.

1

Il problema con il metodo get System.xxx è che il metodo stesso richiede alcuni millisecondi per il calcolo. Il solito modo "accettato" di farlo è eseguire il test poche decine di migliaia di volte e calcolare una media di questo.

Inoltre, a seconda del sistema operativo in uso, è presente uno strumento denominato time granularity (esempio per Windows). Questa è la quantità minima di tempo che il tuo sistema operativo può calcolare. Su alcuni OS è un millisecondo, su alcuni è un nanosecondo. Potrebbe o potrebbe non essere rilevante nel tuo caso.

+0

System.nanoTime() richiede 0,5 microsecondi e System.currentTimeMillis() è molto meno. –

Problemi correlati