C++ c++;只需一行代码就可以实现巨大的性能差异
下面是代码的一些背景 我正在从事一个能够通过CAN总线闪存ECU的项目,这个CAN传输数据将被调用768次,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\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的源代码