2016-09-21 36 views
6

Trong Node.js v6.0.0Tại sao trễ hơn nhiều so với vòng lặp for trước vòng lặp for?

function testlet() { 
 
\t let a = 0; 
 
\t for (var i = 0; i < 100000000; i++) {} 
 
} 
 

 
function testlet2() { 
 
\t for (var i = 0; i < 100000000; i++) {} 
 
\t let a = 0; 
 
} 
 

 
console.time('let'); 
 
testlet(); 
 
console.timeEnd('let'); 
 

 
console.time('let2'); 
 
testlet2(); 
 
console.timeEnd('let2');

Làm thế nào có thể vị trí của let trong mã gây ra một sự khác biệt hiệu suất lớn?

+0

cùng một hiệu ứng trong chrome (không có bất ngờ) - không có sự khác biệt như vậy trong các trình duyệt khác –

+0

Nó cũng xảy ra với 'const', nhưng với' var' nó là cùng một tốc độ cho cả hai. – 4castle

+2

Lạ như nó là, tôi khuyên bạn không nên lo lắng quá nhiều về nó. Tối ưu hóa vi là một mục tiêu di động. Nhanh hôm nay có thể dễ dàng bị chậm vào ngày mai. –

Trả lời

7

Tôi sẽ đoán trước và nói rằng temporal dead zone là thủ phạm.

Vòng lặp đó, mà dường như là những gì microbenchmark của bạn là về, là eaten by the optimiser for breakfast như Vyacheslav Egorov likes to put it trong các cuộc đàm phán của mình. Và thậm chí nó không phải là và động cơ sẽ tăng một biến một triệu lần, nó sẽ mất cùng một thời gian trong cả hai chức năng.

Điều khác biệt là khi biến a được tạo. Trong đoạn đầu tiên của bạn, nó ở đầu tại hàm, không có gì trước nó cả. Không có vùng chết tạm thời, nó chủ yếu là một biến phạm vi chức năng; thay đổi nó thành một var sẽ không tạo sự khác biệt (thử nó). Vì vậy, khi hàm được gọi, phạm vi với biến được tạo và giá trị được intialised thành 0, sau đó một số mã chạy (hoặc không).
Ngược lại, trong đoạn thứ hai có vùng chết tạm thời. Trong mã trước khai báo let, truy cập a phải ném một ngoại lệ. Vì vậy, khi hàm được gọi, phạm vi được tạo và một khe cho a được đặt trước nhưng không được khởi tạo. Trong trạng thái này, mã được chạy (hoặc không), và chỉ sau đó biến sẽ được khởi tạo và gán với giá trị 0.

Vì vậy, nếu let ở giữa mã (hoặc sau nó), phạm vi phức tạp hơn. Điều này có thể khiến trình tối ưu hóa xử lý nó theo cách khác, thậm chí có thể ảnh hưởng đến biến số i có cùng phạm vi hoặc có thể không thực hiện được một số tối ưu nhất định.

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