【问题标题】:XML Parsing too slow!XML解析太慢了!
【发布时间】:2011-09-06 11:37:06
【问题描述】:

我编写了一个 java 应用程序来使用 XML 与 Web 应用程序进行通信。部署后发现解析web应用生成的XML耗时太长。

例如登录大约需要2分钟;登录信息包含在 url 中。 Web 应用程序执行其处理并使用返回的 XML 响应 Java 应用程序是否登录成功。

我使用标准的 java DOM 解析。

有什么方法可以优化这个过程,让活动更快?

【问题讨论】:

  • 首先,请选择一个有效的问题标题。
  • 在苏维埃俄罗斯,问题问你!
  • 这里的关键是你需要分析你的代码。代码的某些部分存在瓶颈。一旦你确定了那些,你可能已经几乎可以进行优化了。诀窍是知道在哪里进行优化。
  • @Bozho 更新了帖子。 @yomexzo 粘贴代码。很可能,您的 webapp 响应时间太长,或者您有某种网络延迟。使用大写 I,并尽量避免不必要地使用省略号 (...)。
  • 你的意思是你不明白我的问题吗?

标签: java xml parsing optimization xml-parsing


【解决方案1】:

我遇到了同样的问题,并设法通过关闭 DocumentBuilder 默认执行的所有验证来加速解析器:

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

factory.setNamespaceAware(false);
factory.setValidating(false);
factory.setFeature("http://xml.org/sax/features/namespaces", false);
factory.setFeature("http://xml.org/sax/features/validation", false);
factory.setFeature("http://apache.org/xml/features/nonvalidating/load-dtd-grammar", false);
factory.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);

// then take a builder via `factory.newDocumentBuilder()` and parse doc with that builder

【讨论】:

  • 谢谢,正是我刚刚遇到的问题!你节省了我的时间:)
  • 上面的前4个调用是多余的:前2个默认为false,后2个由前2个定义
  • 好吧,我的问题是:我的代码需要 40 秒才能获得 DocumentBuilderFactory.newInstance() 的新实例,如何关闭验证将有助于加快代码速度!!
【解决方案2】:

使用标准 XML 解析器应该在大约一毫秒内解析一条短消息。使用自定义解析器,您可以将其缩短到大约 20 微秒。任何比这更长的时间都不在 XML 解析中

【讨论】:

  • 刚刚计算出与服务器执行事务大约需要 5 秒......大约发生了 5 次这样的事务,使应用程序启动缓慢......这个时间太多......我该怎么办?????我已经尝试使用 SwingUtilities.invokeLater() 并尝试在登录事务之后的后续事务上使用线程,以便应用程序 JFrame 至少显示....不幸的是,JFrame 挂起
  • invokeLater 仍然使用 GUI 线程,因此它仍然会锁定 GUI。我建议你使用另一个线程来触发后台任务。真正的问题似乎是你的服务器太慢了。 100 毫秒应该足够长来完成一项简单的任务。您需要调查您的服务器在做什么,看看是否可以修复它。
  • 您应该能够获得线程转储并查看您的 GUI 线程正在等待什么。
【解决方案3】:

parse 方法一直在等待来自其他应用程序的输入。你需要把两者分开,这样你才能看到发生了什么。将来自其他应用程序的 XML 读取到 ByteArrayOutputStream 中,然后在完成后,将输出流复制到输入流(您可以为此使用 commons-io)并将其提供给解析器。然后看看真正花费的时间。

您可以优化的一件事是您的登录过程。您可以使用 LDAP 服务器进行身份验证,LDAP 针对读取进行了优化,您可以使用 JNDI 访问它。

【讨论】:

  • 刚刚计算出与服务器执行事务大约需要 5 秒......大约发生了 5 次这样的事务,使应用程序启动缓慢......这个时间太多......我该怎么办?????我已经尝试使用 SwingUtilities.invokeLater() 并尝试在登录事务之后的后续事务上使用线程,以便应用程序 JFrame 至少显示....不幸的是,JFrame 挂起
  • @yomexzo,你知道吗?问号越多,他们得到的答案就越好!
【解决方案4】:

@Nathan 说了什么,另外我建议在花费大量时间的同时做一些 random pausing。 我过去遇到过这种情况,发现花时间的不是解析,而是解析时数据结构的创建和操作。 您可能会看到一些不同的东西,但很可能是一个惊喜。

【讨论】:

  • 刚刚计算出与服务器执行事务大约需要 5 秒......大约发生了 5 次这样的事务,使应用程序启动缓慢......这个时间太多......我该怎么办?????我已经尝试使用 SwingUtilities.invokeLater() 并尝试在登录事务之后的后续事务上使用线程,以便应用程序 JFrame 至少显示....不幸的是,JFrame 挂起
  • @yomexzo:当你拍摄堆栈照片时,你看到了什么?显示等待发送/接收完成的样本百分比是多少?什么百分比显示操作数据结构(创建、销毁、初始化、复制、通知、注册)?他们中的任何一个人是否在做你没有想到的其他事情——比如伐木?他们会告诉您您可能没有想到的实际花费的时间。然后很清楚您的选择是什么以及它们可以为您节省多少。
猜你喜欢
  • 2015-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-23
  • 1970-01-01
  • 2018-11-19
  • 1970-01-01
相关资源
最近更新 更多