使用 memcmp、memcpy 优化子程序

Posted

技术标签:

【中文标题】使用 memcmp、memcpy 优化子程序【英文标题】:Optimizing subroutine with memcmp, memcpy 【发布时间】: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 进行比较? 【参考方案1】:

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

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

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

如果可能,请读出ledTarget

不清楚您在做什么,但动画通常会执行“双缓冲”以避免在该位置复制大状态。 因此,如果您在从另一个缓冲区读取的同时写入一个缓冲区,然后在下一个周期写入另一个缓冲区并从第一个缓冲区读取。

【讨论】:

以上是关于使用 memcmp、memcpy 优化子程序的主要内容,如果未能解决你的问题,请参考以下文章

memset memcmp memcpy memmove 自己实现

使用CAPL 内置函数 memcpy 和memcmp 处理数组的若干问题

使用CAPL 内置函数 memcpy 和memcmp 处理数组的若干问题

C语言内存操作函数

memcpy() memset() 内存拷贝函数 /初始化

Cortex-A8处理器memcpy的优化方案