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