2015-12-15 14 views
8

"C" bilgimi tazeleme sürecindeyim. I işaretçileri ve bu nasıl çalıştığını o diziler çürüme olsun. Dize işlemede bu gibi görünen kodlara devam ediyorum;İndeksle öğelere erişme üzerinde char işaretçisini artırırken herhangi bir performans artışı var mı?

int count_spaces(const char *s) 
{ 
    int count = 0; 

    for(; *s != '\0'; s++){ 
     if(*s == ' '){ 
      count++; 
     } 
    } 

return count; 

} 

Bu işlevin yazılması yerine dizge işlem kodumdan hangi performans kazanımdan çıkarım?

int count_spaces(const char s[]) 
{ 
    int count = 0, i; 

    for(i = 0; s[i] != '\0'; i++) 
    { 
     if(s[i] == ' '){ 
      count++; 
     } 
    } 
return count; 

} 

İşaretçiyi ne zaman kullanacağınız ve ne zaman kullanmamanız gerektiği için kolay bir sözlüğü var mı?

+1

Kodunuzdan bu tür bir performansı sıkıştırmak için derleyiciye bırakın. Asm sürümünü kontrol etmeyi denediniz mi? –

+0

@ultrasounder’da küçük bir sözdizimi hatası var. İkinci kod örneğinde \ 0'dan sonra ekstra bir teklife ihtiyacınız var. – RunFun

+1

artı önemli basamaklama eksik! –

cevap

8

Bu, derleyiciye bağımlıdır. Bazı derleyiciler, bir yöntem veya diğeri için performans artışı sağlayabilir. Bununla birlikte, belirli bir örneğe bakmak faydalı olabilir. Makinemdeki en düşük optimize edilmiş montaj çıktısı gcc -S -O0'u kullanarak, ikinci işlevden birinci işlev için 3 daha yönergeleri verir. -O3 bayrağını kullanarak aynı montaj dosyalarına göre optimize edilmiştir.

Düzenleme: Ayrıca kod olarak okunabilir ve mümkün :) olarak şanssız hatalara karşı dirençli hale getirir braketi bkz

int count_spaces(const char s[]) { 
    int count = 0, i; 

    for(i = 0; s[i] != '\0'; i++) { 
     if(s[i] == ' ') { 
      count ++; 
     } 
    } 
    return count; 
} 

Düzenleme:

açıkça soruya cevap vermek için: kullanılmasını sizin için en açıktır hangisi ve kim kodunuzu okuyabilir? Alabileceğiniz performans artışı, okunabilirlik ve niyet açıklığı yararına kıyasla ihmal edilebilir düzeydedir.

+0

@dylanKirby derleyici optimizasyon bayraklarının işaretçileri için teşekkürler. Biçimlendirmeyle uygun bir Düzenleyici kullanmak yerine kod parçacığımı yazmak için bir metin düzenleyicisi kullanmak için fiyat koyarım. Şimdi sabit. – ultrasounder

+0

Netlik hakkındaki yorum ile katılıyorum. Eğer performans kesinlikle kritikse, bu fonksiyon dallanma olmaksızın yazılabilir ve muhtemelen SIMD talimatları ile vektör edilir. Bu 's' çok uzun bir dize ise, sadece mantıklı olurdu. – paddy

İlgili konular