2014 đã While
trở lại
Chỉ cần suy nghĩ hợp lý.
Nhìn cái này
for( var index = 0 , length = array.length ; index < length ; index++ ) {
//do stuff
}
- Cần tạo ít nhất 2 biến (chỉ mục, độ dài)
- Cần kiểm tra nếu chỉ số nhỏ hơn chiều dài
- Cần tăng chỉ số
- các
for
vòng lặp có 3 thông số
Bây giờ hãy nói cho tôi tại sao điều này nên nhanh hơn:
var length = array.length;
while( --length ) { //or length--
//do stuff
}
- Một biến
- Không kiểm tra
- chỉ số giảm (Máy thích hơn)
while
chỉ có một tham số
Tôi hoàn toàn bối rối khi Chrome 28 cho thấy vòng lặp for nhanh hơn thời gian. Cái này phải có một số loại
"Uh, mọi người đang sử dụng vòng lặp for, hãy tập trung vào điều đó khi phát triển cho chrome."
Nhưng bây giờ, vào năm 2014, vòng lặp while đã trở lại trên chrome. nó nhanh hơn 2 lần, trên các trình duyệt khác / cũ hơn, nó luôn nhanh hơn.
Gần đây tôi đã thực hiện một số thử nghiệm mới. Bây giờ trong thế giới thực, các mã ngắn đó không có giá trị gì và jsperf thực sự không thể thực thi đúng vòng lặp while, bởi vì nó cần phải tạo lại mảng.length cũng mất thời gian.
bạn không thể có được tốc độ thực của vòng lặp while trên jsperf.
bạn cần tạo chức năng tùy chỉnh của riêng mình và kiểm tra xem với window.performance.now()
Và vâng ... không có cách nào vòng lặp while đơn giản là nhanh hơn.
Vấn đề thực sự là thao tác dom / thời gian kết xuất / thời gian vẽ hoặc tuy nhiên bạn muốn gọi nó.
Ví dụ, tôi có một cảnh canvas trong đó tôi cần tính toán tọa độ và va chạm ... điều này được thực hiện trong khoảng 10-200 MicroSeconds (không phải mili giây). nó thực sự mất nhiều mili giây để hiển thị mọi thứ. Như trong DOM.
NHƯNG
Có một cách siêu hiệu quả khác sử dụng for loop
trong một số trường hợp ... ví dụ để sao chép / sao chép một mảng
for(
var i = array.length ;
i > 0 ;
arrayCopy[ --i ] = array[ i ] // doing stuff
);
Lưu ý thiết lập các tham số:
- Tương tự như trong vòng lặp while tôi chỉ sử dụng một biến
- Cần kiểm tra nếu chỉ số lớn hơn 0;
- Như bạn có thể thấy cách tiếp cận này khác với vòng lặp thông thường mà mọi người sử dụng, vì tôi làm công cụ bên trong tham số thứ 3 và tôi cũng giảm trực tiếp bên trong mảng.
Nói rằng, điều này xác nhận rằng các máy như -
viết rằng tôi đã suy nghĩ để làm cho nó ngắn hơn một chút và loại bỏ một số thứ vô dụng và viết cái này bằng cách sử dụng cùng một phong cách:
for(
var i = array.length ;
i-- ;
arrayCopy[ i ] = array[ i ] // doing stuff
);
Ngay cả khi nó ngắn hơn, có vẻ như sử dụng i
thêm một lần nữa sẽ làm chậm mọi thứ. Nó chậm hơn 1/5 so với for
vòng lặp trước và vòng lặp trước while
.
Lưu ý: điều ;
này rất quan trọng sau khi không có{}
Ngay cả khi tôi chỉ nói với bạn rằng jsperf không phải là cách tốt nhất để kiểm tra tập lệnh .. tôi đã thêm 2 vòng lặp ở đây
http://jsperf.com/caching-array-length / 40
Và đây là một câu trả lời khác về hiệu suất trong javascript
https://stackoverflow.com/a/21353032/2450730
Câu trả lời này là để hiển thị các cách viết javascript hiệu quả. Vì vậy, nếu bạn không thể đọc được điều đó, hãy hỏi và bạn sẽ nhận được câu trả lời hoặc đọc một cuốn sách về javascript http: //www.ecma-i Intl.org/ecma-262/5.1/