2010-05-13 7 views
4

Prenons un exemple simple de deux lignes qui font soi-disant la même chose:Syntaxe C ou syntaxe optimisée binaire?

si (valeur> = 128 || valeur < 0) ...

ou

si (valeur & ~ 127) ...

Dites 'If' sont coûteux dans une boucle de milliers d'itérations, est-il préférable de conserver la syntaxe C traditionnelle ou mieux de trouver un optimisé binaire si possible?

+2

Qu'est-ce que l'estimation va accomplir? Profilez-le et découvrez-le. Si tu devais acheter une voiture, devinerais-tu celle que tu préfères ou est-ce que tu essaierais de les voir? Cela dit, utilisez le premier: c'est plus lisible, et c'est ce qui compte. Les compilateurs sont mieux à l'optimisation alors vous; vous écrivez le code, ils font le binaire. – GManNickG

+4

Ces instructions ne sont pas équivalentes. – ergosys

+0

Cela fonctionne avec la puissance de deux seulement, mais c'est juste un exemple où l'utilisation du code binaire pourrait être plus rapide que ce que le compilateur ferait. – Dpp

Répondre

3

Je voudrais utiliser la première instruction avec la syntaxe traditionnelle car elle est plus lisible. Il est possible de briser les yeux avec la deuxième déclaration.

Attention aux programmeurs qui utiliseront le code après vous.

3

Dans 99 cas sur 100, choisissez celui qui est le plus lisible et exprime le mieux vos intentions.

1

En théorie, les compilateurs feront ce genre d'optimisation pour vous. En pratique, ils pourraient ne pas. Cet exemple particulier est un peu subtil, car les deux ne sont pas équivalents, sauf si vous faites des suppositions sur value et si l'arithmétique signée est le complément de 2 sur votre plate-forme cible.

Utilisez ce que vous trouvez le plus lisible. Si et quand vous avez des preuves que la performance de ce test particulier est critique, utilisez ce qui vous donne les meilleures performances. Personnellement, je ne serais probablement écrire:

if ((unsigned int)value >= 96U) 

parce que c'est plus intuitif pour moi, et plus susceptibles d'être bien traités par la plupart des compilateurs j'ai travaillé.

+0

Vous avez raison sur la partie pratique, ils ne sont généralement pas trop optimisés, même en -o3, c'est pourquoi j'ai posé la question. Avec des milliers d'itérations, la différence peut être énorme. Je ne vois pas le point de l'unsigned dans cet exemple cependant? – Dpp

+0

@Dpp: Si 'value' est un' int', alors toute valeur négative deviendra plus grande que 96 quand elle est convertie en 'unsigned int', donc cela supprime le besoin d'un test séparé pour <0. – caf

+0

Ho ouais, en raison du 8e bit mis à 1, je l'aime! Et puis le pré-compilateur pourrait mieux l'optimiser! – Dpp

1

Cela dépend de comment/où la vérification est. Si la vérification est effectuée une seule fois pendant le démarrage du programme pour vérifier le paramètre de la ligne de commande, alors le problème de performance est complètement discutable et vous devriez utiliser ce qui est plus naturel. D'un autre côté, si la vérification était à l'intérieur d'une boucle interne qui se produit des millions de fois par seconde, alors cela peut avoir de l'importance. Mais ne supposez pas que l'on sera meilleur; vous devriez créer les deux versions et les chronométrer pour voir s'il y a une différence mesurable entre les deux.