2

高级性能问题在这里。这是我的场景:

我有一个包含数千个 XSLT 文档的数据库。一个用于网站的每个页面,因此这些将 XML 转换为 HTML。ASP.NET Web 服务器(场)从数据库加载 XSLT 文档,并使用它们为每个 Web 请求呈现 HTML。

我已经实现了使用 XslCompiledTransform 的优化并在数据库刷新之间缓存它(每 30 分钟)。我希望通过使用 xsltc.exe 将 XSLT 预编译为 DLL 来进一步提高性能。这应该消除 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 分钟,而带有 /queue 的 NGEN.exe 大约需要 10 分钟,在此期间 CPU 会受到重击 - 可能会影响网络服务器的流量服务功能。考虑到我如何通过从程序集中读取字节来加载程序集,是否会引用本机 NGEN 图像,或者 JIT 是否会启动?

对此的任何/所有见解将不胜感激!

马尔科姆

4

1 回答 1

0

哇!

Assembly.Load(string) 确实允许加载本机图像。但是,我怀疑采用字节数组的重载可能不会使用它。我找不到这方面的参考,但也许在测试项目中使用Assembly Binding Log Viewer的一些实验可能会证明这两种方式。

您还必须确保为要使用的本机映像强烈命名您的程序集。

至于变基,这个博客建议在 Vista 一代操作系统或更高版本上不需要它。

于 2012-04-11T03:03:04.177 回答