@Dawkins
100 carreras es demasiado pocos, es necesario ejecutar unos 10.000 veces varias veces y repetirlo y luego tomar el promedio de que para obtener un resultado fiable. El margen de error es grande en su ejemplo, pero es el camino correcto a seguir.
Esto es lo que hice:
var results1 = new List<long>();
var results2 = new List<long>();
for (int j = 0; j < 100; j++)
{
var sp = new System.Diagnostics.Stopwatch();
// With HttpContext.Current:
sp.Start();
for (int i = 0; i < 10000; i++)
{
HttpContext.Current.Response.Output.Write(i);
}
sp.Stop();
results1.Add(sp.ElapsedTicks);
// Without:
TextWriter output2 = HttpContext.Current.Response.Output;
sp.Reset();
sp.Start();
for (int i = 0; i < 10000; i++)
{
output2.Write(i);
}
sp.Stop();
HttpContext.Current.Response.Clear();
results2.Add(sp.ElapsedTicks);
}
results1.Sort();
results2.Sort();
HttpContext.Current.Response.Write(string.Format("HttpContext.Current={0:0.000}ms, Local variable={1:0.000}ms, R={2:0.0%}<br/>", results1[results1.Count/2]/(double)TimeSpan.TicksPerMillisecond, results2[results2.Count/2]/(double)TimeSpan.TicksPerMillisecond, (double)results1[results1.Count/2]/(double)results2[results2.Count/2]));
El resultado muestra que hay una diferencia de rendimiento del 18%, lo que demuestra que es más caro, pero si fuera en un 8%.
Volví a ejecutar los números varias veces y obtuve una diferencia del 10% con un margen de error inferior al 1%.
Se stablaizes en torno a:
HttpContext.Current=0,536ms, Local variable=0,486ms, R=110,2%
De todos modos, HttpContext.Current a plantear un problema significativo el rendimiento que necesita para llamarlo el camino más de 10.000 según la petición (el costo está compuesto en gran parte por la respuesta. Escribir llamadas). Y eso probablemente no va a suceder.
Por alguna razón, me parece interesante que parezcan preferir lo que devuelve el contexto de llamada ilógica sobre lo que devolvería el contexto de llamada lógica (cualquiera que sea). –