6
votes

Delphi 2010 Inlinge inliny inlassement?

Quel est le go avec des fonctions ou des procédures d'inlinage à Delphi (spécifiquement v2010 ici, mais j'avais le même problème avec Turbo Delphi)?

Il y a un peu de discalme dans l'aide à ce sujet peut ne pas toujours aligner une fonction en raison de "certains critères" quel que soit ce que cela signifie.

Mais j'ai constaté que les fonctions d'inlinage généralement (même très simples qui ont 3 ou 4 lignes de code) ralentit le code plutôt que de la vitent.

Une bonne idée serait une option de compilateur de "tout inine". Je m'en fiche si mon exe grandit de 50% environ pour le faire fonctionner plus rapidement.

Y a-t-il une façon de forcer Delphi à un code vraiment en ligne, même s'il n'est pas décidé d'être injuste par le compilateur? Cela aiderait vraiment. Sinon, vous devez faire "l'allusion manuelle" de reproduire le code de procédure dans plusieurs zones de votre code avec des remarques telles que "// l'inlinge a échoué ici, donc si vous modifiez les 5 lignes suivantes, changez-les dans les 8 autres points en double que ce code existe "

Toute astuce ici?


0 commentaires

4 Réponses :


12
votes

Il y a une option de compilateur pour l'affranchissement automatique des routines courtes. Dans Options de projet, sous Delphi Compiler -> Compilation -> Génération de code, Tourner "Contrôle de l'inlinge de code" sur Auto. Sachez cependant que cela ne devrait être que sur une version de libération, car le code inliné est difficile à déboguer.

En outre, vous avez dit que cela ne vous dérange pas de faire votre programme plus grand aussi longtemps que cela devient plus rapide, mais que souvent l'affranchissement le rend plus lent. Vous devriez être conscient que cela pourrait être associé. Plus votre code compilé est important, plus vous aurez des caches d'instructions que vous aurez, qui ralentit l'exécution.

Si vous voulez vraiment accélérer votre programme, passez-le à travers un profileur. Je recommande Profiler d'échantillonnage , qui est gratuit, est fait fonctionner avec Delphi Code (y compris 2010) et n'a pas t ralentir votre exécution. Il vous montrera un rapport détaillé sur le code que vous dépensez le plus de temps en cours d'exécution. Une fois que vous avez trouvé cela, vous pouvez vous concentrer sur les goulots d'étranglement et essayer de les optimiser.


1 commentaires

Code Inlining Control Set sur Auto n'a pas aidé. Le profileur d'échantillonnage est génial. Très serviable dans montrant où les goulots d'étranglement sont dans de vraies statistiques. Même si cela m'a vraiment montré ce que je suis déjà nouveau. Il sera utile à l'avenir à coup sûr. Merci.



4
votes

L'inlinisation peut rendre les choses plus lentes dans certains cas. La fonction inlinette peut augmenter le nombre de registres de la CPU requis pour les variables locales. S'il n'y a pas assez de registres disponibles variables disponibles dans la mémoire, ce qui le rend plus lent.

Si la fonction n'est pas inline, elle aura (presque) tous les registres de la CPU disponibles.

J'ai trouvé que c'est que ce n'est généralement pas une bonne idée de fonctions en ligne contenant des boucles. Ils utiliseront quelques variables susceptibles de se retrouver en mémoire, ralentissant le code inliné.


2 commentaires

L'augmentation du nombre d'octets requis pour exécuter un certain algorithme, utilisera également plus le cache de la CPU. Dans de rares cas, cela pourrait également avoir un effet.


Lars +1 - sauf que ce n'est pas si rare.



2
votes

Si vous voulez Force Inlining , utilisez également les fichiers. Vous devez vous assurer de déclarer les variables correctes, puis utilisez {$ i fichier fichier.inc }. Cela injectera toujours ce code spécifique juste où vous le souhaitez et facilitera la maintenance si vous devez le changer.

Gardez à l'esprit que le compilateur est écrit par des personnes plus intelligentes, puis la plupart des méritaux (y compris moi-même) et ont accès à plus d'informations lorsqu'ils décident d'en ligne ou non, alors quand cela n'a probablement pas la bonne raison.


0 commentaires

0
votes

Si j'ai compris l'un des développements du compilateur FPC (qui a le même problème) correctement, l'affranchissement ne peut se produire que lorsque la routine à faire en ligne était déjà compilée.

Iow si vous faites de l'unité avec les fonctions inlined-to-être une unité "feuille", et mettez-la comme première dans la clause utilisée de votre projet (.DPR), cela devrait être correct. Notez qu'avec l'unité "feuille", je veux dire une unité qui n'a pas de dépendance sur d'autres unités du projet, Iow uniquement sur des unités déjà compilées.

Je ne serais pas surpris que c'était la même chose à Delphi, car il partage un système unitaire basé sur les mêmes principes.

Il est également assez insensible sans violer des principes de compilation distincts.


0 commentaires