2008年 01月 20日

JSDeferred 重い処理を自動で分割する。

JSDeferred の loop 関数は軽かろうが重かろうか一回ずつ setTimeout はさむんで効率わるいので、for ループと loop 関数の間ぐらいの関数をてきとうに書いてみた。

	function aloop (n, f) {
		var i   = 0;
		var end = new Object;
		var ret = null;
		return Deferred.next(function () {
			var t = (new Date()).getTime();
			try {
				do {
					ret = f(i)
					i++;
					if (i > n) throw end;
				} while ((new Date()).getTime() - t < 100)
				log("Devided: " + ((new Date()).getTime() - t) + "msec.");
				return Deferred.call(arguments.callee);
			} catch (e) {
				if (e == end) {
					log("End");
					return ret;
				} else {
					throw e;
				}
			}
		});
	}

	aloop(100, function (n, o) {
		var dummy = 0;
		log(n);
		for (var i = 0; i < n * n * n; i++) {
			dummy++;
		}
	});

関数一回の処理に 100msec 以上かかってしまったら、一度ブラウザに処理をかえす。

この例だとこんなふうになります

Firebug has been disabled for www.google.com

Enable Firebug
Enable Firebug for this web site
http://lowreal.net/Test: 0
http://lowreal.net/Test: 1
http://lowreal.net/Test: 2
http://lowreal.net/Test: 3
http://lowreal.net/Test: 4
http://lowreal.net/Test: 5
http://lowreal.net/Test: 6
http://lowreal.net/Test: 7
http://lowreal.net/Test: 8
http://lowreal.net/Test: 9
http://lowreal.net/Test: 10
http://lowreal.net/Test: 11
http://lowreal.net/Test: 12
http://lowreal.net/Test: 13
http://lowreal.net/Test: 14
http://lowreal.net/Test: 15
http://lowreal.net/Test: 16
http://lowreal.net/Test: 17
http://lowreal.net/Test: 18
http://lowreal.net/Test: 19
http://lowreal.net/Test: 20
http://lowreal.net/Test: 21
http://lowreal.net/Test: 22
http://lowreal.net/Test: 23
http://lowreal.net/Test: 24
http://lowreal.net/Test: 25
http://lowreal.net/Test: 26
http://lowreal.net/Test: 27
http://lowreal.net/Test: 28
http://lowreal.net/Test: 29
http://lowreal.net/Test: 30
http://lowreal.net/Test: 31
http://lowreal.net/Test: 32
http://lowreal.net/Test: 33
http://lowreal.net/Test: 34
http://lowreal.net/Test: 35
http://lowreal.net/Test: 36
http://lowreal.net/Test: 37
http://lowreal.net/Test: 38
http://lowreal.net/Test: 39
http://lowreal.net/Test: Devided: 109msec.
http://lowreal.net/Test: 40
http://lowreal.net/Test: 41
http://lowreal.net/Test: 42
http://lowreal.net/Test: 43
http://lowreal.net/Test: 44
http://lowreal.net/Test: 45
http://lowreal.net/Test: 46
http://lowreal.net/Test: 47
http://lowreal.net/Test: Devided: 116msec.
http://lowreal.net/Test: 48
http://lowreal.net/Test: 49
http://lowreal.net/Test: 50
http://lowreal.net/Test: 51
http://lowreal.net/Test: 52
http://lowreal.net/Test: Devided: 109msec.
http://lowreal.net/Test: 53
http://lowreal.net/Test: 54
http://lowreal.net/Test: 55
http://lowreal.net/Test: 56
http://lowreal.net/Test: Devided: 113msec.
http://lowreal.net/Test: 57
http://lowreal.net/Test: 58
http://lowreal.net/Test: 59
http://lowreal.net/Test: Devided: 103msec.
http://lowreal.net/Test: 60
http://lowreal.net/Test: 61
http://lowreal.net/Test: 62
http://lowreal.net/Test: Devided: 119msec.
http://lowreal.net/Test: 63
http://lowreal.net/Test: 64
http://lowreal.net/Test: 65
http://lowreal.net/Test: Devided: 137msec.
http://lowreal.net/Test: 66
http://lowreal.net/Test: 67
http://lowreal.net/Test: Devided: 103msec.
http://lowreal.net/Test: 68
http://lowreal.net/Test: 69
http://lowreal.net/Test: Devided: 112msec.
http://lowreal.net/Test: 70
http://lowreal.net/Test: 71
http://lowreal.net/Test: Devided: 122msec.
http://lowreal.net/Test: 72
http://lowreal.net/Test: 73
http://lowreal.net/Test: Devided: 133msec.
http://lowreal.net/Test: 74
http://lowreal.net/Test: 75
http://lowreal.net/Test: Devided: 144msec.
http://lowreal.net/Test: 76
http://lowreal.net/Test: 77
http://lowreal.net/Test: Devided: 158msec.
http://lowreal.net/Test: 78
http://lowreal.net/Test: 79
http://lowreal.net/Test: Devided: 168msec.
http://lowreal.net/Test: 80
http://lowreal.net/Test: 81
http://lowreal.net/Test: Devided: 182msec.
http://lowreal.net/Test: 82
http://lowreal.net/Test: 83
http://lowreal.net/Test: Devided: 194msec.
http://lowreal.net/Test: 84
http://lowreal.net/Test: Devided: 103msec.
http://lowreal.net/Test: 85
http://lowreal.net/Test: Devided: 106msec.
http://lowreal.net/Test: 86
http://lowreal.net/Test: Devided: 110msec.
http://lowreal.net/Test: 87
http://lowreal.net/Test: Devided: 114msec.
http://lowreal.net/Test: 88
http://lowreal.net/Test: Devided: 118msec.
http://lowreal.net/Test: 89
http://lowreal.net/Test: Devided: 122msec.
http://lowreal.net/Test: 90
http://lowreal.net/Test: Devided: 126msec.
http://lowreal.net/Test: 91
http://lowreal.net/Test: Devided: 131msec.
http://lowreal.net/Test: 92
http://lowreal.net/Test: Devided: 135msec.
http://lowreal.net/Test: 93
http://lowreal.net/Test: Devided: 140msec.
http://lowreal.net/Test: 94
http://lowreal.net/Test: Devided: 144msec.
http://lowreal.net/Test: 95
http://lowreal.net/Test: Devided: 148msec.
http://lowreal.net/Test: 96
http://lowreal.net/Test: Devided: 153msec.
http://lowreal.net/Test: 97
http://lowreal.net/Test: Devided: 158msec.
http://lowreal.net/Test: 98
http://lowreal.net/Test: Devided: 166msec.
http://lowreal.net/Test: 99
http://lowreal.net/Test: Devided: 171msec.
http://lowreal.net/Test: 100
http://lowreal.net/Test: End

実際つかうならハードコードされてるところをましにしたりしないといけないかな。