我有一个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数据并绘制我想要的内容吗?
答案 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..."