2015-01-22 22 views
5

Tôi đang xem xét cải thiện một số của chúng tôi cho mỗi vòng và tạo một điểm chuẩn kiểm tra để so sánh các cách khác nhau mà chúng tôi đang sử dụng chúng. Bài kiểm tra có thể là found here.Hiệu suất vòng lặp foreach của Javascript

Tôi rất ngạc nhiên khi phát hiện ra rằng đoạn mã này:

function add(val) { 
    sum += val; 
} 
values.forEach(add); 

hoạt động tốt hơn thế này.

values.forEach(function(val) { 
    sum += val; 
    }); 

Đây không phải là chính xác không? Điều gì làm cho đoạn mã đầu tiên nhanh hơn đoạn mã thứ hai?

+0

cả hai đều nhanh trên máy tính của tôi. 56 lần trong .055 và .053 secs –

+1

Đó là vì các khai báo hàm thường nhanh hơn các biểu thức hàm: http://jsperf.com/function-declaration-vs-function-expression. –

+0

@AaditMShah Điều đó khá thú vị! – Jonathan

Trả lời

6

Đó là vấn đề với thử nghiệm của bạn. kiểm tra của bạn là:

values.forEach(add); 

values.forEach(function(val) { 
    sum += val; 
}); 

Trong thử nghiệm thứ hai, bạn đang thời gian tạo ra các chức năng cũng như thực hiện các forEach. Trong bài kiểm tra đầu tiên, bạn không định thời gian tạo hàm; điều đó được thực hiện trong giai đoạn thiết lập của thử nghiệm, mà không phải là thời gian.

Davin Tryon tạo a test that creates the functions in both cases:

function add(val) { 
sum += val; 
} 
values.forEach(add); 

vs

values.forEach(function(val) { 
    sum += val; 
}); 

... trong đó sự khác biệt trong hoạt động biến mất trên một số công cụ, và đi theo cách khác (khai bị chậm) trên một số . (Sau này có lẽ là động cơ số liệu hiện trong bài kiểm tra đó nó có thể nội tuyến chức năng, hoặc ít nhất là bỏ qua một số bước mà nó không thể bỏ qua với một tuyên bố.)

enter image description here

+2

Đây là một nhánh của thử nghiệm: http://jsperf.com/for-vs-foreach/271 –

+0

Tuy nhiên, bạn nên lưu ý rằng việc khai báo các hàm của bạn trước nhanh hơn! – Jonathan

+0

@ Jonathan: Điều gì khiến bạn nghĩ vậy? Với điều kiện bạn tạo ra các hàm chỉ một lần thay vì lặp đi lặp lại, việc khai báo so với biểu thức không quan trọng đến nội suy modulo (xem kết quả từ bản cập nhật của Davin mà tôi đã thêm vào câu trả lời). –

Các vấn đề liên quan