Posted at

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

More than 3 years have passed since last update.

基礎のメソッドで使われている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));
}
}
}