9

私は常に、とのベンチ マーキングの精度の欠如に少し悩まされてsystem.timeおりrbenchmark(タイミングの精度が不足している可能性があるという点で)、Hadley がmicrobenchmark最近パッケージを参照しているのを見ました。そこで、以下に示すように回転させることにしました。私はmean反対し、よりもはるかに良い成績を収めることf <- function(x) {sum(x)/length(x)}を期待していましたが、私が理解しているように、結果はこれが真実であることを示していません.meanf

  1. 結果を誤解していますか?
  2. f は実際に平均より速いですか?
  3. マイクロベンチマークはまだベータ段階にあり、これを解決する必要がありますか?

Win 7 マシンで R2.15 を実行しています (OS によってマイクロベンチマークのタイミングが異なるため)。

結果

Unit: microseconds
     expr    min     lq median     uq    max
1    f(x) 19.130 20.529 20.529 20.996 286.00
2 mean(x) 28.927 29.860 30.327 30.327 672.31

コード

library(microbenchmark)

x <- 1:10000
f <- function(x) {sum(x)/length(x)}
mean(x)

res <- microbenchmark(
    mean(x), 
    f(x), 
times=1000L)

print(res)
boxplot(res)
4

2 に答える 2

10

私は間違っているかもしれませんが、これは私にはそれほど驚くべきことではないようです。mean.default呼び出す前に、 .Internal(mean(x))3 つのifステートメントをチェックし、 の長さを計算してからx、別のifステートメントをチェックする必要があります。そして、時間の差はかなり小さいです。

直接呼び出す.Internal(mean(x)と、さらにわずかに高速になります。

library(microbenchmark)

x <- 1:10000
f1 <- function(x) {sum(x)/length(x)}
f2 <- function(x) {.Internal(mean(x))}

res <- microbenchmark(
    mean(x), 
    f1(x),
    f2(x), 
times=1000L)

print(res)

Unit: microseconds
     expr    min      lq  median      uq     max
1   f1(x) 32.195 32.4605 32.8850 33.4645 106.997
2   f2(x) 21.840 22.0580 22.2015 22.6270  55.316
3 mean(x) 35.393 35.9840 36.1860 36.4420  91.203
于 2012-04-28T16:07:55.363 に答える
2

X のサイズを 10 倍にすると、より一貫した結果が得られることがわかると思います。正直なところ、マルチタスク オペレーティング システムを搭載したコンピューターで、本当にマイクロ秒のタイミング精度が得られるとしたら、私は驚きます。

次のことも検討してください。

  • ラップトップまたは自動 CPU 周波数スケーリングを備えたマシンで実行していますか?
  • 準備し始める?
  • プロセスを 1 つのコアに固定します。
于 2012-04-28T16:15:05.533 に答える