Le plus rapide ? if x. if y imbriqués ou if x et y ?
Bonjour
Savez-vous quel est le plus rapide en éxécution ? La différence est-elle significative ou négligeable ?
Code:
1 2 3 4 5 6
|
if machin then
if truc then
' traitement
endif
endif |
ou
Code:
1 2 3 4
|
if (machin and truc) then
traitement
endif |
Si la réponse dépend du langage alors j'irai poser cette question sur le forum DOTNET (je bosse en vb.net)
Merci
Re: Le plus rapide ? if x. if y imbriqués ou if x et y ?
Citation:
Envoyé par jennings
Savez-vous quel est le plus rapide en éxécution ? La différence est-elle significative ou négligeable ?
Ca dépend de beaucoup de choses... En fait, la question que tu te poses pourrait être reformulée ainsi : "Est-il rentable de ne pas faire d'évaluations booléennes complètes ?", et la réponse est en général "Oui".
Donc, cette forme est en moyenne et en général (j'insiste bien sur ces deux mots !!) plus efficace :
Code:
1 2 3 4 5
| if machin then
if truc then
' traitement
endif
endif |
En fait, j'utilise ce genre de choses lorsque je n'ai pas envie (ou que je ne me rappelles plus) l'ordre d'évaluation d'une condition, ou que je veux forcer une évaluation tronquable même dans les langages qui ne le supportent pas.
Cependant, si tu veux gagner du temps à ce niveau, plusieurs facteurs sont à prendre en compte :
- Les tests ne doivent pas, si possible, avoir de clauses "else" : ça complexifie l'arrangement manuel des expressions.
- Il faut connaître la probabilité "être faux" de chaque condition, et tester la plus fréquente en premier.
- Il faut connaître le temps de calcul, même approximatif, de chaque condition, et tester la plus lente en dernier.
- Il faut connaître l'interdépendance des conditions entre elles, et bien sûr ne pas tester une dépendance avant son prérequis.
- Il faut savoir combien de fois est exécuté le test général : si c'est une seule fois dans le programme, laisse le test tranquille. Si c'est 200 fois par milliseconde, ça devient rentable.
On peut pousser plus avant si tu en as besoin, mais je pense que tu t'es déjà rendu compte que ça demandait des calculs de probas, de vitesse d'exécution et de nombre d'exécutions... Bref, ça ne s'optimise pas "comme ça".
Pour la même raison, le gain est extrêmement variable... Ca peut être 0.3 ns de gain (ridicule), ou 200 ms (rentable), tout dépend de tes conditions, de leur temps de calcul et de leur probabilité d'être évaluées "fausses".
Mais surtout, comprends bien que c'est un gain moyen : sur certains tests (les plus nombreux si tu l'as bien fait), ce sera un gain, mais ce sera toujours une perte lorsque toutes les conditions seront vraies !! Tu comprends donc bien l'intérêt des probabilités !
:arrow: chicorico Un saut conditionnel non-exécuté ne coûte que très très peu de cycles CPU, car on ne vide pas le pipeline d'exécution. Ton exemple n'est valide que parceque ce sont deux variables, avec un seul test "simple". Essaie avec "a And (Not(b))", ou transforme "b" en appel de fonction et ce sera la première méthode la plus rapide.
Entre parenthèses, pour l'instruction de saut, on écrit plutôt "jz" (Jump if Zero) plutôt que "je" (Jump if Equal), c'est plus mnémotechnique, même si l'opcode généré est le même.