例外がスローされない場合、try/catch ブロックはパフォーマンスに影響しますか? 質問する

例外がスローされない場合、try/catch ブロックはパフォーマンスに影響しますか? 質問する

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

おすすめ記事