使用memcmp优化子程序,memcpy

时间:2017-04-07 09:16:23

标签: c++ c memory arduino

我想知道是否有任何优化(比memcmp / memcpy更有效,可能只是使用for循环或将其分解为快速汇编指令),这可以对此子例程进行。 NUM_BYTES是一个常量值(总是= 18):

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 个答案:

答案 0 :(得分:0)

检查您的文档,但许多优秀的编译器memcmp()memcpy()都是作为高效的机器代码指令实现的。 它们很可能(出于实际目的)尽可能快。

尽量不做比较。根据范围相等的概率进行比较,然后(如果不同)进行复制可能不是净胜利。

然而,最好的解决方案是根本不执行复制!

如果可能,请阅读ledTarget

目前还不清楚你在做什么,但动画经常执行'双缓冲'以避免复制周围的大状态。 因此,如果您正在同时写入一个缓冲区,同时从另一个缓冲区读取,然后在下一个循环中写入另一个缓冲区并从第一个缓冲区读取。