Ответ 1
Я написал Benchmark.js, который jsPerf использует.
-
"
ops/sec
" означает операции в секунду. Это то, сколько раз тест проецируется на выполнение через секунду. -
Тест повторяется до тех пор, пока он не достигнет минимального времени, необходимого для получения процентной неопределенности для измерения меньше или равно до
1%
. Количество итераций будет варьироваться в зависимости от разрешения таймера среды и сколько раз тест может выполняться в минимальное время выполнения. Мы собираем завершенные тестовые прогоны на5
секунды (настраиваемый) или по меньшей мере5
работает (также настраивается), а затем выполняет статистический анализ на выборке. Таким образом, тест может быть повторен100,000
раз в50 ms
(минимальное время запуска для большинства сред), а затем повторить100
раз больше (5
секунд). Чем больше размер выборки (в этом примере,100
), тем меньше погрешность . -
Мы основываем решение о том, какой тест выполняется быстрее, чем просто ops/sec, также учитывая погрешность. Например, тест с более низким ops/sec, но с более высоким пределом погрешности может быть статистически неотличим от теста с более высоким ops/sec и более низким пределом погрешности.
Мы использовали welch t-test, аналогично SunSpider использует, но переключился на непарный 2-выборочный t-тест для равной дисперсии (дисперсия чрезвычайно мала), потому что welch t-тест имел проблемы с сравнением меньших ops/sec и более высоких ops/sec с небольшими отклонениями, которые приводили к степеням свободы для вычисления меньше
1
. Мы также добавляем скидку5.5%
на тесты с аналогичными ops/sec, потому что в реальном мире тестирование показало, что идентичные тесты могут колебаться ~5%
от теста до повторного теста. T-тесты используются для проверки того, что различия между тестами статистически значимые.