gpt4 book ai didi

c - 加倍和递增的性能差异

转载 作者:太空宇宙 更新时间:2023-11-03 23:56:26 25 4
gpt4 key购买 nike

我正在递增一个计数器,我需要在 double 算术循环之后使用它。那么,您希望哪个更快? (或者太近而无法通话?)

代码 1:

double dubs = 3.14159265;
double d;
for(d=0; d<BIGNUM; d++) { /* do stuff not depending on d */ }
dubs /= d;

代码 2:

double dubs = 3.14159265;
int i;
for(i=0; i<BIGNUM; i++) { /* do stuff not depending on i */ }
dubs /= (double) i;

它取决于 BIGNUM 的大小吗?我知道这将是一个微小的差异,但只是发现自己在理论上想知道。

奖励问题:如果是 C++,您对使用 static_cast 的答案有什么变化吗?

--编辑--

好的,这是一个示例代码和汇编程序:

#define BIGNUM 1000000000
#define NUMLOOPS 1000

double test1()
{
double dubs = 3.14159265;
double d;
int k = 1;
for(d=0; d<BIGNUM; d++) { k*= 2; }
dubs /= d;
return dubs;
}

double test2()
{
double dubs = 3.14159265;
int i;
int k = 1;
for(i=0; i<BIGNUM; i++) { k*= 2; }
dubs /= (double)i;
return dubs;
}

int main()
{
double d1=0;
double d2=0;
int i;
for(i=0; i<NUMLOOPS; i++)
{
d1 += test1();
d2 += test2();
}
}


_test1:
LFB2:
pushq %rbp
LCFI0:
movq %rsp, %rbp
LCFI1:
subq $48, %rsp
LCFI2:
call mcount
movabsq $4614256656543962353, %rax
movq %rax, -16(%rbp)
movl $1, -4(%rbp)
movl $0, %eax
movq %rax, -24(%rbp)
jmp L2
L3:
sall -4(%rbp)
movsd -24(%rbp), %xmm0
movsd LC2(%rip), %xmm1
addsd %xmm1, %xmm0
movsd %xmm0, -24(%rbp)
L2:
movsd -24(%rbp), %xmm1
movsd LC3(%rip), %xmm0
ucomisd %xmm1, %xmm0
ja L3
movsd -16(%rbp), %xmm0
divsd -24(%rbp), %xmm0
movsd %xmm0, -16(%rbp)
movq -16(%rbp), %rax
movq %rax, -40(%rbp)
movsd -40(%rbp), %xmm0
leave
ret


_test2:
LFB3:
pushq %rbp
LCFI3:
movq %rsp, %rbp
LCFI4:
subq $32, %rsp
LCFI5:
call mcount
movabsq $4614256656543962353, %rax
movq %rax, -16(%rbp)
movl $1, -8(%rbp)
movl $0, -4(%rbp)
jmp L7
L8:
sall -8(%rbp)
incl -4(%rbp)
L7:
cmpl $99999, -4(%rbp)
jle L8
cvtsi2sd -4(%rbp), %xmm1
movsd -16(%rbp), %xmm0
divsd %xmm1, %xmm0
movsd %xmm0, -16(%rbp)
movq -16(%rbp), %rax
movq %rax, -24(%rbp)
movsd -24(%rbp), %xmm0
leave
ret

测试当前正在运行....

最佳答案

作为 double 它可能无关紧要,但如果您使用了 float,第一个代码片段甚至可能无法工作。由于精度有限,一段时间后,递增 float 将不会更改其值。当然,对于(有符号的)整数类型,你会在溢出时得到 UB,这可以说更糟。

我个人建议始终对包含计数/索引之类的变量使用整数类型,该变量自然是整数。为此使用浮点类型只是感觉不对。但是请删除第二个片段最后一行中无用的转换。

关于c - 加倍和递增的性能差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5520338/

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