Vitesse d'execution

redpooka Messages postés 55 Date d'inscription mardi 18 février 2003 Statut Membre Dernière intervention 18 mai 2004 - 8 mars 2004 à 11:39
cs_jije Messages postés 2 Date d'inscription mardi 26 août 2003 Statut Membre Dernière intervention 5 mai 2004 - 5 mai 2004 à 23:57
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

cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
8 mars 2004 à 14:33
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 !!!!
0
cs_jije Messages postés 2 Date d'inscription mardi 26 août 2003 Statut Membre Dernière intervention 5 mai 2004
5 mai 2004 à 23:57
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
0
Rejoignez-nous