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の対応を判定して、あれば使うと速くなりそう。

[2010/12/27 追記] Firefox4が順番依存で少し結果に違いが出たので下記に修正したコンテンツと結果を記述

計測コンテンツ

GCなどで片方が不利にならないようにコンテンツを分割。また、reflowをしないように修正。

計測結果


ブラウザ

配列

read

write

Firefox4.0b8

Int32Array

49ms

46ms

Array

77ms

350ms

Chrome10.0.612.3

Int32Array

94ms

79ms

Array

82ms

393ms

Chromeは同じ。Firefox4はArrayが遅くなった。