2013-04-30 13 views
30

C'è una lista di strutture di dati avendo pigri e rigorose implementazioni:pigro vs implementazioni severi di strutture di dati

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

Quali sono i punti di forza e di debolezza di tali implementazioni e quali sono le regole da seguire quando si sceglie uno specifico?

+6

Non ho regole severe (heh) per te, ma tendo a scegliere la pigrizia a meno che non abbia una buona ragione per non farlo. Le strutture pigre si comportano in modo più naturale e si adattano meglio al resto della lingua. –

risposta

25
  • Data.XYMap.Lazy e Data.XYMap.Strict

per XY in {"", "Int", "Hash"}: La variante *.Strict costringe la valutazione della mappato a valori WHNF prima che vengano immessi nella mappa.

Il grande vantaggio di questo è il comportamento più prevedibile di spazio e tempo, dal momento che è molto più difficile creare enormi thunk, soprattutto per i tipi di modulo (ConstructorN UnboxedValueTypeN), che è impossibile.

Lo svantaggio - Mi ricordo che ci sono stati esempi cresciuti quando è stato discusso se le varianti severe o pigri dovrebbero diventare il default, ma non ricordo nulla di particolare.

Ah, appena ricordato un caso d'uso: si può annodare un nodo con le varianti Lazy, che è ovviamente impossibile con le versioni Strict! Quindi, se fate queste cose: Lazy.

Uso le versioni Strict per impostazione predefinita. Fino a quando non avrò bisogno di annodare o incontrare un altro caso d'uso in cui considero le varianti Lazy superiori, non so quando li userei.

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

Le versioni severe utilizzare uno pezzo monolitico di spazio di archiviazione per il carico utile, che significa avere un rapido accesso casuale, non solo in modo sequenziale, ma anche a ritroso dalla fine, o saltare a e per

Le versioni pigri sono liste fondamentalmente testa-rigida di pezzi rigidi, la loro forza è che il consumo sequenziale di loro spesso può essere fatto in piccola memoria costante, che è grande se avete bisogno di sequenza di processo file di grandi dimensioni.

Per i dati piccolo (ish), sicuramente utilizzare i Strict varianti, per i dati enorme Lazy varianti se i dati vengono elaborati (più o meno) in sequenza.

+2

Si noti che le varianti 'Strict' sono anche rigide nei parametri di funzione come il valore predefinito passato a' findWithDefault', che spesso * non * è quello che ci si aspetta, anche quando si utilizza deliberatamente una mappa rigorosa. –

22

Quali sono i punti di forza e di debolezza di tali implementazioni e quali sono le regole da seguire quando si sceglie uno specifico?

La severità o la pigrizia del tipo portano a diverse complessità di operazioni particolari o modalità di utilizzo.

Non ci sono regole rigide o veloce - invece, come si potrebbe pensare a loro come completamente diversi tipi di dati.

Se si insiste su alcune linee guida:

  • strutture pigri per i dati più grandi di memoria
  • strutture pigri per i dati utilizzati di rado o quando si utilizza una piccola parte di una grande struttura

E poi:

  • strutture rigide se fai un sacco di aggiornamenti
  • strutture rigide per piccole dati atomici