2012-03-13 3 views
2

데이터 계층에 LINQ to SQL을 사용하는 WCF 서비스가 있습니다. 저장 프로 시저 만 사용되며 동적 테이블 액세스는 사용되지 않습니다. x64를 대상으로 할 때 x86 빌드의 처리량이 절반으로 줄어 들었습니다. 나는 뜨거운 경로를 Reflection.Emit.DynamicMethod.CreateDelegate으로 추적했다. 필자는 두 플랫폼 간의 성능 차이를 보여주는 간단한 테스트 프로젝트를 만들었습니다.x64에서 DynamicMethod가 왜 느려지는 이유는 무엇입니까?

DynamicMethod가 x64에서 훨씬 느린 이유는 무엇입니까? 제 모호한 이해는 x64에 DynamicInvoke에 관련된 추가 썽크가있을 수 있다는 것입니다. 싱글 스레드, 1.60 GHz의 @ 윈도우 7 엔터프라이즈 64, 코어 i7 Q720 수행 할 때 다음


결과입니다

Build Target  Average milliseconds to execute 100,000 iterations 
x86    5504 
x64    14699 
Any CPU   14789 

그리고 테스트 코드 :

class Program 
{ 
    private delegate string XInvoker(string arg); 

    private const int OUTER_ITERATIONS = 4; 
    private const int INNER_ITERATIONS = 100000; 

    static void Main(string[] args) 
    { 
     Console.WriteLine("Timing {0} iterations, repeat {1} times...", INNER_ITERATIONS, OUTER_ITERATIONS); 

     var watch = new Stopwatch(); 
     long totalMs = 0; 

     for (int outer = 0; outer < OUTER_ITERATIONS; outer++) 
     { 
      watch.Restart(); 

      for (int inner = 0; inner < INNER_ITERATIONS; inner++) 
      { 
       var method = new DynamicMethod("X", typeof(string), new[] { typeof(string) }); 

       var ilGen = method.GetILGenerator(); 
       ilGen.Emit(OpCodes.Ldarg_0); 
       ilGen.Emit(OpCodes.Ret); 

       var del = method.CreateDelegate(typeof(XInvoker)); 
       var blah = del.DynamicInvoke("blah"); 
      } 

      watch.Stop(); 
      totalMs += watch.ElapsedMilliseconds; 

      Console.WriteLine("Took {0} ms to iterate {1} times", watch.ElapsedMilliseconds, INNER_ITERATIONS); 
     } 

     Console.WriteLine(); 
     Console.WriteLine("Overall average: {0} ms to iterate {1} times", totalMs/OUTER_ITERATIONS, INNER_ITERATIONS); 
    } 
} 
+0

일반적으로 CreateDelegate는 내부 루프에 있지 않습니다. 맞습니까? – antlersoft

+0

WCF 서비스의 부하 테스트를 수행 할 때 실제로 내부 루프에 있습니다. –

+0

@AidanRyan, Main 메서드를 두 번 이상 호출 할 수 있습니까? (Main을 Main2로 이름을 바꾸고 Main2를 루프로 작성하십시오). –

답변

1

I 그것이 편집의 속도와 관련이 있다고 추측 할 수 있습니다. x64 용 JIT 컴파일이 x86보다 의미있는 속도로 느리다는 것을 나타내는 많은 스레드가 있습니다.

이 경우, 다른 종속 어셈블리가 NGEN되지 않았기 때문에 누군가 x64 JIT에서 상당한 성능 향상을 보았습니다. 이 시나리오에서 이것이 도움이 될지는 의심 스럽지만 느려질 수있는 다른 것들을로드하는 것을 결코 알지 못합니다. 아마도 답변에서 명령을 실행 해보고 그 결과가 실적을 변경하는지 확인하십시오. WPF slow to start on x64 in .NET Framework 4.0