2017-12-27 139 views
1

是否可以使用microbenchmark评估由多行代码组成的代码块?如果是这样,怎么样?用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发生变异:

testdata <- dplyr::mutate(testdata, col2 = as.numeric(col2), 
       col3 = as.numeric(col3)) 

或者我们知道的所有列应是数字,所以我们可以尝试一些不太明确,做一些检查:

testdata <- dplyr::mutate_if(testdata, .predicate = is.character, .funs = as.numeric) 

现在我们要比较这3个选项的性能。

后面的2个选项是单独的调用,所以这些可以很容易地在microbenchmark中测试,但第一个选项包含两个独立的调用。我们可以将这两个调用包装在一个函数中,然后在microbenchmark中对其进行评估,但这会引入该函数的轻微开销,因此技术上不会评估我们现在的解决方案。我们可以将这些调用分别包含在微基准中,然后将它们相加,因为平均值应该很好,但对于最小值或最大值等情况,这并不一定能给出明智的结果。

microbenchmark文档中的示例大多使用简单的单个表达式,并且通常使用简单的函数来包装代码。

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

回答

1

通过{}包裹的多行代码,并将它们与一个;它们可以作为一个块中微基准

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 
+0

的'{} '是我尝试的第一件事,但在我的实际使用案例中,它没有奏效,于是我花了一些时间在microbenchmark中搜索多行代码块的示例,但找不到任何代码块。在创建我的示例发布问题时,我想将此解决方案作为我尝试的一个示例,并且它最终能够正常工作。我想,因为我没有在网上找到任何现有的例子,它仍然值得发布。 –