SORU
7 Mart 2012, ÇARŞAMBA


Satır içi derleme dil yerel C kodundan daha yavaş gerçekleşiyor?

Inline assembly Dili ve C kod performansını karşılaştırmak için çalıştım, boyutu 2000 100000 kez iki dizi katan bir fonksiyon yazdım. İşte kod:

#define TIMES 100000
void calcuC(int *x,int *y,int length)
{
    for(int i = 0; i < TIMES; i  )
    {
        for(int j = 0; j < length; j  )
            x[j]  = y[j];
    }
}


void calcuAsm(int *x,int *y,int lengthOfArray)
{
    __asm
    {
        mov edi,TIMES
        start:
        mov esi,0
        mov ecx,lengthOfArray
        label:
        mov edx,x
        push edx
        mov eax,DWORD PTR [edx   esi*4]
        mov edx,y
        mov ebx,DWORD PTR [edx   esi*4]
        add eax,ebx
        pop edx
        mov [edx   esi*4],eax
        inc esi
        loop label
        dec edi
        cmp edi,0
        jnz start
    };
}

Burada main():

int main() {
    bool errorOccured = false;
    setbuf(stdout,NULL);
    int *xC,*xAsm,*yC,*yAsm;
    xC = new int[2000];
    xAsm = new int[2000];
    yC = new int[2000];
    yAsm = new int[2000];
    for(int i = 0; i < 2000; i  )
    {
        xC[i] = 0;
        xAsm[i] = 0;
        yC[i] = i;
        yAsm[i] = i;
    }
    time_t start = clock();
    calcuC(xC,yC,2000);

    //    calcuAsm(xAsm,yAsm,2000);
    //    for(int i = 0; i < 2000; i  )
    //    {
    //        if(xC[i] != xAsm[i])
    //        {
    //            cout<<"xC["<<i<<"]="<<xC[i]<<" "<<"xAsm["<<i<<"]="<<xAsm[i]<<endl;
    //            errorOccured = true;
    //            break;
    //        }
    //    }
    //    if(errorOccured)
    //        cout<<"Error occurs!"<<endl;
    //    else
    //        cout<<"Works fine!"<<endl;

    time_t end = clock();

    //    cout<<"time = "<<(float)(end - start) / CLOCKS_PER_SEC<<"\n";

    cout<<"time = "<<end - start<<endl;
    return 0;
}

Sonra zaman olarak görülebilir hangi işlemci döngüleri elde etmek için Beş kez programı çalıştıracağız. Her zaman işlevi üzerinde tek söz diyorum.

Ve işte sonuç geliyor.

Derleme sürüm fonksiyonu:

Debug   Release
---------------
732        668
733        680
659        672
667        675
684        694
Average:   677

C sürüm fonksiyonu:

Debug     Release
-----------------
1068      168
 999      166
1072      231
1002      166
1114      183
Average:  182

Serbest modunda C kodu derleme kod daha yaklaşık 3,7 kat daha hızlı. Neden?

Yazdığım derleme kod bu GCC tarafından üretilen kadar etkili olduğunu tahmin ediyorum. Benim gibi ortak bir programcı olarak rakibi bir derleyici tarafından oluşturulan daha hızlı kod yazdığı için çok zor.Bu assembly dili performansını ellerim tarafından yazılmış güvenmem gerek yok yani, C odaklanmak yapar ve assembly dili unuttun mu?

CEVAP
7 Mart 2012, ÇARŞAMBA


Evet, Evet, Evet. Çoğu kez.

Derleyicilerin çoğu insan hayal bile edemez iyileştirme (this short list) yapabilir.inter-procedural optimization whole-program optimization alabilirler. Montaj programcı iyi tanımlanmış fonksiyonları iyi tanımlanmış bir arama arayüzü ile yapmak zorunda. Bu Kullanım, Bu Derleyiciler optimizasyon yöntemleri birçok engeller *12, *, common subexpression elimination **13 fonksiyonları instruction scheduling fonksiyonlar tamamında ve diğer karmaşık gibi aşikar iyileştirmeleri (örneğinPolytope model,). 2 gün hesaplamak için neye ihtiyacınız şaşırtıcı, bir saniye içinde kontrol edebilirsiniz değil. RISC mimarlık adamlar durdu endişelenecek bu yıllar önce (talimat zamanlama, örneğin, çok zor tune by hand) ve modern CISC CPU çok uzun pipelines de.

Biraz karmaşık yönetmek için bilesistemkütüphaneler kendi derleyicileri (bakımı kolay) daha iyi bir final kodu üretmek için derleme yerine C yazılmış.

Eğer montajda bir şeyler yazarsan, simple optimizations bazı en azından göz önünde bulundurmanız gerekir bence. Diziler için okul kitabı örnek unroll the cycle (boyutu derleme zamanında biliniyor). Bunu yapmak ve Testi yeniden çalıştırın. Hata ayıklama sürümü daha yavaştır neden saf C (iyileştirme) göstermek olabilir.automatically use some MMX/SIMDx instructions kendilerini, ve eğer ki onlar sadece can't compare (değilim derleme guru ben denemeye bile kalkma konuşma ile ilgili bir kod yazdım). Sadece döngüler için bu ne short list of loop optimizationsortakbir derleyici kontrol etmek için (eğer program bir C için karar ne zaman kendi kendine sizce# program?)

Ayrıca çok nadir başka bir nedenle assembly dili kullanmak için ihtiyacımız var bu günlerde: plethora of different CPUs. Onlara destek olmak ister misiniz? Her 26* *özel specific instruction sets bazı vardır. Küçük görevler (bu gibi) için derleyicigenellikledaha iyi ve karmaşık görevler içingenellikleişe geri ödemesi (compiler may do better Her neyse) değil.

Yapabilirsinizher zamanel yapımı derleme kod derlenmiş kod daha iyi bir örnek oluşturabilir ancakgenelliklekurgusal bir örnek ya da bir tek şey oluyordoğruC kodu 200.000 satırlık program). Derleyiciler daha iyi montaj kodu 95% kere unutmak zorunda değiliz. (ayrıca üretecek sanırım ^strong>çevirici, derleyiciyapacağım de ve iyileştirme) vebazen ve bazı nadir zamanlarda sadecebirkaç, kısa, highly used, performance critical rutinleri için derleme kod yazmak gerekebilir.

Otur ve senin koda bir göz muhtemelen eğer Meclis bunu okuyun great post here on SO () çevirmek için daha algoritma yeniden tasarımı için daha fazla kazanç göreceksin.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • David Wills

    David Wills

    31 Aralık 2007
  • MrOctopi

    MrOctopi

    6 Aralık 2010
  • WiseOwlTutorials

    WiseOwlTutor

    21 EKİM 2011