Java XSLT转换性能

Java XSLT转换性能,java,android,xml,xslt,Java,Android,Xml,Xslt,这是我的文件的链接 嗨 我正在将xml转换为html。我的xml文件大约10kb,xslt大约70kb,输出的html大约10kb Transformer xformer = StylesheetCache.newTransformer(templateFile); xformer.transform(new DOMSource(outlineDoc),new StreamResult(out)); 创建transformer大约需要10秒,这就是为什么我创建了缓存,如果它是缓存的,则将其降低

这是我的文件的链接

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

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

创建transformer大约需要10秒,这就是为什么我创建了缓存,如果它是缓存的,则将其降低到300毫秒。转换行需要3秒才能执行。现在是这么长。我在windows mobile上写过类似的转换,它的执行时间大约是您是否在每次转换中都遇到这样的延迟?我注意到,Android需要一段时间才能将第三方库加载到进程中。确切的时间取决于库的大小。例如,加载joda的时间大约需要3秒。

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

您的问题在于使用DOMSource,如果可能,请不要使用它。与使用流源或SAX源相比,Saxon的性能要差得多——这是因为它构建了自己的高度优化(用于xslt)树(“微型树”)。有一个解决此问题的方法,以及完整的解释:


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

您的问题在于使用DOMSource,如果可能的话,请不要使用它。与使用流源或SAX源相比,Saxon的性能要差得多——这是因为它构建了自己的高度优化(用于xslt)树(“微型树”)。有一个解决此问题的方法,以及完整的解释:


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

我发现了问题。。。我想我需要踢自己。我在家玩我的手机,所以我决定玩一下这个应用程序。突然间,init负载像1s,后续调用像500ms。所以在这一点上我被难住了。于是,我拿出笔记本电脑,把手机插进去调试,结果又是12秒。我就是那个该死的IDE。当我运行它通过ecclipse时,它会减慢到12秒


:-\

我发现了问题。。。我想我需要踢自己。我在家玩我的手机,所以我决定玩一下这个应用程序。突然间,init负载像1s,后续调用像500ms。所以在这一点上我被难住了。于是,我拿出笔记本电脑,把手机插进去调试,结果又是12秒。我就是那个该死的IDE。当我运行它通过ecclipse时,它会减慢到12秒



:-\

对于一个10k XML文件来说,这真是太多了。我的猜测是XSLT中有一些非常耗时的XPath查询。至于Saxon,我认为Michael Kay总是指出,如果您追求性能,应该使用Saxon的树表示,而不是DOM树作为输入。我不知道您是否已经有了一个DOM树并需要对其进行转换,或者您是否只构建了一个DOM来为XSLT提供输入,在后一种情况下,让Saxon通过提供StreamSource或SAXSource来选择它的树模型。至于改进XSLT代码,当然,如果您使用Saxon 9,那么请确保利用XSLT 2.0的功能,如用于每个组,并在可能的情况下使用键来提高性能。@Pintac:除了使用外部DOM API或XSLT处理器内置的树解析器之外,如果您没有提供样式表和输入示例,则无法判断这是否是因为转换模式不好,这会使您的问题更适合
xsltprocessor
标记。我添加了指向xslt和xml的链接。@Martin我从文件加载了一个DOM文档,然后进行了一些更改。对于10k xml文件来说,这是一个非常重要的问题。我的猜测是XSLT中有一些非常耗时的XPath查询。至于Saxon,我认为Michael Kay总是指出,如果您追求性能,应该使用Saxon的树表示,而不是DOM树作为输入。我不知道您是否已经有了一个DOM树并需要对其进行转换,或者您是否只构建了一个DOM来为XSLT提供输入,在后一种情况下,让Saxon通过提供StreamSource或SAXSource来选择它的树模型。至于改进XSLT代码,当然,如果您使用Saxon 9,那么请确保利用XSLT 2.0的功能,如用于每个组,并在可能的情况下使用键来提高性能。@Pintac:除了使用外部DOM API或XSLT处理器内置的树解析器之外,如果您没有提供样式表和输入示例,则无法判断这是否是因为转换模式不好,这使您的问题更适合
xsltprocessor
标记。我添加了指向xslt和xml的链接。@Martin我从文件加载了一个DOM文档,然后进行了一些更改。是的,在加载所有内容之后。在codeYes的转换行,在加载所有内容之后。在CodeHi的转换行,我在android中没有增强源代码。我将domsource更改为streamsource和saxsource,但处理时间仍然保持不变。好的,这是意外的。您确定您使用的是Saxon,而不是默认实现(Xalan)?对我来说,差异非常明显,当我进行更改时,时间减少了50%左右,但这是在常规JavaSE上,而不是在Android上。这听起来确实像是样式表本身的问题,而不是xslt processor.hi。Yep我使用SAXTransformerFactory.newinstance()。我怀疑这可能是xslt,但如果我在msxml上运行完全相同的xslt,xslt transforner是毫秒级的;创建新的转换器