1

我一直在对供应商编写的生产 Web 应用程序 (.NET 4) 进行故障排除。

在过去的几周里,我们在这个网站上遇到了一些速度问题。

最初,重点一直放在数据库方面。现在我觉得排除这部分方程式很舒服......我今天花了很多时间调试 Web 应用程序,看看实际的速度问题来自哪里。

我发现,在 Web 应用程序的这个特定部分中,它会打开一个新的 Internet Explorer 窗口以显示从数据库返回的大量 XML 数据。

在查看了代码并使用调试器试图弄清楚发生了什么之后......这是我发现的:

当这个特定页面上的代码完成填充所有内容时,iexplore 进程拥有一个 692,044K 的私有工作集。这似乎是 msxml3.dll 的许多进程中 activex 控件的结果。

经过一番研究,我发现了这篇微软文章: http: //support.microsoft.com/ ?scid=kb%3Ben-us%3B815112&x=15&y=14

它指出:“Microsoft 不支持在 .NET 应用程序中使用 MSXML(Microsoft 基于 COM 的 XML 解析器)。MSXML 使用与 .NET Framework 不兼容的线程模型和垃圾收集机制。在 .NET 应用程序中使用 MSXML通过 COM 互操作性可能会导致难以调试的意外问题。Microsoft 不建议或不支持在 .NET 代码中直接实例化和使用 MSXML 对象,也不建议或支持跨互操作边界编组 MSXML 接口指针。

这是创建 activex 对象的代码的一部分:

                var oTmp = new ActiveXObject("MSXML2.Domdocument");
                oTmp.loadXML('<plan_data>' + returnValue + '</plan_data>');

随着内存的增加,进程资源管理器会拾取几个加载到 iexplore 进程中的 MSXML3.dll。即使在关闭此特定窗口后,它似乎也无法正确清理自身,因为它仍然使用大约 220,000 K 的内存。(可能是由于上面列出的垃圾收集机制)。

所以,我的问题是......这里有熟悉这个的人可以就这是否看起来像是 Web 应用程序的一个设计不佳的部分提供一些建议吗?

我希望能够将此信息带给开发人员并让他们查看,但我希望有人可以先给我一些专业建议。

谢谢你。

4

2 回答 2

1

每当您将大型 XML 结构处理到内存中然后对其进行操作时,这都是一个相当占用内存的操作。如果您确实需要将整个文档保存在内存中,请考虑使用命名空间中的 XDocument 替换您当前的代码System.Xml.Linq

如果您只需要通过 XML 文档流式传输一次,在读取每个节点时执行操作,请查看大型 XML 文档的流式传输转换

编辑

@Yahia 提出了一个我错过的好观点……这段代码似乎是在客户端执行的。是这样吗?如果是这样,为什么不让 IE(您的 ActiveX 只能在 IE 中运行,其他一些带有插件的浏览器;-)显示生成的 XML。如果 XML 不是太大,它会做得很好(尽管超过几 MB 需要很长时间来进行初始处理)。

于 2012-06-07T02:17:22.423 回答
0

您显示的代码似乎是在浏览器内执行的 JavaScript 代码...在这方面,提到的知识库文章不适用于您的情况...说:加载“大量 XML”是糟糕的设计进入浏览器 - 正如您所发现的那样。

解决方案可能是使用基于服务器的分页机制和/或在 UI 中提供一些过滤机制,这样就永远不会出现完整的 XML 需要在浏览器中的情况......

于 2012-06-07T02:18:53.720 回答