Опубликованный тест является ошибочно медленным ... или это
Вы уверены, что это ошибочно? Ты касаешься (ну, звонок "nf" трогает) 2 миллиона элементов в штучной упаковке - это 4 миллиона указателей. Вы можете назвать это ошибочным, если хотите, но проблема в том, что вы думаете, что вы измеряете по сравнению с тем, что вы действительно измеряете.
Обмен данными между эталонами
Обмен данными может быть осуществлен посредством частичного применения. В моих тестах у меня обычно есть
let var = somethingCommon in
defaultMain [ bench "one" (nf (func1 somethingCommon) input1)
, bench "two" (nf (func2 somethingCommon) input2)]
Избегать повторного использования в присутствии ленивых оценок
Критерий избегает совместного использования, разделяя вашу функцию и ваш вклад. У вас есть подписи, такие как:
funcToBenchmark :: (NFData b) => a -> b
inputForFunc :: a
В Haskell каждый раз, когда вы применяете funcToBenchmark inputForFunc
, он создает thunk, который нуждается в оценке. Совместное использование невозможно, если вы не используете то же имя переменной, что и в предыдущих вычислениях. Автоматическое запоминание отсутствует - это, похоже, распространенное недоразумение.
Обратите внимание на нюанс в , что не передается. Мы не передаем окончательный результат, но input является общим. Если генерация ввода - это то, что вы хотите сравнить (например, getRandList, в данном случае), тогда сравните это, а не только функцию identity + nf:
main = do
gen <- getStdGen
let inData = getRandList gen size
inVec = V.fromList inData
size = 2097152
defaultMain
[ bench "get input for real" $ nf (getRandList gen) size
, bench "get input for real and run harrDWT and listify a vector" $ nf (V.toList . haarDWT . V.fromList . getRandList gen) size
, bench "screw generation, how fast is haarDWT" $ whnf haarDWT inVec] -- for unboxed vectors whnf is sufficient
Интерпретация данных
Третий тест довольно поучителен. Давайте посмотрим, что выводит критерий:
benchmarking screw generation, how fast is haarDWT
collecting 100 samples, 1 iterations each, in estimated 137.3525 s
bootstrapping with 100000 resamples
mean: 134.7204 ms, lb 134.5117 ms, ub 135.0135 ms, ci 0.950
Основываясь на одном прогоне, Criterion считает, что для выполнения его 100 выборок потребуется 137 секунд. Примерно через десять секунд это было сделано - что случилось? Ну, первый запуск заставил все входы (inVec
), что было дорого. Последующие прогоны нашли значение вместо thunk, и, таким образом, мы действительно отметили haarDWT
, а не StdGen
RNG (который, как известно, мучительно медленный).