如何根据基准测试结果获取曲线或折线图?

How to obtain curve or line graph based on benchmark result?

我想根据基准测试结果生成漂亮的折线图或曲线。我使用 rbenchmark 包来评估功能列表。但是,我打算生成折线图或曲线,其中 X 轴显示选定的 csv 文件(两个或三个文件),Y 轴显示 运行 时间。如何根据基准测试结果获得所需的折线图或散点图或曲线图?谁能指出我如何轻松做到这一点?我怎样才能实现我想要的情节?有什么想法吗?

请注意,我尝试 rbenchmark 包以这种方式生成基准测试结果:

benchmark(
    s1=myFunc1,
    s2=myFunc2,
    s3=myFunc3,
    ...
    s10=myFunc10,
    order="elapsed", replications=10
)

迷你示例:

要重现基准测试结果,这里是 data.frame :

benchResult <- data.frame(
    test=c("s5","s1","s6","s9","s2","s3","s4","s7","s8","s10"),
    replications=c(10,10,10,10,10,10,10,10,10,10),
    elapsed=c(0.10,0.11,0.30,0.32,0.75,0.98,3.43,8.07,13.22,30.48),
    relative=c(1.0,1.1,3.0,3.2,7.5,9.8,34.3,80.7,132.2,304.8),
    user.self=c(0.11,0.03,0.30,0.33,0.75, 0.73,3.36,8.07,13.21,27.70),
    sys.self=c(0.00,0.02,0.00,0.00,0.00,0.09,0.00,0.00,0.00,0.31)
)

我得到了这个基准测试结果:

   test replications elapsed relative user.self sys.self user.child sys.child
5    s5           10    0.10      1.0      0.11     0.00         NA        NA
1    s1           10    0.11      1.1      0.03     0.02         NA        NA
6    s6           10    0.30      3.0      0.30     0.00         NA        NA
9    s9           10    0.32      3.2      0.33     0.00         NA        NA
2    s2           10    0.75      7.5      0.75     0.00         NA        NA
3    s3           10    0.98      9.8      0.73     0.09         NA        NA
4    s4           10    3.43     34.3      3.36     0.00         NA        NA
7    s7           10    8.07     80.7      8.07     0.00         NA        NA
8    s8           10   13.22    132.2     13.21     0.00         NA        NA
10  s10           10   30.48    304.8     27.70     0.31         NA        NA

如何根据这个基准测试结果得到漂亮的折线图或曲线?我怎样才能通过使用 ggplot2 来实现这一点?提前致谢!

答案分为两部分:

  1. microbenchmark 包包含 autoplot 方法用于 ggplot2
  2. 绘制给定 benchResult 数据框的代码

1。 microbenchmark 包裹

autoplot 方法使用 ggplot2 生成更清晰的微基准计时图表。例如,

tm <- microbenchmark::microbenchmark(
  rchisq(100, 0),
  rchisq(100, 1),
  rchisq(100, 2),
  rchisq(100, 3),
  rchisq(100, 5), times=1000L)
ggplot2::autoplot(tm)

创建以下图:

地块由 geom_violin 创建。小提琴图是用于显示连续分布的镜像密度图。

编辑 应 OP 的要求,这里有更多详细信息:

tm 是 class microbenchmark 的一个对象,一个包含 5000 次基准测试运行结果的数据框(每次 5 个表达式 x 1000 次重复)。有关详细信息,请参阅帮助页面 ?microbenchmarkValue 部分。

打印此对象时,会给出结果摘要:

print(tm)
#Unit: microseconds
#           expr    min     lq      mean median      uq       max neval
# rchisq(100, 0)  2.266  2.644  3.180188  2.644  3.0210    57.393  1000
# rchisq(100, 1) 16.614 19.257 21.412456 20.012 20.7675    80.048  1000
# rchisq(100, 2)  9.063 12.839 15.289609 14.349 15.8590   151.410  1000
# rchisq(100, 3)  8.307 12.460 16.291712 13.593 15.1040  1449.913  1000
# rchisq(100, 5)  7.929 11.706 26.683478 13.593 16.0475 11920.243  1000

autoplotprint 都是为 class microbenchmark 的对象定义的方法,当应用于像 benchResult

2。 benchResult

的情节

您还可以使用

绘制基准测试结果
library(ggplot2)
ggplot(benchResult, aes(x = forcats::fct_inorder(test), y = elapsed, group = 1)) + 
  geom_line() + 
  xlab("test")

制作这张图表:

请注意对 forcats::fct_inorder() 的调用,它以与 benchResult$test 中出现的值相同的顺序对因子水平进行重新排序。这是必需的,因为 ggplot2 对离散变量使用因子,并且级别的默认顺序是按字母顺序排列的,这将按 s1、s10、s2、s3 的顺序绘制测试。