【发布时间】:2017-04-07 09:16:23
【问题描述】:
我想知道是否可以对这个子例程进行任何优化(比 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 需要更多时间才能获得所需的值。
任何帮助将不胜感激。提前谢谢!
【问题讨论】:
-
要优化这一点,您必须查看这些数组中存储的内容以及是否有更好的方法来存储数据。然后你必须通过
render函数。这意味着如果没有提供任何上下文或详细信息,很难回答这个问题。 -
对于您的情况,如果您始终将 ledTarget 复制到 target_arr,如果您的代码变得更快,我不会感到惊讶。这可能比第一次比较便宜。无论如何,您总是希望他们平等。
-
上面的代码需要
target_arr吗?为什么不在for循环中将rgb_arr值与ledTarget进行比较?