在CPU消耗方面,使用位运算在运行时移位,还是将所有可能的值存储在数组中,哪种更好?

11 浏览
0 Comments

在CPU消耗方面,使用位运算在运行时移位,还是将所有可能的值存储在数组中,哪种更好?

我正在使用Arduino平台上的C++代码编写ESP8266 MCU,并尽可能地使我的代码更加高效。

为了通过I2C操作其他MCU,需要配置其内部存储8位的寄存器。为了设置位的开/关,我使用按位掩码。

一种方法是通过移位位并应用比特位&(and)掩码来实现。详情请参阅将第i位设置为零?

但我还可以将所有可能的移位一的8个值存储在数组中,直接访问它们而不进行位移。

像这样:

const unsigned int PINS[8] = {0x1,0x2,0x4,0x8,0x10,0x20,0x40,0x80};
...
pt = pt & ~(PINS[i]);

而不是:

pt = pt & ~(1 << i);

我认为这取决于MCU的编译器如何工作而可能更糟糕。通过索引访问数组的成本更高吗?数组值将在cpu寄存器中吗?我是不是过多地进行了优化?还有其他选择吗?

您能帮我解决这个问题吗?

admin 更改状态以发布 2023年5月22日
0
0 Comments

如果您需要进行此级别的优化,则需要反编译代码,并了解编译器构建的确切内容。

如果您真的想从那里进行优化,我建议编写一个自定义的汇编函数,确保循环(它在紧密循环中,对吧?)是最优的。这很痛苦,但是您要优化的是个别周期的顺序。

即使到了那个程度,这可能也无关紧要,像循环展开之类的优化可能比两个快速操作更具物质意义。

0