Suite =E0 un post que j'avais ouvert r=E9cemment, j'ai isol=E9 une curiosit=
=E9
que j'aimerais =E9claircir gr=E2ce =E0 vos remarques :
J'ai une classe m=E8re A avec une methode a() virtuelle pure, et une
methode b() normale.
Je cr=E9e une classe d=E9riv=E9e B dans laquelle je mets dans a() la m=EAme
impl=E9mentation que b().
Concr=E8tement B.a(), et B.b() font la m=EAme chose.
Je caste B en A de fa=E7on =E0 utiliser plutot A.a() et A.b()
Si j'ex=E9cute ces 2 m=E9thodes un tr=E8s grand nombre de fois, je remarque
que a() est beaucoup plus lente que b().
J'ai recréé exactement ce que je constate en mode release : a() => 3.078 sec b() => 0 sec
Dans ton exemple il est facile pour un compilateur de virer completement les appels a b() et la boucle qui ne fait donc plus rien.
ou pas. c'est facile pour son premier code, ça l'est un peu moins pour ce second qui utilise un vector<A*>.
j'ai testé son code en insérant une incrémentation de compteur global dans la méthode A::b(), le temps reste infime parce que cette méthode est non virtuelle et inliné.
En general, il faut etre *tres* prudent sur des benchmarks synthetiques, on se retrouve tres facilement a mesurer autre chose que ce qu'on cherche à mesurer.
cela reste néanmoins vrai.
Sylvain.
Jean-Marc Bourguet a écrit :
J'ai recréé exactement ce que je constate en mode release :
a() => 3.078 sec
b() => 0 sec
Dans ton exemple il est facile pour un compilateur de virer completement
les appels a b() et la boucle qui ne fait donc plus rien.
ou pas. c'est facile pour son premier code, ça l'est un peu
moins pour ce second qui utilise un vector<A*>.
j'ai testé son code en insérant une incrémentation de compteur
global dans la méthode A::b(), le temps reste infime parce que
cette méthode est non virtuelle et inliné.
En general, il faut etre *tres* prudent sur des benchmarks synthetiques,
on se retrouve tres facilement a mesurer autre chose que ce qu'on cherche
à mesurer.
J'ai recréé exactement ce que je constate en mode release : a() => 3.078 sec b() => 0 sec
Dans ton exemple il est facile pour un compilateur de virer completement les appels a b() et la boucle qui ne fait donc plus rien.
ou pas. c'est facile pour son premier code, ça l'est un peu moins pour ce second qui utilise un vector<A*>.
j'ai testé son code en insérant une incrémentation de compteur global dans la méthode A::b(), le temps reste infime parce que cette méthode est non virtuelle et inliné.
En general, il faut etre *tres* prudent sur des benchmarks synthetiques, on se retrouve tres facilement a mesurer autre chose que ce qu'on cherche à mesurer.