2

ここで高度なパフォーマンスの質問。これが私のシナリオです:

何千もの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が起動しますか?

これに対するすべての/すべての洞察は大いに感謝されます!

マルコム

4

1 に答える 1

0

わお!

Assembly.Load(string) 、ネイティブイメージのロードを許可します。ただし、バイト配列を使用するオーバーロードはそれを使用しない可能性があると思います。そのためのリファレンスは見つかりませんが、テストプロジェクトでAssembly BindingLogViewerを使用した実験がどちらの方法でも証明される可能性があります。

また、使用するネイティブイメージに対してアセンブリに厳密な名前が付けられていることを確認する必要があります。

リベースに関しては、このブログは、Vista世代以降のOSでは必要ないことを示唆しています。

于 2012-04-11T03:03:04.177 に答える