2015-02-23 33 views
0

我测试循环并同时对javascript和有这样的情况:而X在JavaScript的

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(); 
} 

我的代码是用于测试和一个十亿十十亿互动while循环。我想尽可能最优化的一段时间,那么一段时间会比所有情况下更好,但它并不像我想象的那样被捕获。有一个更好的循环到一个特定的条件?这些循环是否有浏览器优化?在前端情况下,我想象不应该像我在这个例子中那样进行所有的交互,但是在具有节点的应用程序中可能有。有没有在V8循环优化?

http://jsfiddle.net/alexfqc/vfmgc73n/

+3

http://jsperf.com/loops – Andy 2015-02-23 13:35:39

+2

在大多数情况下,不同循环之间的性能差异不明显。无论如何,现代编译器和引擎的编写方式是,他们将根据真实代码的经验优化代码,因此大多数时间这种_specialized_测试都会导致无意义的结果,因为它们不能反映任何实际的使用场景。 – 2015-02-23 13:39:54

+0

你的'for'和'while'循环并不等价:你的'for'循环增加两个变量并比较两个变量;你的'while'循环递减一个变量并递增另一个变量,并将变量与*常数*进行比较。所以起点:让循环等同。然后你会发现它们的性能是相同的(除了测量误差)。 – 2015-02-23 13:40:30

回答

1

如果测试whilefor循环做基本上是相同的事情,你会发现,他们的表现几乎是相同的限制测量误差(测量误差为很容易引进,什么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 

它没有得到比这更接近...

当然,这种基准本质上是无用的;循环必须做真正的工作,因为这里有任何意义。当然,循环的实际工作可能会缩小循环结构中的任何差异(如果有的话)。

+0

好吧。非常感谢您的测试 – 2015-02-23 14:01:39

相关问题