52700.fb2 Учебник по Haskell - читать онлайн бесплатно полную версию книги . Страница 317

Учебник по Haskell - читать онлайн бесплатно полную версию книги . Страница 317

--samples=N

number of samples to collect

-t FILENAME

--template=FILENAME

template file to use

-u FILENAME

--summary=FILENAME

produce a summary CSV file of all results

-V

--version

display version, then exit

-v

--verbose

print more output

If no benchmark names are given, all are run

Otherwise, benchmarks are run by prefix match

Из этих настроек самые интресные, это -s и -o. -s указывает число сэмплов выборке (столько раз будет

запущен каждый тест). а -o говорит, о том в какой файл поместить результаты. Результаты представлены в

виде графиков, формируется файл, который можно открыть в любом браузере. Записать данные в таблицу

(например для отчёта) можно с помощью флага -u.

Проверим результаты:

./Speed -o res. html -s 100

Откроем файл res. html и посмотрим на графики. Оказалось, что для данных двух случаев первый алго-

ритм работал немного лучше. Но выборку из двух вариантов вряд ли можно считать убедительной. Давайте

расширим выборку с помощью QuickCheck. Мы запустим проверку какого-нибудь свойства тем и другим

методом. В итоге QuickCheck сам сгенерирует достаточное число случайных данных, а criterion оценит

быстродействие. Мы проверим самое первое свойство (о перевёрнутых маршрутах) на том и другом алгорит-

ме.

module Main where

import Control.Applicative

import Test.QuickCheck

import Metro

instance Arbitrary Station where

arbitrary = ($ s0) . foldr (. ) id . fmap select <$> ints

where ints = vector =<< choose (0, 100)

s0 = St Blue De

select :: Int -> Station -> Station

select i s = as !! mod i (length as)

where as = fst <$> distMetroMap s

prop :: (Station -> Station -> Maybe [Station])

-> Station -> Station -> Bool

286 | Глава 19: Ориентируемся по карте

prop search a b = search a b == (reverse <$> search b a)

main = defaultMain [

bench ”Set”

$ quickCheck (prop connectSet),

bench ”Hash” $ quickCheck (prop connectHashSet)]

В этом тесте метод Set также оказался совсем немного быстрее.

Как интерпретировать результаты? С левой стороны мы видим оценку плотности вероятности распреде-

ления быстродействия. Под графиком мы видим среднее (mean) и дисперсию значения (std dev). Показаны