GHCIは、対話型セッション中に関数の結果をキャッシュしているようです。時間のかかる関数を2回呼び出すだけで、簡単に気付くことができます。2回目は、結果がすぐに表示されます。
GHCI内からこのキャッシュをクリアして、再起動する必要がないようにする方法はありますか?私はいくつかの簡単な「汚い」非詳細なパフォーマンス比較を行っているので、代わりにSystem.CPUTimeを使用するのはやり過ぎでしょう。
コマンドを使用して、作業中のモジュールをいつでもリロードできます:r
。これにより、作成したインタラクティブなバインディングがすべて破棄されます。これは、実際にモジュールを使用していない場合にも機能します。
コメントにあるように、関数を適用した結果である値に名前let
をバインドするために使用しています。値を維持したい場合は、let で名前を付けないでください。(または、let で既に計算した値を参照しないでください)。
GHCiには+r
オプションがあり、マニュアルによると、あなたが望むことをするはずです:
通常、ロードされたモジュール内の最上位の式 (別名 CAF または定数適用型フォーム) の評価は、評価間で保持されます。オンにする
+r
と、最上位の式のすべての評価が各評価後に破棄されます (1 回の評価では保持されます)。このオプションは、評価された最上位の式が大量のスペースを消費している場合、または繰り返し可能なパフォーマンス測定が必要な場合に役立ちます。
関数ではなく、一定のアプリカティブ フォームについて話していることに注意してください。ただし、あなたの例ではうまくいきませんでした:
Prelude> :set +r
Prelude> :set +s
Prelude> let f = 1 : map (2*) f
(0.01 secs, 1222216 bytes)
Prelude> last $ show $ f !! 100000
'6'
(3.54 secs, 641914476 bytes)
Prelude> last $ show $ f !! 100000
'6'
(0.04 secs, 1634552 bytes)
Prelude> last $ show $ f !! 100000
'6'
(0.04 secs, 1603568 bytes)
どうやら、+r
コンパイルされたコードでのみ機能しますが、ドキュメントではこれについて言及されていません。