SORU
19 Ocak 2012, PERŞEMBE


-Catch kodunu hızlandırmak?

Try-catch, ama bazı şaşırtıcı sonuçlar görmek etkilerini test etmek için bazı kod yazdım.

static void Main(string[] args)
{
    Thread.CurrentThread.Priority = ThreadPriority.Highest;
    Process.GetCurrentProcess().PriorityClass = ProcessPriorityClass.RealTime;

    long start = 0, stop = 0, elapsed = 0;
    double avg = 0.0;

    long temp = Fibo(1);

    for (int i = 1; i < 100000000; i  )
    {
        start = Stopwatch.GetTimestamp();
        temp = Fibo(100);
        stop = Stopwatch.GetTimestamp();

        elapsed = stop - start;
        avg = avg   ((double)elapsed - avg) / i;
    }

    Console.WriteLine("Elapsed: "   avg);
    Console.ReadKey();
}

static long Fibo(int n)
{
    long n1 = 0, n2 = 1, fibo = 0;
    n  ;

    for (int i = 1; i < n; i  )
    {
        n1 = n2;
        n2 = fibo;
        fibo = n1   n2;
    }

    return fibo;
}

Benim bilgisayarda, bu sürekli dışarı 0.96.. etrafında bir değeri yazdırır

Try-catch böyle blok ile ben döngü içine sarın Fibo ():

static long Fibo(int n)
{
    long n1 = 0, n2 = 1, fibo = 0;
    n  ;

    try
    {
        for (int i = 1; i < n; i  )
        {
            n1 = n2;
            n2 = fibo;
            fibo = n1   n2;
        }
    }
    catch {}

    return fibo;
}

Şimdi 0.69... ... aslında daha hızlı çalışır sürekli yazdırır! Ama neden?

Not: Bu Sürüm yapılandırma kullanarak ve doğrudan EXE dosyası (dışında Visual Studio) koştu derlenmiş.

EDİT: Jon Skeet's excellent analysis gösteren try-catch nasılsa neden x 86 CLR kullanın CPU kayıtları bir daha olumlu bir şekilde bu özel durumda (ve sanırım işimiz henüz nedenini anlıyor). Jon 64 CLR bu farkı olmadığını bulmak ve daha hızlı x 86 CLR daha olduğunu doğruladı. Ben de long tip yerine Fibo yöntemi içinde int türleri kullanılarak test, ve sonra x 86 CLR olarak aynı derecede hızlı 64 CLR gibi oldu.


GÜNCELLEME:Bu konu Roslyn tarafından düzeltildi gibi görünüyor. Aynı makine, aynı CLR sürüm -- sorunu VS sorunu VS 2015 derlenmiş uzaklaşır 2013, ama derlenmiş gibi yukarıda kalır.

CEVAP
20 Ocak 2012, Cuma


Bir Roslyn mühendis olan uzmanlaşmış anlama optimizasyonu yığın kullanımı aldı bir bak ve raporlar için bana öyle gibi gözüküyor bir sorun etkileşimi arasındaki yolu C# derleyici oluşturur yerel değişken depolar ve yolu JIT derleyicinin yaptığı kayıt zamanlama karşılık gelen 86 kodu. Sonuç halk yükler ve depolar üzerinde hassasiyetli kod nesil.

Nedense hepimiz için belirsiz, sorunlu kod oluşturma yolunu Jetta blok deneyin korumalı bir bölgede olduğunu bilir ne zaman önlenir.

Bu oldukça garip. Titreme ekibi ile takip ve eğer bir hata bu işi böylece girilen alabiliriz bakalım.

Ayrıca, biz çalışmak gelişmeler için Roslyn için C# ve VB derleyici algoritmaları belirlerken yerli yapılabilir "kısa ömürlü" -- diğer bir deyişle, sadece itti ve ortaya yığını yerine, ayrılmış belirli bir yere yığın süresi aktivasyonu. Jetta biz bu yerli yapılabilir zaman hakkında daha iyi ipuçları "" önceki. ölü verirsem kayıt tahsisi falan daha iyi bir iş yapmak mümkün olacağına inanıyoruz

Dikkatimizi ve garip davranışları için özür dilemek için bu kadar getirdiğin için teşekkürler.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Showtime

    Showtime

    21 HAZİRAN 2006
  • USI Events

    USI Events

    6 AĞUSTOS 2013
  • WePlayWeWatch

    WePlayWeWatc

    3 Temmuz 2013