c++仅用一行代码就实现了巨大的性能差异

c++ huge performance difference by just one line of code

本文关键字:巨大 实现 性能 代码 一行 c++      更新时间:2023-10-16

下面是一些代码背景。

我正在研究一个能够通过CAN总线闪存ecu的项目,这个CAN_TransferData将被调用768次,CAN_messageProc(&msg, cut_data);是实际驱动硬件在CAN总线上发送消息的东西。

在我的电脑上,整个闪烁过程需要61秒,但在另一台电脑上,它需要92秒。如果我把ctrl变成一个常数(即。7),在第二台计算机上,该过程也将花费大约61秒。

也,大多数时候这个函数被调用,唯一的变化是ctrl,所以我认为这是因为改变ctrl禁用编译器来优化代码,但这不能解释为什么这个代码在第一台机器上运行得更快。

为什么会发生这种情况,我如何解决这个问题?

PS:我正在使用vs2010的cpp编译器
int CAN_protocol::CAN_TransferData(U32 CANNo, U8 ctrl, U32 len)
{
    int result;
    CAN_msg msg;
    U16 lenth;
    lenth = (U16)len + 2;
    memset(msg.data, 0xff, 8);
    msg.id= 0x7E0;
    msg.data[0] =(0x10 | (lenth >> 8));
    msg.data[1] = lenth & 0xff;
    msg.data[2] = 0x36;
    msg.data[3] = ctrl; // change ctrl to 0 here will significantly increase execute speed.
    memcpy(&msg.data[4], &cut_data[1], 4);
    msg.len = 8;
    msg.ch = 1;
    msg.format = CAN_ID_FORMAT_STANDARD;
    msg.type = CAN_FRAME_TYPE_DATA;
    result = CAN_messageProc(&msg, cut_data);
    return result;
}

可能是msg。数据不是U8类型,正在扩展中?判断我的假设是否正确的最佳方法是将生成的程序集与ctrl和常量一起发布。