微基準

Microbenchmark 可用於估算其他快速程式的時間。例如,考慮估計列印 hello world 所花費的時間。

system.time(print("hello world"))

# [1] "hello world"
#    user  system elapsed 
#       0       0       0 

這是因為 system.time 本質上是 proc.time 的包裝函式,它以秒為單位測量。由於列印 hello world 不到一秒鐘,所以花費的時間不到一秒,但事實並非如此。要看到這個,我們可以使用包 microbenchmark:

library(microbenchmark)
microbenchmark(print("hello world"))
 
# Unit: microseconds
#                 expr    min     lq     mean  median     uq     max neval
# print("hello world") 26.336 29.984 44.11637 44.6835 45.415 158.824   100

在執行 print("hello world") 100 次之後我們可以看到,平均花費的時間實際上是 44 微秒。 (請注意,執行此程式碼將在控制檯上列印 hello world100 次。)

我們可以將它與一個等效的程式 cat("hello world\n") 進行比較,看看它是否比 print("hello world") 更快:

microbenchmark(cat("hello world\n"))

# Unit: microseconds
#                  expr    min      lq     mean median     uq     max neval
# cat("hello world\\n") 14.093 17.6975 23.73829 19.319 20.996 119.382   100

在這種情況下,cat() 幾乎是 print() 的兩倍。

或者,可以比較同一 microbenchmark 呼叫中的兩個過程:

microbenchmark(print("hello world"), cat("hello world\n"))
# Unit: microseconds
# expr                    min     lq     mean  median     uq     max neval
# print("hello world") 29.122 31.654 39.64255 34.5275 38.852 192.779   100
# cat("hello world\\n")  9.381 12.356 13.83820 12.9930 13.715  52.564   100