Instance Variable Table Benchmark for mruby

GitHub

Performance

mrb_obj_iv_set

空の iv_tblN 個のエントリーを mrb_obj_iv_set で挿入した際の、1回あたりの時間 (上図) と総時間 (下図) の計測結果です。

64-bit Word-boxing
64-bit NaN-boxing
64-bit No-boxing
32-bit Word-boxing
32-bit No-boxing
iv_tbl size: --
2.1.2:
--
M i/s
Baseline:
--
M i/s
New:
--
M i/s
Drag and drop to zoom in (double-click resets)
iv_tbl size: --
2.1.2:
--
M i/s
Baseline:
--
M i/s
New:
--
M i/s
Drag and drop to zoom in (double-click resets)

64-bit CPU では1回あたりの時間は両実装とも概ね同等ですが、ハッシュバケットの拡大時は New 実装がやや速いため総時間は New 実装がやや速くなっています。ハッシュバケットの拡大時の性能向上はおそらくデータ構造の変更の影響よりもいくらか無駄な処理を改善したことの影響が大きいかもしれません。

32-bit CPU でも概ね同じ傾向ですが 64-bit CPU と比較すると New 実装がやや遅いようです。64-bit CPU では構造体のパディングが削除されたこととハッシュテーブルのキーが連続したことにより参照局所性が高くなったことが有利に働いているのではないかと考えています。

mrb_obj_iv_get

サイズが Niv_tbl に対してすべてのキーと1個の存在しないキーを mrb_obj_iv_get で参照した際の、1回あたりの平均時間の計測結果です。

64-bit Word-boxing
64-bit NaN-boxing
64-bit No-boxing
32-bit Word-boxing
32-bit No-boxing
iv_tbl size: --
2.1.2:
--
M i/s
Baseline:
--
M i/s
New:
--
M i/s
Drag and drop to zoom in (double-click resets)

New 実装 は 64-bit CPU では若干速いようですが、32-bit CPU では逆にやや遅くなっています。64-bit CPU で速くなっているのは参照局所性が高くなったことが原因ではないかと考えています。32-bit CPU では元々構造体のパディングがなかったためその恩恵があまりなく、逆に何らかのオーバーヘッドのコストが高くなっているのではないかと考えていますが、具体的な原因は分かっていません。