gpt4 book ai didi

c - 查看 IF 条件代码以节省 CPU 周期

转载 作者:太空狗 更新时间:2023-10-29 15:37:35 25 4
gpt4 key购买 nike

我正在检查我的程序中 if 条件的用法,在那里,我有如下几行:

if(count > 4) count = 4;

将上面的 if 条件语句写成下面的非分支条件语句是不是个好主意?

count = 4*(count> 4) + count*(count<= 4);

我还有以下片段:

for (j=0, i=0; j<NCARD_PER_SUIT && i<CARDS_PER_PLAYER+CARDS_ON_BOARD; ++j) {
if (card_cfg.hearts & cfg_mask[j]) {
player_hand[i].card.face = j;
player_hand[i++].card.suit = HEART;
}
if (card_cfg.spades & cfg_mask[j]) {
player_hand[i].card.face = j;
player_hand[i++].card.suit = SPADE;
}
if (card_cfg.clubs & cfg_mask[j]) {
player_hand[i].card.face = j;
player_hand[i++].card.suit = CLUB;
}
if (card_cfg.diamonds & cfg_mask[j]) {
player_hand[i].card.face = j;
player_hand[i++].card.suit = DIAMOND;
}
}

想知道是否有好的(非分支)方式来编写上面的内容,有什么建议吗?

编辑:根据下面的一些反馈,我比较了汇编指令(使用 Windows 10 的 MSVS2015)并得到以下内容:

; 718  :     count = 4*(count> 4) + count*(count<= 4);

xor ebx, ebx
cmp edx, 4
setle bl
xor ecx, ecx
imul ebx, edx
cmp edx, 4
mov edx, 4
cmovg ecx, edx
add ebx, ecx

如果返回到 if 语句,我得到以下结果,其中没有跳转指令,指令总数是上面的 2/3:

; 718  :     if( count >4) count = 4;

mov eax, DWORD PTR _i$6$[ebp]
cmp edx, edi
mov ebx, DWORD PTR _player$GSCopy$1$[ebp]
cmovg edx, edi
mov edi, DWORD PTR _count$1$[ebp]
mov DWORD PTR _count$4$[ebp], edx

编辑 #2:根据下面评论的提示,我继续创建了一个

union 
typedef union {
struct cfg {
unsigned short hearts;
unsigned short spades;
unsigned short clubs;
unsigned short diamonds;
} suit;
unsigned long long allsuits;
} card_cfg_t;

在这个联盟的帮助下,我能够如下重写 OP 的第二个片段,如果我为 64 位机器构建它并花费更多时间,这似乎节省了很多(在我的情况下为 20%)(额外的 40%),如果我为 32 位机器构建它:

for (j=0, i=0; j<NCARD_PER_SUIT && i<CARDS_PER_PLAYER+CARDS_ON_BOARD; ++j) {
for (int k=0; k<4; ++k) {
present = (int)((card_cfg.allsuits & (cfg_mask[j] << 16*k)) != 0);
player_hand[i].card.face = j*present;
player_hand[i].card.suit = k;
i = i + present;
}
}

最佳答案

那些微观优化没有太多意义,但你想比较(你会看到你的和我的之间的区别 - 打开优化 - 编译器真的很擅长):

int count;

void foo()
{
count = 4*(count> 4) + count*(count <= 4);
}

void foo1()
{
count = count > 4 ? 4 : count;
}

void foo4()
{
if(count> 4) count = 4;
}

foo:
mov edx, DWORD PTR count[rip]
xor ecx, ecx
cmp edx, 4
setle al
setg cl
movzx eax, al
imul eax, edx
lea eax, [rax+rcx*4]
mov DWORD PTR count[rip], eax
ret
foo1:
cmp DWORD PTR count[rip], 4
mov eax, 4
cmovle eax, DWORD PTR count[rip]
mov DWORD PTR count[rip], eax
ret
foo4:
cmp DWORD PTR count[rip], 4
jle .L6
mov DWORD PTR count[rip], 4
.L6:
rep ret

关于c - 查看 IF 条件代码以节省 CPU 周期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45942992/

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