In genere nella maggior parte dei casi saranno funzioni più carnose, non le funzioni chiamate più spesso un miliardo di volte in un ciclo.
Quando esegui il profiling basato su campioni (con uno strumento o manualmente), spesso i più grandi hotspot si trovano in piccole chiamate fogliari che fanno cose semplici, come una funzione per confrontare due numeri interi.
Questa funzione spesso non trarrà vantaggio dall'ottimizzazione, se non del caso. Per lo meno questi hotspot granulari sono raramente la massima priorità. È la funzione che chiama la funzione foglia che potrebbe essere la causa del problema, o la funzione che chiama la funzione che chiama la funzione, come un algoritmo di ordinamento sub-ottimale. Con buoni strumenti puoi eseguire il drill down da chiamata a chiamante e anche vedere chi trascorre più tempo chiamando il callee.
Spesso è un errore ossessionare i callee e non guardare i chiamanti lungo il grafico delle chiamate in una sessione di profilazione, a meno che non si stiano facendo cose molto inefficienti a livello micro. Altrimenti potresti sudare eccessivamente le piccole cose e perdere di vista il quadro generale. Solo avere un profiler in mano non ti protegge dall'ossessione per cose banali. È solo un primo passo nella giusta direzione.
Inoltre devi assicurarti di eseguire operazioni di profilazione che siano in linea con le cose che gli utenti vogliono realmente fare, altrimenti essere totalmente disciplinato e scientifico nelle tue misurazioni e benchmark è inutile dal momento che non si allinea con ciò che i clienti fanno con il prodotto. Una volta ho avuto un collega che si è sintonizzato da un algoritmo di suddivisione per suddividere un cubo in un miliardo di faccette e ne ha fatto un sacco di orgoglio ... eccetto che gli utenti non suddividono cubetti di 6 poligoni semplici in un miliardo sfaccettature. Il tutto ha rallentato fino alla corsa quando ha provato a girare su un modello di auto di produzione con oltre 100.000 poligoni da suddividere, ea quel punto non poteva nemmeno eseguire 2 o 3 livelli di suddivisione senza rallentare la scansione. In poche parole, ha scritto un codice ottimizzato per dimensioni di input irrealisticamente piccole che non sono state adattate per gestire casi di utilizzo reali, in parte perché era un brillante matematico, ma non conosceva il modo in cui gli utenti utilizzavano effettivamente il prodotto.
Devi ottimizzare casi d'uso reali allineati con gli interessi dei tuoi utenti oppure è peggio che inutile, dal momento che tutte quelle ottimizzazioni che tendono ad alterare almeno in parte la manutenibilità del codice hanno scarso vantaggio per l'utente e solo tutti quei negativi per il codice base .