Определить количество циклов - 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)
Здесь также я хочу объявить benchmarkRounds
и warmupRounds
count в benchmarkjs. Я думаю, что warmupRounds
отображается на initCount
? И как установить точное количество циклов/эталонной итерации?
Или, если у нас есть другая хорошая библиотека JavaScript, которая может работать с ней, она тоже будет работать.
Ответы
Ответ 1
Использование фиксированного количества итераций в тестах JavaScript рискованно: мы можем получить нулевые результаты в конечном итоге, поскольку браузеры становятся быстрее.
Benchmark.js не позволяет заранее установить количество раундов/итераций. Вместо этого он запускает тесты снова и снова, пока результаты не будут считаться достаточно точными. Вы должны проверить код, прочитанный Monsur Hossain. Некоторые моменты из статьи:
- Цикл в Benchmark.js состоит из настройки, срыва и нескольких итераций фактического теста.
- Benchmark.js начинается с фазы анализа: выполните несколько циклов, чтобы найти оптимальное количество итераций (как можно быстрее завершите тест, собирая достаточное количество выборок для получения точных результатов).
- Количество циклов, выполняемых во время анализа, сохраняется в
Benchmark.prototype.cycles
.
- Зная оптимальное количество итераций, Benchmark.js начинает фазу выборки: запускает тесты и фактически сохраняет результаты.
-
Benchmark.prototype.stats.sample
- это массив результатов каждого цикла во время выборки.
-
Benchmark.prototype.count
- количество итераций во время выборки.
Ответ 2
Просмотр документов по адресу:
http://benchmarkjs.com/docs
Похоже, вы правы
Ответ 3
Независимо от того, если это хорошая идея, если вы установите minTime
и maxTime
на некоторые отрицательные значения, то minSamples
и initCount
будут оставлены в качестве единственного критерия, и они будут соответствовать # циклам и итерациям прогрева на каждом цикле. Таким образом, тестовая функция будет выполнена (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();
дает мне testmark.js 2.1.0:
$ node count.js
[onCycle] counter: 2
[onCycle] counter: 4
[onCycle] counter: 6
mean: 0.0000034683333333333333