« 吉里吉里Z β4 バイナリ | メイン | 吉里吉里Z β5 バイナリ »

2013年11月23日

吉里吉里Z 開発:: TJS2 オブジェクトのハッシュテーブル初期値を大きくすると速くなるのか

    

大きくするとかなりの速度向上が見込めると思い込んでいる人がいるようなので計測。
羽々斬の時、高速化するためテーブルサイズは変更してみたが特に効果はなかったと記憶しているが再度計測して記録に残す。

KAG3 の初期スクリプト実行時間(WindowやLayerが生成初期化される)を計測。
その直後のメモリ使用量も計測。
メモリ使用量はGetProcessMemoryInfo で得た WorkingSetSize を使用。
速度は6回実行して、最初の1回は除いた5回の平均時間。
括弧内は5回のそれぞれの結果。

HASH BITS 2 - 204.8(213, 184, 215, 219, 193)ms - 27,041,792byte
HASH BITS 3 - 199.4(190, 224, 189, 193, 201)ms - 27,037,696byte
HASH BITS 4 - 192.6(196, 195, 184, 200, 188)ms - 27,148,288byte
HASH BITS 5 - 197.2(201, 183, 215, 206, 181)ms - 27,004,928byte
HASH BITS 6 - 199.2(182, 220, 217, 189, 188)ms - 27,406,336byte
HASH BITS 7 - 192.4(194, 191, 184, 189, 204)ms - 28,024,832byte
推定最適値 -- 216.6(261, 195, 210, 214, 203)ms - 27,140,096byte

推定最適値は要素数をCount+(DataAreaSize-1)として求めたもの。
厳密には異なるが近い値になる。
実数はバイトコード解析しないと出せないはず。
推定最適値が遅かったので、再度 3 の時計測
HASH BITS 3 - 213.8(206, 219, 199, 212, 233)ms
似たような値になった。
実行タイミングによって少し遅くなっていたり速くなっていたりすることがあるので、測ってみたが予想通り。

平均値を見ると少し差があるが、各実行時の時間を見ると、誤差の範囲で特に速度向上は見られない。
メモリ使用量は何度か実行すると多少上下する様子。
ただ、テーブルサイズを大きくするに従って大きくなって行っているのは見て取れる。

実使用環境でもっともオブジェクトの生成を行うであろう起動時でも特に有意な差は見られない。


次に明確な差が出るであろうLayer 生成を1万回行うのに要する時間を同じように計測。

HASH BITS 3 - 532.4(530, 535, 525, 542, 530)ms
HASH BITS 4 - 525.4(516, 535, 519, 536, 521)ms
HASH BITS 5 - 482.6(483, 481, 481, 484, 484)ms
推定最適値 -- 441.0(450, 436, 443, 437, 439)ms

だいたい値が大きくなると速くなっている。
ただ、このようにひたすら生成だけをひたすら繰り返すことはほとんどない。

ハッシュテーブルからオブジェクト検索時、見付けたものをリストの先頭に置き、連続でアクセスされた時、次回から検索が即座に終わるような実装になっている。
このためいくつかのオブジェクトに集中的にアクセスするような状況では、検索時間に差は出にくくなっていると考えられる。
後はキャッシュなどでペナルティがある可能性だろうか。

ハッシュテーブルサイズの初期値を大きくしても実使用時では特に影響ない。
大量に要素数がある辞書を生成するロード時は、バイナリでの読み書きを使用すればもっとも高速化されるはずなので、初期値を変えてもあまり意味はないし、一部の要素数が特に多いオブジェクトのために初期値を変える意味は見出せない。
数万など要素数が極端に大きい辞書を扱う場合は、Dictionary のコンストラクタで要素数を指定できるようになっているので、そちらを使うのが現実的。


結果として、ハッシュテーブルサイズの初期値を変更する意味は見出せず。
Array/Dictionary の saveStruct の第2引数に "b" を入れてバイナリ形式で書き出すのと、Dictionary の要素数指定を適時使うのが効果的。



投稿者 Takenori : 2013年11月23日 05:38




comments powered by Disqus
Total : Today : Yesterday : なかのひと