c++ - 使用 memcmp、memcpy 优化子例程

标签 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 需要更多的时间才能获得所需的值。

任何帮助将不胜感激。预先感谢您!

最佳答案

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

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

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

如果可能的话,直接读出ledTarget

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

关于c++ - 使用 memcmp、memcpy 优化子例程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43274303/

相关文章:

c++ - GTKMM - 为某些宽度绘制图像时出错

c++ - OpenSSL:我使用存储在外部文件中的 RSA key 对文件进行加密和解密,但有时我的程序会崩溃

c - 如何在 C 中释放树时找出导致内存泄漏的原因

multithreading - 线程内存布局

c++ - 为什么编译器允许字符串文字不是 const?

c++ - 将标题添加到大文件的最佳方法是什么

c++ - 什么是 boost::ptr_vector::pop_front() 返回类型?

c++ - 如何让一个 char* 指向一个 char[]?

c++ - C语言中extern存储类说明符的重要性和用法

sql-server - B+ 树索引究竟存储在哪里?