Question

Étant donné que vous essayez d'optimiser uniquement pour la vitesse, ce sont de bons heuristiques pour décider si inline une fonction ou non? Il est évident que la taille du code devrait être important, mais qu'il ya d'autres facteurs généralement utilisés lorsque (par exemple) ou gcc cpi est de déterminer si inline un appel de fonction? Y at-il eu des travaux universitaires importants dans la région?

Était-ce utile?

La solution

Wikipedia a quelques paragraphes à ce sujet, avec quelques liens en bas:

  • En plus des problèmes de taille de la mémoire cache et, Une autre considération est la pression de registre . « Peut consommer des registres supplémentaires, et dans une zone où la pression de registre est déjà élevé ce qui peut forcer les renversements, ce qui provoque des accès RAM supplémentaires les variables ajoutées de la procédure inline. » Du point de vue du compilateur

Langues avec compilateurs JIT et le chargement des classes d'exécution ont d'autres compromis puisque les méthodes virtuelles ne sont pas connues statiquement, mais le JIT peut recueillir des informations de profilage d'exécution, tels que la fréquence d'appel de méthode:

  • Conception, mise en œuvre et l'évaluation des Optimisations dans un Just-in -Temps compilateur (pour Java) parle de méthode inline de méthodes statiques et des classes chargées dynamiquement et ses améliorations sur les performances.

  • JUDO: Java pratique Sous Optimisations dynamique affirme que leur « politique inline est basée sur la taille du code et des informations de profilage. Si la fréquence d'exécution d'une entrée de la méthode est inférieure à un certain seuil, la méthode est donc pas en ligne car il est considéré comme une méthode froide. Pour éviter une explosion de code, nous n'inline pas une méthode avec une taille de bytecode de plus de 25 octets.... Pour éviter inline le long d'une chaîne d'appel profonde, inline arrêts lorsque la taille inline bytecode accumulée le long de la chaîne d'appel dépasse 40 octets « . Bien qu'ils aient des informations de profilage d'exécution (méthode fréquence d'appel), ils sont toujours soin d'éviter les grandes fonctions inline ou des chaînes de fonctions pour éviter le ballonnement.

Une recherche sur Google Scholar révèle un certain nombre de documents, tels que

Autres conseils

Un appel de fonction implique un code supplémentaire (le prologue de la fonction, où le nouveau cadre de pile est mis en place et la fonction épilogue, où il est nettoyé). Si votre compilateur voit que le code de fonction est faible par rapport au prologue et épilogue, il peut décider qu'il ne vaut pas pour faire un appel réel, et la fonction inline.

Le seul avantage que je vois d'appeler une fonction au lieu de inline il est lié à la taille. Je suppose que inline une fonction puis une boucle de déroulement peut entraîner une augmentation de taille significative.

pour autant que j'ai vu, la taille de la fonction est le seul facteur de compilateurs utilisés pour déterminer en ligne. Cependant, si vous le profil de l'optimisation guidée (PGO), je crois que le compilateur est capable d'utiliser d'autres variables, telles que le nombre d'appels / appels temps d'installation.

Dans .NET est principalement basée sur la taille. Mesurer la taille de la fonction parent et la fonction des enfants en octets compilés. Ensuite, mesurer la taille de la fonction combinée. Si la fonction combinée est plus petite, alors inline est une bonne idée.

La raison pour cela est de permettre de fourrer le plus de code dans le cache de la CPU que possible. Cache sont misses beaucoup plus chers que les appels de fonction dans les processeurs modernes.

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