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;
}
- Juez en línea de Esfera (SPOJ): ¿Por qué el siguiente código da como resultado TLE? Quiero saber cómo se puede optimizar mi código para evitarlo.
- ¿Es posible implementar dos pilas usando una matriz?
- ¿Qué debo hacer si no soy bueno en el desarrollo de backend o en los algoritmos, debería enfocarme en UI / UX?
- ¿Qué es una búsqueda ternaria?
- ¿Qué programas pueden determinar las instrucciones de plegado de origami para una forma tridimensional dada?
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.