Bonjour,
Je suis en train actuellement de coder une classe vectoriel en utilisant les expressions templates, et histoire de voir ce que ça donnait, j'ai fait quelques comparaisons avec une classe template mais sans expression template (une classe codé plus naïvement on va dire), et avec boost::ublas, parceque j'étais curieux de voir ce que ça allait donner.
Alors que je m'attendais à ce que ublas ridiculise carrément ma classe, ça a été tout le contraire, et je pense qu'il y a un problème quelque part.
Mon compilo est la dernière version de GCC (3.4.2 je crois), et l'IDE Code::Blocks. Je compile le programme en mode release, avec les options Optimize Fully (for speed) et Expensive Optimizations et les optimisations de l'architecture CPU Athlon XP d'activées.
Pour mesurer, j'utilise QueryPerformanceCounter et QueryPerformanceFrequency. Je fais 10 séries de cent mille du calcul v1 = v2 + v3 + v1, et voici ce que j'obtient comme performance :
boost : 0.888361
moi : 0.0229465
classe "naïve" : 0.10339
En relançant plusieurs fois l'applicaiton j'obtient en gros les mêmes résultats donc il ne doit pas trop y avoir de mises en cache, et sinon l'execution confirme les résultats, lorsqu'il fait les calculs de boost, on voit que c'est plus beaucoup plus lent. J'ai aussi vérifié que les résultats soient identiques à la fin.
Voici comment j'utilise boost::ublas :
Donc si quelqu'un s'en serait déjà servi, où si ce n'est pas tellement dans ce genre d'applications que boost::ublas est efficace, j'en sais rien
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 boost::numeric::ublas::vector <double> A (3); A(1) = 1.0, A(2) = 1.0, A(0) = 1.0; boost::numeric::ublas::vector <double> B (3); B(1) = 2.0, B(2) = 2.0, B(0) = 2.0; boost::numeric::ublas::vector <double> C (3); C(1) = 3.0, C(2) = 3.0, C(0) = 3.0; for (size_t i = 0 ; i != 10 ; ++i) { for (size_t j = 0 ; j != 100000 ; ++j) { A = C+B+A; } }![]()
Partager