2010-11-14 109 views
-1

Quelle opération devrait être plus rapide sur un processeur x86 sous Linux et quelles sont les différences moyennes (en%):division entière vs double division - question d'optimisation

unsigned int x, y, z; 
x = y/z; 

ou:

double x, y, z; 
x = y/z; 

Le opération sur double sera exécutée par la FPU et la CPU peut continuer à d'autres commandes. Est-ce correct? Cela dépend-il des indicateurs de compilation (j'utilise gcc avec le drapeau -O3)?

+5

Ce sont deux opérations différentes avec des résultats différents, et très rarement, voire jamais, interchangeables. Est-ce important si X est légèrement plus rapide que Y si vous ne pouvez pas passer à l'alternative plus rapide? – delnan

+0

+1 à ci-dessus. et pour l'auteur .. faire un lot et l'exécuter sur un vm let; s dire aussi voir les résultats. – sdadffdfd

+1

pourquoi ne pas simplement l'essayer? –

Répondre

3

Si votre travail est intrinsèquement basé sur des entiers, les conversions int-float et float-int peuvent ruiner les performances. La conversion par défaut de C (troncature) peut être particulièrement lente sur les anciennes puces Intel. En dehors de cela, il y a des problèmes d'exactitude avec votre idée et c'est probablement une raison suffisante pour ne pas le faire.

0

Une instruction de division en virgule flottante individuelle prendra plus d'un entier. Cependant, si vous faites beaucoup de choses à la suite, ils atteindront à peu près le même taux, en raison du pipelining (sur un x86 moderne, au moins).

Oh, et oui, la CPU peut continuer avec d'autres opérations pendant que la FPU est occupée.

0

Les opérations intégrales sont généralement plus rapides que leur contrepartie à virgule flottante. La différence dépend principalement du matériel: certaines plates-formes n'ont même pas de FPU.

Une telle opération simple ne devrait pas dépendre du tout de votre système d'exploitation ou des drapeaux du compilateur: il devrait s'agir d'instructions d'assemblage simples.

Le meilleur moyen de connaître la quantité d'opérations à effectuer est de vérifier le manuel d'assemblage de votre plate-forme ou d'exécuter un benchmark.

+1

Dans certains cas, tels que les x86 32 bits modernes, les indicateurs de compilation peuvent avoir de l'importance: SSE (gcc '-mfpmath = sse') peut être un moyen plus rapide de faire des virgules flottantes. Avec 64 bits, c'est généralement par défaut. Attention: les conventions d'appel peuvent entraîner une incompatibilité ou de mauvaises performances avec des options autres que celles par défaut. – jilles