He intentado optimizar un código extremadamente preciso para el rendimiento (un algoritmo de ordenamiento rápido que se llama millones y millones de veces dentro de una simulación de monte carlo) al desenrollarlo. Aquí está el bucle interno que estoy tratando de acelerar:¿Cuándo, si alguna vez, el bucle sigue siendo útil?
// Search for elements to swap.
while(myArray[++index1] < pivot) {}
while(pivot < myArray[--index2]) {}
me trataron desenrollando a algo como:
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
}
Esto hizo absolutamente ninguna diferencia, así que cambió de nuevo a la forma más fácil de leer. He tenido experiencias similares otras veces que he intentado desenrollar loop. Dada la calidad de los predictores de bifurcaciones en el hardware moderno, ¿cuándo, si alguna vez, el bucle se está desenrollando sigue siendo una optimización útil?
¿Puedo preguntar por qué no está utilizando las rutinas de biblioteca estándar de la biblioteca rápida? –
@Poita: Porque los míos tienen algunas características adicionales que necesito para los cálculos estadísticos que estoy haciendo y están muy afinados para mis casos de uso y, por lo tanto, son menos generales pero más rápidos que la lib estándar. Estoy usando el lenguaje de programación D, que tiene un viejo optimizador de mierda, y para grandes matrices de flotantes aleatorias, aún así vencí al género C++ STL de GCC en un 10-20%. – dsimcha