Sono nuovo alla programmazione e all'apprendimento di Haskell leggendo e lavorando con i problemi di Project Euler. Naturalmente, la cosa più importante che si può fare per migliorare le prestazioni su questi problemi è usare un algoritmo migliore. Tuttavia, mi è chiaro che esistono altri modi semplici e facili da implementare per migliorare le prestazioni. Una ricerca sommaria allevato this question, e this question, che danno i seguenti suggerimenti:Semplici suggerimenti per aumentare le prestazioni Haskell (su problemi ProjectEuler)?
- Utilizzare le bandiere ghc -O2 e -fllvm.
- Utilizzare il tipo Int, invece di Integer, perché è unbox (o anche intero anziché Int64). Ciò richiede di digitare le funzioni, non lasciare che il compilatore decida al volo.
- Utilizzare rem, non mod, per il test di divisione.
- Utilizzare Schwartzian transformations quando appropriato.
- Utilizzo di un accumulatore in funzioni ricorsive (un'ottimizzazione della ricorsione in coda, credo).
- Memoizzazione
(Una risposta menziona anche lavoratore/involucro trasformazione, ma che sembra abbastanza avanzata.)
domanda (?): Quali altri semplici ottimizzazioni si può fare in Haskell per migliorare le prestazioni sui problemi in stile Project Euler? Esistono altre idee o caratteristiche specifiche di Haskell (o specifiche di programmazione funzionale?) Che potrebbero essere utilizzate per velocizzare le soluzioni ai problemi di Project Euler? Viceversa, a cosa si dovrebbe prestare attenzione? Quali sono alcune cose comuni ma inefficienti da evitare?
Wow, collegamento eccellente. Grazie. – identity
Le diapositive precedenti dello stesso autore http://blog.johantibell.com/2010/09/slides-from-my-high-performance-haskell.html sono più estese; e http://johantibell.com/files/stanford-2011/performance.html è una specie di case study. C'è una considerevole sovrapposizione, ma non mi ha fatto alcun male. – applicative