2010-10-14 16 views
0

Lequel de ces serait plus rapide pour une méthode statique appelée milliards de fois par nanoseconde:C# double condition de performance

Méthode 1:

static bool DualConditional(int value) 
{ 
    return A(value) && B(value); 
} 

Méthode 2:

static bool DualConditional(int value) 
{ 
    if(!A(value) 
     return false; 

    if(!B(value) 
     return false; 
} 
+1

Pouvez-vous vraiment exécuter une méthode "milliards de fois par nanoseconde"? –

+1

Pas du tout, cette ligne était une exagération voulue. – bufferz

+5

Vous avez déjà écrit le code dans les deux sens, alors ** essayez-le et voyez **. C'est la seule façon d'obtenir une réponse fiable à "qui est le plus rapide?" des questions. –

Répondre

7

Ils devraient tous deux être identiques.

La première court-circuitera et retournera si A() est faux.

Le premier est également beaucoup plus facile à lire et à comprendre. Même si la performance était légèrement pire, j'utiliserais ce code. La micro-optimisation prématurée n'a aucune valeur quand la lisibilité est sacrifiée.

+0

Merci pour la clarification! C'est une optimisation post-mature, désespérée: D – bufferz

2

&& courts-circuits, ce qui signifie que le côté droit n'est évalué que si le côté gauche passe, dans ce cas. Alors oui,

return A(value) && B(value);

est l'quivalent approximative de

if (A(value)) 
    if (B(value)) 
    return true; 

return false; 
2

Est-ce que le compilateur C# tourner Method1 en Method2 automatiquement

Pas

et ignorer B() si A() est faux?

Oui

En général, le code comme

return A(value) && B(value); 

est plus rapide que

if(!A(value) 
    return false; 

if(!B(value) 
    return false; 

Parce que la première variante peut être converti en code x86 qui n'utilise des sauts .

Par exemple dans le code:

private static bool B_1(int value) 
    { 
     return value < 5; 
    } 

    private static bool B_2(int value) 
    { 
     if (value < 5) 
      return true; 
     else 
      return false; 
    } 

Pour B_1 C# généré un code x86 légèrement plus rapide que pour B_2.

Dans cette situation particulière, je dirais que cela dépend de A() et B(). Je l'exécuterais sous profiler pour voir lequel est le plus rapide.

+0

Merci d'avoir ajouté des détails en plus de ce que d'autres ont écrit ci-dessus. Un aperçu de l'exécution 64 bits? – bufferz

+1

La même chose est vraie pour x64. Je viens de vérifier.La première version B_1 enregistre un saut conditionnel. Donc c'est un peu plus rapide. – Max