30 votes

Implémentations paresseuses et strictes des structures de données

Il existe une liste de structures de données ayant des implémentations paresseuses et strictes:

  • Data.Map.Lazy et Data.Map.Strict
  • Data.IntMap.Lazy et Data.IntMap.Strict
  • Data.HashMap.Lazy et Data.HashMap.Strict
  • Data.ByteString.Lazy et Data.ByteString.Strict
  • Data.Text.Lazy et Data.Text

Quelles sont les forces et les faiblesses de ces implémentations et quelles sont les règles à suivre lors du choix d'une implémentation spécifique?

26voto

Daniel Fischer Points 114146
  • Data.XYMap.Lazy et Data.XYMap.Strict

pour XY en {"", "Int", "Hash"}: L' *.Strict variante forces de l'évaluation de la mappés à des valeurs de WHNF avant qu'ils ne soient placés dans la carte.

Le gros avantage de cela est de plus en plus prévisible de l'espace et du temps, le comportement, car il est beaucoup plus difficile de construire d'énormes thunks, en particulier pour les types de la forme (ConstructorN UnboxedValueTypeN), ce qui est impossible.

L'inconvénient - je me souviens il y avait des exemples mis en place quand il a été examiné si la stricte ou paresseux variantes devrait devenir le défaut, mais je ne me souviens de rien en particulier.

Ah, juste de rappeler un cas d'utilisation: On peut faire un nœud avec l' Lazy variantes, qui est bien sûr impossible avec l' Strict versions! Donc si vous faire de telles choses: Lazy.

J'utilise l' Strict versions par défaut. Jusqu'à ce que j'ai besoin de faire des nœuds ou rencontre un autre cas d'utilisation où je considère que l' Lazy variantes supérieur, je ne sais pas quand je les utiliserais.

  • Data.(ByteString/Text).Lazy et Data.(ByteString/Text).Strict

La stricte versions utilisent un bloc monolithique de stockage de la charge utile, cela signifie que vous avez accès aléatoire rapide, pas seulement de façon séquentielle, mais aussi vers l'arrière à partir de la fin, ou de sauter en avant et en arrière.

Le paresseux versions sont fondamentalement de la tête stricte des listes de stricte des morceaux, leur force, c'est que séquentielle, leur consommation peut souvent être fait dans la constante de petite taille mémoire, ce qui est excellent si vous avez besoin de façon séquentielle de traiter des fichiers volumineux.

Pour les petits(ish) de données, certainement utiliser l' Strict variantes, pour les grandes quantités de données de la Lazy variantes si les données sont traitées (plus ou moins) de manière séquentielle.

23voto

Don Stewart Points 94361

Quelles sont les forces et les faiblesses de ces mises en oeuvre et quelles sont les règles à suivre lors du choix d'un type spécifique?

La rigueur ou de la paresse de l'plomb de type différents de la complexité des opérations particulières, ou les modes d'utilisation.

Il n'y a pas ou rapide des règles au lieu de cela, vous pourriez penser à eux tout à fait différents types de données.

Si vous insistez sur quelques lignes directrices:

  • paresseux structures de données de plus de mémoire
  • paresseux structures pour peu utilisés, de données ou lorsque vous utilisez une petite partie d'une grande structure

Et puis:

  • stricte des structures si tu fais beaucoup de mises à jour
  • stricte des structures pour la petite, données atomiques

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