Très peu de développeurs de logiciels scientifiques comprennent les bons principes de conception, je m'excuse donc si cette réponse est un peu longue. Du point de vue de l'ingénierie logicielle, l'objectif du développeur de logiciels scientifiques est de concevoir une solution répondant à un ensemble de contraintes souvent conflictuelles .
Voici quelques exemples typiques de ces contraintes, qui pourraient être appliqués à la conception de votre bibliothèque matricielle clairsemée:
- Terminé en un mois
- Fonctionne correctement sur votre ordinateur portable et plusieurs postes de travail
- Fonctionne efficacement
Les scientifiques accordent progressivement plus d'attention à certaines autres exigences courantes de l'ingénierie logicielle:
- Documentation (guide de l'utilisateur, tutoriel, commentaire de code)
- Maintenabilité (contrôle de version, test, conception modulaire)
- Réutilisation (conception modulaire, "flexibilité")
Vous devrez peut-être plus ou moins l'une de ces exigences. Si vous essayez de gagner un prix Gordon Bell pour la performance, même des fractions de pour cent sont pertinentes, et peu de juges évalueront la qualité de votre code (tant que vous pourrez les convaincre que c'est vrai). Si vous essayez de justifier l'exécution de ce code sur une ressource partagée telle qu'un cluster ou un supercalculateur, vous devez souvent défendre des affirmations sur les performances de votre code, mais celles-ci sont rarement très strictes. Si vous essayez de publier un article dans un journal décrivant les gains de performance de votre approche, vous devez légitimement être plus rapide que vos concurrents, et 20% de performances sont un compromis que je ferais avec plaisir pour une meilleure maintenabilité et réutilisation.
Pour en revenir à votre question, un «bon design», avec suffisamment de temps de développement, ne doit jamais sacrifier les performances. Si l'objectif est de rendre le code qui s'exécute aussi vite que possible, alors le code doit être conçu autour de ces contraintes. Vous pouvez utiliser des techniques telles que la génération de code, l'assemblage en ligne ou profiter de bibliothèques hautement optimisées pour vous aider à résoudre votre problème.
Mais que faire si vous n'avez pas assez de temps de développement? Qu'est-ce qui est assez bon? Eh bien, cela dépend, et personne ne pourra vous donner une bonne réponse à cette question sans plus de contexte.
FWIW: Si vous êtes vraiment intéressé à écrire des noyaux à matrice clairsemée hautes performances, vous devriez comparer avec une installation PETSc optimisée et travailler avec leur équipe si vous les battez, ils seraient heureux d'incorporer des noyaux accordés à la bibliothèque.