我在一个嵌入式系统上工作,我有自己的定时器功能(start_timer()
和stop_timer()
)。我希望对下面的代码进行精确计时,但保持优化(-O2
)。
void loop() {
uint16_t fram_cnt = 0;
for (uint16_t i = 0; i < VEC_SIZE; i++) {
fram_cnt += (fram_dst[i] == i);
}
}
int main() {
init();
start_timer();
loop();
uint32_t time = stop_timer();
msp_send_printf("loop time: %n", time);
exit();
}
字符串
但是,time
的值在-O2
打开时始终为0。我猜编译器会重新排序我的代码,因为如果我使用-O0
优化,我可以得到正确的时间,我的CPU不会有乱序执行。
如何在保持相同优化级别的同时正确地对程序进行基准测试?
1条答案
按热度按时间idfiyjo81#
当您启用优化时,您的函数正在被优化(因为它没有任何可观察到的效果),编译器甚至不会发出对它的调用:
字符串
作为最低限度的补救措施,简单地将计数器的定义移到函数之外:
型
它将被调用并执行:https://godbolt.org/z/TY1sG3nPj