데이터 계층에 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);
}
}
일반적으로 CreateDelegate는 내부 루프에 있지 않습니다. 맞습니까? – antlersoft
WCF 서비스의 부하 테스트를 수행 할 때 실제로 내부 루프에 있습니다. –
@AidanRyan, Main 메서드를 두 번 이상 호출 할 수 있습니까? (Main을 Main2로 이름을 바꾸고 Main2를 루프로 작성하십시오). –