ここで高度なパフォーマンスの質問。これが私のシナリオです:
何千ものXSLTドキュメントを含むデータベースがあります。Webサイトのページごとに1つあるため、これらはXMLをHTMLに変換します。ASP.NET Webサーバー(ファーム)は、データベースからXSLTドキュメントをロードし、それらを使用して各Web要求のHTMLをレンダリングします。
XslCompiledTransformを使用し、データベースの更新の合間に(30分ごとに)キャッシュするという最適化を実装しました。xsltc.exeを使用してXSLTをDLLにプリコンパイルすることにより、パフォーマンスをさらに向上させたいと考えています。これにより、XslCompiledTransformが作成するすべての動的メソッド呼び出しが排除されるはずです。
そのため、XSLTをファイルに書き込み、xsltc.exeを使用してそれらを実行する別のサーバーがあります。約20分かかりますが、大丈夫です。次に、DLLを各Webサーバーにドロップします。これで、必要に応じてWebサーバーにDLLを動的にロードさせることができます。アセンブリをXslCompiledTransformにロードするために使用しているコードは次のとおりです。
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);
ディレクトリ内のDLLをReBase.exeまたはNGEN.exeしますか?ReBaseには約5分かかり、/ queueを使用したNGEN.exeには約10分かかります。その間、CPUが激しく攻撃され、Webサーバーのトラフィックサービス機能に影響を与える可能性があります。アセンブリからバイトを読み取ることによってアセンブリをロードする方法を考えると、ネイティブNGENイメージも参照されますか、それともJITが起動しますか?
これに対するすべての/すべての洞察は大いに感謝されます!
マルコム