【问题标题】:XSLT Transforming performanceXSLT 转换性能
【发布时间】:2010-09-15 14:03:56
【问题描述】:

这里是我的文件的链接XMLXSLTInclude XSLT

我正在将 xml 转换为 html。我的 xml 文件大约 10kb 大,我的 xslt 70kb 和输出 html 大约 10kb 大。

Transformer xformer = StylesheetCache.newTransformer(templateFile);
xformer.transform(new DOMSource(outlineDoc),new StreamResult(out));

创建转换器大约需要 10 秒来创建这就是为什么我创建了缓存,如果它被缓存则将其降低到 300 毫秒。转换线需要 3s 执行。现在这么长了。我在 windows mobile 上写过类似的转换,它的执行时间大约是

我将 TransformerFactory 更改为 Saxon,但结果大致相同。

谢谢

【问题讨论】:

  • 对于一个 10k 的 XML 文件来说,这已经够多了。我的猜测是您的 XSLT 中有一些非常耗时的 XPath 查询。
  • 对于 Saxon,我认为 Michael Kay 总是指出,如果您追求性能,您应该使用 Saxon 的树表示,而不是 DOM 树作为输入。我不知道您是否已经有一个 DOM 树并需要对其进行转换,或者您是否只构建了该 DOM 来为 XSLT 提供输入,在后一种情况下,让 Saxon 通过提供 StreamSource 或 SAXSource 来选择它的树模型。至于改进 XSLT 代码,当然,如果您使用 Saxon 9,那么请确保您利用了 XSLT 2.0 的功能,例如 for-each-group,并尽可能使用键来提高性能。
  • @Pintac:除了使用外部 DOM API 或 XSLT 处理器内置的树解析器外,如果您不提供样式表和输入示例,则无法判断这是否是因为不好转换模式,它使您的问题更适合xsltprocessor 标签。
  • 我添加了指向 xslt 和 xml 的链接。
  • @Martin 我有一个 DOM 文档,我从文件中加载,然后稍作更改。

标签: java android xml xslt


【解决方案1】:

您的问题在于使用 DOMSource,如果可能,请不要使用它。与使用流式源或 SAX 源相比,Saxon 的性能特别差——这是因为它构建了自己的高度优化(用于 xslt)树(“小树”)。这个问题有一个解决方法和完整的解释:http://dev.saxonica.com/blog/mike/2007/03/#000138

但即使您使用的是 Xalan(JDK 默认),使用原始输入而不构建中间 DOM 结构也是有意义的; XSLT 处理器可以自己构建最佳的内存表示,而且通常更有效。

【讨论】:

  • 嗨,我在 android 中没有 AugmentedSource。我将 domsource 更改为 streamsource 和 saxsource,但处理时间仍然保持不变。
  • 好吧,这出乎意料。您确定您使用的是 Saxon,而不是默认实现 (Xalan)?对我来说差异非常明显,当我进行更改时,时间减少了 50% 左右,但这是在常规 Java SE 而不是 Android 上。这听起来确实是样式表本身的问题,而不是 xslt 处理器。
  • 嗨。是的,我使用 SAXTransformerFactory.newinstance()。我怀疑它是 xslt 但如果我在 msxml 上运行完全相同的 xslt xslt 转换器是毫秒
  • 是的;创建新的变压器工厂很浪费,但这只会增加一两毫秒 - 你的时间听起来非常糟糕,这就是为什么我认为它的样式表做的很慢(抱歉还没有查看链接到文件所以不知道是什么)
【解决方案2】:

我发现了问题......我想我需要踢自己。我在家里玩手机,所以我决定稍微玩一下这个应用程序。突然之间,初始化负载就像 1 秒,随后的调用像 500 毫秒。所以在这一点上我被难住了。我于是拿出我的笔记本电脑,插上我的手机并调试,突然又是 12 秒。我是该死的 IDE。一旦我通过 ecclipse 运行它,它就会减慢到 12 秒。

:-\

【讨论】:

    【解决方案3】:

    您是否在每次转换时都遇到这种延迟?我注意到,当 Android 需要一段时间才能将第三方库加载到进程中时。确切的时间取决于图书馆的大小。例如加载 joda-time 大约需要 3 秒。

    【讨论】:

    • 是的,一切都加载完毕后。在代码的变换行
    猜你喜欢
    • 1970-01-01
    • 2021-05-02
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 2013-08-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多