LoginSignup
1
1

More than 5 years have passed since last update.

C#でswitchのフォールスルーの有無でのパフォーマンス

Posted at

基礎のメソッドで使われているswitch条件分岐で実行元によって、
同じ結果を求めるのにswitchで参照する値が異なってるっていうのがあり、
統一した方がいいだろうっていう話から、
そもそもパフォーマンス的に違いがあんの?っていうのから気になって調べたのでその結果メモ

結果
どっちもあんまり変わらなさそう


パフォーマンステストとかやったことないので、そもそも計測方法合ってんの?
っていうのはありますが、下記に詳細。

一応、switch分岐を10個並べたけど、実際の物は2個ぐらいなので、
実務的にはそんなに影響なさそう。

実行環境
CPU : intel i3-3220 @ 3.30GHz
RAM : 4.00 GB
OS : Windows7 Pro 32bit
.NetFreamWork : 3.5

AnyCPUでリビルドした物を実行してます。


出力結果


フォールスルーなし:0回目:00:00:03.1577708
フォールスルーなし:1回目:00:00:03.1692752
フォールスルーなし:2回目:00:00:03.2303683
フォールスルーなし:3回目:00:00:03.1641701
フォールスルーなし:4回目:00:00:03.1919198
フォールスルーなし:5回目:00:00:03.1786859
フォールスルーなし:6回目:00:00:03.2009377
フォールスルーなし:7回目:00:00:03.1793720
フォールスルーなし:8回目:00:00:03.2954076
フォールスルーなし:9回目:00:00:03.1917363
フォールスルーなし平均:00:00:03.1959643
フォールスルーあり:0回目:00:00:03.1917434
フォールスルーあり:1回目:00:00:03.1726927
フォールスルーあり:2回目:00:00:03.1649794
フォールスルーあり:3回目:00:00:03.1667495
フォールスルーあり:4回目:00:00:03.1672266
フォールスルーあり:5回目:00:00:03.1672114
フォールスルーあり:6回目:00:00:03.1684243
フォールスルーあり:7回目:00:00:03.1638066
フォールスルーあり:8回目:00:00:03.2593065
フォールスルーあり:9回目:00:00:03.3309922
フォールスルーあり平均:00:00:03.1953132

まずいソース


using System;
using System.Collections.Generic;

namespace PerformanceTest
{
    class Program
    {
        static void Main(string[] args)
        {
            //Stopwatchオブジェクトを作成する
            System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
            long timeSpan = 0;

            string strValue = "Data";

            for (int count = 0; count < 10; count++)
            {
                //ストップウォッチを開始する
                sw.Reset();
                sw.Start();

                // 1億回ループ
                for (int i = 0; i < 100000000; i++)
                {
                    switch (strValue)
                    {
                        case "Data0":
                            break;
                        case "Data1":
                            break;
                        case "Data2":
                            break;
                        case "Data3":
                            break;
                        case "Data4":
                            break;
                        case "Data5":
                            break;
                        case "Data6":
                            break;
                        case "Data7":
                            break;
                        case "Data8":
                            break;
                        case "Data9":
                            break;
                        case "Data":
                            break;
                    }
                }

                //ストップウォッチを止める
                sw.Stop();

                timeSpan += sw.Elapsed.Ticks;

                //結果を表示する
                Console.WriteLine("フォールスルーなし:" + count.ToString() + "回目:" + sw.Elapsed.ToString());
            }

            Console.WriteLine("フォールスルーなし平均:" + TimeSpan.FromTicks(timeSpan / 10));

            timeSpan = 0;

            for (int count = 0; count < 10; count++)
            {
                //ストップウォッチを開始する
                sw.Reset();
                sw.Start();

                // 1千万回ループ
                for (int i = 0; i < 100000000; i++)
                {
                    switch (strValue)
                    {
                        case "Data0":
                        case "Data1":
                        case "Data2":
                        case "Data3":
                        case "Data4":
                        case "Data5":
                        case "Data6":
                        case "Data7":
                        case "Data8":
                        case "Data9":
                        case "Data":
                            break;
                    }
                }

                //ストップウォッチを止める
                sw.Stop();

                timeSpan += sw.Elapsed.Ticks;

                //結果を表示する
                Console.WriteLine("フォールスルーあり:" + count.ToString() + "回目:" + sw.Elapsed.ToString());
            }

            Console.WriteLine("フォールスルーあり平均:" + TimeSpan.FromTicks(timeSpan / 10));
        }
    }
}

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1