2010-01-17 9 views
7

Sto lavorando a un simple text markup Java Library che dovrebbe essere, tra gli altri requisiti, veloce.Profilazione Java - Quanto sono affidabili i valori che fornisce?

A tale scopo, ho eseguito un po 'di profilazione, ma i risultati mi danno numeri peggiori che vengono poi misurati quando si esegue in modalità non profilo.

Quindi la mia domanda è - quanto è affidabile la profilazione? Questo fornisce solo un rapporto informativo del tempo trascorso in metodi? Questo prende in considerazione il compilatore JIT, o la modalità di profilazione viene interpretata solo? Uso NetBeans Profiler e Sun JDK 1.6.

Grazie.

risposta

5

Quando si esegue il profiling, si incorre sempre in una penalizzazione delle prestazioni poiché qualcosa deve misurare il tempo di avvio/arresto dei metodi, tenere traccia degli oggetti dell'heap (per il profiling della memoria), quindi c'è un overhead di gestione .

Tuttavia, vi fornirà indicazioni chiare per scoprire dove sono i colli di bottiglia. Tendo a cercare i metodi in cui viene speso il tempo più cumulativo e controlla se è possibile eseguire ottimizzazioni. È anche utile determinare se i metodi sono chiamati inutilmente.

Con metodi molto piccoli, eseguire i risultati del profilo con un pizzico di sale, a volte il processo di misurazione può richiedere più tempo rispetto alla chiamata al metodo stesso e distorcere i risultati (potrebbe sembrare un piccolo metodo ha più di un impatto sulle prestazioni).

Spero che questo aiuti.

2

A causa della strumentazione, il codice di profilo viene eseguito in media più lentamente rispetto al codice non profilato. Tuttavia, la misurazione della velocità non è lo scopo della profilazione.

L'output di creazione profili indicherà i colli di bottiglia, i luoghi in cui i thread trascorrono più tempo, il codice che si comporta in modo peggiore del previsto o le possibili perdite di memoria.

È possibile utilizzare questi suggerimenti per migliorare nuovamente i metodi e il profilo suddetti finché non si è soddisfatti dei risultati.

Un profiler non sarà una soluzione per uno stile di codifica che è x% più lento di quello ottimale, tuttavia, è comunque necessario dedicare del tempo a mettere a punto quelle parti del codice che vengono utilizzate più spesso di altre.

2

Non sono sorpreso dal fatto che si ottengano risultati peggiori quando si profila la propria applicazione poiché lo strumento di codice java generalmente rallenterà la sua esecuzione. Questo è in realtà ben catturato dalla pagina di Wikipedia su Profiling che afferma che la strumentazione può provoca cambiamenti nello svolgimento di un programma, causando potenzialmente imprecisi risultati non accurati e heisenbugs (a causa di the observer effect: osservatori influenzano ciò che stanno osservando, per il solo atto di osservarlo da solo).

Detto questo, se si desidera misurare la velocità, penso che non si stia utilizzando lo strumento giusto. I profiler vengono utilizzati per trovare i colli di bottiglia in un'applicazione (e per questo, non ti interessa l'impatto complessivo). Ma se si desidera eseguire il benchmark della libreria, è necessario utilizzare uno strumento di test delle prestazioni (ad esempio, ad esempio JMeter) che sarà in grado di fornire un tempo di esecuzione medio per chiamata. Otterrai risultati molto migliori e più affidabili con lo strumento giusto.

2

Il profilo non dovrebbe avere alcuna influenza sul compilatore JIT. Il codice inserito per profilare la tua applicazione rallenterà comunque i metodi.
I profillatori funzionano su diversi modelli, inseriscono il codice per vedere quanto tempo e con quale frequenza sono in esecuzione i metodi o prelevano solo campioni ripetendo ripetutamente il codice attualmente eseguito.
Il primo rallenterà un po 'il codice, mentre il secondo non è accurato al 100%, in quanto potrebbe perdere alcune chiamate di metodo.

1

Il codice di profilo è destinato a funzionare più lentamente come indicato nella maggior parte dei commenti precedenti. Direi, utilizzare la profilazione per misurare solo le prestazioni relative di varie parti del codice (ad esempio metodi). Non utilizzare le misure da un profiler come indicatore del rendimento complessivo del codice (a meno che non si desideri una misura del caso peggiore, nel qual caso ciò che si avrebbe sarebbe un valore sovrastimato).

1

Ho trovato che ottengo risultato diverso a seconda del profiler che uso. Tuttavia i risultati sono spesso validi, ma una prospettiva diversa sul problema. Qualcosa che faccio spesso quando si profila l'utilizzo della CPU è di abilitare il profiling dell'allocazione della memoria. Questo spesso mi dà risultati CPU diversi (a causa del sovraccarico causato dal profilo di memoria) e mi può dare alcuni posti utili da ottimizzare.