我想知道是否有任何优化(比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需要更长的时间才能获得所需的值。
非常感谢任何帮助。提前谢谢!
答案 0 :(得分:0)
检查您的文档,但许多优秀的编译器memcmp()
和memcpy()
都是作为高效的机器代码指令实现的。
它们很可能(出于实际目的)尽可能快。
尽量不做比较。根据范围相等的概率进行比较,然后(如果不同)进行复制可能不是净胜利。
然而,最好的解决方案是根本不执行复制!
如果可能,请阅读ledTarget
。
目前还不清楚你在做什么,但动画经常执行'双缓冲'以避免复制周围的大状态。 因此,如果您正在同时写入一个缓冲区,同时从另一个缓冲区读取,然后在下一个循环中写入另一个缓冲区并从第一个缓冲区读取。