Microsoft の従業員とコード レビューをしているときに、try{}
ブロック内にコードの大きなセクションがあることに気付きました。彼女と IT 担当者は、これがコードのパフォーマンスに影響する可能性があると指摘しました。実際、彼らは、コードの大半を try/catch ブロックの外側に配置し、重要なセクションのみをチェックすべきだと提案しました。Microsoft の従業員は、今後発表されるホワイト ペーパーで不適切な try/catch ブロックについて警告すると付け加えました。
探し回って見つけた最適化に影響を与える可能性があるただし、変数がスコープ間で共有される場合にのみ適用されるようです。
私はコードの保守性や適切な例外処理について尋ねているのではありません (問題のコードは間違いなくリファクタリングが必要です)。また、フロー制御に例外を使用することについても言及していません。これはほとんどの場合明らかに間違っています。これらは重要な問題ですが (いくつかはより重要です)、ここでの焦点ではありません。
例外がスローされない場合、try/catch ブロックはパフォーマンスにどのような影響を与えますか?
ベストアンサー1
確認してください。
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);
}
出力:
00:00:00.4269033 // with try/catch
00:00:00.4260383 // without.
ミリ秒単位:
449
416
新しいコード:
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();
}
新しい結果:
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