many how hashtags haskell containers

haskell - how - Implementaciones perezosas vs Estrictas de estructuras de datos



instagram hashtags in comments (2)

Hay una lista de estructuras de datos que tienen implementaciones estrictas y perezosas:

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

¿Cuáles son las fortalezas y debilidades de esas implementaciones y cuáles son las reglas a seguir al elegir una específica?


¿Cuáles son las fortalezas y debilidades de esas implementaciones y cuáles son las reglas a seguir al elegir una específica?

El rigor o la pereza del tipo conducen a una complejidad diferente de operaciones particulares o modos de uso.

No hay reglas estrictas o rápidas; en cambio, le gustaría pensar en ellas como tipos de datos completamente diferentes.

Si insistes en algunas pautas:

  • Estructuras perezosas para datos más grandes que la memoria.
  • estructuras perezosas para datos de uso poco frecuente o cuando se utiliza una pequeña parte de una estructura grande

Y entonces:

  • Estructuras estrictas si haces muchas actualizaciones.
  • Estructuras estrictas para pequeños, datos atómicos.

  • Data.XYMap.Lazy y Data.XYMap.Strict

para XY en {"", "Int", "Hash"} : La variante *.Strict fuerza la evaluación de los valores asignados a WHNF antes de que se coloquen en el mapa.

La gran ventaja de eso es un comportamiento más predecible del espacio y el tiempo, ya que es mucho más difícil crear enormes thunk, especialmente para los tipos de formulario ( ConstructorN UnboxedValueTypeN ), eso es imposible.

La desventaja: recuerdo que surgieron ejemplos cuando se discutió si las variantes estrictas o perezosas deberían convertirse en las predeterminadas, pero no recuerdo nada en particular.

Ah, acabo de recordar un caso de uso: ¡Uno puede hacer un nudo con las variantes Lazy , eso es, por supuesto, imposible con las versiones Strict ! Así que si haces esas cosas: Lazy .

Yo uso las versiones Strict por defecto. Hasta que necesite unir nudos o encontrar otro caso de uso en el que considere que las variantes Lazy superiores, no sé cuándo las usaría.

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

Las versiones estrictas usan una porción monolítica de almacenamiento para la carga útil, lo que significa que tiene un acceso aleatorio rápido, no solo secuencialmente, sino también hacia atrás desde el final, o saltando de un lado a otro.

Las versiones perezosas son básicamente listas estrictas para la cabeza de fragmentos estrictos, su fuerza es que el consumo secuencial de las mismas a menudo se puede realizar en una memoria pequeña y constante, lo que es excelente si necesita procesar secuencialmente archivos grandes.

Para datos pequeños (ish), definitivamente use las variantes Strict , para datos enormes las variantes Lazy si los datos se procesan (más o menos) de forma secuencial.