2011-10-16 9 views
6

La parola sulla strada è che per i cicli in scala sono più lenti di quelli di loop.Scala di profilatura per loop che utilizza hprof

lento:

for (i <- 0 until 10000) { 
    f(i) 
} 

veloce:

var i = 0 
while (i < 10000) { 
    f(i) 
    i += 1 
} 

Come faccio ad usare hprof per dire se il cicli for sono il collo di bottiglia nel mio codice? Sto profilando il mio codice usando -agentlib:hprof=cpu=samples, quale sarebbe il metodo nella sezione "CPU SAMPLES"?

Mi piacerebbe sapere dove concentrare i miei sforzi di ottimizzazione. Sono per i loop il collo di bottiglia?

risposta

3

Penso che potresti avere più fortuna con strumenti specializzati con la creazione di profili come yourkit o visualvm.

Di solito dispongono di un'interfaccia per acquisire il campione della CPU e quindi eseguire il drill down per vedere quali chiamate hanno consumato la maggior parte dei cicli della CPU.

Si verifichino colli di bottiglia di qualsiasi tipo (come il 95% del tempo di CPU) e quindi è possibile eseguire il drill down fino a vedere quali metodi (o la libreria) si trovano nello stack di chiamate per tali hot spot. Quindi puoi vedere se sono coinvolti loop.

2

Inserire ciascun ciclo nel proprio metodo, quindi confrontare il tempo impiegato dai metodi. E usa abbastanza iterazioni per impiegare un po 'di tempo (o avvolgerle in un altro ciclo). 10000 iterazioni dovrebbero richiedere microsecondi; è difficile da misurare per un profiler. Prova un miliardo (o 100k iterazioni di 10k iterazioni).

Inoltre, se f(i) è costoso, ci vorrà molto più tempo del ciclo. Inoltre, se f(i) non fa nulla, potrebbe essere ottimizzato completamente. Quindi assicurati di farlo (ad esempio aggiorna un contatore da qualche parte, calcola una somma o qualcosa).

Problemi correlati