javascriptのInt32Arrayのパフォーマンス: 書き込みはArrayより5〜8倍速いが、読み込みは変わらない?
WebGL系の情報を読んでるとInt32Array( https://developer.mozilla.org/en/JavaScript_typed_arrays/Uint32Array )という固定値配列を見つけて、滅茶苦茶速そうなので計測してみた。
Firefox4.0b8、Chrome10.0.612.3 devで動くことを確認。safari/opera/ieはまだっぽい。
計測コンテンツ
http://ndruger.lolipop.jp/hatena/20101227/typed_array.htm
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN"> <html> <head> <title>Int32Array Performance</title> </head> <body> <textarea id="output" style="width:400px; height:200px;"></textarea> <script type="text/javascript"> function DP(in_s){ document.getElementById('output').value += in_s + '\n'; } function test_write(in_array, in_name){ var start = (new Date()).getTime(); var len = in_array.length; for (var i = 0; i < len; i++) { in_array[i] = 1; } DP('write ' + in_name + ' ' + len + ' times: ' + ((new Date()).getTime() - start) + 'ms'); } function test_read(in_array, in_name){ var start = (new Date()).getTime(); var len = in_array.length; var total = 0; for (var i = 0; i < len; i++) { total += in_array[i]; } DP('read ' + in_name + ' ' + len + ' times: ' + ((new Date()).getTime() - start) + 'ms'); } var num = 10000000; var int32_array = new Int32Array(num); test_write(int32_array, 'Int32Array'); test_read(int32_array, 'Int32Array'); var normal_array = new Array(num); test_write(normal_array, 'Array'); test_read(normal_array, 'Array'); </script> </body> </html>
結果
ブラウザ |
配列 |
read |
write |
---|---|---|---|
Firefox4.0b8 |
Int32Array |
49ms |
46ms |
Array |
52ms |
341ms |
|
Chrome10.0.612.3 |
Int32Array |
95ms |
79ms |
Array |
82ms |
391ms |
感想
- 書き込みが非常にFirefox4で7.5倍、Chromeで5倍速い。もっと速くなると予測してたけど、getter / setterとしての繋ぎ部分が案外大きいか。
- javascriptのArrayは、長さによっても違うだろうが、基本的にツリーで実装されていると思っていたので、読み込み速度に大きな違いがないのが意外。
- WebGLを使うときなど、コンテンツで非常に大きな固定長配列を利用する場合、Int32Arrayの対応を判定して、あれば使うと速くなりそう。