2009-08-06 16 views
21

I wrap code frequente in una coppia System.nanoTime() per la sincronizzazione. Qualcosa di simile:Libreria di temporizzazione delle prestazioni Java

long start = System.nanoTime();  
methodToBeTimed(); 
long elapsedTime = System.nanoTime() - start; 

C'è qualche buona libreria di temporizzazione che aiuta con questo problema? Anche il codice homegrown sarà accettato.

NB

un profiler non è una soluzione qui, perché voglio far rispettare alcuni vincoli di tempo nel mio test di unità, quindi voglio temporizzazione metodi programmazione.

+0

Non capisco quale sia il "problema" che stai cercando di risolvere. Hai una linea in alto e un'altra in basso per darti il ​​tempo trascorso. E tu hai una variabile per tenerla. Potresti concludere questo in un corso, o usare la classe Cronometro, ma non ridurrai la complessità del codice in alcun modo: avrai ancora bisogno di una linea in alto e una riga in basso. Vuoi che aiuti la registrazione e il tracciamento di un gran numero di questi tempi? – AgilePro

risposta

11

Non l'ho usato ma mi sono imbattuto recentemente in perf4j.

+0

@Mark: non ne ho mai sentito parlare. Grazie mille! – dfa

+0

È possibile anche disegnare grafici con perf4j, con il servlet integrato. È abbastanza buono. – unludo

+0

perf4j spostato su github https://github.com/perf4j/perf4j – Sebastien

8

Non è una risposta diretta alla sua domanda, ma sto anche usando spesso questo suggerimento in volta il mio codice e ha appena scritto il seguente Eclipse semplice -> Surround Con modello:

long startTime = System.currentTimeMillis(); 
${line_selection}${cursor} 
long totalTime = System.currentTimeMillis() - startTime; 
System.out.println("Total time = " + totalTime); 
System.out.println(); 
+0

sfortunatamente sono un utente netbeans - :) – dfa

1

provato JPerf?

+0

Usa la cache di google per vedere l'utilizzo, in alternativa controlla il link a xjperf: http://code.google.com/p/xjperf/ – techzen

+0

sembra un frontend per iperf, cioè "Un'alternativa moderna per misurare le massime prestazioni di larghezza di banda TCP e UDP". È giusto? – dfa

1

Che tipo di aiuto stai cercando con questo problema? Hai le basi in atto. Ottieni il tempo trascorso in nanosecondi, con precisione a qualsiasi risoluzione il sistema operativo/hardware sottostante sia in grado di eseguire.

Inoltre ... e so che non hai detto nessun profiler ... ma ho avuto un'esperienza eccezionale con YourKit. Fornisce un'API che è possibile utilizzare per controllare il profilo dall'esterno. A seconda di quale sia il tuo problema, potrebbe valere la pena dare un'occhiata a questo.

6

c'è il StopWatch da common-lang, consente anche di dividere il timer.

+0

bello vederlo ma incapsula solo System.nanoTime/System.currentTimeMillis chiama – dfa

+0

è sempre più facile da usare rispetto alla versione predefinita;) – IAdapter

+0

linkk interrotto ... – Pacerier

8

JUnit 4 ha una funzionalità di temporizzazione integrata.

@Test (timeout = X)

dovrebbe fare il trucco. X è il numero massimo di millisecondi consentito per l'esecuzione del metodo.

+0

Suona come un vincitore per me. –

+0

sì, questa è un'implementazione molto basilare, essentialy sto cercando @Test (timeout = X, repeat = N) quindi visualizza la media – dfa

3

Se stai usando Spring hai già una bella classe chiamata StopWatch nel classpath per questa proposta.

1

JETM è una buona libreria per fare ciò. Può anche fornire min, max e medie, oltre a generare grafici informativi.

0

fatti a mano ...

import static java.lang.System.nanoTime; 

/** 
* For testing/debug purposes. 
* 
* <pre> 
* private Stopwatch stopwatch = new Stopwatch(); 
* ... 
* public void method1() { 
*  stopwatch.reset(); 
*  for (...) { 
*   ... 
*   stopwatch.start(); 
*   operation1(); 
*   stopwatch.stop(); 
*   ... 
*  } 
*  System.out.println("operation 1 max timing is " + stopwatch.getMaxLapTime()); 
* } 
* ... 
* public void method2() { 
*  stopwatch.reset(); 
*  for (...) { 
*   ... 
*   stopwatch.start(); 
*   operation2(); 
*   stopwatch.stop(); 
*   ... 
*  } 
*  System.out.println("operation 2 max timing is " + stopwatch.getMaxLapTime()); 
* } 
* </pre> 
* 
* @author Mykhaylo Adamovych 
*/ 
public class Stopwatch { 
    protected long totalTime; 
    protected long maxLapTime; 
    protected long minLapTime = Long.MAX_VALUE; 
    protected long lapsCount; 
    protected long lastThreshold; 

    /** 
    * Human readable time in seconds 
    * 
    * @param nanoTime 
    * @return time in seconds 
    */ 
    public static final String toSeconds(long nanoTime) { 
     return String.format("%.9f", nanoTime/1000000000.0); 
    } 

    public long getAverageLapTime() { 
     if (lapsCount == 0) 
      return 0; 
     return totalTime/lapsCount; 
    } 

    public long getMaxLapTime() { 
     return maxLapTime; 
    } 

    public long getMinLapTime() { 
     return minLapTime; 
    } 

    public long getTotalTime() { 
     return totalTime; 
    } 

    /** 
    * Returns last lap time, process statistic. 
    */ 
    public long lapTime() { 
     return processLapTime(); 
    } 

    private long processLapTime() { 
     if (lastThreshold == 0) 
      throw new IllegalStateException("Stopwatch is stopped."); 
     final long now = nanoTime(); 
     final long lapTime = now - lastThreshold; 
     lapsCount++; 
     totalTime += lapTime; 
     if (lapTime > maxLapTime) 
      maxLapTime = lapTime; 
     if (lapTime < minLapTime) 
      minLapTime = lapTime; 
     lastThreshold = nanoTime(); 
     return lapTime; 
    } 

    /** 
    * Resets statistic and starts. 
    */ 
    public void reset() { 
     totalTime = 0; 
     maxLapTime = 0; 
     minLapTime = Long.MAX_VALUE; 
     lapsCount = 0; 
     start(); 
    } 

    /** 
    * Starts time watching. 
    */ 
    public void start() { 
     lastThreshold = nanoTime(); 
    } 

    /** 
    * Suspends time watching, returns last lap time. 
    */ 
    public long stop() { 
     final long lapTime = processLapTime(); 
     lastThreshold = 0; 
     return lapTime; 
    } 
} 
+1

Non penso che la tua implementazione per 'minLapTime' possa funzionare, dal momento che è inizializzata con il valore più basso possibile: 0. Probabilmente dovrebbe essere inizializzata con (e resettato a) 'Long.MAX_VALUE'. – martin

0

Qualcosa di nuovo sul mercato è JMH. È fatto sotto l'ombrello del progetto openjdk.

0

Ho appena iniziato a utilizzare Java Simon (precedentemente on Google Code) e sembra fantastico! Una semplice serie di cronometri e contatori con poche dipendenze.