Ho cercato di ottimizzare un codice estremamente critico per le prestazioni (un algoritmo di ordinamento rapido che viene chiamato milioni e milioni di volte all'interno di una simulazione di monte carlo) per lo srotolamento del ciclo. Ecco il ciclo interno che sto cercando di accelerare:Quando, se mai, lo svolgimento del ciclo è ancora utile?
// Search for elements to swap.
while(myArray[++index1] < pivot) {}
while(pivot < myArray[--index2]) {}
ho cercato srotolando a qualcosa di simile:
while(true) {
if(myArray[++index1] < pivot) break;
if(myArray[++index1] < pivot) break;
// More unrolling
}
while(true) {
if(pivot < myArray[--index2]) break;
if(pivot < myArray[--index2]) break;
// More unrolling
}
questo ha fatto assolutamente nessuna differenza quindi l'ho cambiato di nuovo alla forma più leggibile. Ho avuto esperienze simili altre volte ho provato a srotolare il ciclo. Data la qualità dei predittori di ramo sull'hardware moderno, quando, se mai, lo srotolamento del ciclo è ancora un'ottimizzazione utile?
Posso chiederti perché non stai utilizzando le routine di quicksort della libreria standard? –
@Poita: Perché il mio ha alcune caratteristiche extra di cui ho bisogno per i calcoli statistici che sto facendo e sono molto ottimizzato per i miei casi d'uso e quindi meno generale ma misurabilmente più veloce della lib standard. Sto usando il linguaggio di programmazione D, che ha un vecchio ottimizzatore crappy, e per grandi matrici di float casuali, continuo a battere l'ordinamento C++ STL di GCC del 10-20%. – dsimcha