gpt4 book ai didi

c - 哪个更快更好?这种比较方法是真的吗?

转载 作者:行者123 更新时间:2023-12-03 16:56:48 24 4
gpt4 key购买 nike

我正在使用 IAR 编译器开发 STM8S 微 Controller 。

我尝试比较 d.M0.bit._5=d.M1.bit._7; 的版本,并将周期和代码内存差异写为下面的命令。

typedef union 
{
struct
{
unsigned char _0 :1;
unsigned char _1 :1;
unsigned char _2 :1;
unsigned char _3 :1;
unsigned char _4 :1;
unsigned char _5 :1;
unsigned char _6 :1;
unsigned char _7 :1;
} bit;
unsigned char data;
} m;

typedef struct
{

m M0,
M1,
M2,
} dm_;

#pragma location = 0x050
dm_ d;

// original version;

d.M0.bit._5=d.M1.bit._7; // 21 byte(difference from total code memory),
// 18 cycle (PC:Programme Counter)
//--------------------------------------------------------------------------
// second version;

d.M0.bit._5=0; // 18 byte(difference from total code memory),
if(d.M1.bit._7) // 15 cycle (PC:Programme Counter)
d.M0.bit._5=1;

// third version;
d.M0.data &=~(1<<5); // 18 byte(difference from total code memory),
if(d.M1.data & 0x80) // 15 cycle (PC:Programme Counter)
d.M0.data |=(1<<5);

似乎是这样,第二版和第三版与原始版本相当且效率更高,但我不知道这是一个 secret 的比较吗?

在调试器模式下,我计算 PC 周期数并编译所有代码以检查每个代码内存和新代码内存的差异。

此外,d.M0.bit._5=d.M1.bit._7; 版本的汇编指令可能并不重要,但汇编指令更多。

最佳答案

总的来说,最好避免 ifs,因为除非你有条件移动指令,否则 if == branch == slow。

将位从一个值分配给另一个值的最短已知公式是:

r = a ^ ((a ^ b) & mask)

这是公式的来源:https://graphics.stanford.edu/~seander/bithacks.html#MaskedMerge

所以你的情况的最终结果是:

unsigned char a = d.M0.data;
unsigned char b = (d.M1.data >> 2); // put bit 7 into 5th position
unsigned char mask = 0x20; // will assign to a the 5th bit of b
d.M0.data = a ^ ((a ^ b) & mask);

在我的 Intel i5 上,它比其他选项快大约 6-13%。我预计这种差异在较慢的 CPU 上会更加突出。

但这有点棘手,所以速度提升是否值得代码可读性取决于您......

--------------------------------------------------------------
Benchmark Time CPU Iterations
--------------------------------------------------------------
bits_assign 212 ns 212 ns 3288700
bits_assign_if_bit 212 ns 210 ns 3327297
bits_assign_if_data 203 ns 203 ns 3457701
bits_assign_branchless 188 ns 188 ns 3713355

关于c - 哪个更快更好?这种比较方法是真的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46786177/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com