如何测试JavaScript代码的性能?

如何测试JavaScript代码的性能?,javascript,performance,Javascript,Performance,CPU周期、内存使用、执行时间等 补充:除了对代码运行速度的感知之外,是否还有一种定量的方法来测试JavaScript的性能?黄金法则是在任何情况下都不要锁定用户的浏览器。之后,我通常会查看执行时间,然后是内存使用情况(除非您正在做一些疯狂的事情,在这种情况下,它可能是一个更高的优先级)。我发现执行时间是最好的衡量标准。您可以使用以下方法:。它有一个JavaScript分析器。一些人建议使用特定的插件和/或浏览器。我不会,因为它们只对那个平台真正有用;Firefox上的测试运行无法准确转换为IE

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


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

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

我发现执行时间是最好的衡量标准。

您可以使用以下方法:。它有一个JavaScript分析器。

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

我的建议是将其保留在JS中。创建一个基准测试页面,其中包含所有JS测试,并确定执行时间。你甚至可以让它把结果发布给你,让它完全自动化


然后在不同的平台上冲洗和重复。

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

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


如今,Chrome profiler和其他工具都是通用的,并且易于使用。Chrome还为您提供了一个时间线视图,它可以显示是什么影响了您的帧速率,用户可能在哪里等待,等等


查找所有这些工具的文档非常容易,您不需要这样的答案。7年后,我仍然会重复我最初答案中的建议,并指出,用户可能永远在没有注意到的地方运行缓慢的代码,在用户注意到的地方运行非常快的代码,他们会抱怨非常快的代码不够快。或者您对服务器API的请求耗时220毫秒。或者其他类似的事情。关键是,如果你拿出一个分析器去寻找要做的工作,你会找到它,但这可能不是你的用户需要的工作。

我认为JavaScript性能(时间)测试已经足够了。我发现了一篇非常方便的文章。

我通常只测试javascript性能,脚本运行多长时间。jquerylover提供了一个很好的测试文章链接,但本文只展示了如何测试javascript代码的运行时间。我还建议您阅读一篇名为“处理海量数据集时的5个技巧”的文章。

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

var start=+new Date();//日志开始时间戳
功能1();
var end=+新日期();//日志结束时间戳
var diff=结束-开始;
是一个轻量级工具,用于创建临时JavaScript基准测试

让我们检查
函数表达式
函数构造函数
之间的性能:

<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>

test(“新函数…”,Function(){

return new Function(“for(var i=0;iTry)。这是一个在线javascript性能工具,用于基准测试和比较代码片段。我一直在使用它。

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

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

你可以在firebug中使用。我确实同意感知性能才是真正重要的。但有时我只是想找出哪种方法做某事更快。有时差异很大,值得了解

您可以只使用javascript计时器。但是我通常使用本机Chrome(现在也在Firefox和Safari中)devTool方法获得更一致的结果
console.time()
&
console.timeEnd()

我如何使用它的示例:
var迭代次数=1000000;
console.time('Function#1');
对于(var i=0;i

更新(4/4/2016): Chrome canary最近添加了dev tools sources选项卡,让您可以确切地看到每一行执行所需的时间!

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

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);
start=newdate().getTime();
对于(变量n=0;n
快速回答

在jQuery上(更具体地说是在Sizzle上),我们使用(在浏览器上使用checkout master和open speed/index.html),后者反过来使用。这用于测试库的性能

长答案

如果读者不知道基准测试、工作负载和分析器之间的区别,请首先阅读上的一些性能测试基础。这是用于系统测试的,但了解这些基础也将有助于JS perf测试。一些重点:

什么是基准

基准是“衡量或评估的标准”(韦伯斯特II字典)。计算机基准通常是执行严格定义的一组操作(工作负载)和操作的计算机程序
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);
var start = performance.now();

// code being timed...

var duration = performance.now() - start;
/*
     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
performance.mark('initSelect - start');
initSelect();
performance.mark('initSelect - end');