Let's start Scheme

2011-09-12

Boehm GCが遅かった

Twitterで「速度が出ない」とつぶやいたが、原因が分かった。
まぁ、結論はすでにタイトルに書いてあるのだが、何が違ったかということをば。

調べたこと。
Gambitベンチマークのbrowseがやたら遅い。moshで5秒、Gaucheで1.7秒(速!)、Ypsilonで2.5秒、Sagittariusは12秒という結果だった。(Windows XP, Cygwin, Core2Duo 3.00GHz)
Display closureという構造をとっているmoshと比べても2倍遅いのはおかしいということで調査。
インストラクションの精査から始めて、結局以下のコードが遅くなることに気づいた
(do ((i 0 (+ i 1)))
     ((= i 10000)) ;; iを100000にすると遅くなる
  (cons 'a 'b))
何が問題だったか?
(cons 'a 'b)をコメントアウトするとmoshとの速度にほとんど差がでない。10000の時でもほとんど差が出ない。
ここでGCを疑う。
とりあえずGCの回数を出力してみたら、10000回だと9回で100000回だと10回になっていた。GCが遅い。

ここで出た疑問。なぜmoshでは遅くならないか?現状ではSagittariusもBoehm GCを使っている(絶対そのうち置き換えてやる!)が、Sagittariusでのみ問題になっている。
コンパイルオプションを調べた。moshのCygwinでのオプションは--disable-shared CFLAGS=-DGC_THREADS win32_threads=trueになっていた。
SagittariusはBoehm GCをバンドルしてないが、win32_threads=trueとかCFLAGS=-DGC_THREADSを渡してコンパイルした記憶がない。
上記を渡してリコンパイルしてみた。
5秒短縮!!!
その他のベンチマークもmoshと同等かそれ以上(遅いのもある)という結果になった。

原因探るのに2日かかったがこんな落ちとは正直思っていなかった。

追記:
自宅のX60ノートで同様にリコンパイルしてリンクしなおしたのだが、速度差はなかった。(上記のは会社のマシン^^;)
どうやらまだまだ別の場所に原因がありそうだ。

追記の追記:
やっぱりGCっぽい。別にコンパイルオプションがあるのだろうか?

No comments:

Post a Comment