2014-03-26 72 views
0

以下是代碼的一些背景。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; 
} 
+0

我不知道有關CAN消息總線的任何信息,我的假設是將'ctrl'更改爲'0'會執行不同的命令或其他無效的命令。 'ctrl'的意義是什麼? – Matthew

+1

必須有別的事情發生。 – OldProgrammer

+0

@Matthew它只是一個字節,用於指示哪一步是當前進程。 – shengy

回答

-1

難道說msg.data不是類型U8的和正在擴大?判斷我的假設是否正確的最好方法是用ctrl和常量發佈生成的程序集。

+0

這意味着擴大需要39毫秒(30/768)。如果這是真的,那麼事情就會嚴重破壞。這幾乎肯定是CAN_messageProc正在做的事情。 –

+0

我假設函數被調用了數百萬次。是的,你是正確的事情正在發生。我想看看CAN_messageProc的源代碼 – user3462295