@道金斯
100 次运行太少,您需要运行大约 10000 次并重复它,然后取其平均值以获得可靠的结果。在您的示例中,误差幅度很大,但这是正确的方法。
这就是我所做的:
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]));
您的结果表明存在 18% 的性能差异,这表明它更昂贵但下降了 8%。
我重新计算了几次,得出了 10% 的差异,误差小于 1%。
它稳定下来:
HttpContext.Current=0,536ms, Local variable=0,486ms, R=110,2%
无论如何,HttpContext.Current 会造成严重的性能问题,您需要将其调用方式超过每个请求 10000(成本主要由 Response.Write 调用构成)。这很可能不会发生。