Saltar al contenido

¿Por qué la multiplicación de matrices en .NET es tan lenta?

Ya no tienes que investigar más por otros sitios porque llegaste al lugar justo, tenemos la solución que necesitas pero sin liarte.

Solución:

Con matrices grandes como esta, la memoria caché de la CPU se convierte en el factor limitante. Lo que es muy importante es cómo se almacena la matriz. Y el código de referencia está comparando manzanas y naranjas. El código C++ usaba arreglos irregulares, el código C# usa arreglos bidimensionales.

La reescritura del código C# para usar matrices irregulares también duplicó su velocidad. Reescribiendo el código de multiplicación de matrices para evitar el array la verificación del límite del índice parecía inútil, nadie usaría un código como este para problemas reales.

Para explicar el origen de la idea de que las operaciones de matriz XNA son lentas:

En primer lugar, está el truco para principiantes: el XNA Matrix de clase operator* Hará varias copias. Esto es más lento de lo que cabría esperar del código C++ equivalente.

(Por supuesto, si usas Matrix.Multiply()entonces puede pasar por referencia).

La segunda razón es que .NET Compact Framework utilizado por XNA en Xbox 360 no tiene acceso al hardware VMX (SIMD) que está disponible para los juegos C++ nativos.

Es por eso que sigues escuchando que es lento, al menos. Como puede ver en los puntos de referencia que publicó, en realidad no es tan “lento”, cuando compara manzanas con manzanas.

Claramente, el autor de referencia no entendió la diferencia entre matrices irregulares y multidimensionales en C#. Realmente no fue una comparación de manzanas con manzanas. Cuando cambié el código para usar arreglos irregulares en lugar de arreglos multidimensionales para que funcione de una manera más similar a Java, entonces el código C# termina ejecutándose el doble de rápido… lo que lo hace más rápido que Java (aunque apenas y eso es probablemente Estadísticamente insignificante). En C#, las matrices multidimensionales son más lentas porque implica un trabajo adicional para encontrar el array ranura y porque el array el control de límites no se puede eliminar para ellos… todavía.

Consulte esta pregunta para obtener un análisis más profundo de por qué las matrices multidimensionales son más lentas que las matrices irregulares.

Consulte este blog para obtener más información sobre array comprobación de límites. El artículo advierte específicamente contra el uso de arreglos multidimensionales para la multiplicación de matrices.

Comentarios y valoraciones del post

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *