46 votes

Comment écrivez-vous des structures de données aussi efficaces que possible dans GHC?

Alors, parfois, j'ai besoin d'écrire une structure de données je ne peux pas trouver sur le Hackage, ou ce que je trouve n'est pas testé ou la qualité des assez pour me faire confiance, ou c'est juste quelque chose que je ne veux pas être une dépendance. Je suis de lecture Okasaki du livre en ce moment, et c'est assez bon pour expliquer comment la conception asymptotiquement rapides des structures de données.

Cependant, je suis en train de travailler spécifiquement avec GHC. Des facteurs constants sont un gros problème pour mes applications. L'utilisation de la mémoire est également un gros problème pour moi. Donc, j'ai des questions spécifiquement sur GHC.

En particulier

  • Comment maximiser le partage de nœuds
  • Comment réduire l'empreinte mémoire
  • Comment éviter l'espace fuites dues à une mauvaise rigueur/la paresse
  • Comment obtenir GHC pour produire serré intérieure boucles d'importantes sections de code

J'ai regardé autour de divers endroits sur le web, et j'ai une vague idée de la façon de travailler avec GHC, par exemple, à base de sortie, à l'aide de UNPACK pragmas, et la comme. Mais je ne suis pas sûr de l'obtenir.

J'ai donc sauté ouvrir mon préféré des structures de données de la bibliothèque, les conteneurs, et regardé les Données.La séquence du module. Je ne peux pas dire que je comprends beaucoup de ce qu'ils font pour faire Seq rapide.

La première chose qui attire mon oeil est la définition de l' FingerTree a. Je suppose que c'est juste moi d'être familier avec le doigt les arbres. La deuxième chose qui attire mon oeil est tout l' SPECIALIZE pragmas. J'ai aucune idée de ce qui se passe ici, et je suis très curieux, car ce sont éparpillées dans le code.

De nombreuses fonctions ont également un INLINE pragma associés avec eux. Je peux deviner ce que cela signifie, mais comment puis-je rendre une décision sur le moment d' INLINE fonctions?

Les choses deviennent vraiment intéressantes autour de la ligne ~475, une section headered comme "Applicative de la Construction". Ils définissent un newtype wrapper pour représenter l'Identité monade, ils écrivent leur propre copie du strict de l'état monade, et ils ont une fonction définie appelés applicativeTree qui, apparemment, est spécialisé sur l'Identité monade, ce qui augmente le partage de la sortie de la fonction. Je n'ai aucune idée de ce qui se passe ici. Ce rituel est utilisé pour augmenter de partage?

De toute façon, je ne suis pas sûr qu'il y a beaucoup à apprendre de Données.La séquence. Existe-il d'autres modèle de la "programmes", je peux lire à acquérir la sagesse? J'aimerais vraiment savoir comment à soupe de mes structures de données quand j'ai vraiment besoin d'eux pour aller plus vite. Une chose en particulier est écrit structures de données qui font de fusion facile, et comment aller sur l'écriture d'une bonne fusion des règles.

41voto

Don Stewart Points 94361

C'est un grand sujet! La plupart a été expliqué ailleurs, je ne vais pas essayer d'écrire un chapitre de livre ici. Au lieu de cela:

  • Real World Haskell, ch 25, "Performance" - explique le profilage, simple spécialisation et de déballage, de la lecture de Base, et quelques optimisations.

Johan Tibell est écrit beaucoup de choses sur ce sujet:

Et certaines choses à partir d'ici:

Et quelques autres choses:

13voto

sclv Points 25335

applicativeTree est tout à fait de fantaisie, mais surtout d'une manière qui a à voir avec FingerTrees en particulier, qui sont tout à fait de fantaisie structure de données eux-mêmes. On a eu quelques discussions de la complexité de plus en cstheory. Notez que applicativeTree est écrit pour fonctionner sur tout Applicative. Il se trouve que quand il est spécialisé pour Id alors qu'il peut partager des nœuds d'une manière qui autrement ne le pouvait pas. Vous pouvez travailler par le biais de la spécialisation par vous-même en inline l' Id méthodes et de voir ce qui se passe. Notez que cette spécialisation est utilisé dans un seul endroit-le O(log n) replicate fonction. Le fait que la plus générale de la fonction se spécialise parfaitement à la constante de cas est un très habile peu de réutilisation de code, mais c'est vraiment tout.

En général, Sequence apprend plus sur la conception de l'persistante des structures de données que sur toutes les astuces pour eeking à la performance, je pense. Enfile les suggestions sont bien sûr excellent. Je voudrais aussi il suffit de parcourir par le biais de la source de la vraiment canonique et à l'écoute libs -- Map, IntMap, Set, et IntSet en particulier. Avec ceux, sa peine de prendre un coup d'oeil à Milan papier sur son amélioration à conteneurs.

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