簡體   English   中英

短Vs Int Gcc

[英]Short Vs Int Gcc

我期望以下程序中的Loop2比Loop1花費更多時間。 但是即使啟用了優化(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);
}

當涉及到性能時,不要指望能夠對您的編譯器進行猜測。 根據算法,您唯一可以期望的是更好的big-O時間。

如果手冊中說數據類型的大小是X,那就是它所宣稱的,這就是您應該期望的。

啟用優化后,如果兩個循環都為空,我將不會感到驚訝。 您是否嘗試將N增加10倍並查看是否存在差異?

在大多數32位體系結構(包括x86)上,將16位值相乘與32位值所花費的時間相同。 (實際上,它可能會使用完全相同的指令。)

在大多數硬件平台上,只有一種類型的整數執行單元,並且它將在相同的CPU周期數量內執行與大小無關的整數運算。 因此,將帶signed charshortintlong long int相乘會花費相同的時間,因為這樣做是在同一硬件上進行的。

正如人們已經說過的那樣,處理器ALU具有固定的大小,並將把較小的整數提升為該首選大小。 現代處理器至少具有32位ALU。 還沒有提到的一點是,在32或64位計算機上,使用較短的類型甚至會生成較慢的代碼,甚至會發生這種情況。 由於某些深奧的規則,在某些情況下,代碼生成器可能需要添加顯式的符號擴展指令。 我在使用gcc v3的SPARC上的Solaris上產生了這種效果,該代碼在代碼中增加了16位截斷指令的負載,從而使短褲比使用int慢得多。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM