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
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
Özel durum catch bloğu içine atılmış -...
Bir alıcı birden fazla catch bloğu öze...
Eclipse: özel durum oluştuğunda, Mola...
Java: kontrol vs denetlenmeyen özel du...
Ferahlatıcı web özel durum için bekler...