2011-04-02 72 views
2

我正在增加一个计数器,我将需要在双重算术循环后使用。那么,你希望哪个更快? (或太近来电?)性能差异与铸造增加一倍和增量

代码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 

测试正在运行....

+0

'd ++'是否可以用于双打? – corsiKa 2011-04-02 00:53:28

+0

很可能双迭代索引不会被矢量化,所以*可能*第二个会更快。生成汇编并发布它。顺便说一句,爱上独角兽。 – Anycorn 2011-04-02 00:55:10

+1

尝试基准测试并检查汇编器生成的 – 2011-04-02 00:56:39

回答

1

为双它可能并不重要,但如果您使用float,则第一个代码片段可能不起作用。由于精度有限,过了一段时间,递增float不会改变其值。当然,对于(带符号)整数类型,你会得到UB溢出,这可以说是更糟。

个人而言,我会推荐总是使用整数类型为一个变量,其中包含类似于计数/索引,自然是一个整数。使用这种浮点类型只是感觉不对。但是请删除第二个片段最后一行中无用的转换。

+0

这个剧组是不是很糟糕?算术中的混合类型总是困扰我,所以我喜欢让它知道我希望代码以这种方式工作...... – usul 2011-04-02 01:23:51

+2

我用另一种方式来看待它:一个演员让它看起来像你在做什么与你不应该做的类型。将浮点数除以整数并没有什么不自然的。 – 2011-04-02 01:30:27