【问题标题】:How can I return a stable time taken by a function to execute如何返回函数执行所花费的稳定时间
【发布时间】:2020-07-30 01:56:45
【问题描述】:

我知道 javascript 中的以下代码返回函数的执行时间:

(function(){
    for(let i = 0; i < 1000; i++){
    }

    console.log(performance.now());
})()

但它返回了一个不稳定的结果,我可以达到稳定的执行时间吗? (对于函数或代码 sn-p)

这样的结果不稳定

850672.7449999889

852057.6050000091

853179.7950000037

1043505.1950000052

返回这个不稳定值的原因是什么,达到静态结果是否合理?

【问题讨论】:

  • 浏览器中同时发生了其他事情,计算机上正在运行其他进程。在具有事件/消息中断的多线程进程中,您永远不应期望一个线程中的任何一个函数具有固定的执行时间。你应该看看时间范围。根据程序逻辑,中位数或最大时间可能更重要。
  • @DaveS 说得对,或者直接回答您的问题。 1) 我能达到……稳定的执行时间吗? -- 几乎没有,即使您对本地系统上的所有活动有 100% 的完全控制权。系统管理员向导可能比我们任何人都更接近! 2)这个不稳定值返回的原因是什么? -- 您系统上的其他活动,浏览器中的其他活动和其他操作系统进程; 3)达到静态结果是否合理? ——不是真的,不。 sha1 的回答在这方面是相当合理的。取平均值。快乐!
  • @DaveS 谢谢哥们!现在考虑到这一点(我的意思是执行时间不可靠),测量执行时间的最佳方法是什么,它是否存在? (比如说我们的程序从系统中占用X时间)
  • 没有一种简单的方法可以在现代 PC 上获得一次完美的时光,还有很多其他事情要做。@DavidConrad 下面的评论是有道理的。舍弃最高和最低,对其余的取平均值作为一个粗略的想法。

标签: javascript performance function time


【解决方案1】:

通常,您可以平均收到的结果。经过一些测量,结果应该会稳定下来,您可以尝试不同的值,即 10、20 的平均值...

但是,performance.now() 返回自文档生命周期开始以来经过的时间。除非我遗漏了什么,否则你应该对这个函数进行两次调用;如here:

var t0 = performance.now();
doSomething();
var t1 = performance.now();
console.log("Call to doSomething took " + (t1 - t0) + " milliseconds.");

【讨论】:

  • 这确实假设没有其他任何事情发生,所以我仍然期待一些变化。同样根据 Mozilla 文档:“重要的是要记住,为了减轻 Spectre 等潜在安全威胁,浏览器通常会将返回值四舍五入,以降低可预测性。”
  • 我会丢弃异常值(最高和最低值),然后对其余的取平均值。
猜你喜欢
  • 2010-09-23
  • 1970-01-01
  • 2014-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多