【问题标题】:Graphing criterion benchmarks taking different orders of magnitude of time使用不同数量级的时间绘制标准基准
【发布时间】:2014-06-01 12:26:58
【问题描述】:

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

【问题讨论】:

    标签: haskell criterion


    【解决方案1】:

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

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

    【讨论】:

      【解决方案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..."
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-09-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多