5

microbenchmark Rパッケージの機能のいくつかを知るようになりました。Hadley Wickham のこの出版物からサンプル コードを実装したところ、正確な情報が見つからず、対処できないエラーが表示されました。説明/ヒントなどをよろしくお願いします。

コード例:

library(microbenchmark)

f <- function() NULL
microbenchmark(
  NULL,
  f()
)

コンソール出力:

Error in microbenchmark(NULL, f()) : 
  Measured negative execution time! Please investigate and/or contact the package author.

アップデート。これが私のseesionInfo()コンソール出力です:

> sessionInfo()
R version 3.0.2 (2013-09-25)
Platform: x86_64-w64-mingw32/x64 (64-bit)

locale:
[1] LC_COLLATE=Polish_Poland.1250  LC_CTYPE=Polish_Poland.1250    LC_MONETARY=Polish_Poland.1250
[4] LC_NUMERIC=C                   LC_TIME=Polish_Poland.1250    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] ggplot2_0.9.3.1      microbenchmark_1.3-0

loaded via a namespace (and not attached):
 [1] colorspace_1.2-4   dichromat_2.0-0    digest_0.6.3       grid_3.0.2         gtable_0.1.2       labeling_0.2      
 [7] MASS_7.3-29        munsell_0.4.2      plyr_1.8           proto_0.3-10       RColorBrewer_1.0-5 reshape2_1.2.2    
[13] scales_0.2.3       stringr_0.6.2      tools_3.0.2    

UPDATE 2.パッケージの作成者が私に求めた詳細情報:

  • R変数R.version

    R.version _
    platform x86_64-w64-mingw32
    arch x86_64
    os mingw32
    system x86_64, mingw32
    status
    major 3
    minor 0.2
    year 2013
    month 09
    day 25
    svn rev 63987
    language R
    version.string R version 3.0.2 (2013-09-25) ニックネームフリスビーセーリング

  • コンピューターの CPU のメーカー、モデル、および速度:

プロセッサ: Intel(R) Core(TM) i7-2600K CPU @ 3.40GHz 3.70 GHz

RAM: 16.0GB

システム タイプ: 64 ビット

更新 3。

上記のコードの変更の 1 つが正しい結果を返すことに気付きました。

> ### 1 
> f <- function(){NULL} 
> microbenchmark(NULL, f())
Error in microbenchmark(NULL, f()) : 
  Measured negative execution time! Please investigate and/or contact the package author.
> 
> 
> ### 2 
> f <- function(){ } 
> microbenchmark(NULL, f())
Error in microbenchmark(NULL, f()) : 
  Measured negative execution time! Please investigate and/or contact the package author.
> 
> 
> ### 3 
> f <- function(){NULL} 
> microbenchmark(f())
Unit: nanoseconds
 expr min lq median uq  max neval
  f()   0  1      1  1 7245   100
> 
> ### 4 
> f <- function(){ } 
> microbenchmark(f())
Error in microbenchmark(f()) : 
  Measured negative execution time! Please investigate and/or contact the package author.
4

3 に答える 3

3

使用しているオペレーティング システムによっては、コンピュータにインストールされている高性能タイマー サブシステム用のドライバに問題がある場合があります。

Windows ランドでは、関数QueryPerformanceCounterQueryPerformanceFrequency関数を介して HPT にアクセスします。QPF は、カウンターがティックする頻度を示し、カウンターの精度を示します。QPC / QPF は秒単位の値を提供します。通常は、コンピューターが起動された時間です。

問題は、この API のドライバー サポートがむらがある場合があることです。AMDは特に過去に問題を抱えていました.私はこれを個人的に経験しました.

CPU やマザーボードのドライバーをオンラインで検索して、ドライバーが不足しているかどうかを確認してみてください。それはこれを修正するかもしれません。

編集:

@MatthewLundberg は、さまざまなコアの rdtsc 命令がわずかにずれていることがあるという点に注目しています。これを回避する安価な方法の 1 つは、プログラムの CPU アフィニティを変更して、1 つのコアでのみ実行されるようにすることです。

Win Vista 以降を使用している場合は、タスク マネージャーに移動し、コードを実行しているプロセスを右クリックし、[アフィニティ...] を選択して、1 つのプロセッサのみに制限します (最初の CPU は問題ありません)。

于 2013-12-29T16:46:40.840 に答える
2

他の回答が述べたように、Windows タイマーには実行時間を測定するのに十分な精度がないようです。つまり、実行時間は 1 ナノ秒未満です。nanotimer.cファイル内のパッケージのソースをdo_microtiming()C 関数に簡単に変更すると...

if (start < end) {
    const nanotime_t diff = end - start;
    if (diff < overhead) {
        ret[i] = R_NaReal;
        n_under_overhead++;
    } else {
        ret[i] = diff - overhead;
    }
} else if( start == end ) { // <----- This elseif is our minor edit
  error( "Start and end have same time. Not enough precision to measure execution time" );
} else {
    error("Measured negative execution time! Please investigate and/or "
          "contact the package author.");
}

そして、それをテストしてください...

f <- function() NULL
microbenchmark( f() )
#Error in microbenchmark(f()) : 
#  Start and end have same time. Not enough precision to measure execution time

あなたの(そして私の)Windowsシステムでは、現在のドライバーではサブナノ秒の時間を測定できないようです。

したがって、実行時間は負ではありません。測定できないほど小さいだけです。

于 2014-01-05T16:19:31.617 に答える
0

この問題を回避する別の方法は、ベンチマークする式の作業量を増やすことです。microbenchmark関数がどのように機能するかを理解しようとしているときに同じ問題に遭遇し、式 (テスト関数f1f2、およびf3) をより挑戦的なものに変更することで問題を回避しました。

library(microbenchmark)

f1 <- function() { factorial(10) }
f2 <- function() { 2 * 3 * 4 * 5 * 6 * 7 * 8 * 9 * 10 }
f3 <- function() { factorial(16) / (11 * 12 * 13 * 14 * 15 * 16) }
benchmarkResults <- microbenchmark(f1(), f2(), f3(), times = 1000L)
print(benchmarkResults)
于 2015-08-15T14:58:56.293 に答える