C 性能差异与铸造成倍增长

C 性能差异与铸造成倍增长,c,casting,double,increment,C,Casting,Double,Increment,我正在递增一个计数器,我需要在双精度算术循环后使用它。那么,你希望哪一个更快?(或者离得太近以至于打不到电话?) 代码1: double dubs = 3.14159265; double d; for(d=0; d<BIGNUM; d++) { /* do stuff not depending on d */ } dubs /= d; double dubs=3.14159265; 双d; 对于(d=0;d作为双精度,这可能无关紧要,但如果使用了float,第一个代码片段甚至可能不起

我正在递增一个计数器,我需要在双精度算术循环后使用它。那么,你希望哪一个更快?(或者离得太近以至于打不到电话?)

代码1:

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

对于(d=0;d作为双精度,这可能无关紧要,但如果使用了
float
,第一个代码片段甚至可能不起作用。由于精度有限,一段时间后,增加
float
不会改变其值。当然,对于(有符号)整数类型,溢出时会出现UB,这可能更糟


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

最有可能的是,双迭代索引不会矢量化,所以请bably第二个会更快。生成汇编并发布。顺便说一句,我喜欢独角兽。尝试基准测试和检查生成的汇编程序…等等…你被零除了吗?演员阵容有那么糟糕吗?算术中的混合类型总是困扰着我,所以我喜欢把它放进去,以知道我打算让代码以这种方式工作…我看着它另一种方法是:强制转换使它看起来像是在对不应该执行的类型执行某些操作。将浮点数除以整数并没有什么不自然的地方。
double dubs = 3.14159265;
int i;
for(i=0; i<BIGNUM; i++) { /* do stuff not depending on i */ }
dubs /= (double) i;
#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