Quand est-assemblage plus rapide que le C?

L'une des raisons pour connaître l'assembleur, c'est que, à l'occasion, il peut être utilisé pour écrire du code qui sera plus performant que d'écrire ce code dans un langage de niveau plus élevé, C en particulier. Cependant, j'ai aussi entendu il dit à plusieurs reprises que, même si c'est pas entièrement faux, le cas où l'assembleur peut fait être utilisé pour générer plus de code performant sont à la fois extrêmement rares et requièrent une expertise et une expérience de l'assemblée.

Cette question n'a même pas entrer dans le fait que les instructions de l'assembleur sera spécifique à la machine et non portable, ou l'un des autres aspects de l'assembleur. Il ya beaucoup de bonnes raisons pour savoir assemblée d'ailleurs celui-ci, bien sûr, mais c'est censé être une question spécifique de la sollicitation d'exemples et de données, pas une extension de discours sur l'assembleur versus langues de plus haut niveau.

Quelqu'un peut-il fournir certains des exemples précis de cas où l'assemblée sera plus rapide que le bien-écrit le code en C à l'aide d'un compilateur moderne, et pouvez-vous soutenir cette affirmation avec le profilage des données probantes? Je suis assez confiant sur le fait que ces cas existent, mais je veux vraiment savoir exactement comment ésotérique de ces cas, car il semble être un point de discorde.

  • Et maintenant, une autre question serait approprié: Quand est-ce le fait que l'assembleur est plus rapide que C effectivement des questions?
  • L'une des plus grandes questions que j'ai vu. Merci Adam!
  • Comme quelqu'un juste au début pour apprendre l'asm, je trouve les réponses à cette question très utile.
  • en fait, il est tout à fait banale pour améliorer le code compilé. N'importe qui avec une solide connaissance du langage assembleur et C peut le voir en examinant le code généré. Tout facile est la première performance de la falaise vous tombez d'lorsque vous exécutez hors de jetables registres dans la version compilée. En moyenne, le compilateur va faire beaucoup mieux qu'un homme pour un gros projet, mais il n'est pas difficile dans une taille convenable du projet pour trouver des problèmes de performances dans le code compilé.
  • En fait, la réponse courte est: Assembleur est toujours le plus rapide ou égale à la vitesse de C. La raison en est que vous pouvez avoir de l'assemblée sans C, mais vous ne pouvez pas avoir C sans montage (dans la forme binaire, qui nous l'ancien des jours "code machine"). Cela dit, la réponse est: les Compilateurs C sont assez bon dans l'optimisation et la "pensée" à propos de choses que vous n'avez pas l'habitude de penser, donc cela dépend vraiment de vos compétences, mais normalement, vous pouvez toujours battre le compilateur C; il est encore seulement un logiciel qui ne peut pas penser et d'avoir des idées. Vous pouvez aussi écrire à l'assembleur portable si vous utilisez des macros et vous êtes patient.
  • Je suis en total désaccord que les réponses à cette question doivent être "opinion fondée" - ils peuvent tout à fait objectif - il n'est pas quelque chose comme essayer de comparer les performances de l'animal de compagnie préféré des langues, dont chacune a des points forts et des inconvénients. C'est une question de comprendre dans quelle mesure les compilateurs peuvent nous prendre, et à partir de quel moment il est préférable de prendre le dessus.
  • Il n'est même pas toujours le cas que vous avez besoin de réécrire quelque chose dans l'assemblage de récolter les avantages de la connaissance de l'assemblée. Simplement recompiler votre C de l'algorithme dans diverses formes et en observant l'assemblée que le compilateur génère va vous permettre d'écrire plus efficace du code en C.
  • Pour un ésotérisme exemple, de faire une recherche sur le web pour pclmulqdq crc. pclmulqdq est une assemblée spéciale de l'instruction. L'optimisation des exemples d'utilisation environ 500 lignes de code assembleur. Certains X86 ont également un crc32c instruction pour un cas spécifique de crc32. Les résultats d'un Benchmark pour générer crc32 de plus de 256 MO (256*1024*1024) tableau d'octets: c code à l'aide de la table => 0.516749 sec, assemblage à l'aide de pcmuldq => 0.0783919 sec, code c à l'aide de crc32 intrinsèque => 0.0541801 sec.
  • Plus tôt dans ma carrière, j'ai écrit beaucoup de C et mainframe assembleur à une société de logiciels. Un de mes camarades était ce que j'appellerais un "assembleur puriste" (tout devait être assembleur), de sorte que je parie que lui, je pourrais écrire une routine qui courait plus vite en C que ce qu'il a pu écrire en assembleur. J'ai gagné. Mais pour couronner le tout, après j'ai gagné, je lui ai dit que je voulais un deuxième pari - que je pourrais écrire quelque chose de plus rapide dans l'assembleur que le programme C qui l'a battu sur l'état de la mise. Je ne vais que trop, prouvant que la plupart de la compétence et de la capacité du programmeur plus de anythings d'autre.
  • À moins que votre cerveau a une -O3 drapeau, vous êtes probablement mieux de laisser l'optimisation du compilateur C 🙂