以下是代碼的一些背景。C++巨大的性能差異只需一行代碼
我正在開發一個能夠通過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;
}
我不知道有關CAN消息總線的任何信息,我的假設是將'ctrl'更改爲'0'會執行不同的命令或其他無效的命令。 'ctrl'的意義是什麼? – Matthew
必須有別的事情發生。 – OldProgrammer
@Matthew它只是一個字節,用於指示哪一步是當前進程。 – shengy