2011-05-02 58 views
1

我有一个用于转换XML的简单代码,但它非常耗时(我不得不多次重复)。有没有人有建议如何优化此代码?谢谢。Java:需要帮助优化代码的一部分

编辑:这是一个新版本的代码。我不幸重新使用Transformer,因为XSLTRule是在大多数情况下不同。我现在正在重复使用TransformerFactory。我之前没有阅读文件,所以我不能使用StreamSource。最大的时间花在初始化Transformer上。

private static TransformerFactory tFactory = TransformerFactory.newInstance(); 

public static String transform(String XML, String XSLTRule) throws TransformerException { 

    Source xmlInput = new StreamSource(new StringReader(XML)); 
    Source xslInput = new StreamSource(new StringReader(XSLTRule)); 

    Transformer transformer = tFactory.newTransformer(xslInput); 

    StringWriter resultWriter = new StringWriter(); 
    Result result = new StreamResult(resultWriter); 
    transformer.transform(xmlInput, result); 
    return resultWriter.toString(); 
} 
+3

每次都有不同的XSL文件?如果没有,缓存变压器。另外,这个代码本身是否缓慢?你看到什么表现? – 2011-05-02 13:52:14

+0

每次它是一个不同的XML,但XSLT重复自己(虽然有很多)。我正在使用一个分析器,它说这一堆时间花在了这个方法上。 – Ivan 2011-05-02 14:01:10

+0

*此方法中的*在哪里?编译XSLT通常很慢,但如果这不是花时间的话......查看http://opensymphony.com/的OSCore,因为它有一些优化的XML实用程序,如果可以的话,它将缓存变换器。 – 2011-05-02 14:08:36

回答

3

你应该做的第一件事就是跳过XML字符串的不必要的转换为字节(尤其是硬编码,可能不正确的编码)。您可以使用StringReader并将其传递给StreamSource构造函数。结果相同:使用StringWriter并避免转换。

当然,如果您在首先将XML从文件(字节)转换为String后再调用该方法(同样可能存在错误编码),那么将StreamSource从直接文件。

+0

+1:不必要的格式转换会浪费很多时间。他们可以很容易地引入丑陋的错误。 – 2011-05-02 14:02:58

+0

请看看更新后的帖子。 – Ivan 2011-05-02 14:24:03

+0

@Ivan:你仍然在对结果流进行不必要的和可能破坏性的String - > byte - > String转换。是的,缓存变压器实例可能会有很大的改进,具体取决于同一个XSLT发生的频率。 – 2011-05-02 14:33:59

1

看起来像您将XSLT应用于XML文件。为了加快速度,您可以尝试编译XSLT,例如XSLTC

+0

尽管几乎每次调用都得到不同的XSLT? – Ivan 2011-05-02 14:01:38

0

我只能想到一对夫妇的小事情的:

  • 的TransformerFactory中可以重复使用。

  • 如果线程受限,并且XSL输入每次都相同,Transformer可以重用。

  • 如果您可以合理准确地估计输出大小,则可以使用初始大小提示创建ByteArrayOutputStream。

0

正如Michaels的回答所述,你可以通过将输入或输出xml完全加载到内存中并使自己的api流为基础来加快速度。