Ответ 1
Опубликованный критерий неистово медленный... или он
Вы уверены, что это ошибочно? Вы трогаете (ну, звонок "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
, он создает тон, который необходимо оценить. Совместное использование отсутствует, если вы не используете одно и то же имя переменной, как в предыдущем вычислении. Нет автоматических заметок - это похоже на общее недоразумение.
Обратите внимание на нюанс в том, что не используется. Мы не разделяем конечный результат, но общий вход. Если генерация входного сигнала - это то, что вы хотите проверить (т.е. 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 думает, что потребуется 137 секунд, чтобы выполнить 100 образцов. Примерно через десять секунд это было сделано - что случилось? Ну, первый запуск заставил все входы (inVec
), что было дорого. Последующие прогоны обнаруживают значение вместо thunk, и поэтому мы по-настоящему сравниваем haarDWT
, а не StdGen
RNG (который, как известно, мучительно медленный).