我将了解一些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.
答案 0 :(得分:3)
根据您使用的操作系统,计算机上的高性能计时器子系统的已安装驱动程序可能存在问题。
在Windows版本中,可以通过QueryPerformanceCounter
和QueryPerformanceFrequency
函数访问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系统上测量亚纳秒次。
所以执行时间不是负面的,它只是很小,你无法衡量它。