我正在测试 javascript 的 for 和 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();
}
我的代码正在测试十亿和一百亿交互的 for 和 while 循环。我猜想 while 是尽可能最优化的,那么 while 会比在所有情况下都更好,但它不会像我想象的那样发生。对于特定条件是否有更好的循环?浏览器是否对这些循环进行了优化?在前端情况下,我认为不应该像本示例中那样进行所有交互,但在具有 Node 的应用程序中可以进行交互。 v8 中有循环优化吗?
最佳答案
如果您测试 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
没有比这更接近的了......
当然,这种基准测试本质上是没有用的;循环必须做真正的工作,这里才有意义。当然,循环的实际工作可能会掩盖循环结构中的任何差异(如果有的话)。
关于javascript - 而 x for at javascript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28674943/