是否有一个包可以帮助我对 JavaScript 代码进行基准测试?我不是指 Firebug 和此类工具。
我需要比较我实现的 2 个不同的 JavaScript 函数。我非常熟悉 Perl 的 Benchmark ( Benchmark.pm ) module,我正在寻找类似的 JavaScript 内容。
对 JavaScript 代码进行基准测试的重点是否过分了?我可以只对一次功能进行计时吗?
是否有一个包可以帮助我对 JavaScript 代码进行基准测试?我不是指 Firebug 和此类工具。
我需要比较我实现的 2 个不同的 JavaScript 函数。我非常熟悉 Perl 的 Benchmark ( Benchmark.pm ) module,我正在寻找类似的 JavaScript 内容。
对 JavaScript 代码进行基准测试的重点是否过分了?我可以只对一次功能进行计时吗?
jsperf.com是测试 JS 性能的首选站点。从那里开始。如果您需要一个框架来从命令行运行您自己的测试或脚本,请使用Benchmark.js,即 jsperf.com 所基于的库。
注意:任何测试 Javascript 代码的人都应该了解“微基准测试”(针对特定功能或操作的小型测试,而不是基于现实世界代码模式的更复杂的测试)的陷阱。这样的测试可能很有用,但由于现代 JS 运行时的运行方式而容易出现不准确。 Vyacheslav Egorov 关于性能和基准测试的演示值得一看,以了解问题的性质。
编辑:删除了对我的 JSLitmus 工作的引用,因为它不再相关或有用。
只是简单的方法。
console.time('test');
console.timeEnd('test');
只需在混合中添加一个快速计时器,有人可能会发现它很有用:
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
只需对每个函数进行几次迭代。一次迭代可能不够,但是(取决于您的函数的复杂程度)接近 100 甚至 1,000 次迭代应该可以完成这项工作。
Firebug 也有一个分析器,如果你想查看你的函数的哪些部分会减慢它的速度。
编辑:对于未来的读者,以下推荐 JSPerf 的答案应该是正确的答案。我会删除我的,但我不能,因为它已被 OP 选中。基准测试不仅仅是运行多次迭代,而且 JSPerf 会为您处理这些。
我一直在使用@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;
};