使用微基准测试评估多行代码块

5

使用microbenchmark评估由多行代码组成的代码块是否可能?如果可以,如何实现?

示例: 我们有一些字符列中的数字数据:

testdata <- tibble::tibble(col1 = runif(1000), col2 = as.character(runif(1000)), col3 = as.character(runif(1000)))

现在我们可以尝试不同的转换方法。 我们可以直接在列上调用as.numeric:

testdata$col2 <- as.numeric(testdata$col2)
testdata$col3 <- as.numeric(testdata$col3)

我们可以尝试在 dplyr 的 mutate 函数中实现这个功能:
testdata <- dplyr::mutate(testdata, col2 = as.numeric(col2),
               col3 = as.numeric(col3))

也许我们知道所有列都应该是数字,所以可以尝试一些不太明确但可以进行一些检查的方法:
testdata <- dplyr::mutate_if(testdata, .predicate = is.character, .funs = as.numeric)

现在我们想要比较这3种选择的性能。

后两种选择是单独调用的,因此可以很容易地在微基准测试中进行测试,但第一种选择由两个单独的调用组成。我们可以将这两个调用包装在一个函数中,然后在微基准测试中评估它,但这会引入函数的轻微开销,因此不符合我们现有解决方案的技术评估标准。我们可以将这些调用分别包含在微基准测试中,然后在最后将它们加起来,平均值应该可以胜任,但对于最小值或最大值之类的东西,这并不一定会得到明智的结果。

微基准测试文档中的示例大多使用简单的单独表达式,并经常使用简单的函数来包装代码。

是否可以直接输入多行代码到microbenchmark中一起进行评估?

1个回答

9
将多行代码用 {} 包装,并使用 ; 分隔它们,可以将其作为一个块在微基准测试中进行评估。
bench <- microbenchmark(separate = {as.numeric(testdata$col2); as.numeric(testdata$col3)},
                    mutate = dplyr::mutate(testdata, col2 = as.numeric(col2),
                                           col3 = as.numeric(col3)),
                    mutateif = dplyr::mutate_if(testdata, .predicate = is.character, .funs = as.numeric))

以下是结果:

这将会得到以下结果:

> bench
Unit: microseconds
     expr      min       lq      mean    median        uq        max neval
 separate  477.014  529.708  594.8982  576.4275  611.6275   1109.762   100
   mutate 3410.351 3633.070 4465.0583 3876.6975 4446.0845  34298.910   100
 mutateif 5118.725 5365.126 7241.5727 5637.5520 6290.7795 118874.982   100

“{}”是我尝试的第一件事,但在实际使用中它并没有起作用,然后我花了一些时间搜索microbenchmark中的多行代码块示例,但找不到任何内容。当我创建我的示例以发布问题时,我想将此解决方案包括在尝试的示例中,结果它起作用了。我想既然我在网上没有找到任何现有的示例,那么发布这个解决方案仍然值得一试。 - Marijn Stevering

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接