gpt4 book ai didi

c - 为什么C程序在循环包含条件时运行速度变慢

转载 作者:行者123 更新时间:2023-11-30 21:00:26 25 4
gpt4 key购买 nike

我根据收到的评论重新表述这个问题。

我有一个运行 300 亿次的循环,并将值分配给使用 malloc() 分配的内存块;

当循环包含条件时,它的运行速度比条件不存在时慢得多。查看以下场景:

场景 A:存在条件且程序缓慢(43 秒)

场景 B:条件不存在,程序速度更快(4 秒)

// gcc -O3 -c block.c && gcc -o block block.o



#include <stdio.h>
#include <stdlib.h>


#define LEN 3000000000

int main (int argc, char** argv){

long i,j;

unsigned char *n = NULL;
unsigned char *m = NULL;

m = (unsigned char *) malloc (sizeof(char) * LEN);

n = m;

srand ((unsigned) time(NULL));

int t = (unsigned) time(NULL);

for (j = 0; j < 10; j++){

n = m;

for (i = 0; i < LEN; i++){


//////////// A: THIS IS SLOW
/*
if (i % 2){
*n = 1;

} else {
*n = 0;
}
*/
/////////// END OF A


/////////// B: THIS IS FAST

*n = 0;

i % 2;

*n = 1;

/////////// END OF B

n += 1;

}
}


printf("Done. %d sec \n", ((unsigned) time(NULL)) - t );

free(m);

return 0;
}

问候,KD

最佳答案

您可以使用 gcc -S -O3 查看生成的汇编程序。以下是英特尔盒子上的示例:

快速版本:

    movl    %eax, %r12d
.p2align 4,,10
.p2align 3
.L2:
movl $3000000000, %edx
movl $1, %esi
movq %rbp, %rdi
call memset
subq $1, %rbx
jne .L2

慢速版本:

    movl    $10, %edi
movl %eax, %ebp
movl $3000000000, %esi
.p2align 4,,10
.p2align 3
.L2:
xorl %edx, %edx
.p2align 4,,10
.p2align 3
.L5:
movq %rdx, %rcx
andl $1, %ecx
movb %cl, (%rbx,%rdx)
addq $1, %rdx
cmpq %rsi, %rdx
jne .L5
subq $1, %rdi
jne .L2

结论:编译器比你想象的更聪明。它能够将内部循环优化为 memset(速度更快,因为它使用 Intel 上的 SSE/AVX 或 REP 指令)。但是,如果保持该条件,则此优化无法启动 - 因为结果不同。

关于c - 为什么C程序在循环包含条件时运行速度变慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41364602/

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