2011-08-14 28 views
7

Gần đây tôi đã có cơ hội để làm looping trong javascript và tôi đã khá bối rối cho dù để sử dụng cho vòng lặp hoặc trong khi tuyên bố.Hiệu quả hơn trong Javascript: trong khi hoặc đối với báo cáo là gì?

var i = foo.length; 
while(i--){ 

} 

hoặc

for(var i=0 ;i<=foo.length;i++){ 

} 

Tôi muốn biết từ kẻ javascript đó là một trong nhiều effecient sử dụng và trong hoàn cảnh nào chúng ta nên sử dụng chúng cho phù hợp. Có cùng lý do như trong java hay đôi khi khác nhau.

+0

Tôi không biết rằng một sẽ hiệu quả hơn so với người kia vì mỗi liên quan đến cùng một số bài tập và so sánh. Để dễ đọc, tôi sẽ đi với vòng lặp 'for', nhưng đó là sở thích cá nhân. – Ryan

+7

Bạn có thể tự mình thử tại http://jsperf.com/for-vs-while-loop-iterating. – pimvdb

+0

Nó không phải là vấn đề hiệu quả, đó là vấn đề ưu tiên và dễ đọc. Không có sự khác biệt thực tế như thử nghiệm của @ pimvdb cho thấy. – JJJ

Trả lời

9

Trong lý thuyết while vòng lặp là nhanh hơn vì for loop trông lên length thuộc tính của foo mỗi lần mặc dù các vòng lặp, nhưng trong thực tế sử dụng nó sẽ làm cho một sự khác biệt vô cùng nhỏ.

+0

điều này đúng cho ví dụ cụ thể này, trong đó các câu lệnh đang làm những việc khác nhau, vì (i = foo.length; i> 0; i--) sẽ không tra cứu thuộc tính độ dài của foo trên mọi lần lặp nhưng đó là thao tác O (1) anyway – guigouz

4

Vòng lặp là đường cú pháp trong khi vòng lặp. Chúng phải giống hệt nhau. Tuy nhiên,

Hai vòng lặp của bạn khác nhau về mặt ngữ nghĩa. Một số được tính bằng không, trong khi số còn lại tính vào một thuộc tính của một đối tượng, mà bị ràng buộc là chậm hơn, mặc dù chỉ hơi như vậy. Sẽ có ý nghĩa hơn khi so sánh vòng lặp trong khi với vòng lặp for-loop sau:

for (var i = foo.length; i--;) { } 
4

Thực ra nó không có sự khác biệt đáng kể về vòng lặp bạn sử dụng. mọi cuốn sách tôi đã đọc đều nói như vậy. có thể có sự khác biệt trong ví dụ của bạn bởi vì bạn đang sử dụng vòng lặp giảm dần trong vòng lặp while. nó có xu hướng nhanh hơn vì điều kiện duy nhất được đánh giá.

ví dụ while(i<100) là chậm hơn so với while(i--)

cho bạn cho vòng lặp bạn có thể lưu trữ độ dài trước khi vòng lặp và làm việc trên giá trị đó thay vì lấy nó mỗi lần. nó cũng sẽ cung cấp cho bạn một số tối ưu hóa hiệu suất.

var fooLength = foo.length; 
for(var i=0 ;i<= fooLength;i++){ 

} 
+0

Bạn thậm chí có thể làm điều đó trong phần đầu tiên của for(). cho (var i = 0, arrLength = arr.length; i

7

Trong một số trình duyệt một số cách của vòng lặp là nhanh hơn - ví dụ, trong Chrome thì for vòng lặp là hơn gấp đôi nhanh chóng, nhưng không có người chiến thắng nhất quán trên tất cả các trình duyệt. Nếu bạn tìm thấy một mẹo để làm cho nó thực sự nhanh chóng trong một trình duyệt, bạn sẽ bị trừng phạt vì nó trong một trình duyệt khác.

thử nghiệm hiệu suất thực tế trong các trình duyệt khác nhau: http://jsperf.com/for-or-while

Bạn nên sử dụng các loại vòng lặp có ý nghĩa cho tình hình. Trong nhiều trường hợp, những gì bạn làm bên trong vòng lặp mất nhiều thời gian hơn chính vòng lặp đó.

0

Không có nhiều khác biệt về "hiệu quả" hoặc hiệu suất của chúng, sử dụng bất kỳ điều gì làm cho logic của chương trình của bạn dễ hiểu hơn trên từng trường hợp cụ thể.

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