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

Tob*_*sen 2 r microbenchmark

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

microbenchmark(j1 = {sample(1e5)},
               j2 = {sample(2e5)},
               j3 = {sample(3e5)})
Run Code Online (Sandbox Code Playgroud)

以下内容将不再适用,因为列表将仅包含向量而不是未求值的表达式。

microbenchmark(list = list(j1 = {sample(1e5)},
                          j2 = {sample(2e5)},
                          j3 = {sample(3e5)))
Run Code Online (Sandbox Code Playgroud)

我也想使用eg生成列表lapply

Tob*_*sen 5

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

microbenchmark(list = list(j1 = bquote({sample(1e5)}),
                           j2 = bquote({sample(2e5)}),
                           j3 = bquote({sample(3e5)})))
Run Code Online (Sandbox Code Playgroud)

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

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

  • 您可以将语句放在“local”中,而不是胡乱使用“new.env()”:“local({s = s; bquote(sample(.(s)))})` (`bquote`和“substitute”都可以,但为了可读性,我通常更喜欢“bquote”)。事实上,这个简单的例子甚至可以在没有本地环境的情况下工作(但这并不能概括):`jobs = lapply(1000 * 1 : 3, function (s) bquote(sample(.(s))))`。 (3认同)

Hug*_*ugh 5

只需使用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
Run Code Online (Sandbox Code Playgroud)

alist像处理函数参数一样处理其参数。因此,不会评估值,并且允许使用没有值的带标签的参数,而list只会忽略它们。