2008-11-14 5 views

Antwort

3

@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.

2

von Reflektor

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

Anrufe ContextBase die

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

...

so nennt es ein bisschen Einfädeln 'Zeug' los; das spezifische weiß ich nicht wirklich.

+4

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). –

2

Es ist überhaupt nicht intensiv. Ich weiß nicht, warum ich nicht zum ersten Mal versucht haben:

 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; 

Und mein Computer Ergebnisse sind um:

result1 = 395 Ticks result2 = 332 Ticks

So ist es sehr schnell!

+0

Ich habe Probleme mit der Durchführung von Leistungstests, siehe meine Antwort unten. Ihr Recht in Ihrer Antwort, aber die Ergebnisse sind nicht genau (statistisch durchführbar). –