我正在为javascript测试循环for and while并得到了这种情况:
function loopWithWhileOneBillion() {
var max = 1000000000; //1kkk
var date1 = new Date();
var inc = 0;
while (max--) {
inc++;
}
var date2 = new Date();
return date2.getTime() - date1.getTime();
}
function loopWithForOneBillion() {
var max = 1000000000; //1kkk
var date1 = new Date();
var inc = 0;
for (var i = 0; i < max; i++) {
inc++;
}
var date2 = new Date();
return date2.getTime() - date1.getTime();
}
/* *************************************** */
/* loop with 10kkk interactions */
function loopWithWhileTenBillion() {
var max = 10000000000; //10kkk
var date1 = new Date();
var inc = 0;
while (max--) {
inc++;
}
var date2 = new Date();
return date2.getTime() - date1.getTime();
}
function loopWithForTenBillion() {
var max = 10000000000; //10kkk
var date1 = new Date();
var inc = 0;
for (var i = 0; i < max; i++) {
inc++;
}
var date2 = new Date();
return date2.getTime() - date1.getTime();
}
我的代码正在测试10亿次和100亿次交互的for和while循环。我想虽然while尽可能地进行了最优化,然后while会比在所有情况下都好,但它并没有像我想象的那样出现。对特定条件有更好的循环吗?这些循环是否有浏览器优化?在前端的情况下,我想不应该像我在这个例子中那样进行所有交互,但在具有节点的应用程序中可以有。在v8中是否有优化循环?
答案 0 :(得分:1)
如果你测试while
和for
循环基本上做同样的事情,你会发现它们的性能几乎相同,除非测量误差(并且测量误差非常容易介绍,那些以部分速度运行的CPU,直到/除非需要做很多工作,在机器上运行其他进程等等。)
这是一个更多的苹果对苹果比较:
function loopWithWhileOneBillion() {
var max = 1000000000;
var start = Date.now();
while (max--) {
}
var end = Date.now();
return end - start;
}
function loopWithForOneBillion() {
var max;
var start = Date.now();
for (max = 1000000000; max; max--) {
}
var end = Date.now();
return end - start;
}
/* *************************************** */
/* loop with 10kkk interactions */
function loopWithWhileTenBillion() {
var max = 10000000000;
var start = Date.now();
while (max--) {
}
var end = Date.now();
return end - start;
}
function loopWithForTenBillion() {
var max;
var start = Date.now();
for (max = 10000000000; max; max--) {
}
var end = Date.now();
return end - start;
}
console.log("loopWithWhileOneBillion: " + loopWithWhileOneBillion());
console.log("loopWithForOneBillion: " + loopWithForOneBillion());
console.log("loopWithWhileTenBillion: " + loopWithWhileTenBillion());
console.log("loopWithForTenBillion: " + loopWithForTenBillion());
我的结果 启动运行以加热CPU:
trial while1B for1B ----- -------- ----- 1 988 987 2 983 981 3 983 989 trial while10B for10B ----- -------- ------ 1 12248 12245 2 12243 12240 3 12245 12242
它没有比那更接近......
当然,这种基准测试基本没用;循环必须做真正的工作,这里有任何有意义的东西。当然,循环的实际工作可能会在循环结构中淹没任何差异(如果有的话)。