我怎样才能基准JavaScript代码? [关闭] 我怎样才能基准JavaScript代码?

2019-05-13 11:22发布

是否有一个包,可以帮助我的基准JavaScript代码? 我不是指萤火虫和这样的工具。

我需要比较,我已经实现了2个不同的JavaScript函数。 我很熟悉Perl的基准( Benchmark.pm )模块和我正在寻找在JavaScript中类似的东西。

具有标杆过火JavaScript代码的重点? 我可以逃脱时间只有一个功能运行?

Answer 1:

紧接时间每个功能的多次反复。 一个迭代可能是不够的,但(这取决于你的函数是多么复杂)的地方接近100甚至1000次迭代应该做的工作。

萤火虫也有一个分析器 ,如果你想了解您的哪些功能部件减缓下来。

编辑:为了未来的读者,下面的答案,建议JSPerf应该是正确的答案。 我想删除我的,但我不能,因为它已经被OP选择。 还有更多的基准测试不仅仅是运行多次迭代,并JSPerf需要照顾的那个你。



Answer 2:

jsperf.com是去到现场进行测试JS性能。 从那里开始。 如果你需要在命令行或脚本运行自己的测试框架使用Benchmark.js ,据此jsperf.com建库。

注意:任何测试Javascript代码应该教育自己的(基于真实世界的代码模式的小测试,针对特定功能或操作,而不是更复杂的测试)“微基准”的陷阱。 这种测试可能是有用的,但容易出现误差由于JS运行时是如何运作的现代化。 维亚切斯拉夫·叶戈罗夫的性能和基准表现是值得关注来感受的问题(S)的性质。

编辑:我JSLitmus工作,因为它只是不再相关或有用删除引用。



Answer 3:

只要添加一个快速定时器的组合,其中有人可能会觉得有用:

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


Answer 4:

只需简单的方式。

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


Answer 5:

我一直用这个简单的实现@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;  
};


Answer 6:

这真的很难写出像样的跨浏览器的基准。 只要定时你的代码的重复预先定义的号码是不是防弹在所有 。

作为@broofa已经建议,看看jsPerf 。 它采用Benchmark.js幕后。



Answer 7:

如果编写自定义脚本基准,一定要注意,有些浏览器只在定义它们结束后的功能应用DOM操作。 更多详细的http://www.quirksmode.org/blog/archives/2009/08/when_to_read_ou.html



Answer 8:

如果你需要的东西简单,你可以这样做:

'use strict'
console.clear()

const powerOf = x => y => Math.pow(x, y)
const powerOfThree = powerOf(3)

function performanceCalc(fn, ...params) {
    const start = +new Date()
    const result = fn(...params)
    const end = +new Date()

    console.log(`Result: ${result}. Execution Time: ${end - start} ms`)
}

performanceCalc(powerOfThree, 2)

下面是代码的一个例子



文章来源: How can I benchmark JavaScript code? [closed]