HttpContext.Current调用背后有多少计算?

时间:2008-11-14 18:16:36

标签: asp.net-mvc performance

贵吗?

我正在开发一个直接呈现给Response.Output的HtmlHelper,以便保存不必要的字符串创建,我需要选择:

<% Validator.RenderClient(Response.Output); %>

<% Validator.RenderClient(); %>

并从HttpContext.Current.Response

获取textWriter

3 个答案:

答案 0 :(得分:3)

@Dawkins

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调用组成)。这可能不会发生。

答案 1 :(得分:2)

来自反射器

public static HttpContext get_Current()
{
    return (ContextBase.Current as HttpContext);
}

调用ContextBase 哪个叫

public static object HostContext
{
    get
    {
        object hostContext = 
          Thread.CurrentThread.GetIllogicalCallContext().HostContext;
        if (hostContext == null)
        {
            hostContext = GetLogicalCallContext().HostContext;
        }
        return hostContext;
    }

...

所以有一些线程'东西'正在进行;具体我不知道。

答案 2 :(得分:2)

根本不密集。我不知道为什么我第一次没有尝试这个:

        System.Diagnostics.Stopwatch sp = new System.Diagnostics.Stopwatch();

        // With HttpContext.Current:
        sp.Start();
        for (int i = 0; i < 100; i++)
        {
            HttpContext.Current.Response.Output.Write(i.ToString());
        }
        sp.Stop();
        long result1 = sp.ElapsedTicks;

        // Without:
        TextWriter output2 = HttpContext.Current.Response.Output;
        sp.Reset();
        sp.Start();
        for (int i = 0; i < 100; i++)
        {
            output2.Write(i.ToString());
        }
        sp.Stop();
        long result2 = sp.ElapsedTicks; 

我的电脑结果是:

result1 = 395个刻度 result2 = 332 ticks

所以它很快!