2013-08-11 13 views
6

Sono un neofita del profiling di Ruby, e sembra che ruby-prof sia una scelta popolare. Ho appena installato la gemma e invocato il mio programma:Come faccio a convincere ruby-prof a ignorare i metodi core/gemma/core standard di Ruby?

ruby-prof ./my-prog.rb 

Tuttavia, l'uscita è incredibilmente dettagliato, in quanto i dati di profilazione per tutto il nucleo Ruby e metodi di libreria standard, e altre gemme sono inclusi. Ad esempio, le prime tre linee sono:

8.79  0.011  0.010  0.000  0.001  3343 *String#% 
7.28  0.078  0.009  0.000  0.069  2068 *Array#each 
4.93  0.038  0.006  0.000  0.032  1098 *Array#map 

Questo non è informazioni a distanza utile per me, dato che ho già sapere che le mie offerte di programma con le stringhe e array molto, e presumibilmente quelle classi hanno già avuto l'inferno ottimizzato fuori di loro. Mi interessa solo gli hotspot nel codice my.

Ho provato alcune delle altre modalità della stampante, ad es. -p graph_html e -p call_stack, ma hanno tutti lo stesso problema.

vedo che ruby-prof supporta alcuni eliminazione metodo e semplificazione:

-x, --exclude regexp    exclude methods by regexp (see method elimination) 
-X, --exclude-file file   exclude methods by regexp listed in file (see method elimination) 
    --exclude-common-cycles  make common iterators like Integer#times appear inlined 
    --exclude-common-callbacks make common callbacks invocations like Integer#times appear 

, ma non sembra essere un modo ovvio per ottenere ciò che voglio veramente, che è data profiling per il mio codice solo , cioè con il tempo trascorso all'interno del codice da Ruby core/stdlib, e altre gemme vengono contate solo come il tempo trascorso all'interno del mio codice.

Una volta mi rendo conto che il mio codice ha un metodo foo che è un collo di bottiglia a causa di essere chiamato migliaia di volte e non funziona bene, allora e solo voglio vedere la ripartizione del tempo trascorso tra il mio codice e codice core/libreria chiamato all'interno di quel particolare metodo.

Non riesco a capire perché questa non è una funzione standard, poiché mi aspetterei che sia quello che tutti vogliono fare: prima creare il profilo del proprio codice e poi una volta esauriti gli elementi da ottimizzare, potenzialmente inizia a ottimizzare le gemme che usi e magari anche il core/stdlib di Ruby. Cosa mi manca?

risposta

0

Si consiglia di profilo e benchmark tramite test. Minitest lo consente nel proprio framework di test. In questo modo puoi concentrarti su comportamenti specifici per ottenere i tuoi tempi.

Disponibile in Ruby 2.0 o Gem per Ruby 1.9 e versioni precedenti.

Per quanto riguarda la profilatura allo stesso modo, require 'profile' e utilizzarlo per gli stessi test.

Questo blog post dettagli come fare questo, non credo sia cambiato molto.

+0

Grazie per la risposta, ma la mia suite di test è già stata scritta in RSpec.Darò il 'profile' a go, ma quel blog sembra mostrare che soffre esattamente dello stesso problema dei metodi di libreria che inquinano i risultati. –

+0

Sì, sicuramente non è una corrispondenza esatta per una risposta, ma potrebbe avvicinarti. E per quanto riguarda l'utilizzo di RSpec, vedere come l'hanno fatto in minitest può darti qualche indizio. RSpec è solo Ruby, aprilo e modificalo ... e magari invia una funzionalità! – vgoff

2

Sono d'accordo che questo è un grosso problema con ruby-prof. Ho preferito preferire perftools.rb. Si integra con gperftools e supporta vari focus and ignore options, insieme a report grafici che sono superiori per comprendere rapidamente hotspots and their call trees.

Con ruby-prof, è anche possibile provare a esportare il formato KCacheGrind e utilizzare lo KCacheGrind Viewer per l'analisi. Ha un certo numero di modalità di visualizzazione e facilita il filtraggio ad hoc e l'esplorazione dei risultati.

Problemi correlati