是否有一个可以帮助我基准测试JavaScript代码的软件包?我不是指像Firebug这样的工具。
我需要比较两个不同的JavaScript函数,我非常熟悉Perl的Benchmark(Benchmark.pm)模块,我正在寻找类似于JavaScript的东西。
JavaScript基准测试的重点是否过分了?我能否只计时一次运行这些函数并得出结论?
是否有一个可以帮助我基准测试JavaScript代码的软件包?我不是指像Firebug这样的工具。
我需要比较两个不同的JavaScript函数,我非常熟悉Perl的Benchmark(Benchmark.pm)模块,我正在寻找类似于JavaScript的东西。
JavaScript基准测试的重点是否过分了?我能否只计时一次运行这些函数并得出结论?
只需要简单的方式。
console.time('test');
console.timeEnd('test');
jsperf.com 是测试JS性能的首选网站,建议从这里开始。如果您需要一个从命令行或脚本运行自己测试的框架,请使用 Benchmark.js,这是jsperf.com所构建的库。
注意: 所有测试Javascript代码的人应该了解“微基准测试”的缺陷(它们是针对特定功能或操作而不是基于真实世界代码模式的更复杂测试的小型测试)。这样的测试可能有用,但由于现代JS运行时的运作方式,易于产生不准确的结果。观看Vyacheslav Egorov关于性能和基准测试的演讲可以帮助您了解这些问题的性质。
编辑:删除了有关我的JSLitmus工作的引用,因为它已不再相关或有用。
在这里,我为大家提供一个快速计时器的代码,或许会对某些人有用:
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/zh-CN/docs/Web/API/Performance/now - thormeierDate.now()
来获取当前的 Unix 时间,而不是先调用 new Date()
然后再调用 getTime()
。 - AlienKevin只需要对每个函数进行多次迭代即可。一次迭代可能不够,但根据您的功能复杂程度,大约需要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;
};
编写优秀的跨浏览器基准测试真的很难。仅仅计时您的代码一组预定义迭代次数并不完全可靠。
正如@broofa已经建议的那样,请查看jsPerf。它在幕后使用的是Benchmark.js。
'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)
如果编写自定义基准测试脚本,请注意某些浏览器仅在定义它们的函数结束后应用DOM操作。更多详细信息请参见http://www.quirksmode.org/blog/archives/2009/08/when_to_read_ou.html.