E 'facile eseguire la scansione del codice di byte per chiamate di funzione e iniettare chiamate start/stop timer?
O è davvero difficile ed è per questo la gente paga per gli strumenti per fare questo?
Iniezione di chiamate è abbastanza difficile che gli strumenti sono necessari per farlo.
non solo è difficile, è un modo molto indiretto, per trovare i colli di bottiglia. Il motivo è che un collo di bottiglia è uno o un piccolo numero di istruzioni nel codice che sono responsabili di una buona percentuale di tempo speso, tempo che potrebbe essere ridotto in modo significativo - cioè non è veramente necessario, cioè è uno spreco. SE puoi dire il tempo medio compreso di una delle tue routine (compreso il tempo di IO), e SE puoi moltiplicarlo di quante volte è stato chiamato, e dividere per il tempo totale, puoi dire quale percentuale di tempo il la routine prende. Se la percentuale è piccola (come il 10%) probabilmente avete problemi più grandi altrove. Se la percentuale è maggiore (come dal 20% al 99%) si potrebbe avere un collo di bottiglia all'interno della routine. Quindi ora devi fare all'interno della routine per questo, guardando le cose che chiama e quanto tempo loro prendere. Inoltre, si vuole evitare di essere confusi dalla ricorsione (il bugaboo dei grafici delle chiamate).
Ci sono profiler (come Zoom per Linux, Shark, &) che funzionano su un principio diverso. Il principio è che c'è uno stack di chiamate di funzioni e durante tutto il tempo che una routine è responsabile (sia che lavori o aspetti che altre routine eseguano il lavoro richiesto) è nello stack. Quindi, se è responsabile per il 50% del tempo (diciamo), allora è il tempo che è in pila, indipendentemente da quante volte è stato chiamato, o quanto tempo è occorso per chiamata. Non solo la routine è in pila, ma anche le linee specifiche di codice che costano il tempo sono in pila. Non hai bisogno di cercarli. Un'altra cosa che non ti serve è la precisione della misurazione. Se si prendessero 10.000 campioni di stack, le linee colpevoli sarebbero misurate a 50 +/- 0,5 percento. Se si prendessero 100 campioni, sarebbero misurati come 50 +/- 5 percento. Se si prendessero 10 campioni, sarebbero misurati come 50 +/- 16 percento. In ogni caso li trovi, e questo è il tuo obiettivo. (E la ricorsione non ha importanza. Tutto ciò significa che una determinata linea può apparire più di una volta in un campione di pila.)
Su questo argomento, c'è molta confusione. In ogni caso, i profiler che sono più efficaci nel trovare i colli di bottiglia sono quelli che campionano lo stack, in tempo di wall-clock, e riferiscono percentuale per riga. (Questo è facile da vedere se certi myths about profiling sono messi in prospettiva.)
fonte
2011-04-28 15:33:33
Aspetto Jon Skeet. –
Questo articolo ha molte buone informazioni: http://msdn.microsoft.com/en-us/magazine/cc301725.aspx. Anche http://msdn.microsoft.com/en-us/library/bb384547.aspx –
Generalmente molti profiler prendono istantanee molto frequenti dello stack per vedere dove si trova attualmente. Quindi costruiscono statistiche usando quelle istantanee. Naturalmente c'è la netta possibilità che questo non sia il caso di C#, quindi prendilo con un pizzico di sale. –