我正在尝试使用Benchmark.js执行示例性能基准测试。 这是我写的:
var Benchmark = require('benchmark');
var arr = []
benchmark = new Benchmark('testPerf',function(){
arr.push(1000);
},
{
delay: 0,
initCount: 1,
minSamples: 1000,
onComplete : function(){ console.log(this);},
onCycle: function(){}
});
benchmark.run();
就像我们在JUnitBenchmarks中所做的那样:
@BenchmarkOptions(clock = Clock.NANO_TIME, callgc = true, benchmarkRounds = 10, warmupRounds = 1)
此处我还想在benchmarkjs中声明benchmarkRounds
和warmupRounds
计数。我认为warmupRounds
映射到initCount
?以及如何设置确切的周期数/基准迭代次数?
或者,如果我们有一些其他可以处理它的好的JavaScript库也可以。
答案 0 :(得分:5)
在JavaScript基准测试中使用固定的迭代计数是有风险的:we might get zero-time results eventually,因为浏览器变得更快。
Benchmark.js不允许提前设置轮数/迭代次数。相反,它会一遍又一遍地运行测试,直到结果被认为是相当准确的。你应该看看code reading by Monsur Hossain。文章中的一些亮点:
Benchmark.prototype.cycles
。Benchmark.prototype.stats.sample
是采样期间每个周期的结果数组。Benchmark.prototype.count
是采样期间的迭代次数。答案 1 :(得分:4)
查看文档:
听起来你是对的
答案 2 :(得分:0)
无论这是一个好主意,如果您将minTime
和maxTime
设置为某些负值,那么minSamples
和initCount
将作为唯一标准它们将对应于每个循环运行的#cycles和warmup迭代。因此测试功能将被执行(initCount
+ 1)* minSamples
次。至少那是我的实验所显示的。
var Benchmark = require('benchmark');
var counter = 0;
Benchmark('counting', {
'fn': function() { ++counter; },
minSamples: 3,
initCount: 1,
minTime: -Infinity,
maxTime: -Infinity,
onCycle: function () { console.log('[onCycle] counter: ' + counter); },
onComplete : function(){ console.log('mean: ' + this.stats.mean);},
}).run();
给了我chris.js 2.1.0:
$ node count.js
[onCycle] counter: 2
[onCycle] counter: 4
[onCycle] counter: 6
mean: 0.0000034683333333333333