Haskellの「fib = 1:1:zipWith (+) fib (tail fib)」はとても遅い件

1
kinaba @kinaba

http://bit.ly/dtpDca ううむ、複雑に考えすぎではないでしょうか…。fib=1:1:... は単にリストを作って変数fibに持っている式なので、素直に動かすと全リストが保持されます。たまたま1回しか使わないならば残す必要がないので最適化で消えるだけで。

2010-06-23 23:15:37
kinaba @kinaba

最適化でじゃなくてこの場合はGCでかな。どっちだろう。!!とzipWithが融合されて消えているのか、GCで適宜回収されているのかどっちか。

2010-06-23 23:23:42
kinaba @kinaba

+の引数の計算ではなく、+の計算自体を正格評価しないと変わらないので、遅延をやめるならば zipWith' f (x:xs) (y:ys) = ((:) $! (f x y)) (zipWith' f .. http://togetter.com/li/31078

2010-06-23 13:23:26
kinaba @kinaba

遅延評価だと(正格評価のつもりでいると予想しないところでメモリを食う、ので、メモリを食うとGCの影響やメモリ階層の影響がフクザツなので)実行時間が読みづらい、というのはあると思う。けど、実行される演算の回数は、必要な演算は結局最後には全部呼ばれるので、深く考えず普通に数えればok

2010-06-23 23:37:08