2012-10-28 20 views
10

Voglio testare il tempo di esecuzione di alcuni blocco di codice come segue:In java, come annotare rapidamente diverse righe di codice?

start = System.currentTimeMillis(); 
{ 
    ... 
    this.dosomething(); 
} 
end = System.currentTimeMillis(); 
System.out.println(end - start); 

quando ottimizzare il blocco di codice, come posso annotare quei codici che calcolare il tempo in fretta come la seguente?

//start = System.currentTimeMillis(); 
{ 
    ... 
    this.dosomething(); 
} 
//end = System.currentTimeMillis(); 
//System.out.println(end - start); 
+0

Qualcosa di simile a [questa risposta] (http://stackoverflow.com/a/4836219/477878)? –

+0

Non una risposta alla tua domanda, ma ** per favore ** non usare 'System.currentTimeMillis()' per scopi di benchmark, usa invece 'System.nanoTime()'. E per favore leggi le risposte a questa domanda: [Come posso scrivere un micro-benchmark corretto in Java?] (Http://stackoverflow.com/questions/504103/how-do-i-write-a-correct-micro- benchmark-in-java) –

risposta

1

Se si desidera solo qualcosa di semplice, si può sempre avere una variabile debug (booleana) che è vero quando si vuole informazioni di debug da stampare, ad esempio:

if (debug) start = System.currentTimeMillis(); 
{ 
    ... 
    this.dosomething(); 
} 
if (debug) { 
    end = System.currentTimeMillis(); 
    System.out.println(end - start); 
} 

Quando sono Facendo questo, ho spesso impostato debug utilizzando gli argomenti della riga di comando, quindi non è necessario modificare il codice per attivare la modalità di debug.

MODIFICA: Se si desidera ripetere questa struttura altrove nel programma, sceglierei AOP come indicato nelle altre risposte.

+0

+1 per me poiché è la soluzione semplice. – DaveFar

-1

Non sono molto chiaro del tuo significato. se vuoi semplicemente commentare il codice, la scorciatoia è ctrl +/in eclissi. E se provi a gentilire questo tipo di codice nel tuo progetto, puoi usare log4j per fare questo genere di cose.

+2

Il poster originale non ha indicato quale IDE sta utilizzando (Eclipse è solo una delle tante possibilità). Inoltre, dovrai espandere la tua risposta per spiegare perché log4j può essere d'aiuto, perché non riesco a vedere come. –

+0

Mi sono appena unito a questo fantastico posto, quindi non so quale sia la regola e sono felice di condividere la mia idea. Ma se non è permesso, allora mi dispiace per questo. – OQJF

+0

StackOverflow non esisterebbe senza che le persone condividessero le loro idee - va bene. Ma prospera anche sulla revisione tra pari e sulle critiche costruttive. Non tutte le risposte che date saranno corrette ed è importante non essere feriti se gli altri mettono in dubbio la vostra risposta. A proposito, non tutti i commenti sono corretti :-) –

2

È possibile utilizzare annotation processing per creare compile timeannotations e generare il codice sorgente in base a tale.

In questo articolo viene illustrato come generare il codice Properties via Annotation Processing utilizzando le annotazioni. È possibile definire annotazioni personalizzate come @Start, @End, @Calculate e utilizzarle come di seguito. Se non generi codice sorgente, saranno comunque rimossi.

@Start 
{ 
     ... 
     this.dosomething(); 
} 
@End 
@Caclulate 

Nota: non è possibile modificare il codice da ispezionare, quindi è necessario creare una sottoclasse.

1

Separando il codice per la misurazione delle prestazioni dal codice principale dall'inizio. Effettuare una delle seguenti operazioni:

  • come chm052 descritto nella sua risposta, con alcuni comandi di bandiera e di guardia;
  • utilizzando un framework di registrazione con questi comandi protetti, ad es. SLF4J;
  • utilizzando uno (micro-)benchmarking tool, che consente di eseguire misurazioni di tempo, statistiche e comandi protetti (ad esempio tramite AspectOrientedProgramming). Dovresti assolutamente usare questo strumento per ottenere misurazioni sensate (vedi ad esempio https://stackoverflow.com/a/7120803/750378).
1

L'approccio proposto da chm052 funzionerà sicuramente, ma accoppierà la logica del tempo di misurazione del tempo al metodo aziendale, che non è auspicabile. Dopo tutto il metodo viene scritto per eseguire "dosomething()" - e prima e dopo questi si vogliono misurare i tempi. Domani vorrai registrare il link statement "inserendo i metodi/lasciando il metodo doSomething", in un certo momento probabilmente vorrai controllare i permessi se questo codice può essere eseguito affatto.

spero che hai il mio punto, mentre questo approccio è un bene per i progetti semplici che inquinerà il codice con le preoccupazioni non collegati

Ci sono un paio di tecniche.

  1. AOP, questo è stato già suggerito da Joachim Isaksson. AOP brilla davvero in quest'area. Crea un consiglio dove utilizzerai la tua logica di timemeasurement e sei pronto per partire.

  2. Se vuoi/necessità di attenersi alle tecnologie OOP, suggerisco di creare un Proxy o Decorator

Tecnicamente la sua davvero vicini l'uno all'altro, il suo solo come tenere a mente l'intenzione della tua preoccupazione.

Spero che questo aiuti

4

Basta usare un profiler. Strumenterà automaticamente il tuo codice con un ingombro minimo, visualizzando varie statistiche e punti caldi. Guarda il profiler built into JVisualVM, JProfiler o YourKit.

Quando non ne hai bisogno, non paghi nulla per questo.

+0

Come si può testare il tempo di esecuzione di un determinato blocco di codice con un profiler (se il blocco di codice non è né una singola operazione né un metodo completo)? – DaveFar

+0

@DaveBall: in effetti non è possibile. Immagino che il modo più semplice per ovviare al problema sarebbe semplicemente estrarre il metodo (che spesso è una buona idea da solo) –

Problemi correlati