Aunque la cuestión mencionada C++, que implementa la matriz 3x3 multiplicación C = A * B en C# (.NET 4.5) y ejecutó algunas pruebas básicas de tiempo en mi máquina Windows 7 de 64 bits con optimizaciones. 10.000.000 multiplicaciones tomó cerca de
- 0,556 segundos con una aplicación ingenua y
- 0,874 segundos con el código Laderman de la otra respuesta.
Curiosamente, el código de laderman era más lento que el ingenuo. No investigué con un generador de perfiles, pero creo que las asignaciones adicionales son más costosas que algunas multiplicaciones adicionales.
Parece que los compiladores actuales son lo suficientemente inteligentes como para hacer esas optimizaciones para nosotros, lo cual es bueno. Aquí está el código ingenua he usado, por su interés:
public static Matrix3D operator *(Matrix3D a, Matrix3D b)
{
double c11 = a.M11 * b.M11 + a.M12 * b.M21 + a.M13 * b.M31;
double c12 = a.M11 * b.M12 + a.M12 * b.M22 + a.M13 * b.M32;
double c13 = a.M11 * b.M13 + a.M12 * b.M23 + a.M13 * b.M33;
double c21 = a.M21 * b.M11 + a.M22 * b.M21 + a.M23 * b.M31;
double c22 = a.M21 * b.M12 + a.M22 * b.M22 + a.M23 * b.M32;
double c23 = a.M21 * b.M13 + a.M22 * b.M23 + a.M23 * b.M33;
double c31 = a.M31 * b.M11 + a.M32 * b.M21 + a.M33 * b.M31;
double c32 = a.M31 * b.M12 + a.M32 * b.M22 + a.M33 * b.M32;
double c33 = a.M31 * b.M13 + a.M32 * b.M23 + a.M33 * b.M33;
return new Matrix3D(
c11, c12, c13,
c21, c22, c23,
c31, c32, c33);
}
donde Matrix3D es una estructura inmutable (de sólo lectura campos dobles).
Lo difícil es llegar a una válida referencia , donde se mide el código y no es así, lo que el compilador hizo con su código (depurador con un montón de material extra, o optimizado sin su código real ya que el resultado nunca fue usado). Por lo general, trato de "tocar" el resultado, de manera que el compilador no puede eliminar el código bajo prueba (por ejemplo, verifique los elementos de la matriz para la igualdad con 89038.8989384 y throw, si es igual). Sin embargo, al final ni siquiera estoy seguro de si el compilador hackeó esta comparación :)
"... podríamos esperar que el rendimiento de un compilador moderno supere las diferencias de los algoritmos?" ¿Por qué no probarlo? Codifique los dos, ejecútelos cada 1000 veces y compare los tiempos de ejecución. – AndyPerfect
La respuesta general a esa pregunta es "no". Los algoritmos inteligentes todavía se necesitan en el mundo. – phs
@phs: responda a la pregunta en el título, o a la pregunta justo encima de la nota? Ellos son opuestos. – MSalters