Hatena::Groupjavascript

JavaScriptで遊ぶよ

 | 

2010-01-29

Worker初期化の時間、通信時間

16:12

てきとうなベンチ。

  • メインページ
var N = 20;
var workers = [];

setTimeout(function() {
	for (var i = 0; i < N; i++) (function(i) {
		var w = new Worker('answer.js');
		w.start = Date.now();
		w.onmessage = function() { w.duration = Date.now() - w.start };
		workers.push(w);
	})(i);
}, 1000);

setTimeout(function() {
	console.log(workers.map(function(w) {return w.duration}));

	workers.forEach(function(w) {
		w.start = Date.now();
		w.postMessage('');
		w.onmessage = function() { w.duration = Date.now() - w.start };
	});
}, 3000);

setTimeout(function() {
	console.log(workers.map(function(w) {return w.duration}));
}, 4000);
  • answer.js
postMessage(Date.now()+''); // 最初にロードしたときに返事

onmessage = function() {
	postMessage(Date.now()+''); // メッセージが遅られたときに返事
}

以下、特に言及のないときは Worker Script がブラウザのキャッシュにあるときの数字。


N = 1 のとき

Firefox と Safari では最初のレスポンスが3ms、次 (Worker がロードしてから十分時間をおいた後) のレスポンスが3msぐらい。(ただし answer.js がキャッシュされてないときは最初のレスポンスが30msぐらい)

Chromium (昨日の時点での最新版) では 最初のレスポンスが100msぐらいで次は3msぐらい。


N = 5 のとき

Firefox (Worker がキャッシュにないとき)
[346, 347, 346, 351, 351]
[0, 1, 1, 46, 1]
Firefox (Worker がキャッシュにあるとき)
[18, 18, 18, 20, 20]
[6, 6, 5, 5, 5]
Safari (Worker がキャッシュにないとき)
[325, 499, 250, 212, 212]
[325, 499, 250, 212, 212]

↑1回目と2回目が同じなのはおかしい。測り方が悪かった。

Safari (Worker がキャッシュにあるとき)
[7, 5, 3, 5, 4]
[9, 9, 9, 9, 9]
Chromium (Worker がキャッシュにないとき)
[4098, 4097, 4097, 4097, 4097]
[4098, 4097, 4097, 4097, 4097]

これも測り方が悪かった。

Chromium (Worker がキャッシュにあるとき)
[1171, 1164, 1121, 1164, 1124]
[8, 8, 8, 8, 8]

今回はローカルから Worker を呼んでるけど、実際はネットワーク通信があるので1秒ぐらいはかかると思ってもいい。


N = 10 のとき

Firefox
[3, 6, 8, 8, 9, 12, 10, 13, 13, 13] // 最初のレスポンス時間 × Worker 10個
[5, 4, 4, 4, 4, 3, 3, 3, 3, 3] // 2回目のレスポンス時間 × Worker 10 個
Safari
[10, 11, 10, 6, 11, 9, 9, 9, 9, 10]
[11, 11, 11, 11, 10, 10, 10, 10, 10, 10]
Chromium
[562, 502, 481, 501, 588, 541, 578, 537, 601, 540]
[14, 9, 14, 14, 14, 14, 14, 14, 14, 14]

N = 20 のとき

Firefox
[4, 8, 6, 7, 10, 10, 11, 14, 12, 14, 15, 17, 17, 18, 19, 21, 21, 23, 24, 24]
[8, 8, 8, 8, 8, 7, 7, 7, 6, 6, 6, 5, 5, 5, 5, 5, 4, 4, 4, 4]
Safari
[12, 16, 17, 11, 12, 11, 15, 16, 16, 12, 10, 16, 10, 15, 11, 14, 15, 5, 14, 14]
[13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13]
Chromium
[740, 762, 907, 761, 909, 735, 852, 906, 906, 638, 929, 865, 853, 926, 925, 821, undefined, undefined, undefined, undefined]
[14, 16, 16, 14, 13, 15, 16, 13, 13, 15, 13, 15, 16, 15, 15, 16, undefined, undefined, undefined, undefined]

Chromium は 16 個を超える Workers とは通信できない。


N = 100 のとき

Firefox
[9, 10, 10, 11, 11, 12, 13, 15, 15, 15, 16, 18, 17, 20, 19, 20, 21, 28, 23, 23, 27, 25, 27, 28, 30, 30, 32, 36, 33, 35, 37, 39, 38, 39, 41, 42, 43, 43, 44, 45, 46, 46, 47, 48, 49, 49, 50, 54, 52, 54, 55, 57, 56, 58, 58, 60, 60, 62, 63, 64, 65, 65, 95, 97, 106, 104, 105, 107, 127, 128, 156, 129, 154, 156, 181, 182, 185, 183, 184, 186, 214, 217, 217, 217, 266, 244, 267, 265, 296, 274, 302, 303, 323, 305, 322, 341, 342, 342, 396, 396]

[17, 17, 17, 16, 16, 16, 16, 15, 15, 15, 15, 15, 14, 14, 14, 14, 15, 14, 15, 14, 15, 15, 15, 15, 15, 15, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12, 11, 11, 11, 11, 11, 11]
Safari
[88, 98, 92, 97, 98, 95, 90, 96, 50, 89, 97, 97, 96, 94, 96, 25, 78, 49, 93, 86, 84, 48, 96, 24, 84, 47, 95, 47, 91, 47, 47, 83, 94, 85, 82, 88, 75, 88, 92, 45, 93, 92, 45, 90, 75, 81, 87, 80, 75, 20, 91, 81, 44, 72, 51, 64, 79, 90, 43, 79, 43, 81, 78, 80, 55, 83, 89, 80, 79, 80, 79, 41, 17, 72, 78, 88, 89, 41, 85, 76, 77, 67, 71, 87, 84, 16, 65, 86, 79, 87, 78, 83, 86, 87, 78, 14, 83, 86, 62, 78]

[18, 18, 18, 18, 18, 18, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 17, 18, 17, 17, 17, 18, 17, 18, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18]

数字はどれも何度かやって安定した速さのときを取った。たまにこれの3倍ぐらいかかるようなときもある。

Chromium では Workers はまだ使えるレベルではない。

Workers を使うときは、並列化したいその瞬間に呼ぶのではなく、並列化することが分かっているなら予め予定した数をロードしておくのがいい。

トラックバック - http://javascript.g.hatena.ne.jp/edvakf/20100129
 |