@Dawkins
100 läuft zu wenig ist, müssen Sie es über 10000 mal mehrmals wiederholen und laufen und nehmen dann den Durchschnitt, dass ein zuverlässiges Ergebnis zu erhalten. Die Fehlerquote ist in Ihrem Beispiel zu groß, aber es ist der richtige Weg.
Hier ist, was ich tat:
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]));
Ihre Ergebnisse zeigen, dass es eine 18% Unterschied in der Leistung, die zeigt, dass es teurer ist, aber es um 8% ab.
Ich habe die Zahlen mehrmals wiederholt und kam zu einer Abweichung von 10% mit einer Fehlermarge von weniger als 1%.
Es stablaizes um:
HttpContext.Current=0,536ms, Local variable=0,486ms, R=110,2%
Wie dem auch sei, HttpContext.Current eine signifikante Performance-Problem stellen Sie es zu nennen brauchen, weit mehr als 10000 pro Anfrage (die Kosten weitgehend durch die Reaktion aus. Schreibe Anrufe). Und das wird wahrscheinlich nicht passieren.
Aus irgendeinem Grund finde ich es interessant, dass sie bevorzugen, was der unlogische Aufrufkontext übergibt, was der logische Aufrufkontext zurückgeben würde (was auch immer diese Dinge sind). –