Rolling up loop.
Seriamente, l'ultima volta che avevo bisogno di fare qualcosa di simile era in una funzione che richiedeva l'80% del tempo di esecuzione, quindi valeva la pena provare a micro-ottimizzare se potessi ottenere un notevole aumento delle prestazioni.
La prima cosa che ho fatto è stato di arrotolare il ciclo. Questo mi ha dato un aumento di velocità molto significativo. Credo che questa fosse una questione di località cache.
La prossima cosa che ho fatto è stato aggiungere uno strato di riferimento indiretto e inserire un po 'di logica nel loop, che mi ha permesso di scorrere solo le cose di cui avevo bisogno. Questo non era un aumento di velocità, ma valeva la pena farlo.
Se si esegue un'ottimizzazione micro, è necessario avere un'idea ragionevole di due elementi: l'architettura che si sta effettivamente utilizzando (che è molto diversa dai sistemi con cui sono cresciuto, almeno per i micro- scopi di ottimizzazione) e cosa farà il compilatore per te.
Molte delle tradizionali micro-ottimizzazioni scambiano spazio per il tempo. Oggigiorno, usare più spazio aumenta le possibilità di perdere la cache, e ci sono le tue prestazioni. Inoltre, molti di questi sono ora realizzati da compilatori moderni, e in genere migliori di quanto sia probabile che li facciano.
Attualmente, è necessario (a) un profilo per vedere se è necessario eseguire l'ottimizzazione micro, e quindi (b) provare a scambiare il calcolo per lo spazio, nella speranza di conservare il più possibile nella cache. Infine, esegui alcuni test, così sai se hai migliorato le cose o le hai rovinate. I moderni compilatori e chip sono troppo complessi per poter mantenere un buon modello mentale e l'unico modo per sapere se l'ottimizzazione funziona o meno è testare.
fonte
2009-02-27 16:45:34
"... di quanto puoi." <- caso generale. In alcuni casi specifici (come algoritmi, DSP, ecc.) Un essere umano può codificare una routine C che sembra essere piuttosto strana, ma una volta compilata genera un assembly migliore per lo scopo specifico rispetto al compilatore. –
Principalmente dovuto, tuttavia, al fatto che anche le ottimizzazioni del compilatore ottimizzano solo determinati tipi di ottimizzazione e sezioni più piccole di codice ottimizzato. Una volta compreso il compilatore e l'assembly, è possibile ottimizzare a mano pezzi di codice molto più grandi che il compilatore non potrebbe rendere migliori. –
... ma sto dividendo i capelli: poche persone avrebbero mai avuto bisogno di farlo. È divertente vedere come un compilatore ha trasformato una sezione di codice in assembly - alcune delle ottimizzazioni del compilatore sono in realtà abbastanza intricate e dispari finché non lo si studia davvero. –