图形标准基准采用不同的时间量级

时间:2014-04-17 09:40:26

标签: haskell criterion

我有一个Criterion基准,其中每个bgroup对应一个测试,并且在每个bgroup内,有两个bench测试值,具有不同的选项。例如:

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
    ]

在每个bgroup内,两个bench测试具有可比性。但是,test1需要2000微秒,而test2需要45微秒。概览图(对我想要做的最有用)在同一轴上显示不同的测试,因此我可以清楚地看到test1中的差异,但test2很难看到。

是否可以将每个bgroup标准化以进行绘图?或者在不同的轴上显示它们?或者我应该转储CSV数据并绘制我想要的内容吗?

2 个答案:

答案 0 :(得分:3)

这个问题肯定属于Criterion的缺点。我多次遭遇同样的问题。

我采用的标准方法是为每个比较单元生成单独的可执行文件。最新版本的Cabal中添加了一个特殊的benchmark目标,因此我在.cabal文件中为每个比较单元声明了一个基准目标。然后我可以使用cabal bench [target-name]运行每个比较。是的,这一切都远非安慰,但它是我能想到的最好的。

答案 1 :(得分:2)

我刚刚发布了一个库criterion-plus。它是一个超过“标准”的圆顶图书馆,它可以解决您遇到的问题。它允许您声明多个“对峙”,从而生成独立的“标准”报告文件。它修复的另一个重要问题是能够从基准测试中排除“设置/拆卸”阶段,“标准”不允许您这样做。

以下是如何使用此库的示例:

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