如何正确地对我的C程序进行基准测试,优化可能会重新排序我的代码?

643ylb08  于 2023-08-03  发布在  其他
关注(0)|答案(1)|浏览(72)

我在一个嵌入式系统上工作,我有自己的定时器功能(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不会有乱序执行。
如何在保持相同优化级别的同时正确地对程序进行基准测试?

idfiyjo8

idfiyjo81#

当您启用优化时,您的函数正在被优化(因为它没有任何可观察到的效果),编译器甚至不会发出对它的调用:

loop:
        bx      lr
.LC0:
        .ascii  "loop time: %n\000"
main:
        push    {r3, lr}
        bl      init
        bl      start_timer
        bl      stop_timer
        mov     r1, r0
        ldr     r0, .L5
        bl      msp_send_printf
        movs    r0, #1
        bl      exit
.L5:
        .word   .LC0

字符串
作为最低限度的补救措施,简单地将计数器的定义移到函数之外:

uint16_t fram_cnt = 0;

void loop() { 
 fram_cnt = 0;
 for (uint16_t i = 0; i < VEC_SIZE; i++) {
  fram_cnt += (fram_dst[i] == i);
 }
}


它将被调用并执行:https://godbolt.org/z/TY1sG3nPj

相关问题