预编译的 XSLT、ReBase 和 NGEN

发布于 2024-10-03 09:21:02 字数 1001 浏览 5 评论 0 原文

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

我有一个包含数千个 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 是否会启动?

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

马尔科姆

Advanced performance question here. Here's my scenario:

I have a database that contains thousands of XSLT documents. One for each page of a website so these translate XML into HTML. An ASP.NET web server (farm) loads the XSLT documents from the database and uses them to render HTML for each web request.

I've implemented the optimization of using XslCompiledTransform and caching it between database refreshes (every 30 minutes). I'm looking to notch performance up further by pre-compiling the XSLT to DLLs with xsltc.exe. This is supposed to eliminate all the Dynamic Method Invocations that XslCompiledTransform creates.

So, I have a separate server writing the XSLTs to files and running through them with xsltc.exe. Takes about 20 minutes but that's OK. I then drop the DLLs onto each webserver. Now I can just have the webserver dynamically load the DLLs on an as-needed basis. Here's the code I'm using to load the assembly into 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);

Shoud I ReBase.exe the DLLs in the directory and/or NGEN.exe them? ReBase takes about 5 minutes and NGEN.exe with /queue will take about 10 minutes during which CPU is hit hard - likely causing an impact to the traffic serving function of the webserver. Given how I'm loading the assembly by reading bytes from the assembly will the native NGEN image even be referenced or will the JIT fire up anyway?

Any/all insight into this will be MUCHLY appreciated!

malcolm

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

梦里泪两行 2024-10-10 09:21:02

哇!

Assembly.Load(string) 允许要加载的本机图像。但是,我怀疑采用字节数组的重载可能不会使用它。我找不到这方面的参考,但也许使用 程序集绑定日志进行一些实验测试项目上的 Viewer 可能会证明这两种情况。

您还必须确保您的程序集针对要使用的本机映像进行强命名。

至于变基,此博客表明 Vista 一代操作系统或更高版本不需要它。

Wow!

Assembly.Load(string) does permit native images to be loaded. However, I suspect that the overload that takes a byte array may not use it. I can't find a reference for that, but perhaps some experimentation using the Assembly Binding Log Viewer on a test project might prove either way.

You also have to make sure that your assemblies are strongly named for the native image to be used.

As for rebasing, this blog suggests that it's not required on Vista generation OSes or later.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文