就 cpu 成本而言,哪个更好?在运行时移位或将所有可能的值存储在数组中?
What is better in terms of cpu cost? Shifting bits in runtime or store all possible values in array?
我正在为 Arduino 平台中的 ESP8266 MCU 编写 C++ 代码,我正在努力让我的代码尽可能高效。
要通过I2C 操作其他MCU,我需要配置他的内部寄存器,它存储8 位。为了设置位on/off,我使用了按位掩码。
实现此目的的一种方法是移动位并以这种方式应用按位 &(和)掩码 Set the i-th bit to zero?。
但我也可以将所有 8 个可能的移位值存储在一个数组中,直接访问它们并逐出进行位移。
像这样:
const unsigned int PINS[8] = {0x1,0x2,0x4,0x8,0x10,0x20,0x40,0x80};
...
pt = pt & ~(PINS[i]);
而不是:
pt = pt & ~(1 << i);
我认为这可能会更糟,具体取决于 MCU 的编译器将如何处理它。
通过索引访问数组成本更高?数组值将在 cpu 寄存器中?我是否过度优化?还有其他选择吗?
你能帮我看看这个问题吗?
如果您处于(并且需要)这种优化级别,那么您将需要反编译代码并准确查看编译器构建的内容。
如果您真的想从那里进行优化,我建议您编写一个自定义汇编函数来确保循环(它处于紧密循环中,对吗?)是最佳的。这很痛苦,但您正在查看的优化是按单个周期的顺序进行的。
即使到那时,这也可能无关紧要,像循环展开这样的优化将远远超过 material 两个快速操作。
我正在为 Arduino 平台中的 ESP8266 MCU 编写 C++ 代码,我正在努力让我的代码尽可能高效。
要通过I2C 操作其他MCU,我需要配置他的内部寄存器,它存储8 位。为了设置位on/off,我使用了按位掩码。
实现此目的的一种方法是移动位并以这种方式应用按位 &(和)掩码 Set the i-th bit to zero?。
但我也可以将所有 8 个可能的移位值存储在一个数组中,直接访问它们并逐出进行位移。
像这样:
const unsigned int PINS[8] = {0x1,0x2,0x4,0x8,0x10,0x20,0x40,0x80};
...
pt = pt & ~(PINS[i]);
而不是:
pt = pt & ~(1 << i);
我认为这可能会更糟,具体取决于 MCU 的编译器将如何处理它。 通过索引访问数组成本更高?数组值将在 cpu 寄存器中?我是否过度优化?还有其他选择吗?
你能帮我看看这个问题吗?
如果您处于(并且需要)这种优化级别,那么您将需要反编译代码并准确查看编译器构建的内容。
如果您真的想从那里进行优化,我建议您编写一个自定义汇编函数来确保循环(它处于紧密循环中,对吗?)是最佳的。这很痛苦,但您正在查看的优化是按单个周期的顺序进行的。
即使到那时,这也可能无关紧要,像循环展开这样的优化将远远超过 material 两个快速操作。