c++仅用一行代码就实现了巨大的性能差异
c++ huge performance difference by just one line of code
下面是一些代码背景。
我正在研究一个能够通过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和常量一起发布。
相关文章:
- 如果没有malloc,链表实现将失败
- 如何在c++中实现处理器调度模拟器
- 如何在c++中使用引用实现类似python的行为
- 实现无开销push_back的最佳方法是什么
- 使用简单类型列表实现的指数编译时间.为什么
- 在linux上调试巨大的C++项目
- 如何在BST的这个简单递归实现中消除警告
- 实现一个在集合上迭代的模板函数
- 我应该实现右值推送功能吗?我应该使用std::move吗
- 如何正确实现和访问运算符的各种自定义枚举器
- C++Union/Struct位域的实现和可移植性
- 这个极客对极客的trie实现是否存在内存泄漏问题
- 在c++中实现LinkedList时,应出现未处理的错误
- 为左值和右值的包装器实现C++范围
- 使用模板进行堆栈实现; "name followed by :: must be a class or namespace"
- 使用GSoap实现ONVIF
- 在用于格式4的arm模拟器中实现功能时的一个问题
- 为什么这两个实现多维数组之间会有如此巨大的执行时间差
- 实现上的巨大差异
- c++仅用一行代码就实现了巨大的性能差异