我正在尝试以毫秒为单位执行我的函数。我使用 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++)
却没有。
感谢您指出正确的方向。
答案 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中测试您的代码: