2017-04-07 4 views
-1

このサブルーチンで実行できる最適化があるかどうか(memcmp/memcpyよりも効率的かもしれません。 NUM_BYTESが一定値である(常に18 =):円滑にLEDの色を設定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(); 
} 

このサブルーチンは、毎秒数百回呼び出されるかもしれません。 loop()の機能が実行時間に増加するので、各LEDが望ましい値になるまでにはるかに多くの時間がかかります。

ご協力いただければ幸いです。前もって感謝します!

+1

これを最適化するには、それらの配列に格納されているものを調べ、データを格納するためのより良い方法があるかどうかを調べる必要があります。それで 'render'関数を実行する必要があります。文脈や細部がなくてもこの質問に答えることは難しいということです。 – Lundin

+1

あなたが常にledTargetをtarget_arrにコピーすると、あなたのコードがより速くなるなら、私は驚くことはありません。それはおそらく最初に比較するよりも安価でしょう。あなたはいつもそれらをとにかく平等にしたい。 –

+0

上記のコードに 'target_arr'がまったく必要ですか?あなたの 'for'ループで' rgb_arr'値を 'ledTarget'と比較するだけではどうですか? –

答えて

0

文書をチェックしてくださいが、多くの良いコンパイラmemcmp()memcpy()は効率的な機械語命令として実装されています。 彼らは(実際的な目的のために)それが得られるほど速いかもしれません。

比較をしないでください。範囲が均等になる確率によっては、比較を行っても(異なる場合)、コピーを行うことは正味の勝利ではない可能性があります。

ただし、コピーを一切実行しないことをお勧めします。

可能であれば、ledTargetから読み取ってください。

あなたのしていることははっきりしていませんが、アニメーションでは大きな状態を周囲にコピーすることを避けるために、「ダブルバッファリング」を実行することがよくあります。 したがって、同時に作業している場合は、別のバッファから読み込み中に1つのバッファに書き込み、次のサイクルでもう一方のバッファに書き込み、最初のバッファから読み込みます。