Tête de matrice en utilisant des classes pour des structures algébriques en C ++
-
13-10-2019 - |
Question
J'utilise C ++ pour coder un algorithme complexe FFT, donc je dois mettre en application ces structures algébriques comme escouades et codes Hamilton-Eisenstein. L'algorithme fonctionne avec tableau 2D de ce que des structures. Quelles seraient les frais généraux de les mettre en œuvre des classes? Une autre manière, dois-je créer le tableau avec [M] [N] dimensions qui se compose des classes Quaternion, ou devrais-je créer [M] [N] [4] tableau et travail avec [4] tableaux comme escouades? L'utilisation de classes est plus pratique, mais la création de classes M * N et accéder à leurs méthodes au lieu de travailler avec tableau juste - ce ne serait pas trop frais généraux? Je le codage de l'algorithme pour les grandes images de traitement, donc la performance est importante pour moi.
La solution
à mon humble avis vous sont mieux servis par leur mise en œuvre en cours simplement parce que cela vous permettra d'écrire votre code plus rapide avec moins d'erreurs. Vous devriez faire des mesures pour voir ce qui fonctionne mieux si cela est important pour vous, mais aussi vous assurer qu'il est en réalité ce code qui est le goulot d'étranglement. (Obligatoire : « l'optimisation prématurée est la racine de tout le mal »).
La plupart des compilateurs feront un très bon travail à l'optimisation du code pour vous, je dirais. Plus souvent qu'autrement, je trouve qu'il est autre chose que ces choses de bas niveau qui font la différence, comme l'ajout d'un début de sortie test ou réduisant au minimum l'ensemble de données ou tout le reste.
Pour un quaternion, vous pouvez toujours mettre en œuvre la classe en utilisant un réseau interne (en cas qui est en fait plus rapide), ce qui devrait faire la différence encore moins importante.
Vous êtes probablement mieux servi par exemple faire en sorte que vous pouvez exécuter vos algorithmes en parrallèle sur multicœurs machines ou faire vos calculs réels utilisent des instructions SSE.
Autres conseils
En ce qui concerne les frais généraux des classes. À moins que vos classes ont des fonctions virtuelles, il n'y a pas de pénalité pour l'utilisation des classes
Ainsi, par exemple, un tableau de variables complexes peut être écrit:
std::complex<double> m[10][10];
Méfiez-vous des classes de collection STL, cependant, car ils ont tendance à utiliser l'allocation dynamique et parfois introduire des frais généraux importants (à savoir, je ne voudrais pas faire des tableaux en utilisant vector< vector<> >
.
Vous voudrez peut-être enquêter sur l'utilisation d'une bibliothèque, comme Eigen rapide, optimisé, les classes matrice / vecteur.