定义循环次数 - Benchmark.js

Define number of cycles - 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?以及如何设置确切的 cycles/benchmark 迭代次数?

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

正在查看文档:

http://benchmarkjs.com/docs

听起来你是对的

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

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

Benchmark.js不允许预先设置rounds/iterations的个数。相反,它 运行 一遍又一遍地测试,直到结果可以被认为是相当准确的。您应该查看 code reading by Monsur Hossain。文章的一些要点:

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

不管这是否是个好主意,如果您将 minTimemaxTime 设置为一些负值,那么 minSamplesinitCount 将作为唯一的标准,并且它们将对应于每个周期的 #cycles 和预热迭代 运行。所以测试函数会被执行(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();

给我 benchmark.js 2.1.0:

$ node count.js
[onCycle] counter: 2
[onCycle] counter: 4
[onCycle] counter: 6
mean: 0.0000034683333333333333