Vitesse d'execution

Signaler
Messages postés
55
Date d'inscription
mardi 18 février 2003
Statut
Membre
Dernière intervention
18 mai 2004
-
Messages postés
2
Date d'inscription
mardi 26 août 2003
Statut
Membre
Dernière intervention
5 mai 2004
-
Imaginons que j'ai deux fonctions qui retourne un booleen
FctRapide() et FctLente()
FctRapide() est une fonction très rapide
FctLente() est une focntion qui met beaucoup de temps

Je voulais savoir si le temps d'excécution de ce code est plus rapide si FctRapide renvoie false

if(FctRapide())
  if (FctLente())
    //Action


Que
if(FctRapide() && FctLente())
    //Action



if(FctLente() && FctRapide())
    //Action


Est-ce lorsqu'on a les deux fonctions dans la condition, si la 1er fausse va-t-il quand même évaluer la seconde ?
Je pense, mais je demande confirmation. Donc le 1er code est plus rapide.

2 réponses

Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
84
avec &&, si la premiere condition est fausse alors il s'arrete là et n'evalue pas la seconde, comme au final le resultat sera faux

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/csref/html/vclrfandandoperator.asp

Cocoricoooooooo !!!!
Messages postés
2
Date d'inscription
mardi 26 août 2003
Statut
Membre
Dernière intervention
5 mai 2004

Si on prend le code suivant:

private void btnTest_Click(object sender, System.EventArgs e)
{
// Solution 1
if (FctRapide())
if (FctLente())
MessageBox.Show("Solution 1 vrai");
else
MessageBox.Show("Solution 1 faux");
else
MessageBox.Show("Solution 1 faux");

// Solution 2
if (FctRapide() && FctLente())
MessageBox.Show("Solution 2 vrai");
else
MessageBox.Show("Solution 2 faux");

// Solution 3
if (FctLente() && FctRapide())
MessageBox.Show("Solution 3 vrai");
else
MessageBox.Show("Solution 3 faux");
}

On obient le code MSIL suivant:
IL_0000:ldarg.0
IL_0001:call instance bool TestETLogique.Form1::FctRapide()
IL_0006:brfalse.s IL_0020
IL_0008:ldarg.0
IL_0009:call instance bool TestETLogique.Form1::FctLente()
IL_000e:brfalse.s IL_0018
IL_0010:ldarg.0
IL_0011:call instance void TestETLogique.Form1::Solution1Vrai()
IL_0016:br.s IL_001e
IL_0018:ldarg.0
IL_0019:call instance void TestETLogique.Form1::Solution1Faux()
IL_001e:br.s IL_0026
IL_0020:ldarg.0
IL_0021:call instance void TestETLogique.Form1::Solution1Faux()
IL_0026:ldarg.0
IL_0027:call instance bool TestETLogique.Form1::FctRapide()
IL_002c:brfalse.s IL_003e
IL_002e:ldarg.0
IL_002f:call instance bool TestETLogique.Form1::FctLente()
IL_0034:brfalse.s IL_003e
IL_0036:ldarg.0
IL_0037:call instance void TestETLogique.Form1::Solution2Vrai()
IL_003c:br.s IL_0044
IL_003e:ldarg.0
IL_003f:call instance void TestETLogique.Form1::Solution2Faux()
IL_0044:ldarg.0
IL_0045:call instance bool TestETLogique.Form1::FctLente()
IL_004a:brfalse.s IL_005c
IL_004c:ldarg.0
IL_004d:call instance bool TestETLogique.Form1::FctRapide()
IL_0052:brfalse.s IL_005c
IL_0054:ldarg.0
IL_0055:call instance void TestETLogique.Form1::Solution3Vrai()
IL_005a:br.s IL_0062
IL_005c:ldarg.0
IL_005d:call instance void TestETLogique.Form1::Solution3Faux()
IL_0062:ret

On en déduit que les solutions 1 et 2 seront exécutées avec la même vitesse. Mais la solution 2 nécessite moins de code pour la clause else.

Jije
C'est bien moi là-bas, dans le noir