Question

À quoi servent les fonctions ou les procédures en ligne dans Delphi (plus précisément ici, la version 2010, mais le même problème avec Turbo Delphi)?

Il existe un peu de discalimer dans l’aide qui en est faite qui peut ne pas toujours intégrer une fonction en raison de "certains critères". peu importe ce que cela signifie.

Mais j’ai constaté que les fonctions en ligne (même les plus simples comportant 3 ou 4 lignes de code) ralentissent le code au lieu de l’accélérer.

Une bonne idée serait une option du compilateur pour "tout insérer". Je me fiche de savoir si mon exe grandit de 50% environ pour le faire fonctionner plus vite.

Existe-t-il un moyen de forcer Delphi à utiliser du code réellement intégré, même s’il n’est pas décidé d’être intégré au compilateur? Cela aiderait vraiment. Sinon, vous devez effectuer une "insertion manuelle". de la réplication du code de procédure dans plusieurs zones de votre code avec des remarques telles que "// l'inlignage a échoué ici. Par conséquent, si vous modifiez les 5 lignes suivantes, modifiez-les dans les 8 autres points dupliqués où ce code existe"

.

Des conseils ici?

Était-ce utile?

La solution

Il existe une option de compilation pour l’insertion automatique de courtes routines. Dans Options de projet, sous Compilateur Delphi - > Compiler - > Génération de code, tournez "Contrôle de code inlining" à Auto. Sachez cependant que cela ne devrait concerner que la compilation, car le code en ligne est difficile à déboguer.

De plus, vous avez dit que cela ne vous dérangeait pas d'agrandir votre programme tant qu'il accélérait, mais que l'inline le ralentit souvent. Vous devez savoir que cela pourrait être lié. Plus le code compilé est volumineux, plus le nombre d'instruction en cache dans le cache d'instructions est important, ce qui ralentit l'exécution.

Si vous souhaitez vraiment accélérer votre programme, exécutez-le via un profileur. Je recommande Sampling Profiler , qui est gratuit, est conçu pour fonctionner avec le code Delphi (y compris 2010) et ne le fait pas. Ne ralentissez pas votre exécution. Il vous montrera un rapport détaillé sur le code que vous passez réellement le plus de temps à exécuter. Une fois que vous avez trouvé cela, vous pouvez vous concentrer sur les goulots d'étranglement et essayer de les optimiser.

Autres conseils

La mise en ligne peut parfois ralentir les choses. La fonction en ligne peut augmenter le nombre de registres de la CPU requis pour les variables locales. S'il n'y a pas assez de registres, les variables disponibles seront placées dans la mémoire, ce qui ralentit le processus.

Si la fonction n'est pas en ligne, tous les registres de la CPU seront disponibles (presque).

J'ai constaté que ce n'est généralement pas une bonne idée d'inclure des fonctions en ligne contenant des boucles. Ils utiliseront deux variables susceptibles de se retrouver en mémoire, ce qui ralentira le code en ligne.

Si vous souhaitez forcer l'inligne , utilisez les fichiers d'inclusion. Vous devez vous assurer de déclarer les variables correctes, puis utiliser {$ I nomfichier.inc }. Cela injectera toujours ce code spécifique là où vous le souhaitez et facilitera sa maintenance si vous devez le modifier.

N'oubliez pas que le compilateur est écrit par des personnes plus intelligentes que la plupart des simples mortels (y compris moi-même) et qu'il a accès à plus d'informations pour décider s'il est inline ou non.

Si j'ai bien compris l'un des devels du compilateur FPC (qui a le même problème), l'inligne ne peut se produire que lorsque la routine à intégrer est déjà compilée.

IOW si vous définissez l'unité avec les fonctions imbriquées comme une "feuille". unité, et mettez-le en premier dans la clause uses de votre projet (.dpr), ça devrait aller. Notez que avec " feuille " unité, je veux dire une unité qui ne dépend pas des autres unités du projet, mais uniquement des unités déjà compilées.

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

Il est également assez difficile à corriger sans violer les principes de compilation séparés.

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