我目睹了以下奇怪的行为。我有两个功能几乎相同 - 它们测量执行某个操作所需的周期数。在一个函数中,在循环内我增加了一个变量;在其他什么都没有发生。这些变量是易变的,因此它们不会被优化掉。这些是功能:
unsigned int _osm_iterations=5000;
double osm_operation_time(){
// volatile is used so that j will not be optimized, and ++ operation
// will be done in each loop
volatile unsigned int j=0;
volatile unsigned int i;
tsc_counter_t start_t, end_t;
start_t = tsc_readCycles_C();
for (i=0; i<_osm_iterations; i++){
++j;
}
end_t = tsc_readCycles_C();
if (tsc_C2CI(start_t) ==0 || tsc_C2CI(end_t) ==0 || tsc_C2CI(start_t) >= tsc_C2CI(end_t))
return -1;
return (tsc_C2CI(end_t)-tsc_C2CI(start_t))/_osm_iterations;
}
double osm_empty_time(){
volatile unsigned int i;
volatile unsigned int j=0;
tsc_counter_t start_t, end_t;
start_t = tsc_readCycles_C();
for (i=0; i<_osm_iterations; i++){
;
}
end_t = tsc_readCycles_C();
if (tsc_C2CI(start_t) ==0 || tsc_C2CI(end_t) ==0 || tsc_C2CI(start_t) >= tsc_C2CI(end_t))
return -1;
return (tsc_C2CI(end_t)-tsc_C2CI(start_t))/_osm_iterations;
}
那里有一些非标准功能,但我相信你会管理的。
问题是,第一个函数返回4,而第二个函数(据说做的更少)返回6,尽管第二个显然比第一个做的少。
这对任何人都有意义吗?
实际上,我创建了第一个函数,这样我就可以减少测量第二个函数的循环开销。你知道如何做到这一点(因为这种方法并没有真正削减它)?
我在 Ubuntu 上(我认为是 64 位)。
非常感谢。