定义循环次数 - 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 中声明 benchmarkRounds
和 warmupRounds
计数。我认为 warmupRounds
映射到 initCount
?以及如何设置确切的 cycles/benchmark 迭代次数?
或者如果我们有一些其他好的 JavaScript 库可以处理它也可以。
正在查看文档:
听起来你是对的
- warmupRounds => initCount (http://benchmarkjs.com/docs#options_initCount)
- 周期 => 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
是采样时的迭代次数。
不管这是否是个好主意,如果您将 minTime
和 maxTime
设置为一些负值,那么 minSamples
和 initCount
将作为唯一的标准,并且它们将对应于每个周期的 #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
我正在尝试使用 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
?以及如何设置确切的 cycles/benchmark 迭代次数?
或者如果我们有一些其他好的 JavaScript 库可以处理它也可以。
正在查看文档:
听起来你是对的
- warmupRounds => initCount (http://benchmarkjs.com/docs#options_initCount)
- 周期 => 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
是采样时的迭代次数。
不管这是否是个好主意,如果您将 minTime
和 maxTime
设置为一些负值,那么 minSamples
和 initCount
将作为唯一的标准,并且它们将对应于每个周期的 #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