您如何性能测试JavaScript代码?


337

CPU周期,内存使用率,执行时间等?

补充:除了感知代码运行的速度之外,还有定量的测试JavaScript性能的方法吗?


您可能想看看Firefox 的YSlow插件。
罗伯·威尔斯

7
这只会告诉您加载需要多长时间。我认为问题更多地与运行时的性能有关。
山姆·哈斯勒

如果您想以最通用的方式来检测代码的性能(也是最精确的方法,因为您可以磨练特定的功能)。这篇文章有一个使用计时器的不错的例子(但如果有机会,您应该真正看一下Performance.now。):albertech.blogspot.com/2015/07/…–
jar

1
为了在浏览器中进行快速简便的测试,您可以使用jsben.ch
EscapeNetscape

Answers:


325

探查器绝对是获取数字的好方法,但是根据我的经验,感知的性能对用户/客户端至关重要。例如,我们有一个带有Ext手风琴的项目,该项目扩展为显示一些数据,然后显示一些嵌套的Ext网格。实际上,所有内容的渲染速度都非常快,一次操作都不会花费很长时间,一次渲染的信息很多,因此用户感觉很慢。

我们不是通过切换到更快的组件或优化某种方法来“修复”此问题,而是首先渲染数据,然后使用setTimeout渲染网格。因此,信息首先出现,然后网格将在第二秒弹出。总体而言,以这种方式花费了更多的处理时间,但是对于用户而言,感知性能得到了改善。


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

查找所有这些工具的文档确实非常容易,您不需要一个SO答案。7年后,我仍然会重复最初答案的建议,并指出您可以让用户永远不会注意到的地方永远运行缓慢的代码,而在用户注意到的地方却拥有非常快的代码,他们会抱怨快速的代码还不够快。或者您对服务器API的请求花费了220毫秒。或类似的东西。重点仍然是,如果您将探查器拿出来去寻找要做的工作,就会找到它,但这可能不是用户需要的工作。


3
众所周知的高性能算法到位后,这是一个微调步骤。
拉斐尔·泽维尔2014年

1
这是一个非常好的答案,因为它对问题描述的大多数情况都采用了一种实用的方法。但是,它不能回答问题,即询问是否存在除用户感知之外的另一种方法来衡量此问题。整个停机时间(例如按钮被冻结时)仍可以使用pramodc的答案中的方法及其附带的注释进行测量。
RoboticRenaissance 2015年

202

我确实同意,感知性能实际上至关重要。但是有时候我只想找出哪种方法做起来更快。有时区别是巨大的,值得了解。

您可以只使用JavaScript计时器。但是我通常使用本地Chrome(现在也在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开发工具的“来源”标签,可让您确切地了解每行执行的时间! 在此处输入图片说明


是的,此功能的魅力之一是它快速且易于实现。我想知道,日志记录本身是否会从javascript执行中获得一些性能。假设我们在游戏中有一个循环,它输出多个日志行。例如,每秒一次,持续5分钟,即300行。有谁知道?
K. Kilian Lindberg 2014年

仍然可以使用吗?在Chrome中无法使用。
以示例方式学习统计数据(


@ K.KilianLindberg日志记录和其他代码一样,总是会从性能上花费时间,但是a)在您的测试中它将保持一致,并且b)您不应在控制台中登录实时代码。在我的机器上进行测试后,时间记录只是MS的一小部分,但是您做得越多,它的总和就越多。
Polyducks

92

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

var start = +new Date();  // log start timestamp
function1();
var end =  +new Date();  // log end timestamp
var diff = end - start;

10
请注意,该解决方案将返回以毫秒为单位的差异
克里斯·比尔

16
不建议使用Date(),因为以毫秒为单位的时间可能会因系统因素而异。而是使用console.time()和console.timeEnd()。有关更多详细信息,请参见JQuery Lover的回答。
mbokil

44
更好的是,使用performance.now()
edan 2014年

1
在使用performance.now()之前,请检查浏览器的兼容性。developer.mozilla.org/en-US/docs/Web/API/Performance/...
AR_HZ

日期并不能真正代表所经过的时间。查看有关此文章:sitepoint.com/measuring-javascript-functions-performance。Performance.now()是更准确的时间戳。
百万富翁

61

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


1
由于jsPerf目前处于关闭状态,所以 Benchmarkjs 易于使用
mucaho

我也推荐它,因为它可以进行操作/秒测量(它可以多次运行您的代码)
理查德(Richard

jsPerf +9001(超过9000;)。我经常使用这种类似的方式,以%timeitipythonREPL外壳为Python代码。
amcgregor

37

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

用法

var start = performance.now();

// code being timed...

var duration = performance.now() - start;

参考文献


2
更妙的是使用用户计时API,它是建立在performance.now()
克里斯(Chris)

30

JSLitmus是用于创建临时JavaScript基准测试的轻量级工具

让检查之间的性能function expressionfunction constructor

<script src="JSLitmus.js"></script>
<script>

JSLitmus.test("new Function ... ", function() { 
    return new Function("for(var i=0; i<100; i++) {}"); 
});

JSLitmus.test("function() ...", function() { 
       return (function() { for(var i=0; i<100; i++) {}  });
});

</script>

我在上面所做的是创建一个function expressionfunction constructor执行相同的操作。结果如下:

FireFox性能结果

FireFox性能结果

IE性能结果

IE性能结果


链接的JSLitmus页面包含损坏的下载链接。我找到了JSLitmus(用于浏览器)和jslitmus(用于NodeJS,小写!)。
罗伯W

16

有人建议使用特定的插件和/或浏览器。我不会因为他们是唯一真正为一个有用的平台; 在Firefox上运行的测试无法正确转换为IE7。考虑到99.999999%的网站有一个以上的浏览器访问它们,您需要检查所有流行平台上的性能。

我的建议是将此保留在JS中。创建一个基准测试页面,其中包含所有JS测试并计时执行时间。您甚至可以使用AJAX将结果发布回给您,以使其完全自动化。

然后,只需冲洗并在不同的平台上重复即可。


5
的确如此,但是如果存在与浏览器特定问题无关的编码问题,则探查器非常有用。
John Boker

1
当然!是的,它们将捕获一般的“不良编码”问题,而特定的问题对于进行实际的调试非常有用,但是对于一般的用例测试,您将从在所有平台上运行的功能中受益。
奥利

2
请注意+1,这是对的,但是拥有Firebug这样的分析器仍然很重要,即使不是必须的,也可以找到瓶颈。
Pekka

1
考虑到99.999999%的网站…… ”我认为您做了……:-/
RobG '16

@RobG我可能夸大了一个或两个小数位,但您的开发平台可能与部署平台可能并不相同。
奥利

11

我有一个小型工具,可以在浏览器中快速运行小型测试用例并立即获得结果:

JavaScript速度测试

您可以使用代码,并找出在经过测试的浏览器中哪种技术更好。


谢谢,这正是我想要的。
约瑟夫·希迪


9

这是一个简单的函数,显示传入的函数的执行时间:

var perf = function(testName, fn) {
    var startTime = new Date().getTime();
    fn();
    var endTime = new Date().getTime();
    console.log(testName + ": " + (endTime - startTime) + "ms");
}


4

快速回答

在jQuery(更具体地说是在Sizzle上)上,我们使用(签出母版并在浏览器上打开speed / index.html),而后者又使用了Benchmark.js。这用于对库进行性能测试。

长答案

如果读者不知道基准测试,工作负载和事件探查器之间的区别,请首先阅读spec.org“ readme 1st”部分的一些性能测试基础。这是用于系统测试,但是了解这些基础也将有助于JS性能测试。一些重点:

什么是基准?

基准是“衡量或评估的标准”(韦伯斯特II词典)。计算机基准测试通常是一种计算机程序,它执行一组严格定义的操作-工作负载-并返回某种形式的结果-指标-描述被测计算机的性能。计算机基准测试指标通常衡量速度:工作负载完成的速度;或吞吐量:每单位时间完成多少工作量单位。在多台计算机上运行同一计算机基准测试可以进行比较。

我应该对自己的应用程序进行基准测试吗?

理想情况下,系统的最佳比较测试将是您自己的应用程序和自己的工作量。不幸的是,使用自己的应用程序和自己的工作量为不同的系统获得广泛的可靠,可重复和可比较的测量结果通常是不切实际的。问题可能包括生成好的测试用例,机密性问题,难以确保可比的条件,时间,金钱或其他限制。

如果不是我自己的应用程序,那又如何?

您不妨考虑使用标准化基准作为参考点。理想情况下,标准化基准测试将是可移植的,并且可能已经在您感兴趣的平台上运行。但是,在考虑结果之前,需要确保您了解应用程序/计算需求与所需要处理的内容之间的相关性。基准正在衡量。基准测试与您运行的应用程序类型相似吗?工作负载是否具有相似的特征?根据对这些问题的回答,您可以开始查看基准如何近似您的现实。

注意:标准化基准可以用作参考点。但是,当您进行供应商或产品选择时,SPEC并不声称任何标准化的基准都可以替代您自己的实际应用基准。

性能测试JS

理想情况下,最好的性能测试是使用自己的应用程序和自己的工作负载来切换需要测试的内容:不同的库,机器等。

如果这不可行(通常是不可行)。重要的第一步:定义工作量。它应该反映您的应用程序的工作量。在本次演讲中,Vyacheslav Egorov讨论了您应避免的繁琐工作负载。

然后,您可以使用Benchmark.js之类的工具来帮助您收集指标,通常是速度或吞吐量。在Sizzle上,我们有兴趣比较修复或更改如何影响库的系统性能。

如果某件事确实表现不佳,那么下一步就是寻找瓶颈。

如何找到瓶颈?分析器

剖析javascript执行的最佳方法是什么?


3

我发现执行时间是最好的方法。


相对于什么?我不确定我是否理解。
佩卡

与原始的海报问题相反:“ CPU周期,内存使用率,执行时间等?”
窃笑


2

我通常只测试javascript性能,脚本运行多长时间。jQuery Lover提供了一个很好的文章链接来测试javascript代码的性能,但是本文仅显示了如何测试javascript代码的运行时间。我还建议阅读一篇名为“ 在处理巨大数据集时改进jQuery代码的 5条技巧”的文章。


2

这是时间性能的可重用类。示例包含在代码中:

/*
     Help track time lapse - tells you the time difference between each "check()" and since the "start()"

 */
var TimeCapture = function () {
    var start = new Date().getTime();
    var last = start;
    var now = start;
    this.start = function () {
        start = new Date().getTime();
    };
    this.check = function (message) {
        now = (new Date().getTime());
        console.log(message, 'START:', now - start, 'LAST:', now - last);
        last = now;
    };
};

//Example:
var time = new TimeCapture();
//begin tracking time
time.start();
//...do stuff
time.check('say something here')//look at your console for output
//..do more stuff
time.check('say something else')//look at your console for output
//..do more stuff
time.check('say something else one more time')//look at your console for output

1

UX Profiler从用户角度解决了此问题。它对由某些用户操作(点击)引起的所有浏览器事件,网络活动等进行分组,并考虑所有方面,例如延迟,超时等。


1

我在寻找相似的东西,但是发现了这个。

https://jsbench.me/

它允许进行侧面比较,然后您也可以共享结果。


0

黄金法则是在任何情况下均不得锁定用户浏览器。在那之后,我通常会先看执行时间,然后看内存使用情况(除非您做了疯狂的事情,在这种情况下,它可能是更高的优先级)。


0

最近,性能测试已成为流行语,但这并不是说性能测试在质量保证中或产品出厂后并不是重要的过程。在开发应用程序时,我使用了许多不同的工具,其中有些是上面提到的工具,例如chrome Profiler,我通常会看一下SaaS或一些我可以使用的开源软件,而忘记了它,直到我得到警告,说有些事情变得不堪设想为止。 。

有很多很棒的工具可以帮助您随时关注性能,而不必仅仅为了获得一些基本的警报而跳过障碍。我认为有一些值得您亲自检查。

  1. Sematext.com
  2. Datadog.com
  3. Uptime.com
  4. Smartbear.com
  5. Solarwinds.com

为了画出更清晰的图片,这里有一个关于如何为React应用程序设置监视的小教程。


-1

这是收集特定操作性能信息的好方法。

start = new Date().getTime(); 
for (var n = 0; n < maxCount; n++) {
/* perform the operation to be measured *//
}
elapsed = new Date().getTime() - start;
assert(true,"Measured time: " + elapsed);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.