OVH Cloud OVH Cloud

test et style

13 réponses
Avatar
Laurent Deniau
Y aurait-il une quelleconque raison pour que

if (A) {
if (B) {
[...]
}
}

soit plus lent ou plus rapide que

if (A && B) {
[...]
}

ou A et B sont deux expressions booleennes non-constantes.

Idem pour:

while(A) {
if (B) {
[...]
}
}

et

while(A && B) {
[...]
}

A priori je dirais non, mais est-ce que qqchose m'aurait echappe?

a+, ld.

3 réponses

1 2
Avatar
Laurent Deniau
Laurent Coustet wrote:
Laurent Deniau wrote:

Y aurait-il une quelleconque raison pour que

if (A) {
if (B) {
[...]
}
}

soit plus lent ou plus rapide que

if (A && B) {
[...]
}



A priori je dirais non, mais est-ce que qqchose m'aurait echappe?



Il suffit de regarder la différence dans la sortie assembleur crashée
par le compilateur.

Et on constate qu'il sagit exactement du même code généré!


Merci, mais je parlais de ce que autorise la norme. Regarder
l'assembleur, c'est specifique a un compilateur pour un ensemble d'options.

a+, ld.


Avatar
DINH Viêt Hoà

Y aurait-il une quelleconque raison pour que

if (A) {
if (B) {
[...]
}
}

soit plus lent ou plus rapide que

if (A && B) {
[...]
}

ou A et B sont deux expressions booleennes non-constantes.


ma compilation naïve des 2 blocs ci-dessus :

1.
cmp a, 0
goto_if_equal label1;
cmp b, 0
goto_if_equal label2;
[...]
label2:
label1:


2.
c = a & b
cmp c, 0
goto if_equal label1;
[...]
label1:


on a des ordres de grandeurs d'exécution sans doute similaire mais on
peut donc très bien imaginer des choses un peu différentes surtout dans
l'évaluation de A && B.

On peut très bien imaginer :

cmp a, 0
goto_if_equal label1
a = 1
label1:
cmp b, 0
goto_if_equal label2
b = 1
label2:
c = a & b

--
DINH V. Hoa,

"emacs, c'est génial" -- Arsunique

Avatar
Antoine Leca
In news:, DINH Viêt Hoà va escriure:
if (A && B) {
[...]
}

ou A et B sont deux expressions booleennes non-constantes.


2.
c = a & b
cmp c, 0
goto if_equal label1;
[...]
label1:


Non. Tu n'as pas le droit d'évaluer b avant d'avoir déterminer que a est
non-nul (OK, en fait c'est plutôt, tu n'as pas le droit de rendre visible
les effets de bord de l'évaluation de b).
Donc tu es obligé de créer un code qui ressemble plus à ton autre schéma
(éval a, test si nul, éval b etc.)


Antoine


1 2