2015-04-23 9 views
5

Sık sık genellikle arayüz dosyaları ve uygulama dosyalarını ama ayırmak isterLink time optimizasyonu gcc 5.1 'de basit fonksiyonlardan vazgeçmek için yeterince iyi mi? aliskanliklarindan

class PositiveInteger 
{ 
private: 
    long long unsigned m_i; 
public: 
    PositiveInteger (int i); 
}; 

inline PositiveInteger :: PositiveInteger (int i) 
: m_i (i) 
{ 
    if (i < 0) 
     throw "oops"; 
} 

böyle bu (yapmacık örnek) gibi basit işlevleri için satır içi işlev tanımları yazma, yine de, bu işlevler için benim alışkanlık olduğu Kafamdaki ses bana muhtemelen sıcak noktalarda çok fazla vurulacağını söylüyor.

ben tavsiye "İlk profil" ve kabul ama ben derleyici böyle fonksiyonlar derleme de inlined edilip aynı nihai nesne kodu üretmek olacağını önsel bilse çaba profilleme bir bütün yükü önlemek olabilir biliyorum veya bağlantı zamanı. (Ayrıca, enjekte edilen profil kodunun kendisinin yukarıdaki gibi çok basit işlevlerin etkisini azaltan zamanlamada bir değişikliğe neden olabileceğine inanıyorum.)

GCC 5.1, yeni LTO (bağlantı süresi optimizasyonu) iyileştirmeleri yayınlandı. Gerçekten ne kadar iyi? Nihai yürütülebilir dosyayı bilerek hangi tür işlevleri güvenli bir şekilde etkileyemeyeceğim?

+7

Bu kod biçimlendirmesi ... ... gözleri acıtıyor. PositiveInteger :: PositiveInteger' bir şeyin adıdır. Nitelikli, ama yine de sadece bir isim. Neden buna boşluk koyarsın? –

+0

Yazdığın yolu buldum acıyor * gözlerim, her ne kadar uzaklarda daha yaygın olduğunu fark etsem de. Başka herhangi bir yerde beyaz boşluk koymak için aynı argüman. – spraff

cevap

1

Zaten kendi sorunuzu yanıtladınız: Kısıtlanmış kaynaklarla bir tür yerleşik bir sistemi hedeflemediğiniz sürece, önce açıklık ve süreklilik için kod yazınız. O zaman , performansı kabul edilemezse, çabalarınızı gerçek noktalara göre profilleyebilir ve hedefleyebilirsiniz. Bir düşünün: Eğer kullanım durumunuzda farkedilemeyecek fazladan 250ns alan daha net kod yazarsanız, ekstra zaman önemli değildir.

+0

Önşart, derleyicinin satır içi çizgisi belirmediğinde, * büyük olasılıkla daha yavaş gerçekleşeceğidir. Ancak, derleyici * biliyorum * inline sonra ben * tamamen düşünmeyi bırakabilirsiniz *. Profil oluşturmadan. – spraff

0

LTO'lu GCC, çapraz modül çizgisini gösterir, bu nedenle çoğu zaman kod kalitesinde fark görmemelisiniz. Çevrimdışı işlev bildirimleri de çeviri birimleri arasında çoğaltılmıyor ve daha hızlı/küçük nesne dosyaları üretiyor.

GCC'nin buluşsal sezgisel özellikleri, "satır içi" anahtar sözcüğünü, işlevin satır içi olarak iyi olması ve işlev boyutundaki sınırların artması için iyi bir ipucu olduğunu düşünür. Benzer şekilde, çağrılan aynı çeviri biriminde bildirilen işlevler için fazladan ipucu olacaktır. Örneğinizde olduğu gibi küçük işlevler için bu bir fark yaratmamalı.