実際には、ここでは、コメントの一部にもかかわらず、多少速くすることができます。
だが、実際にそれをテストしてみましょう:
using System;
using System.Diagnostics;
namespace Demo
{
class Program
{
static void Main(string[] args)
{
int count = 1000000000;
Stopwatch sw = Stopwatch.StartNew();
for (int way = 1; way <= 3; ++way)
test1(count, way);
var elapsed1 = sw.Elapsed;
Console.WriteLine("test1() took " + elapsed1);
sw.Restart();
for (int way = 1; way <= 3; ++way)
test2(count, way);
var elapsed2 = sw.Elapsed;
Console.WriteLine("test2() took " + elapsed2);
Console.WriteLine("test2() was {0:f1} times as fast.", + ((double)elapsed1.Ticks)/elapsed2.Ticks);
}
static void test1(int count, int way)
{
for (int i = 0; i < count; ++i)
{
switch (way)
{
case 1: doWork1(); break;
case 2: doWork2(); break;
case 3: doWork3(); break;
}
}
}
static void test2(int count, int way)
{
switch (way)
{
case 1:
for (int i = 0; i < count; ++i)
doWork1();
break;
case 2:
for (int i = 0; i < count; ++i)
doWork2();
break;
case 3:
for (int i = 0; i < count; ++i)
doWork3();
break;
}
}
static void doWork1()
{
}
static void doWork2()
{
}
static void doWork3()
{
}
}
}
doWork()メソッドは何もしないので、今これは、かなり非現実的です。しかし、それは私たちにベースラインのタイミングを与えるでしょう。私は私のWindows 7のx64システム上のリリースビルドのために得る
結果は以下のとおりです。
test1() took 00:00:03.8041522
test2() took 00:00:01.7916698
test2() was 2.1 times as fast.
だから、switch文の中にループを移動すると、TWICE AS FAST THANそれはMOREます。今
doWork()の中にいくつかのコードを追加してのは、それを少しより現実的にしましょう:
test1() took 00:00:03.9153776
test2() took 00:00:05.3220507
test2() was 0.7 times as fast.
今ではにループを入れても遅いです:
using System;
using System.Diagnostics;
namespace Demo
{
class Program
{
static void Main(string[] args)
{
int count = 1000000000;
Stopwatch sw = Stopwatch.StartNew();
for (int way = 1; way <= 3; ++way)
test1(count, way);
var elapsed1 = sw.Elapsed;
Console.WriteLine("test1() took " + elapsed1);
sw.Restart();
for (int way = 1; way <= 3; ++way)
test2(count, way);
var elapsed2 = sw.Elapsed;
Console.WriteLine("test2() took " + elapsed2);
Console.WriteLine("test2() was {0:f1} times as fast.", + ((double)elapsed1.Ticks)/elapsed2.Ticks);
}
static int test1(int count, int way)
{
int total1 = 0, total2 = 0, total3 = 0;
for (int i = 0; i < count; ++i)
{
switch (way)
{
case 1: doWork1(i, ref total1); break;
case 2: doWork2(i, ref total2); break;
case 3: doWork3(i, ref total3); break;
}
}
return total1 + total2 + total3;
}
static int test2(int count, int way)
{
int total1 = 0, total2 = 0, total3 = 0;
switch (way)
{
case 1:
for (int i = 0; i < count; ++i)
doWork1(i, ref total1);
break;
case 2:
for (int i = 0; i < count; ++i)
doWork2(i, ref total2);
break;
case 3:
for (int i = 0; i < count; ++i)
doWork3(i, ref total3);
break;
}
return total1 + total2 + total3;
}
static void doWork1(int n, ref int total)
{
total += n;
}
static void doWork2(int n, ref int total)
{
total += n;
}
static void doWork3(int n, ref int total)
{
total += n;
}
}
}
今、私はこれらの結果を取得スイッチ!このような直感的ではない結果は、こうした種類の典型であり、コードを最適化しようとしているときにタイミングテストを実行する必要がある理由を示しています。 (そして、このようなコードを最適化するのは、通常、ボトルネックがあると疑う十分な理由がない限り、行うべきではありません。コードを整理するのが良いでしょう。))
I他のいくつかのテストを行い、少し簡単なdoWork()メソッドの場合は、test2()メソッドが高速でした。これは、JITコンパイラが最適化を使用してできることに大きく依存します。
注:私の2番目のテストコードの速度の違いは、JITコンパイラがdoWork()の呼び出しをインライン展開するときに 'ref'呼び出しを最適化できるためです。 in test1(); test2()の場合は(何らかの理由で)できません。
これを試してください:http://stackoverflow.com/questions/445067/if-vs-switch-speed – Shiham
[対策](http://msdn.microsoft.com/en-us/library) /system.diagnostics.stopwatch.aspx)それは? –
@TimSchmelter私のプロジェクトは銀色で、ストップウォッチはここでは利用できません。 – vaibhav