2013-02-20 116 views
2

我正在做一些JavaScript练习并考虑如何将我的解决方案(算法)改进为the exercise。我正在考虑在调整代码后计算运行时速度,以便知道速度有多快。我搜索并找到了this method,并认为我可以做同样的事情。这是我做的,如何在独立JavaScript程序中计算运行时速度?

var d = new Date(); 
var startTime = d.getTime(); 
var endTime; 

function testTargeAlgorithm(){ 
    .... 
    .... 
} 

testTargetAlgorithm(); 

endTime = d.getTime(); 
console.log(endTime-startTime); 

这是一个非常简单的算法,所以我不指望会有明显的时间差异。但是,如果毫秒不能衡量速度的提高,我还能做什么?

+2

使用内置于Firebug或WebKit调试器的分析器。 – marekful 2013-02-20 16:39:47

+0

添加一个循环,以便您可以调用您的函数1000次或更多次。另一方面,如果差值<1ms,那么它并不重要,是吗? – AndrewR 2013-02-20 16:43:15

+0

@MarcellFülöp我明白了。我会仔细看看的。 – Bao 2013-02-21 15:22:21

回答

2

你可以,如果引擎支持它使用performance.now()。这会给出一个以毫秒为单位的时间,自加载页面或应用程序启动以来,精度为亚毫秒级。

performance.now() // 26742.766999999956 

我知道Chrome支持它,但不知道其他浏览器,node.js或其他引擎独立js引擎。


或者你可以在一个循环中运行代码很多次,并测量所花费的总时间。

+1

谢谢。我使用Node.js作为解释器,我发现它有一个类似的函数process.hrtime(),它返回一个两元素数组:'[seconds,nanoseconds]'。以那纳秒的精度,我可以看到每次调整后的差异。另一个新问题是每次运行的偏差:即使不进行调整,每次程序运行时差异都会有所不同。所以我做的是平均运行10000次以减少偏差。 – Bao 2013-02-21 15:17:34

1

一次又一次运行相同的功能。

var startTime = (new Date()).getTime(); 
for(var i=0;i<1000;i++) { 
    testTargeAlgorithm() 
} 
var endTime = (new Date()).getTime(); 
console.log(endTime-startTime); 

编辑,以反映的建议,感谢马塞尔

+1

我试过了,但即使我运行1000000次的算法,它似乎毫秒也无法捕捉细微的差异。我猜测这种算法对于这种测量来说太简单了。但是,使用纳秒级方法(Node.js的'process.hrtime()'),成功捕获时间差异。 – Bao 2013-02-21 15:20:42

+0

这个例子中有一个错误。 “var endtime”需要是“var endTime”。所以我不会让我做一个字符编辑。 – broccoli2000 2016-09-11 18:24:25

0

我最终使用process.hrtime()为测量运行时性能提供了纳秒精度。请注意,此方法仅适用于Node.js.在Chrome & Firefox中,您可以使用performance.now()

即使运行相同的算法/函数,返回的时间差仍然变化(以纳秒单位寿)大概是由于CPU使用率和其他未知的影响,所以建议跑好多次,并计算平均值。例如:

function calAvgSpeed(timesToRun, targetAlgorithm){ 

var diffSum = 0; 
for(var i = 1; i <= timesToRun; i++){ 
    var startTime = process.hrtime(); 
    targetAlgorithm(); 
    var diff = process.hrtime(startTime); 
    diffSum += diff[1]; 
    } 
    return Math.floor(diffSum/times); 
}