7

我有一个 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 数据并自己绘制我想要的东西?

4

2 回答 2

3

这个问题绝对是 Criterion 的缺点之一。我曾多次被同一个问题所困扰。

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

于 2014-04-17T12:53:56.980 回答
2

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

这是应该如何使用此库的示例:

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..."
于 2014-04-25T18:34:23.327 回答