() Olası/muhtemel() Linux çekirdeği makro - nasıl çalışır? 'onların yararı ne?
Linux çekirdeği bazı kısımları inceledim ve buldum böyle: çağırır
if (unlikely(fd < 0))
{
/* Do something */
}
ya
if (likely(!err))
{
/* Do something */
}
Onları tanımını buldum:
#define likely(x) __builtin_expect((x),1)
#define unlikely(x) __builtin_expect((x),0)
Optimizasyon için olduğunu biliyorum, ama nasıl çalışır? Ve ne kadar performans boyutunu küçült bunları kullanarak beklenen/olabilir? Ve darboğaz kodu güçlük (ve muhtemelen taşınabilirlik kaybetme) en az (tabii ki kullanıcı) değer.
CEVAP
Şube tahmin "" atlama talimatı. yan yana Olası neden olacak talimatları sağlamak için derleyici için bir talimat onlar Bu büyük bir zafer olabilir, eğer bu tahmin doğru ise atlama yönergesi temelde ücretsiz ve sıfır devir alacak demektir. Eğer tahminim doğru ise, öte yandan, sonra işlemci boru hattı temizlendi tutulmalı ve birkaç döngüleri mal olabilir. Tahmin çoğu zaman doğru olduğu sürece, bu performans için iyi olma eğilimindedir.
Tüm bu performans mükemmelleştirme gibi sadece sıkı bir döngü içinde çalıştırılan kapsamlı bir profil kodu gerçekten bir darboğaz olduğundan emin olmak için, ve muhtemelen mikro doğası gereği sonrasında yapmak gerekir. Genellikle Linux geliştiricileri böyle bir şey yaptılar ... sanıyorum bu yüzden oldukça deneyimlidir. Gerçekten onlar sadece gcc hedef olarak taşınabilirlik konusunda çok fazla umurlarında değil, ve bunu oluşturmak istiyorlar Meclisi çok yakın bir fikirleri yok.
Nasıl linux çekirdeği test edilir?...
Nasıl bir süreç bölümlendirme hatası a...
Nasıl Linux çekirdeği derlemek olabili...
JavaScript kilitler nasıl çalışır?...
CSS üçgenler nasıl çalışır?...