ピクセルごとにキャンバス要素に画像を描画する関数を書いています。関数の処理に以前よりも突然時間がかかるポイントがあることに気付きました。具体的には、338x338 ピクセルのキャンバスから 339x339 ピクセルのキャンバスに移行するときです。
似たような関数を jsfiddle に入れても、同じ結果が得られます。338x338 の配列を処理する while ループには、約 1 秒かかります。339x339 の配列には約 6 ~ 7 秒かかります。24 ~ 25 秒。
これは Chrome で発生しています。Firefoxでは、両方とも約かかります。16秒。
これがフィドルです: http://jsfiddle.net/8pb89/5/
コードは次のようになります。
var ary1 = [];
var ary2 = [];
var mapData = {};
var colorMatrix = {};
for (var i = 0; i < (338 * 338); i++) {
ary1.push([i, i + 2]);
}
for (var i = 0; i < (339 * 339); i++) {
ary2.push([i, i + 2]);
}
//Light operation
function test(i, j) {
return Math.floor((i * j + i + j) / j);
}
//Heavy operation on objects
function calcTest(ary){
var point = ary.splice(0, 1);
var i = point[0];
var j = point[1];
if (!mapData[i]) {
mapData[i] = [];
}
if (!mapData[i][j]) {
mapData[i][j] = [];
}
mapData[i][j]["one"] = test(i, j);
mapData[i][j]["two"] = test(i, j);
colorMatrix[mapData[i][j]["two"]] = mapData[i][j]["one"];
}
var len = ary1.length;
var start = new Date().getTime();
while (len--) {
calcTest(ary1);
}
var end = new Date().getTime();
var time = end - start;
alert('Execution for 338x338: ' + time);
var len2 = ary2.length;
obj = {};
obj2 = {};
start = new Date().getTime();
while (len2--) {
calcTest(ary2);
}
end = new Date().getTime();
time = end - start;
alert('Execution for 339x339: ' + time);
これは Chrome の JavaScript のメモリの問題ですか、それともオブジェクトに何か問題がありますか? この長い処理時間を回避する方法はありますか?