Tôi đã sử dụng vòng lặp đồng thời máy kiểm tra (không có quy trình nền bên thứ ba không chuẩn nào đang chạy). Tôi đã chạy số for loop
so với while loop
vì nó liên quan đến việc thay đổi thuộc tính kiểu của 10.000 <button>
nút.
Xét nghiệm này được được chạy liên tục 10 lần, với 1 chạy timed out cho 1500 mili giây trước khi thực hiện:
Đây là javascript rất đơn giản tôi đã thực hiện cho mục đích này
function runPerfTest() {
"use strict";
function perfTest(fn, ns) {
console.time(ns);
fn();
console.timeEnd(ns);
}
var target = document.getElementsByTagName('button');
function whileDisplayNone() {
var x = 0;
while (target.length > x) {
target[x].style.display = 'none';
x++;
}
}
function forLoopDisplayNone() {
for (var i = 0; i < target.length; i++) {
target[i].style.display = 'none';
}
}
function reset() {
for (var i = 0; i < target.length; i++) {
target[i].style.display = 'inline-block';
}
}
perfTest(function() {
whileDisplayNone();
}, 'whileDisplayNone');
reset();
perfTest(function() {
forLoopDisplayNone();
}, 'forLoopDisplayNone');
reset();
};
$(function(){
runPerfTest();
runPerfTest();
runPerfTest();
runPerfTest();
runPerfTest();
runPerfTest();
runPerfTest();
runPerfTest();
runPerfTest();
setTimeout(function(){
console.log('cool run');
runPerfTest();
}, 1500);
});
đây là kết quả tôi nhận được
pen.js:8 whileDisplayNone: 36.987ms
pen.js:8 forLoopDisplayNone: 20.825ms
pen.js:8 whileDisplayNone: 19.072ms
pen.js:8 forLoopDisplayNone: 25.701ms
pen.js:8 whileDisplayNone: 21.534ms
pen.js:8 forLoopDisplayNone: 22.570ms
pen.js:8 whileDisplayNone: 16.339ms
pen.js:8 forLoopDisplayNone: 21.083ms
pen.js:8 whileDisplayNone: 16.971ms
pen.js:8 forLoopDisplayNone: 16.394ms
pen.js:8 whileDisplayNone: 15.734ms
pen.js:8 forLoopDisplayNone: 21.363ms
pen.js:8 whileDisplayNone: 18.682ms
pen.js:8 forLoopDisplayNone: 18.206ms
pen.js:8 whileDisplayNone: 19.371ms
pen.js:8 forLoopDisplayNone: 17.401ms
pen.js:8 whileDisplayNone: 26.123ms
pen.js:8 forLoopDisplayNone: 19.004ms
pen.js:61 cool run
pen.js:8 whileDisplayNone: 20.315ms
pen.js:8 forLoopDisplayNone: 17.462ms
Đây là demo link
Cập nhật
Một thử nghiệm riêng tôi đã tiến hành nằm bên dưới, mà thực hiện 2 thuật toán thừa khác bằng văn bản, 1 sử dụng một vòng lặp for, người kia sử dụng một vòng lặp while.
Đây là mã:
function runPerfTest() {
"use strict";
function perfTest(fn, ns) {
console.time(ns);
fn();
console.timeEnd(ns);
}
function whileFactorial(num) {
if (num < 0) {
return -1;
}
else if (num === 0) {
return 1;
}
var factl = num;
while (num-- > 2) {
factl *= num;
}
return factl;
}
function forFactorial(num) {
var factl = 1;
for (var cur = 1; cur <= num; cur++) {
factl *= cur;
}
return factl;
}
perfTest(function(){
console.log('Result (100000):'+forFactorial(80));
}, 'forFactorial100');
perfTest(function(){
console.log('Result (100000):'+whileFactorial(80));
}, 'whileFactorial100');
};
(function(){
runPerfTest();
runPerfTest();
runPerfTest();
runPerfTest();
runPerfTest();
runPerfTest();
runPerfTest();
runPerfTest();
runPerfTest();
console.log('cold run @1500ms timeout:');
setTimeout(runPerfTest, 1500);
})();
Và kết quả cho điểm chuẩn thừa:
pen.js:41 Result (100000):7.15694570462638e+118
pen.js:8 whileFactorial100: 0.280ms
pen.js:38 Result (100000):7.156945704626378e+118
pen.js:8 forFactorial100: 0.241ms
pen.js:41 Result (100000):7.15694570462638e+118
pen.js:8 whileFactorial100: 0.254ms
pen.js:38 Result (100000):7.156945704626378e+118
pen.js:8 forFactorial100: 0.254ms
pen.js:41 Result (100000):7.15694570462638e+118
pen.js:8 whileFactorial100: 0.285ms
pen.js:38 Result (100000):7.156945704626378e+118
pen.js:8 forFactorial100: 0.294ms
pen.js:41 Result (100000):7.15694570462638e+118
pen.js:8 whileFactorial100: 0.181ms
pen.js:38 Result (100000):7.156945704626378e+118
pen.js:8 forFactorial100: 0.172ms
pen.js:41 Result (100000):7.15694570462638e+118
pen.js:8 whileFactorial100: 0.195ms
pen.js:38 Result (100000):7.156945704626378e+118
pen.js:8 forFactorial100: 0.279ms
pen.js:41 Result (100000):7.15694570462638e+118
pen.js:8 whileFactorial100: 0.185ms
pen.js:55 cold run @1500ms timeout:
pen.js:38 Result (100000):7.156945704626378e+118
pen.js:8 forFactorial100: 0.404ms
pen.js:41 Result (100000):7.15694570462638e+118
pen.js:8 whileFactorial100: 0.314ms
Kết luận: Không có vấn đề kích thước mẫu hoặc loại công việc cụ thể được kiểm tra, không có chiến thắng rõ ràng về hiệu suất giữa một thời gian và vòng lặp. Thử nghiệm được thực hiện trên MacAir với OS X Mavericks trên Chrome thường xanh.
Đánh giá chúng nếu bạn muốn (nhưng chúng có thể bằng nhau). –
Đặt cược cho bạn chúng tạo chính xác cùng một mã byte. – zwol
'for' trong hầu hết các ngôn ngữ là cú pháp đường cho một vòng lặp tương đương' while', đó là lần lượt cú pháp đường cho một tập hợp các nhãn và 'gotos' xuống trong lắp ráp hoặc IL. Với việc thực hiện hiệu quả đặc tả ngôn ngữ, chúng sẽ gần bằng nhau. Một số ngôn ngữ bao gồm nội bộ "bình luận" đưa ra gợi ý để decompilers/phản xạ về những gì mã ban đầu như thế nào, mà sẽ có một hiệu ứng không đáng kể về hiệu suất. Tôi nghĩ rằng bạn sẽ thấy rằng sự khác biệt thời gian thực hiện lớn nhất giữa chúng là vốn có trong lập lịch hệ điều hành. – KeithS