実装

17

をtreap改善はここで(暗黙のキーとノードに保存されているいくつかの追加情報を)treapの一種の私の実装です:データGCをプロファイリングによるとhttp://hpaste.org/42839/treap_with_implicit_keys実装

は、このプログラムのために時間の80%を取ります。私が理解する限りでは、ノードが「変更される」たびに、ルートへのパス上の各ノードが再作成されるという事実が原因です。

私はパフォーマンスを向上させるためにここでできることがありますか、またはSTモナドの領域に降りていかなければなりませんか?

+4

@adamax:この動作(ルートまでのすべてを再作成)は不変構造では一般的ですが、Chris Okasakiの純粋な機能データ構造を読んでいますか? http://www.cs.cmu.edu/~rwh/theses/okasaki.pdf彼はこれについていくつかの論文を書いた。 –

+1

おそらく、+ RTS -s -RTSでプログラムを実行して確認する必要があります。この80%は私が7.0.1を使って素早く実行したときの話です。約16%の時間が費やされていますGCで – ScottWest

+0

@ScottWest:ghc -O2 -prof --make test.hsでコンパイルし、./test + RTS -s -RTSで実行すると、%GC時間は77.4%(77.4%が経過した)と表示され、合計時間は8.7秒。しかし私のghcのバージョンは6.12.1です。ちょうど興味のない、あなたのシステムで合計時間は何ですか? – adamax

答えて

26

GHC 7.0.3を使用して、私はあなたの重いGCの挙動を再現することができます

$ time ./A +RTS -s 
    %GC time  92.9% (92.9% elapsed) 
    ./A +RTS -s 7.24s user 0.04s system 99% cpu 7.301 total 

は私がプログラムを通過する10分を過ごしました。ここで私は順序で、やったことだ:

  • 設定GHCの-Hフラグ、GCに制限を増やす
  • は、第一世代の配置領域を調整し
  • をインライン化改善開梱チェック

10倍のスピードアップをもたらし、GCは約45%の時間をもたらす。ために


、GHCの魔法-Hフラグを使用して、我々はその実行時にかなり減らすことができますが:

$ time ./A +RTS -s -H 
    %GC time  74.3% (75.3% elapsed) 
    ./A +RTS -s -H 2.34s user 0.04s system 99% cpu 2.392 total 

悪くありません!

TreeノードのUNPACKプラグマは何もしないので、それらを削除します。我々は割り当てをテストしていることから、結局 - それは高速ですが、GCはまだ支配しているんだからheight

./A +RTS -s -H 1.74s user 0.03s system 99% cpu 1.777 total 

をインライン化するよう

./A +RTS -s -H 1.84s user 0.04s system 99% cpu 1.883 total 

インラインupdateは、より多くのランタイムをオフに剃ります。 、

$ time ./A +RTS -s -A200M 
%GC time  45.1% (40.5% elapsed) 
./A +RTS -s -A200M 0.71s user 0.16s system 99% cpu 0.872 total 

そしてJohnLが示唆されているように、展開のしきい値を増やす私たちが始めたよりも何を、10倍は速くなり

./A +RTS -s -A100M 0.74s user 0.09s system 99% cpu 0.826 total 

、少し助け:私たちが行うことができます ことの一つは、最初の世代のサイズを増やしています?悪くない。

ghc-gc-tuneを使用して

、あなたが-A-Hの機能としてランタイムを見ることができ、

Time and GC

興味深いことに、最高の実行時間は、例えば、非常に大きな-A値を使用

$ time ./A +RTS -A500M 
./A +RTS -A500M 0.49s user 0.28s system 99% cpu 0.776s 
+0

うわー、それは信じられないほどです!私はghc 6.12.1と同様の動作をしています。最大の高速化は、 'update'をインライン展開し、最初のgenサイズを設定することによって与えられます。一つの質問ですが、-Hに 'size'オプションを付けることを忘れましたか?ちょうど-Hは何もしていないようですが、-H64mはそうです。 – adamax

+1

GHC 7の場合、-HはGCのすべての制限を増加させます。 –

+3

より正確には、-Hは「自動-A」の一種です。 GCをコピーしているのでこれが可能です。メジャーなGC間では未使用のメモリが大量にあります。 -Aを増やすことは必ずしも良い考えではありません。プログラムによっては、キャッシュミスが増えるため、状況が悪化します。 –