你如何对 JavaScript 代码进行性能测试?

IT技术 javascript performance
2021-01-28 14:45:54

CPU 周期、内存使用情况、执行时间等?

补充:除了仅仅感知代码运行的速度之外,是否有一种量化的方式来测试 JavaScript 的性能?

6个回答

探查器绝对是获取数字的好方法,但根据我的经验,感知性能对用户/客户来说是最重要的。例如,我们有一个带有 Ext 手风琴的项目,它可以扩展以显示一些数据,然后是一些嵌套的 Ext 网格。一切其实都渲染得很快,没有一个操作需要很长时间,只是一次渲染了很多信息,所以用户感觉很慢。

我们“修复”了这个问题,不是通过切换到更快的组件或优化某些方法,而是通过先渲染数据,然后使用 setTimeout 渲染网格。因此,信息首先出现,然后网格会在下一秒后弹出。总的来说,这样做需要更多的处理时间,但对用户来说,感知性能得到了改善。


这些天来,Chrome的探查和其他工具的普及和易于使用,因为是console.time()console.profile()performance.now()Chrome 还为您提供了一个时间线视图,它可以向您显示导致您的帧速率下降的因素、用户可能正在等待的位置等。

查找所有这些工具的文档非常简单,您不需要为此提供 SO 答案。7 年后,我仍然会重复我原来的答案的建议,并指出你可以让缓慢的代码在用户不会注意到的地方永远运行,而在他们所做的地方运行非常快的代码,他们会抱怨相当快的代码不够快。或者您对服务器 API 的请求花费了 220 毫秒。或者其他类似的东西。重点仍然是,如果你拿出一个分析器去寻找工作要做,你会找到它,但它可能不是你的用户需要的工作。

这是众所周知的良好性能算法到位后的微调步骤。
2021-03-14 14:45:54
这是一个非常好的答案,因为它对问题描述的大多数情况采取了实用的方法。但是,它没有回答这个问题,即询问是否有另一种方法来衡量这一点,而不仅仅是用户感知。整个停机时间,例如按钮被冻结时,仍然可以使用 pramodc 的答案中的方法及其附带的评论来衡量。
2021-03-28 14:45:54

我确实同意感知性能真的很重要。但有时我只想找出做某事的哪种方法更快。有时差异是巨大的,值得了解。

你可以只使用 javascript 计时器。但我通常得到使用原生的浏览器(目前还在Firefox和Safari)devTool方法更加一致的结果console.time()console.timeEnd()

我如何使用它的示例:

var iterations = 1000000;
console.time('Function #1');
for(var i = 0; i < iterations; i++ ){
    functionOne();
};
console.timeEnd('Function #1')

console.time('Function #2');
for(var i = 0; i < iterations; i++ ){
    functionTwo();
};
console.timeEnd('Function #2')

结果看起来像这样

更新 (4/4/2016):

Chrome canary 最近添加了Line Level Profiling the dev tools sources 选项卡,让您准确了解每行执行所需的时间! 在此处输入图片说明

这还可以操作吗?不在 Chrome 中出现。
2021-03-21 14:45:54
2021-03-22 14:45:54
是的,它的魅力之一是它快速且易于实施。我想知道,日志本身是否会从 javascript 执行中获取一些性能。假设我们在游戏中有一个循环,它输出多个日志行。例如每秒一次,持续 5 分钟,即 300 行。有谁知道?
2021-03-31 14:45:54
@K.KilianLindberg Logging 总是会占用性能的时间,任何代码也是如此,但是 a) 它在您的测试中会保持一致,并且 b) 您不应该在实时代码中进行控制台日志记录。在我的机器上测试后,时间记录只是一个 MS 的一小部分,但它会加起来你做的越多。
2021-04-02 14:45:54

我们总是可以通过简单的日期对象测量任何函数所花费的时间

var start = +new Date();  // log start timestamp
function1();
var end =  +new Date();  // log end timestamp
var diff = end - start;
不鼓励使用 Date(),因为以毫秒为单位的时间可能会因系统因素而异。而是使用 console.time() 和 console.timeEnd()。有关更多详细信息,请参阅 JQuery Lover 的回答。
2021-03-11 14:45:54
日期并不能真正代表经过的时间。查看关于它的这篇文章:sitepoint.com/measuring-javascript-functions-performancePerformance.now() 是一个更准确的时间戳。
2021-03-11 14:45:54
请注意,此解决方案以毫秒为单位返回差异
2021-03-17 14:45:54
更好的是,使用 performance.now()
2021-03-22 14:45:54
在使用 performance.now() 之前,请检查浏览器兼容性。developer.mozilla.org/en-US/docs/Web/API/Performance/...
2021-04-09 14:45:54

试试jsPerf它是一个在线 javascript 性能工具,用于对代码片段进行基准测试和比较。我用它所有的时间。

由于 jsPerf 目前已关闭,因此benchmarkjs 很容易使用
2021-03-21 14:45:54
不幸的是,这似乎不再可用:(
2021-03-25 14:45:54
+9001(超过九千;)对于 jsPerf。我经常以类似于%timeitipythonPython 代码REPL shell中的方式使用它
2021-04-04 14:45:54
我也推荐它,因为它提供了 ops/sec 测量(它多次运行您的代码)
2021-04-08 14:45:54

大多数浏览器现在都在performance.now(). 它优于new Date()性能测试,因为它独立于系统时钟运行。

用法

var start = performance.now();

// code being timed...

var duration = performance.now() - start;

参考

更好的是使用用户计时 API,它建立在performance.now().
2021-03-26 14:45:54