コンカレントGCの実装その2、マルチコアCPUでのコンカレントGCの性能

プログラムにアロケーションのない場合

GCの発生しないプログラムではコアの数に影響を受けないことを確認します。これにはイプシロンのプロジェクトに含まれているbench/gambit-benchmarks/tak.scmを使うことにします。(今回の計測にはメニューで簡単にコアの数を切り替えられるMac OS X 10.5.4とiMac 1.83 GHz Intel Core Duoを使用しています)

tak.scm - 1 core active
;;  tak     (x200)
;;  1.027523 real    1.010287 user    0.001666 sys
tak.scm - 2 core active
;;  tak     (x200)
;;  1.010330 real    1.007290 user    0.001455 sys

プログラムにアロケーションがある場合

アロケーションが大量発生するbench/gambit-benchmarks/paraffins.scmを使うことにします。

paraffins.scm - 1 core active
;;  paraffins (x100)
;;  1.559572 real    1.498873 user    0.036067 sys
paraffins.scm - 2 core active
;;  paraffins (x100)
;;  0.893248 real    1.633692 user    0.078935 sys

ここで"1.559572 real"と"0.893248 real"を比較すれば、2コアを使用することにより実行時間が57.3%まで短縮されていることがわかります。

これは、ごくあたりまえの結果に見えますが・・・

実は最初に実装したコンカレントGCは1コアよりも2コアの方が遅くなるというショックなことになっていたのです。コンカレントGCの考え方は単純ですが、それを単純に実装すると性能が出ないということが解っています。イプシロンのコンカレントGCの実装は少々複雑なことになっていますが、これは実用的なパフォーマンス得るために必要とされた改良の結果なのです。

現実的な性能

ところで2コアによる性能向上率が良いとしても最終的な性能が悪くては意味がありません。そこでイプシロンでは主要なSchemeインタープリタベンチマークを比較しながら開発することにしました。ベンチマークの結果は以下のURLで見ることができます。