【发布时间】:2009-03-23 00:03:45
【问题描述】:
我目睹了以下奇怪的行为。我有两个功能几乎相同 - 它们测量执行某个操作所需的周期数。在一个函数中,在循环内我增加了一个变量;在其他什么都没有发生。这些变量是易变的,因此它们不会被优化掉。这些是函数:
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 位)。
非常感谢。
【问题讨论】:
-
变量 j 似乎在两个循环中都增加了
-
是的,这只是一个愚蠢的错误......
-
_osm_iterations 似乎从未被定义过,它是全球性的吗?如果有,它是如何实例化的?
-
它是全局的:unsigned int _osm_iterations=5000;
-
为什么说第二个功能做得更多?看起来它实际上做得更少。
标签: c optimization loops benchmarking