Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Complexité du polymorphisme

21 réponses
Avatar
Gégé
Salut,

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().

Est-ce un r=E9sultat attendu ?

Merci

G

1 réponse

1 2 3
Avatar
Sylvain SF
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.



cela reste néanmoins vrai.

Sylvain.
1 2 3