2017-04-07 49 views
-1

我想知道是否有任何優化(比memcmp/memcpy更有效,也許只是使用for循環或將其分解爲快速彙編指令)可以對此子例程執行。 NUM_BYTES是恆定值(=總是18):使用memcmp,memcpy優化子程序

void ledSmoothWrite(uint8_t ledTarget[]) 
{ 
    // If the new target is different, set new target 
    if(memcmp(target_arr, ledTarget, NUM_BYTES)) memcpy(target_arr, ledTarget, NUM_BYTES); 

    // Obtain equality 
    for(uint8_t i = 0; i < NUM_BYTES; i++) 
    { 
     if(rgb_arr[i] < target_arr[i]) rgb_arr[i]++; 
     else if(rgb_arr[i] > target_arr[i]) rgb_arr[i]--; 
    } 
    render(); 
} 

該子程序順利設置LED顏色可能被稱爲每秒幾百次。隨着loop()功能在運行時間內增加,每個LED需要更多時間才能獲得所需的值。

任何幫助將不勝感激。先謝謝你!

+1

爲了優化這個,你必須看看這些數組中存儲了什麼,以及是否有更好的方法來存儲數據。然後你必須通過'render'函數。這意味着在沒有提供任何背景或細節的情況下很難回答這個問題。 – Lundin

+1

對於您的情況,如果您始終將ledTarget複製到target_arr,如果代碼變得更快,我不會感到驚訝。這可能比第一次比較便宜。無論如何,你總是希望他們平等。 –

+0

上面的代碼是否需要'target_arr'?爲什麼不在'for'循環中比較'rgb_arr'值和'ledTarget'? –

回答

0

請檢查您的文檔,但許多優秀的編譯器memcmp()memcpy()都作爲有效的機器代碼指令實現。 它們很可能(實際用途)儘可能快。

請勿嘗試進行比較。根據範圍相同的概率進行比較,然後(如果不同)進行復制可能不是淨贏。

但是,最好的解決方案是根本不執行復制!

如果可能的話,只需要讀出ledTarget

這並不完全清楚你在做什麼,但動畫通常執行「雙緩衝」,以避免複製周圍的大州。 因此,如果您在同時從另一個緩衝區讀取數據的同時寫入一個緩衝區,然後在下一個循環中寫入另一個緩衝區並從第一個緩衝區讀取數據。