使用javascript performance.now()进行计时

时间:2015-04-05 17:22:21

标签: javascript timing

我正在尝试以毫秒为单位执行我的函数。我使用 performance.now()来执行此操作。我能够在第一次运行时获得时间,但在第二次,第三次,依此类推,我得到0毫秒。 这是一个例子:

function someFunction (){
    var t0 = performance.now();
    //Function calculations
    var t1 = performance.now();
    Console.log(t1 - t0);
}

我启动了onclick功能。它在我第一次启动页面时有效。它在第二次点击时停止工作。 t0和t1得到相同的值,当我减去它们时,我得到0的时间。不管怎么说呢?我不一定需要使用performance.now()。我只想以毫秒为单位测量时间。

谢谢。

更新 我认为它与速度有关。 例如:

    <html>
    <script type="text/javascript">
    	function someFunction (){
        var t0 = performance.now();
        console.log(t0);
        //Function calculations
        //Some loop
        var counter = 0;
        for (i = 0; i < 1000000; i++) { 
        	counter ++;
    	}
        var t1 = performance.now();
        console.log(t1);
        console.log(t1 - t0);
    }
    
    </script>
    
    <button type="button" onclick="someFunction()">Click me</button>
    </hmtl>

按照我的预期工作,但使用循环for (i = 0; i < 1000; i++)却没有。

感谢您指出正确的方向。

3 个答案:

答案 0 :(得分:0)

您使用的实际代码将在此处更改结果,以及为什么测试结果为0,因为结果是没有它的推测。

也就是说,现在JavaScript中的微基准测试受optimizations的约束。例如:

function spiffy() {
    /* long bit of code that
       loops and loops and runs in 
       O(n!) time then finally */ 
    return result; 
}

漂亮!

让我们说spiffy()确定性地始终输出相同的结果。允许优化器有效地运行它:

function spiffy() { 
    return 42; 
}

转过来

function someFunction (){
    var t0 = performance.now();
    var result = spiffy();
    var t1 = performance.now();
    Console.log(t1 - t0);
}

进入无用的测试结果。

如果您在JavaScript应用中遇到了真正的性能问题,我会在它运行slower than molasses时对其进行分析并分析代码中最繁忙的部分。我不是指微基准,但是{​​{3}},examining run-time您在该部分中使用并查看是否有更好的基准用于您的情况,最后,请问某人关于实际代码的问题,在相同的上下文中运行。

答案 1 :(得分:0)

performance.now()已升级,问题应该关闭,不再被撞

https://developer.mozilla.org/en-US/docs/Web/API/Performance/now

  

Performance.now()返回的时间戳不限于   一毫秒的分辨率。相反,它们表示时间为   浮点数,精度高达微秒。

  <html>
        <script type="text/javascript">
        	function someFunction (){
            var t0 = performance.now();
            console.log(t0);
            //Function calculations
            //Some loop
            var counter = 0;
            for (i = 0; i < 1000; i++) { 
            	counter ++;
        	}
            var t1 = performance.now();
            console.log(t1);
            console.log(t1 - t0);
        }
        
        </script>
        
        <button type="button" onclick="someFunction()">Click me</button>
        </hmtl>

答案 2 :(得分:0)

根据MDN文档:

https://developer.mozilla.org/en-US/docs/Web/API/Performance/now

  

时间戳实际上不是高分辨率的。为了缓解Spectre等安全威胁,浏览器目前对结果进行了不同程度的调整。 (Firefox在Firefox 60中开始四舍五入到1毫秒。)某些浏览器可能还会稍微随机化时间戳。在将来的版本中,精度可能会再次提高;浏览器开发人员仍在研究这些计时攻击以及如何最好地缓解它们。

在这种情况下,您不应依赖于浏览器中的performance.now(),也不应仅依赖毫秒级的分辨率(就像Date.now()一样)。

一种解决方法,用另一个for{}循环将您的代码包装1000次,因此在包装的代码上花费的时间大约是原始代码的1000倍。

function benchmark(func) {
  var start = Date.now()
  for (var i=0;i<1000;i++) {
    func();
  }
  var end = Date.now();
  var diff = (end - start) / 1000;
  console.log('running 1000 times, average time is '+ diff + 'ms');
}
benchmark(someFunction);

或者,如果您的代码没有DOM操作,则可以在NodeJS中测试您的代码: