Question

Vous écrivez une fonction et, si vous regardez l'assemblage obtenu, vous constaterez qu'elle peut être améliorée.

Vous souhaitez conserver la fonction que vous avez écrite pour plus de lisibilité, mais vous souhaitez remplacer votre propre assemblage par celui du compilateur. Existe-t-il un moyen d'établir une relation entre votre fonction de langage très dynamique et le nouvel assemblage?

Était-ce utile?

La solution

Si vous regardez l’assemblage, il est raisonnable de supposer que vous comprenez bien comment le code est compilé. Si vous avez cette connaissance, alors il est parfois possible d '«inverser» les modifications dans la langue d'origine, mais il vaut souvent mieux ne pas vous déranger.

Les optimisations que vous effectuez sont susceptibles d’être très faibles par rapport au temps et aux efforts nécessaires pour effectuer ces modifications. Je suggérerais que vous laissiez ce genre de travail au compilateur et que vous alliez prendre une tasse de thé. Si les modifications sont importantes et que les performances sont essentielles (comme dans le monde intégré), vous voudrez peut-être mélanger le code normal à l'assemblar d'une manière ou d'une autre. Cependant, sur la plupart des ordinateurs et des puces, les performances sont généralement suffisantes pour éviter ce mal de tête.

Si vous avez vraiment besoin de plus de performances, optimisez le code et non l'assembly.

Autres conseils

Aucun, je suppose. Vous avez rejeté le travail du compilateur en faveur du vôtre. Vous pouvez également supprimer la fonction que vous avez écrite dans le langage compilé, car vous ne disposez plus que de votre assembleur dans cette plate-forme.

Je vous conseillerais vivement de ne pas vous engager dans ce type d'optimisation car, à moins d'être certain, via le profilage et l'analyse, que vous faites réellement une différence.

Cela dépend de la langue dans laquelle vous avez écrit votre fonction. Certaines langues, comme le C, sont de bas niveau, traduisant chaque appel de fonction ou instruction en instruction d'assemblage spécifique. Si vous avez utilisé C, vous pouvez remplacer votre fonction par un assemblage en ligne pour améliorer les performances.

D'autres langages de haut niveau peuvent convertir chaque instruction en routines de macros ou autres appels plus complexes du côté assemblage. Certaines optimisations (telles que la récursion de la queue, le déroulement de boucle, etc.) peuvent être facilement implémentées côté source, mais d’autres (telles que l’utilisation plus efficace du fichier de registre) peuvent être impossibles (encore une fois, en fonction du langage et du compilateur utilisé). utilisant).

Il est difficile de dire qu’il existe une relation entre l’assemblage modifié et le source qui a généré la version non modifiée. Cela confondra certainement les outils de débogage: le contenu du registre ne correspondra plus aux variables source auxquelles ils étaient censés correspondre.

Il existe un certain nombre d'endroits dans le code de traitement de paquets où j'ai examiné l'assemblage généré et que je suis revenu en arrière pour modifier le code source d'origine afin d'améliorer le résultat. La réorganisation de la source peut réduire le nombre de branches, __attribute__ et les arguments du compilateur peuvent aligner les points de branche et les fonctions pour réduire les I $ manquants. Dans des cas désespérés, un petit assemblage en ligne peut être utilisé, de sorte que le binaire puisse toujours être compilé à partir du source.

Vous pouvez essayer de séparer votre fonction d'origine dans son propre fichier et de fournir une règle de création pour construire l'assembleur à partir de là. Mettez ensuite à jour le fichier assembleur avec votre version améliorée et fournissez une règle de création pour créer un fichier objet à partir du fichier assembleur. Puis modifiez vos règles de lien pour inclure ce fichier d'objet.

Si vous ne modifiez que le fichier assembleur, il continuera à être utilisé. Si vous modifiez jamais le fichier de langue d'origine de niveau supérieur, le fichier d'assembleur sera reconstruit et le fichier d'objet généré à partir de la nouvelle version (non améliorée).

Cela vous donne une relation entre les deux; vous souhaiterez probablement ajouter un commentaire d'avertissement en haut du fichier de langue de niveau supérieur pour avertir du comportement. Utiliser une forme de VCS vous permettra de récupérer le fichier assembleur amélioré si vous faites une erreur ici.

Si vous écrivez une application compilée native dans Visual C ++, il existe deux méthodes:

  1. Utilisez le bloc __ asm {} et écrivez votre assembleur.
  2. Ecrivez vos fonctions dans MAS. assembleur, assemblez-le en .obj et reliez-le en tant que bibliothèque statique. Dans votre code C / C ++, déclarez la fonction avec une déclaration extern "" & C ".

D'autres compilateurs C / C ++ ont des approches similaires.

Dans cette situation, vous avez généralement deux options: optimiser le code ou réécrire le compilateur. Je ne vois pas où briser le lien entre la source et l'op serait la bonne solution.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top