82 votes

Qui est plus rapide : x << 1 ou x << 10 ?

Je ne veux pas d'optimiser quoi que ce soit, je le jure, je veux juste vous poser cette question, par curiosité. Je sais que sur la plupart des matériels, il y a une assemblée de commande de décalage de bit (par exemple, shl, shr), qui est une commande unique. Mais qu'importe (de l'ordre de la nanoseconde-sage, ou CPU-tact-sage) nombre de bits de décalage. En d'autres termes, est l'une des conditions suivantes plus rapidement sur n'importe quel CPU?

x << 1;

et

x << 10;

Et s'il vous plaît ne me déteste pas pour cette question. :)

83voto

nimrodm Points 9191

Potentiellement dépend du CPU.

Cependant, tous les processeurs modernes (x86, bras) utilisent un levier de vitesses « tonneau »--un module matériel spécifiquement conçu pour effectuer arbitraire se déplace en temps constant.

Donc en bout de ligne, c’est... non. Aucune différence.

63voto

Ben Voigt Points 151460

Certains processeurs embarqués ont seulement une instruction « shift-by-one ». Sur ces processeurs, le compilateur changerait dans .

Je pense que le Motorola MC68HCxx était une des familles plus populaires avec cette limitation. Heureusement, ces architectures sont désormais assez rares, plus maintenant inclure un levier de vitesses de Canon avec une taille de variables.

L’Intel 8051, qui compte de nombreux dérivés modernes, aussi ne peut pas déplacer un nombre arbitraire de bits.

29voto

Vovanium Points 2170

Il existe de nombreux cas.

  1. De nombreuses hi-speed MPUs ont barrel shifter, multiplexeur-comme circuit électronique qui ne aucune évolution constante de temps.

  2. Si MPU ont seulement 1 bit shift x << 10 serait normalement plus lent, il fait principalement par 10 équipes ou octet de la copie avec 2 équipes.

  3. Mais il existe un cas courant où x << 10 serait même plus rapide que d' x << 1. Si x est de 16 bits, seulement inférieur à 6 bits de il est de soins (tous les autres vont être décalées), de sorte MPU besoin de ne charger octet de poids faible, donc à faire seul accès au cycle de 8 bits en mémoire, en x << 10 besoin de deux cycles. Si l'accès du cycle est plus lente que la maj (et clair octet de poids faible), x << 10 sera plus rapide. Cela peut s'appliquer à des microcontrôleurs rapide à bord de programme ROM lors de l'accès lente de données externe RAM.

  4. Comme plus de cas 3, le compilateur peut de soins sur le nombre de bits significatifs en x << 10 et d'optimiser les opérations de faible largeur, comme le remplacement d'16x16 multiplication avec 16x8 un (octet de poids faible est toujours à zéro).

Remarque, certains microcontrôleurs ont pas de maj gauche de l'instruction à tous, ils utilisent l' add x,x à la place.

9voto

onemasse Points 2851

Sur le bras, cela peut être fait comme un effet secondaire d’une autre instruction. Donc potentiellement, il n’y a pas de latence du tout pour un d’eux.

9voto

Mike Dunlavey Points 25419

Voici mon CPU préféré, dans lequel prend deux fois aussi longue que :)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X