85 votes

Est-ce que "SI" est cher?

Pour ma vie, je ne peux pas me souvenir de ce que notre professeur a dit exactement ce jour-là et j'espère que vous le saurez probablement.

Le module est "Structures de données et algorithmes" et il nous a dit quelque chose dans le sens de:

La déclaration if est la plus chère [quelque chose]. [quelque chose] enregistre [quelque chose].

Oui, j'ai une mémoire horrible et je suis vraiment désolée, mais je suis sur Google pendant des heures et rien ne s'est produit. Des idées?

168voto

Adam Rosenfield Points 176408

Au niveau le plus bas (dans le matériel), oui, sis sont chers. Afin de comprendre pourquoi, vous devez comprendre comment les pipelines de travail.

L'instruction à exécuter est stocké dans quelque chose de généralement appelé le pointeur d'instruction (IP) ou compteur de programme (PC); ces termes sont synonymes, mais en des termes différents sont utilisés avec des architectures différentes. Pour la plupart des instructions, le PC de la prochaine instruction est juste le PC actuel, plus la longueur de l'instruction courante. Pour la plupart des architectures RISC, les instructions sont toutes de longueur constante, de sorte que le PC peut être incrémenté par une valeur constante. Pour CDCI architectures telles que les x86, des instructions peuvent être de longueur variable, de sorte que la logique qui décode l'instruction a la figure combien de temps l'instruction courante est de trouver l'emplacement de la prochaine instruction.

Pour la branche des instructions, cependant, la prochaine instruction à être exécutée n'est pas l'emplacement suivant, après l'instruction courante. Les Branches sont gotos - ils dire que le processeur où la prochaine instruction. Les Branches peuvent être soit conditionnelle ou inconditionnelle, et l'emplacement cible peut être soit fixe ou calculée.

Conditionnel vs inconditionnel est facile à comprendre, une branche conditionnelle n'est prise que si une certaine condition est remplie (par exemple si un nombre est égal à un autre); si la branche n'est pas pris, le contrôle passe à l'instruction suivante après que la branche comme d'habitude. Pour les inconditionnels de branches, la branche est toujours pris. Les branches conditionnelles montrent en if états et les tests de contrôle de for et while boucles. Inconditionnel des branches apparaissent dans les boucles infinies, des appels de fonction, la fonction renvoie la, break et continue des déclarations, l'infâme goto déclaration, et beaucoup d'autres (ces listes sont loin d'être exhaustive).

La direction de la cible est une autre question importante. La plupart des branches ont un fixe en direction de la cible - ils accéder à un emplacement spécifique dans le code qui est fixé au moment de la compilation. Cela inclut if des déclarations, des boucles de toutes sortes, régulièrement des appels de fonction, et beaucoup plus. Calculé branches calculer la cible de la direction au moment de l'exécution. Cela inclut switch des déclarations (parfois), de retour d'une fonction, la fonction virtuelle appels et appels de pointeur de fonction.

Donc, est-ce que cela signifie pour la performance? Lorsque le processeur voit une branche de l'instruction apparaissent dans son pipeline, il a besoin de comprendre comment continuer à remplir son pipeline. Afin de comprendre ce que les instructions viennent après la direction générale dans le flux de programme, il a besoin de savoir deux choses: (1) si la direction générale seront prises et (2) l'objectif de la direction générale. Essayant de se faire est appelée direction de la prévision, et c'est un problème difficile. Si le processeur devine correctement, le programme continue à pleine vitesse. Si, au contraire, le processeur devine de façon incorrecte, il a juste passé un peu de temps de calcul quelque chose de mal. Il a maintenant pour vider son pipeline et de le recharger avec des instructions de l'exécution correcte de chemin. Bottom line: un grand gain de performance.

Ainsi, la raison pour laquelle si les déclarations sont cher est due à la branche mispredictions. C'est seulement au niveau le plus bas. Si vous écrivez du code de haut niveau, vous n'avez pas besoin de vous soucier de ces détails. Vous devez uniquement les soins à ce sujet si vous êtes à l'écriture extrêmement critiques des performances de code en C ou de l'assemblée. Si c'est le cas, l'écriture de la branche-gratuit code peut souvent être supérieure à code branches, même si plusieurs instructions sont nécessaires. Il y a quelques frais de la bit-se tourner les trucs que vous pouvez faire pour calculer des choses telles que abs(), min(), et max() sans ramification.

16voto

Joel Coehoorn Points 190579

"Cher" est un terme relatif, en particulier en relation avec un "if" énoncé, puisque vous devez également prendre en compte le coût de la condition. Qui pourrait se situer n'importe où à partir de quelques instructions du processeur pour tester le résultat d'une fonction qui appelle à une base de données distante.

Je ne serais pas s'inquiéter à ce sujet. Sauf si vous faites de la programmation embarquée, vous ne devriez pas être préoccupé par le coût de la "if " . Pour la plupart des programmeurs, c'est tout simplement pas jamais être le facteur déterminant dans les performances de votre application.

14voto

rmeador Points 15107

Branches, en particulier sur RISC architecture des microprocesseurs, sont parmi les plus élevés des instructions. C'est parce que sur de nombreuses architectures, le compilateur prédit le chemin d'exécution sera pris le plus probable et met ces instructions suivante dans le fichier exécutable, donc ils vont déjà dans le cache du PROCESSEUR lorsque la branche qui se passe. Si la direction va dans l'autre sens, il a à la faire revenir à la mémoire principale et de chercher de nouvelles instructions -- c'est assez cher. Sur de nombreuses architectures RISC, toutes les instructions sont d'un cycle à l'exception de la direction générale (qui est souvent de 2 cycles). Nous ne parlons pas d'un coût important ici, alors ne vous inquiétez pas à ce sujet. Aussi, le compilateur d'optimiser mieux que de vous faire 99% du temps :) Un de vraiment génial de choses sur l'architecture EPIC (Itanium est un exemple), c'est qu'il met en cache (et commence le traitement) des instructions, des deux côtés de la direction générale, puis les rejets de l'ensemble il n'a pas besoin une fois le résultat de la branche est connu. Cela permet d'économiser de la mémoire supplémentaire d'accès d'une architecture typique, dans le cas des branches le long de la imprévue chemin.

10voto

Parappa Points 4835

Découvrez l'article de Meilleures Performances Par Branche d'Élimination sur les Performances des Cellules. Un autre plaisir est ce post sur sans branches sélections sur le Temps Réel de Détection de Collision de Blog.

En plus des excellentes réponses déjà posté en réponse à cette question, je voudrais mettre un rappel que, bien que "si" déclarations sont considérées comme coûteuses opérations de bas niveau, essayez d'utiliser la branche-gratuit techniques de programmation à un niveau plus élevé de l'environnement, comme un langage de script ou d'une couche de logique métier (quel que soit le langage), peut être ridiculement inapproprié.

La grande majorité du temps, les programmes devraient être écrites pour la clarté de la première et optimisé pour les performances seconde. Il existe de nombreux domaines où la performance est primordiale, mais le simple fait est que la plupart des développeurs ne sont pas l'écriture de modules pour l'utilisation de profondeur dans le coeur d'un moteur de rendu ou une haute performance de simulation de la dynamique des fluides qui s'exécute pendant des semaines. Lorsque la priorité est votre solution pour "fonctionne" la dernière chose sur votre esprit est de savoir si ou non vous pouvez économiser sur les frais généraux d'une instruction conditionnelle dans votre code.

6voto

Peut-être que le branchement tue l'instruction préalable de la CPU?

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