2010-11-19 2 views
2

여기에 고급 성능 질문이 있습니다. 내 시나리오는 다음과 같습니다.미리 컴파일 된 XSLT, ReBase 및 NGEN

수천 개의 XSLT 문서가 포함 된 데이터베이스가 있습니다. 웹 사이트의 각 페이지마다 하나씩, 이렇게하면 XML이 HTML로 변환됩니다. ASP.NET 웹 서버 (팜)는 데이터베이스에서 XSLT 문서를로드하고이를 사용하여 각 웹 요청에 대해 HTML을 렌더링합니다.

저는 XslCompiledTransform을 사용하고 데이터베이스 새로 고침 사이에 캐싱 (30 분마다)하는 최적화를 구현했습니다. xsltc.exe를 사용하여 XSLT를 DLL로 미리 컴파일하여 성능을 향상시키는 방법을 모색 중입니다. 이것은 XslCompiledTransform이 생성하는 모든 동적 메서드 호출을 제거하기로되어 있습니다.

그래서 별도의 서버에서 XSLT를 파일에 쓰고 xsltc.exe로 실행합니다. 약 20 분이 걸리지 만 괜찮습니다. 그런 다음 각 웹 서버에 DLL을 놓습니다. 이제는 필요할 때마다 웹 서버에 DLL을 동적으로로드 할 수있게되었습니다.

byte[] bytes = File.ReadAllBytes(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "XsltDlls\\" + fileName + ".dll")); 
Assembly assembly = Assembly.Load(bytes); 
Type type = assembly.GetType(fileName); 
XslCompiledTransform compiledTransform = new XslCompiledTransform(); 
compiledTransform.Load(type); 

내가 디렉토리 및/또는 ngen.exe를 그들에 DLL을 REBASE.EXE 샤 우드 : 여기 XslCompiledTransform에 어셈블리를로드하는 데 사용하고 코드인가? ReBase는 약 5 분이 걸리고/대기열과 함께 NGEN.exe는 CPU가 심하게 눌리는 동안 약 10 분이 걸릴 것입니다 - 웹 서버의 트래픽 처리 기능에 영향을 미칠 가능성이 있습니다. 어셈블리에서 바이트를 읽음으로써 어셈블리를로드하는 방법을 감안할 때 네이티브 NGEN 이미지가 참조되거나 JIT가 계속 실행됩니까?

이 모든 것에 대한 통찰력은 대단히 감사하겠습니다!

malcolm

답변

0

와우!

Assembly.Load(string) 네이티브 이미지를로드 할 수 있습니다. 그러나, 바이트 배열을 사용하는 과부하가 그것을 사용하지 않을 수도 있습니다 용의자. 나는 그것에 대한 참고 문헌을 찾을 수 없지만 아마도 시험 프로젝트에서 Assembly Binding Log Viewer을 사용하는 일부 실험은 어느 쪽이든 증명할 수 있습니다.

또한 네이티브 이미지를 사용하려면 어셈블리의 이름도 정확하게 지정해야합니다.

리베이스의 경우 this blog은 Vista 세대 OS 이상에서는 필요하지 않습니다.

관련 문제