我想知道是否可以对此子例程进行任何优化(比 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 需要更多的时间才能获得所需的值。
任何帮助将不胜感激。预先感谢您!
最佳答案
检查您的文档,但在许多优秀的编译器上,memcmp()
和 memcpy()
都是作为高效的机器代码指令实现的。
它们很可能(出于实际目的)尽可能快。
尽量不要进行比较。根据范围相等的概率进行比较,然后(如果不同)进行复制可能不会是净赢。
但是最好的解决方案是根本不执行复制!
如果可能的话,直接读出ledTarget
。
目前尚不清楚您在做什么,但动画通常会执行“双缓冲”以避免复制该位置周围的大状态。 因此,如果您在从另一个缓冲区读取的同时写入一个缓冲区,然后在下一个周期写入另一个缓冲区并从第一个缓冲区读取。
关于c++ - 使用 memcmp、memcpy 优化子例程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43274303/