2014-04-17 3 views
7

Ich habe einen Criterion-Benchmark, wo jeder bgroup entspricht einem Test, und innerhalb jedes bgroup gibt es zwei bench Werte des Tests mit verschiedenen Optionen. Zum Beispiel:Grafikkriterium Benchmarks mit verschiedenen Größenordnungen der Zeit

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 
    ] 

Innerhalb jeder bgroup die beiden bench Tests sind vergleichbar. Allerdings dauert test1 2000 Mikrosekunden, während test2 45 Mikrosekunden dauert. Das Übersichtsdiagramm (das für das, was ich machen möchte, am nützlichsten ist) zeigt verschiedene Tests an den gleichen Achsen an, so dass ich die Unterschiede in test1 deutlich sehen kann, aber test2 ist schwer zu sehen.

Ist es möglich, jede bgroup zum Plotten zu normalisieren? Oder sie auf separaten Achsen zeigen? Oder sollte ich die CSV-Daten ablegen und selbst planen, was ich will?

Antwort

3

Dieses Problem gehört definitiv zu den Mängeln von Criterion. Ich wurde mehrmals von demselben Problem gebissen.

Der Standard Ansatz, den ich um dieses Problem herumgehe, ist nur eine einzelne ausführbare Datei pro Vergleichseinheit zu generieren. Ein spezielles Ziel benchmark wurde in den neuesten Versionen von Cabal hinzugefügt, so dass ich ein Benchmark-Ziel für jede Vergleichseinheit in der .cabal Datei deklariere. Dann kann ich jeden Vergleich mit cabal bench [target-name] ausführen. Ja, es ist alles andere als beruhigend, aber es ist das Beste, was ich mir vorstellen kann.

2

Ich habe gerade eine Bibliothek criterion-plus freigegeben. Es ist eine Dome-Bibliothek über "Kriterium", die das Problem anspricht, das Sie unter anderem erleben. Sie können mehrere "Abstandhalter" deklarieren, die unabhängige "Kriterium" -Berichtsdateien generieren. Ein anderes wichtiges Problem, das behoben wird, ist die Fähigkeit, "Setup/Teardown" -Phasen vom Benchmarking auszuschließen, was "Kriterium" nicht erlaubt. Hier

ist ein Beispiel dafür, wie diese Bibliothek soll verwendet werden:

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..." 
Verwandte Themen