Domanda

Prima di tutto devo ammettere che si tratta di domande molto basilari e primitive ... Voglio dimostrare diversi algoritmi in Java per l'ordinamento e la ricerca e ottenere un valore per il runtime. Ci sono problemi che non posso risolvere:

  1. c'è la compilazione di Hotspot - che è un'ottimizzazione del runtime che devo disattivare (immagino).

  2. Come posso ottenere valori di tempo (secondi) per i runtime? Avvio di un timer prima dell'esecuzione e interruzione successiva ... sembra un po 'primitivo. E l'oggetto timer stesso consuma tempo di esecuzione ... Devo evitarlo.

C'è qualcosa nell'API Java che si potrebbe utilizzare per risolvere questi problemi?

Grazie, Klaus

È stato utile?

Soluzione

  1. Usa -Xint flag JVM. Altre opzioni sono disponibili qui .

  2. Utilizza ThreadMXBean API per ottenere i tempi CPU / utente per il tuo thread. Un esempio può essere visto qui .

  3. .

Altri suggerimenti

È possibile disabilitare HotSpot con -Xint sulla riga di comando, per ottenere un ordine di riduzione della grandezza delle prestazioni. Tuttavia, perché non vuoi misurare le prestazioni del mondo reale? Diverse cose possono diventare colli di bottiglia durante la compilazione.

Generalmente per microbenchmark:

  • usa System.nanoTime per ottenere una misurazione del tempo all'inizio e alla fine
  • esegui per un periodo di tempo ragionevole
  • esegui la misurazione più volte (c'è un po 'di "riscaldamento")
  • non interleave misurazioni di diversi algoritmi
  • non eseguire alcun I / O nel segmento misurato
  • usa il risultato (HotSpot può ottimizzare completamente le operazioni banali)
  • fallo in una situazione del mondo reale (o una cloae possibile)
  • ricorda che il dual core è la norma e più core diventeranno normali

L'uso di System.nanoTime () consuma due volte meno di 1 micro-secondo. Ti suggerisco di eseguire qualsiasi benchmark per un numero di secondi e prendere una media in modo che un errore di micro-secondi non sia significativo.

Nel complesso, suggerirei di non rendere le cose più complicate di quanto tu ne abbia bisogno.

Per avere un riscaldamento integrato, spesso ignoro il primo 10% -20% delle iterazioni. Qualcosa come

long start;
int count;
for(int i = -count / 5; i < count; i++) {
    if (count == 0) start = System.nanoTime();
    // do tested code
}
long time = System.nanoTime() - start;
long average = time / count;
System.out.printf("Average time was %,d micro-seconds%n", average / 1000);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top