Расширенный вопрос производительности здесь. Вот мой сценарий:
У меня есть база данных, содержащая тысячи документов XSLT. По одному на каждую страницу веб-сайта, чтобы они переводили XML в HTML. Веб-сервер ASP.NET (ферма) загружает документы XSLT из базы данных и использует их для визуализации HTML для каждого веб-запроса.
Я реализовал оптимизацию использования XslCompiledTransform и кэширования между обновлениями базы данных (каждые 30 минут). Я собираюсь еще больше повысить производительность, предварительно скомпилировав XSLT в библиотеки DLL с помощью xsltc.exe. Предполагается, что это устранит все вызовы динамических методов, которые создает XslCompiledTransform.
Итак, у меня есть отдельный сервер, записывающий XSLT в файлы и запускающий их с помощью xsltc.exe. Занимает около 20 минут, но это нормально. Затем я загружаю библиотеки DLL на каждый веб-сервер. Теперь я могу просто заставить веб-сервер динамически загружать библиотеки 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);
Должен ли я ReBase.exe библиотеки DLL в каталоге и/или NGEN.exe их? ReBase занимает около 5 минут, а NGEN.exe с /queue займет около 10 минут, в течение которых ЦП сильно страдает, что, вероятно, оказывает влияние на функцию обслуживания трафика веб-сервера. Учитывая, как я загружаю сборку, читая байты из сборки, будет ли вообще ссылаться на собственное изображение NGEN или JIT все равно запустится?
Любое/все понимание этого будет ОЧЕНЬ оценено!
Малькольм