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?
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. –
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