为什么'测量的负执行时间!'出现错误? (以及如何处理它?)

时间:2013-12-29 16:24:21

标签: r microbenchmark

我将了解一些microbenchmark R软件包的功能。我实施了来自Hadley Wickham的this出版物的示例代码,并收到一个错误,我找不到任何有关的精确信息,我无法处理。提前感谢您的任何解释/提示等。

示例代码:

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.

UPDATE。这是我的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    

更新2。该软件包的作者要求我提供的一些进一步信息:

  • R变量R.version

      

    R.version              _
      平台x86_64-w64-mingw32
      拱x86_64
      os mingw32
      system x86_64,mingw32
      状态
      专业3   小0.2   2013年   月09日   第25天   svn rev 63987
      语言R
      version.string R版本3.0.2(2013-09-25)   昵称飞盘航行

  • 计算机中CPU的型号,型号和速度:

处理器:Intel(R)Core(TM)i7-2600K CPU @ 3.40GHz 3.70 GHz

RAM:16,0 GB

系统类型:64位

更新3。

我注意到上面代码的其中一个修改确实返回了正确的结果:

> ### 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.

2 个答案:

答案 0 :(得分:3)

根据您使用的操作系统,计算机上的高性能计时器子系统的已安装驱动程序可能存在问题。

在Windows版本中,可以通过QueryPerformanceCounterQueryPerformanceFrequency函数访问HPT。 QPF告诉您计数器滴答的频率,从而告诉您计数器的准确性; QPC / QPF以秒为单位给出一个值,通常是计算机启动的时间。

问题是此API的驱动程序支持有时不稳定。 AMD过去特别遇到麻烦,我亲身经历过这个。

您可以尝试在线搜索CPU和/或主板的驱动程序,看看是否缺少驱动程序。这可能解决了这个问题。

编辑:

@MatthewLundberg关于不同内核上的rdtsc指令有时会略微偏离。解决这个问题的一种便宜方法是更改​​程序的cpu亲和性,使其仅在一个核心上运行。

假设您使用的是Win Vista或更高版本,请进入任务管理器,右键单击运行代码的过程,选择“Affinity ...”并将其限制为仅一个处理器(第一个CPU正常)。

答案 1 :(得分:2)

正如另一个答案所述,似乎Windows计时器没有足够的精度来测量执行时间,即执行时间<1。 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系统上测量亚纳秒次。

所以执行时间不是负面的,它只是很小,你无法衡量它。