Tôi đang viết một hàm vẽ hình ảnh vào pixel yếu tố canvas theo pixel. Tôi nhận thấy rằng có một điểm, nơi mà chức năng đột nhiên mất nhiều thời gian hơn để xử lý hơn trước đây - cụ thể là từ một canvas 338x338 pixel đến một khung ảnh 339x339 pixel.Sự khác biệt về xử lý rất cao giữa hai vòng gần như tương tự nhau trong khi các vòng
Đưa chức năng tìm kiếm tương tự vào jsfiddle, tôi nhận được kết quả tương tự. Vòng lặp while xử lý một mảng gồm 338x338 mất khoảng. 6-7 giây, trong khi một mảng 339x339 mất khoảng. 24-25 giây.
Điều này đang xảy ra trên Chrome. Trong Firefox cả hai đều mất khoảng. 16 giây.
Đây là fiddle: http://jsfiddle.net/8pb89/5/
Mã này trông như thế này:
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);
Đây có phải là một vấn đề bộ nhớ với javascript trên Chrome, hay tôi làm điều gì sai với các đối tượng? Có cách nào để tránh thời gian xử lý cao hơn này không?
Thú vị. http://jsperf.com/chrome-loops-test – climbage
Tôi không biết điều này có nghĩa vụ phải làm gì, nhưng có nhiều sai lầm trong hàm 'calcTest' đó. Bạn có muốn xây dựng? – Bergi
Fiddle chỉ là một phiên bản đơn giản hóa chức năng của tôi, vì vậy tôi có thể kiểm tra sự khác biệt giữa các mảng 338x338 và 339x339. Trong chương trình cuối cùng, mảng (ary1/ary2) chứa tọa độ, chưa được xử lý. Hàm calcTest tính toán màu pixel cho tọa độ và lưu trữ dữ liệu trong đối tượng mapData và đối tượng colorMatrix (được đổi tên trong ví dụ trên) – LongInt