Подтвердить что ты не робот

Определить количество циклов - 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, которая может работать с ней, она тоже будет работать.

4b9b3361

Ответ 1

Использование фиксированного количества итераций в тестах JavaScript рискованно: мы можем получить нулевые результаты в конечном итоге, поскольку браузеры становятся быстрее.

Benchmark.js не позволяет заранее установить количество раундов/итераций. Вместо этого он запускает тесты снова и снова, пока результаты не будут считаться достаточно точными. Вы должны проверить код, прочитанный Monsur Hossain. Некоторые моменты из статьи:

  • Цикл в Benchmark.js состоит из настройки, срыва и нескольких итераций фактического теста.
  • Benchmark.js начинается с фазы анализа: выполните несколько циклов, чтобы найти оптимальное количество итераций (как можно быстрее завершите тест, собирая достаточное количество выборок для получения точных результатов).
  • Количество циклов, выполняемых во время анализа, сохраняется в Benchmark.prototype.cycles.
  • Зная оптимальное количество итераций, Benchmark.js начинает фазу выборки: запускает тесты и фактически сохраняет результаты.
  • Benchmark.prototype.stats.sample - это массив результатов каждого цикла во время выборки.
  • Benchmark.prototype.count - количество итераций во время выборки.

Ответ 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