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
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.
Neden bir döngü iki döngü daha yavaş g...
Neden yerel değişkenler olun ekleme ya...
Neden bu liste hesaplamak daha yavaş h...
Daha hızlı olan: birden fazla tek Ekle...
Neden string'daha yavaş daha star...