gpt4 book ai didi

c - if 语句和 mod(SIZE) 之间的效率差异

转载 作者:太空宇宙 更新时间:2023-11-04 01:16:44 24 4
gpt4 key购买 nike

研究我发现使用 (i+1)mod(SIZE) 在元素数组中执行循环。所以我想知道这种方法是否比 if 语句更有效...


例如:

#define SIZE 15

int main(int argc, char *argv[]) {
int items[SIZE];

for(int i = 0; items[0] < 5; i = (i + 1) % SIZE) items[i] += 1;

return 0;
}

它比(?)更有效:

#define SIZE 15

int main(int argc, char *argv[]) {
int items[SIZE];

for(int i = 0; items[0] < 5; i++) {
if(i == SIZE) i = 0;
items[i] += 1;
}

return 0;
}

感谢您的回答和抽空。

最佳答案

您可以在线检查程序集(即 here )。结果取决于体系结构和优化,但如果没有优化并且对于带有 GCC 的 x64,您将得到此代码(作为一个简单的示例)。

示例 1:

main:
push rbp
mov rbp, rsp
mov DWORD PTR [rbp-68], edi
mov QWORD PTR [rbp-80], rsi
mov DWORD PTR [rbp-4], 0
.L3:
mov eax, DWORD PTR [rbp-64]
cmp eax, 4
jg .L2
mov eax, DWORD PTR [rbp-4]
cdqe
mov eax, DWORD PTR [rbp-64+rax*4]
lea edx, [rax+1]
mov eax, DWORD PTR [rbp-4]
cdqe
mov DWORD PTR [rbp-64+rax*4], edx
mov eax, DWORD PTR [rbp-4]
add eax, 1
movsx rdx, eax
imul rdx, rdx, -2004318071
shr rdx, 32
add edx, eax
mov ecx, edx
sar ecx, 3
cdq
sub ecx, edx
mov edx, ecx
mov DWORD PTR [rbp-4], edx
mov ecx, DWORD PTR [rbp-4]
mov edx, ecx
sal edx, 4
sub edx, ecx
sub eax, edx
mov DWORD PTR [rbp-4], eax
jmp .L3
.L2:
mov eax, 0
pop rbp
ret

示例 2:

main:
push rbp
mov rbp, rsp
mov DWORD PTR [rbp-68], edi
mov QWORD PTR [rbp-80], rsi
mov DWORD PTR [rbp-4], 0
.L4:
mov eax, DWORD PTR [rbp-64]
cmp eax, 4
jg .L2
cmp DWORD PTR [rbp-4], 15
jne .L3
mov DWORD PTR [rbp-4], 0
.L3:
mov eax, DWORD PTR [rbp-4]
cdqe
mov eax, DWORD PTR [rbp-64+rax*4]
lea edx, [rax+1]
mov eax, DWORD PTR [rbp-4]
cdqe
mov DWORD PTR [rbp-64+rax*4], edx
add DWORD PTR [rbp-4], 1
jmp .L4
.L2:
mov eax, 0
pop rbp
ret

你看,对于 x86 的特定情况,没有模数的解决方案要短得多。

关于c - if 语句和 mod(SIZE) 之间的效率差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56585003/

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