2016-06-20 48 views
8

Nel this video (Fuga dalla torre d'avorio - Il viaggio di Haskell), Simon Peyton Jones dice che fare in modo che Haskell Lazy li aiutasse con vincoli di risorse sulle macchine che avevano in quel momento. Ha anche portato a molti altri benefici con la pigrizia.Perché rendere Haskell pigro ha un impatto sulle prestazioni?

Quindi ha detto che la sfida che hanno ora è che la pigrizia ha un impatto sulle prestazioni.

La mia domanda è: Perché rendere Haskell pigro ha un impatto sulle prestazioni?

+2

https://wiki.haskell.org/Foldr_Foldl_Foldl 'dovrebbe darti alcuni spunti – Bergi

+0

Lazyness significa ulteriore calcolo e gestione della memoria. Dai un'occhiata a https://wiki.haskell.org/Performance/Data_types e https://wiki.haskell.org/Performance/Strictness – zigazou

risposta

10

Se non si intende utilizzare il risultato di qualcosa, quindi archiviarlo pigramente e quindi non eseguirlo mai è più efficiente dell'esecuzione inutile. Questo è immediatamente ovvio.

Tuttavia, se si è eseguirlo, quindi memorizzarlo pigramente e quindi eseguirlo in seguito è meno efficiente rispetto alla semplice esecuzione in questo momento. C'è più indiretta coinvolti. Ci vuole tempo per annotare tutti i dettagli necessari per l'esecuzione, e ci vuole tempo per caricarli tutti quando ci si rende conto che è effettivamente necessario eseguire.

Questo è particolarmente il caso con qualcosa come l'aggiunta di due interi di larghezza della macchina. Se i tuoi operandi sono già nei registri della CPU, quindi aggiungerli immediatamente è una singola istruzione della macchina. Invece, abbiamo faticosamente messo tutte queste cose nell'heap, e poi recuperate in un secondo momento (probabilmente con un sacco di errori di cache e bancarelle di pipeline).

Oltre a questo, a volte un calcolo non è molto costoso e produce un piccolo risultato, ma i dettagli che dobbiamo memorizzare per eseguire il calcolo in seguito sono piuttosto grandi. L'esempio canonico sta sommando un elenco. Il risultato potrebbe essere un singolo intero a 32 bit, ma l'elenco da sommare potrebbe essere enorme! Tutto quel lavoro in più per il garbage collector per gestire questi dati che potrebbero essere altrimenti oggetti morti che potrebbero essere deallocati.

In generale, la pigrizia utilizzato destra può portare a guadagni di prestazioni di massa, ma la pigrizia utilizzato sbagliate risultati in disastri prestazioni spaventose. E la pigrizia può essere molto difficile da ragionare; questa roba non è facile. Con l'esperienza, ci si abitua gradualmente.