gpt4 book ai didi

c - 有和没有 'static' 的速度

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

我知道“静态”与范围有关,但我有一个问题:什么函数/变量访问速度更快:“静态”或不是?哪个代码会更快:

#include <stdio.h>

int main(){
int count;
for (count=0;count<1000;++count)
printf("%d\n",count);
return 0;
}

#include <stdio.h>

int main(){
static int count;
for (count=0;count<1000;++count)
printf("%d\n",count);
return 0;
}

在我的代码中,我正在处理非常大的数字(带有 unsigned long long),并且我每秒访问和增加它们大约 4.000.000 次。 此代码不是我正在处理的代码,它只是一个示例

最佳答案

作为善意的标志,我编写了一个我们可以实际推理的程序。

#include <stdint.h>
#include <stdio.h>

int
main()
{
static const uint64_t a = 1664525UL;
static const uint64_t c = 1013904223UL;
static const uint64_t m = (1UL << 31);
static uint32_t x = 1;
register unsigned i;
for (i = 0; i < 1000000000U; ++i)
x = (a * x + c) % m;
printf("%d\n", x);
return 0;
}

它将简单地计算由简单线性同余生成器返回的伪随机序列的十亿分之一元素。我们必须做一些比简单地增加计数器更困难的事情,否则编译器将优化整个循环以使其不存在。

以下是我的编译方式(x86_64 GNU/Linux 上的 GCC 4.9.1):

$ gcc -o non-static -Dstatic= -Wall -O3 main.c
$ gcc -o static -Wall -O3 main.c

要获得没有static的版本,我们只需在编译器命令行上#define它即可。

运行这两个程序花费了 2.36 秒,这意味着没有可测量的性能差异。

为了找出原因,我喜欢查看汇编代码。

$ gcc -S -o non-static.s -Dstatic= -Wall -O3 main.c
$ gcc -S -o static.s -Wall -O3 main.c

我们发现 GCC 为内部循环生成了相同的机器代码,并将对static变量的特殊处理移出了循环,这正是我们对一个好的编译器所期望的。

static相关的代码:

main:
.LFB11:
.cfi_startproc
movl x.2266(%rip), %esi
movl $1000000000, %eax
.p2align 4,,10
.p2align 3
.L2: # BEGIN LOOP
imull $1664525, %esi, %esi
addl $1013904223, %esi
andl $2147483647, %esi
subl $1, %eax
jne .L2 # END LOOP
subq $8, %rsp
.cfi_def_cfa_offset 16
movl $.LC0, %edi
xorl %eax, %eax
movl %esi, x.2266(%rip)
call printf
xorl %eax, %eax
addq $8, %rsp
.cfi_def_cfa_offset 8
ret

没有:

main:
.LFB11:
.cfi_startproc
movl $1000000000, %eax
movl $1, %esi
.p2align 4,,10
.p2align 3
.L2: # BEGIN LOOP
imull $1664525, %esi, %esi
addl $1013904223, %esi
andl $2147483647, %esi
subl $1, %eax
jne .L2 # END LOOP
subq $8, %rsp
.cfi_def_cfa_offset 16
movl $.LC0, %edi
xorl %eax, %eax
call printf
xorl %eax, %eax
addq $8, %rsp
.cfi_def_cfa_offset 8
ret

这只是再次强调了许多人在评论中试图表达的内容:我们需要实际的代码来推理性能,并且我们应该在这样做时真正对其进行基准测试。

此外,您不应该太担心这些事情,并且大多数时候应该相信您的编译器。专注于编写可读且可维护的代码,只有当您有证据表明有必要实现所需的性能时,才可以处理肮脏的细节。在您的特定示例中,我看不到声明局部变量static的任何有效理由。作为一名读者,这让我感到不安,不应该这样做。

关于c - 有和没有 'static' 的速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27446881/

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