如何在微基准测试中使用列表参数

How to use list-argument in microbenchmark

如何在 microbenchmark 函数中使用列表参数。 我想对具有不同输入的相同函数进行微基准测试,如

microbenchmark(j1 = {sample(1e5)},
               j2 = {sample(2e5)},
               j3 = {sample(3e5)})

以下不会运行,因为列表将只包含向量而不是未计算的表达式。

microbenchmark(list = list(j1 = {sample(1e5)},
                          j2 = {sample(2e5)},
                          j3 = {sample(3e5)))

我还想使用例如生成列表lapply.

我们需要使用substitutebquote函数来获取列表中未计算的表达式,例如

microbenchmark(list = list(j1 = bquote({sample(1e5)}),
                           j2 = bquote({sample(2e5)}),
                           j3 = bquote({sample(3e5)})))

可以使用lapply生成作业,但我们必须小心环境

jobs = lapply(1000*1:3, function(s) local({s = s; bquote(sample(.(s)))}) )

只需使用alist:

microbenchmark(list = alist(a = Sys.sleep(0.005), b = Sys.sleep(0.01)))
#> Unit: milliseconds
#>  expr      min       lq      mean    median        uq       max neval cld
#>     a  5.02905  5.15946  5.447538  5.446029  5.612429  6.030764   100  a 
#>     b 10.04997 10.18264 10.431011 10.459569 10.547814 11.058911   100   b

alist handles its arguments as if they described function arguments. So the values are not evaluated, and tagged arguments with no value are allowed whereas list simply ignores them.