0

与 Loop1 相比,我预计以下程序中的 Loop2 会花费更多时间。但即使在启用优化 (gcc -O2) 之后,我发现这两个循环几乎都需要相同的时间。为什么在我的系统中 sizeof(int)=4 和 sizeof(short)=2 会这样?我期待编译器放置一个简短的乘法指令来乘以短裤,从而缩短时间。

#include <stdio.h>
#include <time.h>

float DiffTime(struct timespec Start,struct timespec Stop);

main ()
{
    struct timespec start,stop;    
    int    i;  
    short  a,b,c;
    int    p,q,r;

    a=1;
    b=2;
    c=3;
    p=1;
    q=2;
    r=3;
    clock_gettime (CLOCK_THREAD_CPUTIME_ID, &start);
    for(i=0;i<1000000;i++) // Loop1
    {
        a=b*a;
    }
    clock_gettime (CLOCK_THREAD_CPUTIME_ID, &stop);
    printf("Time taken %11.9fs\n",DiffTime(start,stop));
    clock_gettime (CLOCK_THREAD_CPUTIME_ID, &start);
    for(i=0;i<1000000;i++) // Loop2
    {
        p=q*p;
    }
    clock_gettime (CLOCK_THREAD_CPUTIME_ID, &stop);
    printf("Time taken %11.9fs\n",DiffTime(start,stop));

    printf("%d,%d\n",a,p);        

}

float DiffTime(struct timespec Start,struct timespec Stop)    
{
 long nTime1,nTime2;
 nTime1=Start.tv_sec*1000000000 + Start.tv_nsec ;
 nTime2=Stop.tv_sec*1000000000 + Stop.tv_nsec ;
 return((float)(nTime2-nTime1)/1000000000);
}
4

5 回答 5

2

不要期望在性能方面能够对您的编译器进行第二次猜测。您唯一应该期待的是基于您的算法的更好的大 O 时间。

如果手册说数据类型的大小是 X,那就是它声称的全部内容,这就是您应该期望的全部内容。

于 2012-12-21T17:43:03.567 回答
2

如果启用优化后两个循环都是空的,我不会感到惊讶。您是否尝试将 N 增加 10 倍并查看是否存在差异?

于 2012-12-21T17:44:18.387 回答
0

在大多数 32 位架构(包括 x86)上,乘以 16 位值与 32 位值所用的时间相同。(实际上,它可能会使用完全相同的指令。)

于 2012-12-21T17:41:50.243 回答
0

在大多数硬件平台上,只有一种整数执行单元,它将在相同数量的 CPU 周期内执行与大小无关的整数运算。所以乘以signed char, short, int,long long int将花费相同的时间,因为它是同一块硬件。

于 2012-12-21T17:47:12.443 回答
0

正如人们已经说过的那样,处理器 ALU 具有固定的大小,并且会将较小的整数提升到该首选大小。现代处理器至少有 32 位 ALU。还没有人提到的一点是,在 32 位或 64 位机器上,使用较短的类型甚至会产生较慢的代码。由于一些深奥的规则,代码生成器在某些情况下可能需要添加显式符号扩展指令。我在带有 gcc v3 的 SPARC 上的 Solaris 上产生了这种效果,它在代码中添加了大量 16 位截断指令,使得短裤比使用 int 慢得多。

于 2012-12-21T18:26:07.147 回答