2008-11-14 2 views

답변

3

@Dawkins

100 실행이 너무 적은 것입니다, 당신은 여러 번 약 10000 번 실행하고 그것을 반복하고 신뢰할 수있는 결과를 얻기 위해 그 평균을해야합니다. 귀하의 예에서는 오류의 한계가 크지 만 갈 길이 적절합니다. 더 비싼 것을 보여준다 18 %의 성능 차이가있다

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])); 

귀하의 결과 쇼 있다고하지만 그것을 떨어져 8 % :

여기에 내가 무슨 짓을했는지.

숫자를 여러 번 다시 실행하고 오류 마진이 1 % 미만인 10 % 차이가 발생했습니다.

그것은 주위 stablaizes :

HttpContext.Current=0,536ms, Local variable=0,486ms, R=110,2% 

을 어쨌든, HttpContext.Current 당신이 방법이 더 비용이 크게 응답으로 구성되어 있습니다 (요청에 따라 10000보다를 호출해야합니다 상당한 성능 문제를 제기 할 수 있습니다. 통화 기록). 그리고 그것은 일어날 가능성이 없습니다.

2

리플렉터

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

통화

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

호출 을 ... ContextBase

그래서 계속 '물건'을 스레딩의 비트가있다; 내가 모르는 구체적.

+4

어떤 이유로 논리적 콜 컨텍스트가 리턴하는 논리적 콜 컨텍스트 (무엇이든간에)가 반환하는 것을 선호하는 것처럼 보이는 것이 흥미 롭습니다. –

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; 

그리고 내 컴퓨터 결과는 주위 :

결과 1 = 395 틱 result2 = 332 틱

그래서 그것이 내가이 처음 시도하지 않은 이유를 알고하지 않습니다 꽤 빠른!

+0

성능 테스트를 수행하는 방법에 문제가 있습니다. 내 대답은 아래를 참조하십시오. 당신의 대답은 당신의 권리이지만 결과는 정확하지 않습니다 (통계적으로 실행 가능합니다). –

관련 문제