44 votes

Y a-t-il une raison de ne pas utiliser le pragma INLINABLE pour une fonction?

La documentation états:

Un {-# INLINABLE f #-} pragma sur une fonction f a le comportement suivant:

  • Si INLINE dit "s'il vous plaît inline-moi", le INLINABLE dit "se sentir libre pour inline moi; utilisez votre discrétion". En d'autres termes, le choix est laissé à GHC, qui utilise les mêmes règles que pour la pragma-gratuit fonctions. Contrairement à la volée, cette décision est prise sur le site d'appel, et seront donc concernés par l'alignement du seuil, optimisation etc niveau.

  • Comme INLINE, le INLINABLE pragma conserve une copie de l'original de l'ERS pour inline fins, et persiste, c'est dans le fichier d'interface, quelle que soit la taille de la RHS.

  • Une manière d'utiliser INLINABLE est en conjonction avec la fonction spéciale en ligne (Article 7.18, "Spécial intégré dans les fonctions"). L'appel inline f essaie très dur pour inline f. Pour vous assurer que f peut être inline, c'est une bonne idée pour marquer la définition de f, comme INLINABLE, de sorte que GHC garanties pour exposer un déroulement indépendamment de la façon dont il est grand. En outre, en annotant f comme INLINABLE, vous vous assurez que f est original RHS est inline, plutôt que quel que soit aléatoire version optimisée de la f GHC l'optimiseur a produit.

  • Le INLINABLE pragma travaille également avec d'SPÉCIALISÉES: si vous marquez la fonction f comme INLINABLE, alors vous pouvez par la suite se SPÉCIALISER dans un autre module (voir la Section 7.16.8, "se SPÉCIALISENT pragma").

  • Contrairement à la volée, c'est OK pour utiliser un INLINABLE pragma sur une fonction récursive. La principale raison à le faire pour permettre de les utiliser plus tard de se SPÉCIALISER

Quel est l'inconvénient de celui-ci?

Faut-il faire des fichiers d'interface beaucoup, beaucoup plus grand? Faire la compilation beaucoup plus lent?

Est-il une raison que je ne devrais pas mettre un INLINABLE pragma sur chaque fonction exportée-je écrire? Est-il une raison de GHC ne pas mettre un INLINABLE pragma sur chaque fonction exportée-je écrire?

49voto

Simon Marlow Points 9153

Il y a trois différences entre l'utilisation de INLINABLE et non pas à l'aide d'un pragma à tous:

  • Sans INLINABLE, la définition qui va dans le fichier d'interface est le code après l'optimisation, alors qu'avec INLINABLE, c'est le code que vous avez écrit (plus ou moins). En particulier, sans INLINABLE, GHC pourrait inline autres fonctions dans la définition de la fonction.

  • Sans INLINABLE, GHC omettra la définition de l'interface de fichier si le fichier est trop gros. Si une autre fonction a obtenu incorporé dans le côté droit, ce qui pourrait facilement pousser à la limite.

  • INLINABLE s'allume aussi quelques ingénieuses machines qui automatiquement se spécialise fonctions surchargées où ils sont utilisés, et les actions spécialisées versions avec d'autres modules que transitivement importer le module dans lequel la version spécialisée a été créée.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X