Sto provando Haskell per calcolare le funzioni di partizione dei modelli nella fisica statistica. Ciò comporta l'attraversamento di elenchi di configurazioni piuttosto grandi e la somma di vari osservabili - che vorrei fare nel modo più efficiente possibile.Haskell: sintonizzazione delle prestazioni list/vector/array
La versione corrente del mio codice è qui: https://gist.github.com/2420539
Alcune cose strane accadono quando si cerca di scegliere tra liste e vettori per enumerare le configurazioni; in particolare, per troncare la lista, usando V.toList . V.take (3^n) . V.fromList
(dove V
è Data.Vector
) è più veloce di usare semplicemente take
, che sembra un po 'contro-intuitivo. In entrambi i casi l'elenco viene valutato pigramente.
L'elenco stesso viene creato utilizzando iterate
; se invece io uso Vector
s il più possibile e creare l'elenco utilizzando V.iterateN
, ancora una volta diventa più lento ...
La mia domanda è: esiste un modo (diverso da splicing V.toList
e V.fromList
in luoghi casuali nel codice) per prevedere quale sarà il più veloce? (A proposito, ho compilare tutto utilizzando ghc -O2
con l'attuale versione stabile.)
BTW '-funbox-strict-fields' aiuterà il vostro tipo di dati Stats. –
Lo fa! Circa il 10% più veloce nel suo complesso ... Ottimizzare in questo modo è divertente :-) –
BTW - Ho fatto un'implementazione di benchmark in C++, usando lo stesso algoritmo in modo imperativo usando std :: vector. Sul mio computer per n = 15, la versione di Haskell termina in 4,6 secondi e quella in C++ in circa 1,8 secondi. Direi che questo è abbastanza soddisfacente :-) –