Muy pocos desarrolladores de software científico entienden los buenos principios de diseño, por lo que me disculpo si esta respuesta es un poco larga. Desde una perspectiva de ingeniería de software, el objetivo del desarrollador científico de software es diseñar una solución que satisfaga un conjunto de restricciones que a menudo son conflictivas .
Estos son algunos ejemplos típicos de estas restricciones, que podrían aplicarse al diseño de su biblioteca de matriz dispersa:
- Completado en un mes
- Se ejecuta correctamente en su computadora portátil y varias estaciones de trabajo
- Corre eficientemente
Los científicos gradualmente están prestando más atención a otros requisitos comunes de la ingeniería de software:
- Documentación (guía del usuario, tutorial, comentarios de código)
- Mantenibilidad (control de versiones, pruebas, diseño modular)
- Reutilización (diseño modular, "flexibilidad")
Es posible que necesite más o menos de uno de estos requisitos. Si está tratando de ganar un premio Gordon Bell por su desempeño, incluso las fracciones de un porcentaje son relevantes, y pocos de los jueces evaluarán la calidad de su código (siempre que pueda convencerlos de que es correcto). Si está tratando de justificar la ejecución de este código en un recurso compartido, como un clúster o una supercomputadora, con frecuencia debe defender las afirmaciones sobre el rendimiento de su código, pero rara vez son muy estrictas. Si está tratando de publicar un artículo en una revista que describa las ganancias de rendimiento de su enfoque, entonces necesita ser legítimamente más rápido que sus competidores, y el 20% de rendimiento es una compensación que con mucho gusto haría para una mejor mantenibilidad y reutilización.
Volviendo a su pregunta, el "buen diseño", con suficiente tiempo de desarrollo, nunca debería sacrificar el rendimiento. Si el objetivo es crear un código que se ejecute lo más rápido posible, entonces el código debe diseñarse en torno a esas restricciones. Puede usar técnicas como la generación de código, el ensamblaje en línea o aprovechar las bibliotecas altamente ajustadas para ayudarlo a resolver su problema.
Pero, ¿qué pasa si no tienes suficiente tiempo de desarrollo? ¿Qué es lo suficientemente bueno? Bueno, depende, y nadie podrá darle una buena respuesta a esta pregunta sin más contexto.
FWIW: Si realmente está interesado en escribir núcleos de matriz dispersos de alto rendimiento, debe compararlo con una instalación PETSc optimizada y trabajar con su equipo si los supera, estarán encantados de incorporar núcleos ajustados a la biblioteca.