定义循环次数 - Benchmark.js

时间:2015-09-17 11:57:51

标签: javascript benchmark.js

我正在尝试使用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中声明benchmarkRoundswarmupRounds计数。我认为warmupRounds映射到initCount?以及如何设置确切的周期数/基准迭代次数?

或者,如果我们有一些其他可以处理它的好的JavaScript库也可以。

3 个答案:

答案 0 :(得分:5)

在JavaScript基准测试中使用固定的迭代计数是有风险的:we might get zero-time results eventually,因为浏览器变得更快。

Benchmark.js不允许提前设置轮数/迭代次数。相反,它会一遍又一遍地运行测试,直到结果被认为是相当准确的。你应该看看code reading by Monsur Hossain。文章中的一些亮点:

  • Benchmark.js中的一个循环包括实际测试的设置,拆除和多次迭代。
  • Benchmark.js以分析阶段开始:运行几个周期以找到最佳迭代次数(尽可能快地完成测试,同时收集足够的样本以生成准确的结果)。
  • 分析期间运行的周期数保存在Benchmark.prototype.cycles
  • 了解最佳迭代次数,Benchmark.js开始采样阶段:运行测试并实际存储结果。
  • Benchmark.prototype.stats.sample是采样期间每个周期的结果数组。
  • Benchmark.prototype.count是采样期间的迭代次数。

答案 1 :(得分:4)

查看文档:

http://benchmarkjs.com/docs

听起来你是对的

  1. warmupRounds => initCount(http://benchmarkjs.com/docs#options_initCount
  2. cycles => http://benchmarkjs.com/docs#prototype_cycles

答案 2 :(得分:0)

无论这是一个好主意,如果您将minTimemaxTime设置为某些负值,那么minSamplesinitCount将作为唯一标准它们将对应于每个循环运行的#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