Groongaのコンパイル時にmax-gcse-memoryを指定してみた

はじめに

Groongaをコンパイルしているとこんな警告がでていることに気づく。

warning: const/copy propagation disabled:

これはGCSEというやつで、最適化が無効になったという警告である。 無効になってしまったんなら、そこはなんとか有効にしてあげたくなるというのが人情というものである(適当)。

Optimize Options - Using the GNU Compiler Collection (GCC) を読むと、必要なメモリを確保できなくて最適化を諦めたとある。 ならばパラメーターを明示的に指定してもうちょっとGCCに頑張ってもらおう。

そのためのオプションもある。それがmax-gcse-memoryである。

--param max-gcse-memory=

デフォルトが128MBらしい。それを超えてしまうと、断念してしまうようだ。 デフォルトの値を超えることってそんなにはないだろうが、それをGroongaさんは超えてしまった。

max-gcse-memoryを指定してコンパイル

適用するのにlib/Makefile.inにひとまず直に書いて試した。

CFLAGS = @CFLAGS@ --param max-gcse-memory=268435456

これによってコンパイル時間が増えるだろうと思ったらせいぜい1割増程度だった。

適用前

V=1 make 2>&1  258.80s user 18.57s system 96% cpu 4:46.33 total

適用後

V=1 make 2>&1  269.90s user 32.32s system 97% cpu 5:10.68 total

ベンチマークをしてみる

どれくらい効果があったのか、ベンチマークをとってみることにした。 幸いにしてGroongaにはbenchmarkが付属している。この結果を比較すればよいはずである。

  • Groonga 5.1.1
  • Intel Core i5-2467M CPU @ 1.60GHz
  • メモリ8GB
  • 10回試行し、その中央値をそれぞれプロット
  • Original versionというのが普通にコンパイルした版
  • Modified versionというのがmax-gcse-memoryをカスタマイズした版

f:id:kenhys:20160104204539p:plain

f:id:kenhys:20160104204532p:plain

f:id:kenhys:20160104204537p:plain

f:id:kenhys:20160104204533p:plain f:id:kenhys:20160104204534p:plain

f:id:kenhys:20160104204535p:plain f:id:kenhys:20160104204536p:plain

見事にほぼどんぐりの背比べである。なかには変更後のほうが妙に遅いケースもみられる。

まとめ

片手間にとったベンチマークとはいえ、残念ながらちょろっとコンパイルオプションを変更して速くなるかというと、そうでもなかった。 そんなに甘くないのが現実である。