当前位置:  开发笔记 > 编程语言 > 正文

如何对JavaScript代码进行基准测试?

如何解决《如何对JavaScript代码进行基准测试?》经验,为你挑选了6个好方法。

有没有一个包可以帮助我对JavaScript代码进行基准测试?我不是指Firebug和这样的工具.

我需要比较我实现的两个不同的JavaScript函数.我非常熟悉Perl的Benchmark(Benchmark.pm)模块,我正在寻找类似JavaScript的东西.

是否强调对JavaScript代码进行基准测试?我可以通过一次运行来计时吗?



1> broofa..:

jsperf.com是测试JS性能的首选站点.从那里开始.如果您需要一个框架来从命令行运行您自己的测试或脚本使用Benchmark.js,那么构建jsperf.com的库.

注意:任何测试Javascript代码的人都应该了解"微基准"的缺陷(针对特定功能或操作的小测试,而不是基于真实代码模式的更复杂的测试).这些测试很有用,但由于现代JS运行时的运行方式,这些测试很容易出现不准确. Vyacheslav Egorov关于性能和基准测试的演示值得关注,以了解问题的本质.

编辑:删除了对我的JSLitmus工作的引用,因为它不再相关或有用.


更新:jsperf不再在线,并且在重新联机时没有任何消息.有关详细信息,请参阅[this github thread](https://github.com/jsperf/jsperf.com/issues/18).
更新:只需使用jsperf.com - 它已经变得更好了,并且非常适合这类事情.jslitmus仍然有效,但相当长一段时间没有积极开发.

2> Kenny..:

只需添加一个快速计时器,有人可能会觉得有用:

var timer = function(name) {
    var start = new Date();
    return {
        stop: function() {
            var end  = new Date();
            var time = end.getTime() - start.getTime();
            console.log('Timer:', name, 'finished in', time, 'ms');
        }
    }
};

理想情况下,它将被放置在一个类中,并不像上面的示例目的那样用作全局.使用它会很简单:

var t = timer('Some label');
// code to benchmark
t.stop(); // prints the time elapsed to the js console


为了获得更准确的结果,可能需要使用`performance.now()`而不是`Date()`https://developer.mozilla.org/en-US/docs/Web/API/Performance/now
这里好好利用封口.

3> 小智..:

简单的方法.

console.time('test');
console.timeEnd('test');


这应该是公认的答案。有时使用第三方服务并不方便,而仅使用简单的内置功能非常好。

4> Sasha Chedyg..:

只需对每个函数进行多次迭代.一次迭代可能是不够的,但是(取决于你的函数有多复杂),接近100或甚至1000次迭代的地方应该可以胜任.

如果你想看看你的功能的哪些部分正在减慢速度,Firebug也有一个分析器.

编辑:对于未来的读者,推荐JSPerf的以下答案应该是正确的答案.我会删除我的,但我不能,因为它已被OP选中.基准测试不仅仅是运行多次迭代,而且JSPerf会为您完成这项工作.


简单地计算代码的预定义迭代次数[根本不是防弹](http://calendar.perfplanet.com/2010/bulletproof-javascript-benchmarks/).此外,让Firebug打开会禁用Firefox的即时(JIT)编译器,这意味着测试将在解释器中运行,即比其他情况慢得多.使用Firebug的分析器不会给你你期望的结果.
或者使用http://jsben.ch,因为jsperf已关闭
当然,没有进攻伴侣.我只是想我已经评论了未来的参考,因为已经对这个问题进行了更多的研究.
JSperf离线

5> fncomp..:

我一直在使用@musicfreaks答案的这个简单实现.没有功能,但它真的很容易使用.这bench(function(){return 1/2;}, 10000, [], this)将计算1/2 10,000次.

/**
 * Figure out how long it takes for a method to execute.
 * 
 * @param {Function} method to test 
 * @param {number} iterations number of executions.
 * @param {Array} args to pass in. 
 * @param {T} context the context to call the method in.
 * @return {number} the time it took, in milliseconds to execute.
 */
var bench = function (method, iterations, args, context) {

    var time = 0;
    var timer = function (action) {
        var d = Date.now();
        if (time < 1 || action === 'start') {
            time = d;
            return 0;
        } else if (action === 'stop') {
            var t = d - time;
            time = 0;    
            return t;
        } else {
            return d - time;    
        }
    };

    var result = [];
    var i = 0;
    timer('start');
    while (i < iterations) {
        result.push(method.apply(context, args));
        i++;
    }

    var execTime = timer('stop');

    if ( typeof console === "object") {
        console.log("Mean execution time was: ", execTime / iterations);
        console.log("Sum execution time was: ", execTime);
        console.log("Result of the method call was:", result[0]);
    }

    return execTime;  
};



6> Mathias Byne..:

编写像样的跨浏览器基准测试真的很难.简单地计时代码的预定义迭代次数根本不是防弹的.

正如@broofa已经建议的那样,请查看jsPerf.它在幕后使用Benchmark.js.

推荐阅读
贾志军
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有