Tôi cố gắng đưa ra một bức tranh rộng lớn với câu trả lời này.
Những suy nghĩ sau đây trong ngoặc là niềm tin của tôi cho đến khi tôi vừa mới kiểm tra vấn đề:
[[Xét về các ngôn ngữ cấp thấp như C / C ++ , mã được biên dịch để bộ xử lý có lệnh nhảy có điều kiện đặc biệt khi một biến bằng 0 (hoặc khác không).
Ngoài ra, nếu bạn quan tâm đến việc tối ưu hóa nhiều này, bạn có thể đi ++i
thay i++
vì bởi vì đó ++i
là một lệnh của bộ xử lý trong khi đó i++
có nghĩa là j=i+1, i=j
.]]
Các vòng lặp thực sự nhanh có thể được thực hiện bằng cách hủy đăng ký chúng:
for(i=800000;i>0;--i)
do_it(i);
Nó có thể chậm hơn
for(i=800000;i>0;i-=8)
{
do_it(i); do_it(i-1); do_it(i-2); ... do_it(i-7);
}
nhưng lý do cho việc này có thể khá phức tạp (chỉ cần đề cập đến, có các vấn đề về xử lý tiền xử lý lệnh và xử lý bộ đệm trong trò chơi).
Về các ngôn ngữ cấp cao , như JavaScript như bạn đã hỏi, bạn có thể tối ưu hóa mọi thứ nếu bạn dựa vào các thư viện, các hàm tích hợp để lặp. Hãy để họ quyết định làm thế nào nó được thực hiện tốt nhất.
Do đó, trong JavaScript, tôi sẽ đề xuất sử dụng một cái gì đó như
array.forEach(function(i) {
do_it(i);
});
Nó cũng ít bị lỗi hơn và các trình duyệt có cơ hội tối ưu hóa mã của bạn.
[LƯU Ý: không chỉ các trình duyệt, mà bạn cũng có một không gian để tối ưu hóa dễ dàng, chỉ cần xác định lại forEach
chức năng (phụ thuộc vào trình duyệt) để nó sử dụng thủ thuật tốt nhất mới nhất! :) @AMK nói trong trường hợp đặc biệt, nó đáng để sử dụng array.pop
hoặc array.shift
. Nếu bạn làm điều đó, đặt nó đằng sau bức màn. Quá mức cần thiết là thêm các tùy chọn forEach
để chọn thuật toán lặp.]
Hơn nữa, đối với các ngôn ngữ cấp thấp, cách tốt nhất là sử dụng một số chức năng thư viện thông minh cho các hoạt động phức tạp, lặp nếu có thể.
Những thư viện đó cũng có thể đặt mọi thứ (đa luồng) phía sau lưng của bạn và các lập trình viên chuyên ngành luôn cập nhật chúng.
Tôi đã xem xét kỹ hơn một chút và hóa ra trong C / C ++, ngay cả đối với các hoạt động 5e9 = (50.000x100.000), không có sự khác biệt giữa đi lên và xuống nếu thử nghiệm được thực hiện theo hằng số như @alestanis nói. (Kết quả của JsPerf đôi khi không nhất quán nhưng nói chung cũng giống nhau: bạn không thể tạo ra sự khác biệt lớn.)
Vì vậy, --i
tình cờ là một điều "posh". Nó chỉ làm cho bạn trông giống như một lập trình viên tốt hơn. :)
Mặt khác, để không kiểm soát trong tình huống 5e9 này, nó đã đưa tôi xuống từ 12 giây xuống 2,5 giây khi tôi đi được 10 giây và xuống còn 2,1 giây khi tôi đi được 20 giây. Đó là không có tối ưu hóa, và tối ưu hóa đã đưa mọi thứ xuống thời gian ngắn không thể đo lường được. :) (Việc hủy đăng ký có thể được thực hiện theo cách của tôi ở trên hoặc sử dụng i++
, nhưng điều đó không mang lại những điều phía trước trong JavaScript.)
Tất cả trong tất cả: giữ i--
/ i++
và ++i
/ i++
sự khác biệt cho các cuộc phỏng vấn công việc, bám sát array.forEach
hoặc các chức năng thư viện phức tạp khác khi có sẵn. ;)