C++ c++;只需一行代码就可以实现巨大的性能差异

C++ c++;只需一行代码就可以实现巨大的性能差异,c++,performance,C++,Performance,下面是代码的一些背景 我正在从事一个能够通过CAN总线闪存ECU的项目,这个CAN传输数据将被调用768次,CAN\u messageProc(&msg,cut\u data)实际上是驱动硬件在CAN总线上发送消息的原因 在我的电脑上,整个闪烁过程需要61秒,但在另一台电脑上,需要92秒。如果我将ctrl更改为常量(即7),则在第二台计算机上执行此过程也需要大约61秒 另外,在调用此函数的大部分时间,唯一的变化是ctrl,因此我认为这是因为更改ctrl会禁用编译器来优化代码,但这无法解释为什么此

下面是代码的一些背景

我正在从事一个能够通过CAN总线闪存ECU的项目,这个CAN传输数据将被调用768次,
CAN\u messageProc(&msg,cut\u 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.data不是U8类型,正在扩展?判断我的假设是否正确的最佳方法是使用ctrl和常量发布生成的程序集。

在不了解CAN消息总线的情况下,我的假设是将
ctrl
更改为
0
执行不同的命令,或执行无效的操作。
ctrl
的意义是什么?肯定还有其他原因。@Matthew它只是一个字节,用于指示当前进程的步骤。在您的问题中,您说更改行
msg.data[3]=ctrl至<代码>消息数据[3]=0使程序执行更快。问题不在于那一行,问题在于
CAN\u messageProc
如何解释现在不同的
msg
参数。这就是我所说的变化的意义所在。如果在
ctrl
参数为
0
的地方调用
CAN\u TransferData
,我相信您会在测试中看到相同的结果。稍微偏离主题,但您的
成员集(msg.data,0xff,8)行是多余的。这意味着扩展需要39毫秒(30/768)。如果这是真的,则有些东西严重损坏。这几乎可以肯定是CAN_messageProc在做什么。我假设这个函数被调用了数百万次。是的,你是对的,有些奇怪的事情正在发生。我想看看CAN_messageProc的源代码