使用microbenchmark评估多行代码块

时间:2017-12-27 13:29:05

标签: r microbenchmark

是否可以使用microbenchmark评估由多行代码组成的代码块?如果是这样,怎么样?

实施例: 我们在字符列中有一些数字数据:

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

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

dplyr

我们可以尝试在testdata <- dplyr::mutate(testdata, col2 = as.numeric(col2), col3 = as.numeric(col3)) mutate中执行此操作:

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

或许我们知道所有列都应该是数字的,所以我们可以尝试一些不太明确的东西进行一些检查:

{}

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

后两个选项是单独调用,因此可以在microbenchmark中轻松测试,但第一个选项包含两个单独的调用。我们可以将两个调用包装在一个函数中然后在微基准测试中进行评估,但是这会引入函数的轻微开销,因此在技术上不会评估我们现在的解决方案。我们可以在微基准测试中单独包含这些调用,然后将它们添加起来,因为平均值应该没问题,但是对于像min或max这样的事情,这不一定能给出合理的结果。

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

是否可以直接将多行代码输入到微基准测试中进行一起评估?

1 个答案:

答案 0 :(得分:5)

通过在;中包含多行代码并用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)) 分隔它们,可以将它们评估为microbenchmark中的一个块

> 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

其中给出了以下结果:

;WITH CTE
AS
(
    SELECT
        SeqNo = 1,
        Entity,
        Number
        FROM YourTable

    UNION ALL

    SELECT
        SeqNo = SeqNo+1,
        Entity,
        Number
        FROM CTE
            WHERE SeqNo < Number
)
SELECT
    Entity
    FROM CTE
        ORDER BY 1