フィボナッチ数列のn番目の項を計算するための次の2つのHaskellプログラムは、パフォーマンス特性が大きく異なります。
fib1 n =
case n of
0 -> 1
1 -> 1
x -> (fib1 (x-1)) + (fib1 (x-2))
fib2 n = fibArr !! n where
fibArr = 1:1:[a + b | (a, b) <- zip fibArr (tail fibArr)]
これらは数学的には非常に似ていfib2
ますが、リスト表記を使用して中間結果をメモし、fib1
明示的な再帰があります。中間結果がキャッシュされる可能性があるにもかかわらず、fib1
実行時間はの場合でも問題になりfib1 25
、再帰的なステップが常に評価されることを示唆しています。参照透過性はHaskellのパフォーマンスに何か貢献しますか?できるかどうかを事前に知るにはどうすればよいですか?
これは私が心配していることのほんの一例です。怠惰に実行された関数型プログラミング言語のパフォーマンスについて推論することに固有の困難を克服することについての考えを聞きたいです。
要約: 私は3lectrologosの答えを受け入れています。なぜなら、コンパイラの最適化に関して、言語のパフォーマンスについてあまり推論しないという点は、Haskellでは非常に重要であるように思われるからです。と。コンパイラーの重要性は、怠惰で機能的な言語でのパフォーマンスに関する推論を、他のタイプのパフォーマンスに関する推論と区別する要因であると言いがちです。
補遺:この質問で起こっている人は誰でも、 JohanTibellの高性能Haskellについての話のスライドを見たいと思うかもしれません。