如何评估JavaScript代码?
有没有一个包可以帮助我testingJS代码? 我不是指Firebug和这样的工具。
我需要比较我已经实现的两个不同的JS函数。 我非常熟悉perl的Benchmark( Benchmark.pm )模块,我正在寻找类似的JavaScript。
重点在JS代码溢出基准? 我可以逃避只有一个function的运行时间吗?
只是时间几个迭代的每个function。 一次迭代可能是不够的,但是(取决于你的函数的复杂程度)接近100甚至1000次迭代应该能够完成这个工作。
如果你想看看你的函数的哪些部分正在放慢速度,Firebug也有一个分析器 。
编辑:对于未来的读者,下面的回答build议JSPerf应该是正确的答案。 我会删除我的,但是我不能,因为它已经被OP选中了。 基准testing比运行多次迭代还要多,JSPerf会为您提供帮助。
jsperf.com是testingJS性能的前往网站。 从那里开始。 如果您需要一个框架来从命令行或脚本运行您自己的testing,请使用Benchmark.js ,即jsperf.com构build的库。
注意:任何testingJavascript代码的人都应该对“微基准”(针对特定function或操作的小testing,而不是基于真实代码模式的更复杂testing)的缺陷进行教育。 这样的testing可能是有用的,但由于现代JS运行时如何运行,容易造成不准确。 维亚切斯拉夫•叶戈罗夫(Vyacheslav Egorov)关于性能和基准testing的介绍值得关注,以便了解问题的性质。
编辑:删除对我的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
我一直在使用@musicfreaks这个简单的执行答案。 没有function,但使用起来非常简单。 这个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已经build议的,查看jsPerf 。 它在幕后使用Benchmark.js 。
如果编写自定义基准testing脚本,请务必注意,某些浏览器仅在定义函数结束之后才应用dom操作。 更多细节在这里http://www.quirksmode.org/blog/archives/2009/08/when_to_read_ou.html
只是简单的方法。
console.time('test'); console.timeEnd('test');
如果你需要一些简单的东西,你可以这样做:
'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)
这是一个代码的例子