En realidad, puede ser algo más rápido a pesar de algunos de los comentarios aquí.
Vamos a probarlo en realidad:
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()
{
}
}
}
Ahora bien, esto es muy poco realista, ya que el DoWork() métodos no hacen nada. Sin embargo, nos dará un tiempo de referencia.
Los resultados me pasa por una versión de lanzamiento en mi sistema de Windows 7 x64 son:
test1() took 00:00:03.8041522
test2() took 00:00:01.7916698
test2() was 2.1 times as fast.
Así se mueve el bucle en la sentencia switch hace que sea más del doble de rápido.
Ahora vamos a hacer un poco más realista añadiendo un poco de código en DoWork():
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;
}
}
}
Ahora consigo estos resultados:
test1() took 00:00:03.9153776
test2() took 00:00:05.3220507
test2() was 0.7 times as fast.
Ahora es más lento para poner el bucle en ¡el interruptor! Este resultado contrario a la intuición es típico de este tipo de cosas y demuestra por qué SIEMPRE debe realizar pruebas de tiempo cuando está tratando de optimizar el código. (Y la optimización de código como este suele ser algo que ni siquiera debería hacer a menos que tenga buenas razones para sospechar que hay un cuello de botella. Sería mejor que se tomara el tiempo limpiando su código;))
I Hice algunas otras pruebas, y para los métodos doWork() un poco más simples, el método test2() fue más rápido. Realmente depende mucho de lo que el compilador JIT pueda hacer con las optimizaciones.
NOTA: Creo que el motivo de las diferencias de velocidad para mi segundo código de prueba es que el compilador JIT puede optimizar las llamadas "ref" al alinear las llamadas a doWork() cuando no están en un bucle en test1(); mientras que para test2() no puede (por alguna razón).
intente esto: http://stackoverflow.com/questions/445067/if-vs-switch-speed – Shiham
¿Por qué no [medida] (http://msdn.microsoft.com/en-us/library /system.diagnostics.stopwatch.aspx) it? –
@TimSchmelter mi proyecto está en Silverlight, el cronómetro no está disponible aquí. – vaibhav