以下の2つのHaskell関数は、インデックス変数が暗黙的であるか明示的であるかによって異なるように見えますが、パフォーマンスの違いは2桁の違いがあります。GHCの最適化
この機能は、MFIB 30を計算するために約0.03秒かかる:
let mfib = (map fib [0..] !!)
where
fib 0 = 0
fib 1 = 1
fib x = mfib (x-1) + mfib (x-2)
この関数は、MFIB 30のために約3秒かかります。
let mfib i = map fib [0..] !! i
where
fib 0 = 0
fib 1 = 1
fib x = mfib (x-1) + mfib (x-2)
私はそれがGHCインラインに関係している推測しています一致するパフォーマンスを得るためにインライン/ノーインラインプラグマを追加しようとしていました。
編集:私は怠惰なリストのルックアップを使ってfib関数をメモすることができ、なぜfibの伝統的な定義が非常に遅いのか理解しています。私はmemoizationが第1の機能と同様に第2の機能でも動作することを期待していたが、なぜそうでないのか理解していない。
鍵は* memoization *です。 [ここ](http://stackoverflow.com/questions/11466284/how-is-this-fibonacci-function-memoized)を参照してください。 –