2017-12-27 138 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中搜索多行代碼塊的示例,但找不到任何代碼塊。在創建我的示例發佈問題時,我想將此解決方案作爲我嘗試的一個示例,並且它最終能夠正常工作。我想,因爲我沒有在網上找到任何現有的例子,它仍然值得發佈。 –