2012-01-15 12 views
15

Örneğin, ben gcc için tanımlandığı şekilde ve Linux çekirdeği kullanılır biliyoruz:C# 'da şube tahmini ipuçlarını kullanmak mümkün mü?

#define likely(x)  __builtin_expect((x),1) 
#define unlikely(x)  __builtin_expect((x),0) 

böyle bir şey C# mümkün değilse, en koyarak elle if ifadesi yeniden düzenlemek için en iyi alternatif olduğunu büyük olasılıkla ilk? Bu tür dış bilgiye dayanarak optimize etmenin başka yolları var mı?

İlgili bir notta, CLR koruma maddelerinin nasıl tanımlanacağını bilir ve alternatif dalın alınacağını varsayar, bu optimizasyonun koruyucu gözlüklerde kullanılması uygun değildir, doğru mu?

(Bunun mikro optimizasyon olabilir fark Not; ben akademik amaçlarla ilgileniyorum.)

+4

Bunu nasıl yaparsınız, C# derlemesi olarak görmek, herhangi bir yerel CPU'ya derlenebilecek bir bayt kodu olan bir bayt kodu mu? – Oded

+0

Cevap "hayır, bu mümkün değil." Bu imkansızlığın mantığı Oded tarafından belirtilmiştir. –

+0

Eğer IL, yerel kod için bir ipucu için bir talimatın kullanılabileceği, derlenmiş olduğundan, IL yapılabileceğini umuyordum sanırım. Ya da, diğer herhangi bir benzer teknik, işlemci düzeyinde olmasa bile, (bunun mümkün olduğundan emin değilim) ilgi çekicidir. – ceyko

cevap

23

Kısa cevap: Hayır

Uzun Cevap: Bilemezsin gerçekten çoğu durumda ihtiyacım var. , numaralı ifadeleri, ifadelerinizdeki mantığı değiştirerek ipuçları verebilir. Bu, bir performans aracıyla, Visual Studio'nun daha yüksek (ve daha pahalı) sürümlerinde yerleşik olan gibi daha kolaydır. Bunun akademik amaçlar için olduğunu anlıyorum, ancak JITer'in kodunuzu sizin için optimize etmede çok iyi olduğunu bilmek güzel. (CLR via C# gelen hemen hemen kelimesi kelimesine alınmıştır) Örnek olarak

Bu kod:

public static void Main() { 
    Int32[] a = new Int32[5]; 
    for(Int32 index = 0; index < a.Length; index++) { 
     // Do something with a[index] 
    } 
} 

a.Length bir özellik olduğundan, verimsiz gibi görünebilir ve C# bildiğimiz gibi, bir özellik aslında bir dizi iki yöntem (bu durumda get_Length ve set_Length). Bununla birlikte, JIT bir özellik olduğunu bilir ve ya uzunluğunu sizin için yerel bir değişkende depolar ya da üstünü engellemek için yöntemi satır içine alır.

... Bazı geliştiriciler yetileri JIT derleyicisi hafife ve JIT derleyici yardımcı olmak için bir girişim “zeki kod” yazmayı denedi. Bununla birlikte, geldiğiniz akıllı girişimler, performansını olumsuz etkileyecektir ve kodunuzun okunmasını zorlaştıracak ve bakımını azaltacaktır. Diğer şeylerin yanı sıra

, aslında ileri gider ve döngünün yerine performansının düşmesine döngü içinde dışında bir kez kontrol sınırları yok.

Sorununla doğrudan ilgisi olmayan bir şey olduğunu anlıyorum, ama sanırım yapmaya çalıştığım nokta, bu gibi mikro optimizasyonların C# 'da çok fazla yardım etmemesidir çünkü JIT genellikle bunun için tam olarak tasarlandığından daha iyi. (Eğlenceli gerçek, x86 JIT derleyicisi, x64 karşılığı daha agresif optimizasyonlar gerçekleştirir)

This article, .NET 3.5 SP1'de eklenen bazı optimizasyonları açıklar; bunlar arasında, tahminleri ve önbellek konumunu iyileştirmek için dalları düzleştirme konusunda iyileştirmeler bulunur.

Bütün bunlar, derleyicinin oluşturduğu ve CLR'nin performansına giden harika bir kitap okumak isterseniz, yukarıda alıntı yaptığım kitabı CLR ile C# üzerinden öneririm.

DÜZENLEME: .NET'te şu anda mümkün olsaydı, bilgileri EMCA-335 standard veya working draft'da bulabileceğinizi belirtmeliyim. Bunu destekleyen bir standart yoktur ve meta verileri, IlDasm veya CFF Explorer gibi bir şeye bakarak, şube tahminlerinde ipucu verebilecek herhangi bir özel veri işareti göstermez.

+0

Hayal kırıklığı olmasına rağmen, JITing hakkında bilgi güven veriyor. İpuçlarından dolayı, CLR'ye fazla aşina olmadığımdan, ama son zamanlarda "sahne arkasında" neyin gerçekte gerçekleştiğine çok ilgi duyduğumdan bu kitabı mutlaka okuyacağım. – ceyko

+0

Bu kitabın çoğundan zevk alırken, verdiğiniz alıntıdan hoşlanmıyorum. Bu aslında doğru, ama "akıllı kod" ile ilgili tonu sevmiyorum, özellikle bir kişi belirli bir optimizasyonun neden yapılmadığını merak ettiğinde insanlar sadece aşağılık göze çarpıyor. Her zaman mümkün olan en verimli kodu üreten ve mükemmel bir şekilde hiçbir şeyi optimize etmeyen korkunç bir saflığı hayal edebilen sihirli mükemmel bir jitter hayal edebiliyoruz ve gerçeğin aralarında olduğunu biliyoruz. Aradaki bu noktanın nerede olduğunu bilmeden, insanlar bu şeyleri sıcak noktalarda denemeye ve çalışıp çalışmadıklarını görmeye terkedilmişlerdir. –

+0

@JonHanna - Bence size büyük ölçüde katılıyorum. Geliştiricinin, JITer'in yaptığı şeyi görmezden gelmesi gerektiğini düşünmüyorum; Tam olarak neyin optimize edildiğini tam olarak bilmediğimiz için biraz talihsiz bir durum. Mükemmel olmadığını biliyorum. Ayrıca, bunun korkunç olmadığını da biliyorum. Kısa ve öz bir şekilde söylediniz, ancak basitçe ne kadar optimize edildiğini bilmiyoruz. Bilmenin tek yolu (çerçevenin tek bir versiyonu için), yapılıyormuş gibi yaptıklarına bakarak, Windbg gibi bir şey kullanmak. Yine de daha kolay olduğu söyleniyor. –

İlgili konular