0

次のプログラムの Loop2 は、Loop1 よりも時間がかかると予想していました。しかし、最適化 (gcc -O2) を有効にした後でも、両方のループにほぼ同じ時間がかかることがわかります。私のシステムで sizeof(int)=4 と sizeof(short)=2 を使用しているのはなぜですか? 私は、コンパイラが short を乗算するための短い乗算命令を配置し、したがって時間を短縮することを期待していました。

#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

パフォーマンスに関しては、コンパイラを推測できるとは思わないでください。あなたが期待すべき唯一のことは、あなたのアルゴリズムに基づいてより良いビッグオータイムです.

データ型のサイズが X であるとマニュアルに記載されている場合は、それが主張のすべてであり、それが期待されるすべてです。

于 2012-12-21T17:43:03.567 に答える
2

最適化を有効にした後、両方のループが空になっても驚かないでしょう。N を 10 倍に増やしてみて、違いがあるかどうかを確認しましたか?

于 2012-12-21T17:44:18.387 に答える
0

ほとんどのハードウェア プラットフォームでは、1 種類の整数実行ユニットしかなく、同じ量の CPU サイクルでサイズに関係なく整数演算を実行します。signed charしたがって、shortint、 の乗算にlong long intは同じ時間がかかります。それを行うのは同じハードウェアであるためです。

于 2012-12-21T17:47:12.443 に答える