SORU
20 AĞUSTOS 2009, PERŞEMBE


Try/catch bloğu özel durum oluşturuldu değilken performans acıyor mu?

Bir Microsoft çalışanı ile kod incelemesi sırasında üzerinde try{} bir blok içinde kod büyük bir bölümüne geldik. O ve bir temsilcisi bu kodun performansı üzerinde etkileri olabilir önerdi. Aslında, çoğu kodu try/catch bloğu dışında olmalıdır, ve sadece önemli bölümleri kontrol edilmesi gerektiğini önermişlerdi. Microsoft çalışanı eklendi ve yaklaşan beyaz bir kağıt yanlış deneyin karşı blok yakalamak/uyardı " dedi.

Etrafıma baktım ve o can affect optimizations ama bir değişken kapsamları arasında paylaşıldığında sadece uygulanabilir görünmektedir bulundu.

Kod bakımı, veya özel durumları (söz konusu kod re-faktoring ihtiyaçları, şüphesiz) bile sormuyorum. Ayrıca akış kontrolü için özel durumlar kullanarak bahsetmiyorum, bu açıkça çoğu durumda yanlış. Bunlar önemli konular (biraz daha önemlidir), ama odak değil, burada.

Nasıl deneyin/catch bloğu istisna performansını etkilerdeğilatılmış?

EDİT: bir ödül daha ekliyorum. İlginç tepkiler var, ama biraz daha bilgi almak istiyorum.

CEVAP
20 AĞUSTOS 2009, PERŞEMBE


Bunu kontrol edin.

static public void Main(string[] args)
{
    Stopwatch w = new Stopwatch();
    double d = 0;

    w.Start();

    for (int i = 0; i < 10000000; i  )
    {
        try
        {
            d = Math.Sin(1);
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.ToString());
        }
    }

    w.Stop();
    Console.WriteLine(w.Elapsed);
    w.Reset();
    w.Start();

    for (int i = 0; i < 10000000; i  )
    {
        d = Math.Sin(1);
    }

    w.Stop();
    Console.WriteLine(w.Elapsed);
}

Çıkış:

00:00:00.4269033  // with try/catch
00:00:00.4260383  // without.

Milisaniye:

449
416

Yeni kod:

for (int j = 0; j < 10; j  )
{
    Stopwatch w = new Stopwatch();
    double d = 0;
    w.Start();

    for (int i = 0; i < 10000000; i  )
    {
        try
        {
            d = Math.Sin(d);
        }

        catch (Exception ex)
        {
            Console.WriteLine(ex.ToString());
        }

        finally
        {
            d = Math.Sin(d);
        }
    }

    w.Stop();
    Console.Write("   try/catch/finally: ");
    Console.WriteLine(w.ElapsedMilliseconds);
    w.Reset();
    d = 0;
    w.Start();

    for (int i = 0; i < 10000000; i  )
    {
        d = Math.Sin(d);
        d = Math.Sin(d);
    }

    w.Stop();
    Console.Write("No try/catch/finally: ");
    Console.WriteLine(w.ElapsedMilliseconds);
    Console.WriteLine();
}

Yeni bulgular:

   try/catch/finally: 382
No try/catch/finally: 332

   try/catch/finally: 375
No try/catch/finally: 332

   try/catch/finally: 376
No try/catch/finally: 333

   try/catch/finally: 375
No try/catch/finally: 330

   try/catch/finally: 373
No try/catch/finally: 329

   try/catch/finally: 373
No try/catch/finally: 330

   try/catch/finally: 373
No try/catch/finally: 352

   try/catch/finally: 374
No try/catch/finally: 331

   try/catch/finally: 380
No try/catch/finally: 329

   try/catch/finally: 374
No try/catch/finally: 334

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • MatheusDosGames

    MatheusDosGa

    28 Aralık 2011
  • superflyy88

    superflyy88

    8 ŞUBAT 2009
  • Tutorials Junction

    Tutorials Ju

    1 Ocak 2014