2014-04-17 14 views
7

Posiadam benchmark Kryterium, gdzie każdy bgroup odpowiada testowi, aw każdym bgroup są dwie wartości testu bench z różnymi opcjami. NpBenchmark kryteriów kryterialnych o różnych rzędach wielkości

main = defaultMain 
    [bgroup "test1" [bench "v1" test1_1, bench "v2" test1_2] 
    ,bgroup "test2" [bench "v1" test2_1, bench "v2" test2_2 
    -- lots more tests 
    ] 

W każdym bgroup dwóch bench badań są porównywalne. Jednak test1 trwa 2000 mikro sekund, a test2 trwa 45 mikro sekund. Wykres poglądowy (który jest najbardziej przydatny dla tego, co chcę zrobić) wyświetla różne testy na tych samych osiach, więc wyraźnie widzę różnice w test1, ale trudno jest stwierdzić, test2.

Czy możliwe jest znormalizowanie każdego bgroup w celu wykreślenia? Lub pokazać je na osobnych osiach? A może powinienem zrzucić dane CSV i knuć, co chcę sam?

Odpowiedz

3

Ten problem jest zdecydowanie jednym z niedociągnięć Criterion. Zostałem ugryziony przez ten sam problem wiele razy.

Standardowe podejście, jakie podejmuję w celu obejścia tego problemu, ma na celu wygenerowanie indywidualnego pliku wykonywalnego dla każdej jednostki porównania. Specjalny cel benchmark został dodany w najnowszych wersjach Cabal, dlatego deklaruję cel porównawczy dla każdej jednostki porównania w pliku .cabal. Następnie mogę uruchomić każde porównanie, używając cabal bench [target-name]. Tak, to wcale nie jest pocieszające, ale najlepsze, co mogę wymyślić.

2

Właśnie wydałem bibliotekę criterion-plus. Jest to biblioteka kopułkowa nad "kryterium", która zbliża się do problemu, którego doświadczasz między innymi. Pozwala zadeklarować wiele "patentów", które generują niezależne pliki raportu "kryterium". Kolejną ważną kwestią, którą to naprawia, jest możliwość wykluczenia faz "konfiguracji/rozpadu" z testów porównawczych, czego nie pozwala ci "kryterium".

Oto przykład jak ta biblioteka ma być użyty:

import CriterionPlus 
import qualified SomeMySQLLib as MySQL 
import qualified SomePostgreSQLLib as PostgreSQL 

main = 
    benchmark $ do 
    standoff "Inserting rows" $ do 
     subject "MySQL" $ do 
     -- Exclude the "setup" phase from measurement: 
     pause 
     connection <- liftIO $ MySQL.openConnection 
     -- Measure what we want: 
     continue 
     liftIO $ MySQL.insertAThousandRows connection 
     -- Exclude the "teardown" phase from measurement: 
     pause 
     liftIO $ MySQL.closeConnection connection 
     subject "PostgreSQL" $ do 
     -- This is how we can exclude the "setup" phase from monad transformers: 
     pause 
     PostgreSQL.runSession $ do 
      lift $ continue 
      PostgreSQL.insertAThousandRows 
      -- Exclude "teardown": 
      lift $ pause 
    -- Each standoff generates an independent report file: 
    standoff "Querying" $ do 
     subject "MySQL" $ error "So on..." 
     subject "PostgreSQL" $ error "So on..." 
Powiązane problemy