2010-11-19 6 views
2

Erweiterte Leistungsfrage hier. Hier ist mein Szenario:Vorkompilierte XSLT, ReBase und NGEN

Ich habe eine Datenbank, die Tausende von XSLT-Dokumenten enthält. Eine für jede Seite einer Website, so dass diese XML in HTML übersetzen. Ein ASP.NET-Webserver (Farm) lädt die XSLT-Dokumente aus der Datenbank und verwendet sie zum Rendern von HTML für jede Webanforderung.

Ich habe die Optimierung der Verwendung von XslCompiledTransform und Caching zwischen Datenbankaktualisierungen (alle 30 Minuten) implementiert. Ich freue mich, die Leistung weiter zu verbessern, indem ich die XSLT mit xsltc.exe zu DLLs vorkompiliere. Dies soll alle dynamischen Methodenaufrufe eliminieren, die XslCompiledTransform erstellt.

Also habe ich einen separaten Server die XSLTs in Dateien schreiben und durch sie mit xsltc.exe laufen. Dauert etwa 20 Minuten, aber das ist in Ordnung. Ich lasse dann die DLLs auf jeden Webserver fallen. Jetzt kann ich den Webserver dynamisch die DLLs auf einer bedarfsabhängigen Basis laden lassen. Hier ist der Code, den ich die Baugruppe in XslCompiledTransform laden bin mit:

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

Shoud I Rebase.exe die DLLs im Verzeichnis und/oder Ngen.exe sie? ReBase dauert ungefähr 5 Minuten und NGEN.exe mit/queue dauert ungefähr 10 Minuten, während denen die CPU schwer getroffen wird - was wahrscheinlich Auswirkungen auf die Traffic-Serving-Funktion des Webservers hat. Wenn ich bedenke, wie ich die Assembly lese, indem ich Bytes aus der Assembly lese, wird das native NGEN-Bild überhaupt referenziert oder wird das JIT trotzdem hochfeuern?

Alle/alle Einblicke in dies wird sehr geschätzt werden!

malcolm

Antwort

0

Wow!

Assembly.Load(string)ermöglicht ermöglichen native Bilder geladen werden. Ich vermute jedoch, dass die Überladung, die ein Byte-Array benötigt, es möglicherweise nicht verwendet. Ich kann keine Referenz dafür finden, aber vielleicht einige Experimente mit der Assembly Binding Log Viewer auf einem Test-Projekt könnten beide Wege beweisen.

Sie müssen auch sicherstellen, dass Ihre Assemblies für das native Bild, das verwendet werden soll, stark benannt werden.

Wie für die Umbasierung schlägt this blog vor, dass es auf Betriebssystemen der Vista-Generation oder später nicht erforderlich ist.