2010-07-19 8 views
2

Existe-t-il des différences de performance entreComparaison des types de virgule flottante

float x, y; 
// Set x and y 
if(x > y) 
{ 
    // do something 
} 

et

float x,y; 
// Set x and y 
if(x.CompareTo(y) > 0) 
{ 
    // do something 
} 

Sont-ils en train de faire la même chose dans les coulisses ou est-il plus à lui. J'ai un morceau de code critique de performance qui fait cette comparaison de nombreuses fois et je voulais vérifier qu'il n'y avait pas plus de choses que je ne le pensais.

Répondre

2

Le premier sera un peu plus rapide et beaucoup plus lisible.

x > y compile en une instruction IL qui compare deux valeurs de la pile.

x.CompareTo(y) > 0 compile à un appel de méthode normale suivi d'une comparaison, ce qui sera un peu plus lent.

+1

@Brian - voir http://msdn.microsoft.com/en-us/library/74z9b11e(VS.95).aspx pour plus d'informations sur ce que fait la méthode 'CompareTo'. – ChrisF

+0

Moins le CPU doit effectuer d'opérations, mieux c'est. –

4

Ce qui suit est une remarque générale, sans tenir compte des performances. Vous devez savoir qu'il existe une légère différence entre l'utilisation de l'opérateur et la méthode IComparable. Ils sont presque faisant la même chose. La différence est lorsque vos deux valeurs sont NaN et que vous vérifiez l'égalité. Voir l'exemple suivant:

float x = float.NaN; 
float y = float.NaN; 

bool resultOperator = (x == y);    // will be false 
bool resultCompareTo = (x.CompareTo(y) == 0); // will be true(!) 

La raison de cette incohérence est que l'interface IComparable exige que x.CompareTo(x) renvoie zéro.

Questions connexes