¿Cuál es la mejor optimización de código con menos líneas?

El ejemplo clásico que viene a la mente es la multiplicación de matrices. Primero, la implementación ingenua:

const int size = 1000;

int main (int argc, const char * argv []) {
auto a = new int [tamaño] [tamaño];
auto b = new int [tamaño] [tamaño];
auto c = new int [tamaño] [tamaño];
para (auto i = 0; i <tamaño; ++ i)
para (auto j = 0; j <tamaño; ++ j)
para (auto k = 0; k <tamaño; ++ k)
c [i] [j] + = a [i] [k] * b [k] [j];
devuelve 0;
}

Compilando con la bandera -03 en mi MacBook Pro, esto tardó aproximadamente 1 segundo en ejecutarse. Tenga en cuenta que la lectura de b [k] [j] dará como resultado un error de caché [1] ya que solo el índice final de la matriz es contiguo. Simplemente cambiando jyk producirá una aceleración considerable asegurándose de que b [k] [j] permanezca en el caché.

const int size = 1000;

int main (int argc, const char * argv []) {
auto a = new int [tamaño] [tamaño];
auto b = new int [tamaño] [tamaño];
auto c = new int [tamaño] [tamaño];
para (auto i = 0; i <tamaño; ++ i)
para (auto k = 0; k <tamaño; ++ k)
para (auto j = 0; j <tamaño; ++ j)
c [i] [j] + = a [i] [k] * b [k] [j];
devuelve 0;
}

Esto tomó aproximadamente 0.3 segundos, una aceleración 3x al no hacer nada más que cambiar el orden del bucle.

[1] Tendrás que asegurarte de que tus matrices sean lo suficientemente grandes como para desbordar tu caché L3.

Al calcular el cierre transitivo de un gráfico muy escaso utilizando el algoritmo Floyd-Warshall.

Cambio de

para (int k = 0; k para (int i = 0; i para (int j = 0; j if (gráfico [i] [k] && gráfico [k] [j])
gráfico [i] [j] = verdadero;

a

para (int k = 0; k para (int i = 0; i si (gráfico [i] [k])
para (int j = 0; j si (gráfico [k] [j])
gráfico [i] [j] = verdadero;

redujo el tiempo de ejecución en un factor de 1000 en un gráfico con N = 10000 nodos.

Esto sucede mucho en las consultas de la base de datos.

A menudo, agregar un índice, o simplemente un predicado crucial de DONDE en una unión que permita que la consulta use un índice o clave existente, puede cambiar el plan de ejecución y convertir una exploración de tabla que lleva horas o peor en una exploración de índice que lleva milisegundos.

More Interesting

¿Cómo funcionan los algoritmos de clasificación en un sistema distribuido grande?

¿Cómo debo hacer uso de sitios como HackerEarth y GeeksforGeeks si tengo habilidades de algoritmos por debajo del promedio?

¿Alguien puede ayudarme a resolver el problema SPOJ "Consulta en un árbol" (QTREE)?

¿Cuáles son algunos conceptos que debo saber antes de aprender programación dinámica?

Me resultó difícil entender los algoritmos de clasificación. ¡Cuando profundizo en los algoritmos, siento que mi mente se bloquea! ¿Qué debo hacer para sentirme cómodo con los algoritmos?

Cómo superar y comprender el algoritmo / código de otras personas

Cómo organizar y buscar un árbol de búsqueda binario donde cada nodo tiene más de un campo de datos

Cómo fusionar tres matrices ordenadas en una sola matriz ordenada de manera eficiente

¿Cuál es la solución a la siguiente relación de recurrencia: [matemáticas] T (n) = 3T (n-1) - 7T (n-2) + 9T (n-3) [/ matemáticas], con las siguientes condiciones iniciales: [ matemática] T (0) = 1 [/ matemática], [matemática] T (1) = 6 [/ matemática], [matemática] T (2) = 7 [/ matemática]. ¿Qué es una expresión para [math] T (n) [/ math] de modo que no haya términos [math] T (i (\ frac {n} {j}) ^ {k}) [/ math] a la derecha ¿lado?

¿Cuál es la mejor manera de ordenar una matriz de objetos en javascript?

¿Cuál de los siguientes libros es más adecuado para principiantes y más fácil de entender: CLRS o Algorithms by Sedgewick?

¿Cómo se implementa la cola prioritaria en C ++? ¿Cómo se hace usando STL?

Si [matemática] f (n) [/ matemática] [matemática] \ en O (n) [/ matemática] y [matemática] g (n) \ en O (n) [/ matemática], es [matemática] f ( g (n)) \ en O (n ^ 2)? [/ matemáticas]

Cómo ordenar la matriz de tipos primitivos en orden descendente en Java

¿Cuáles son algunos algoritmos favoritos que los usuarios de Quora crearon por sí mismos?