【问题标题】:Java: need help with optimizing a part of codeJava:在优化部分代码方面需要帮助
【发布时间】:2011-05-02 13:51:02
【问题描述】:

我有一个转换 XML 的简单代码,但它非常耗时(我必须重复很多次)。有没有人建议如何优化此代码?谢谢。

编辑:这是代码的新版本。很遗憾,我不能重用 Transformer,因为在大多数情况下 XSLTRule 是不同的。我现在重用TransformerFactory。在此之前我没有从文件中读取,所以我不能使用StreamSourceTransformer 的初始化花费的时间最多。

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();
}

【问题讨论】:

  • 每次都有不同的 XSL 文件?如果没有,缓存转换器。另外,这段代码本身很慢吗?你看到了什么表现?
  • 每次都是不同的 XML,但 XSLT 会重复自己(尽管有很多)。我正在使用分析器,它说在这种方法上花费了很多时间。
  • 在哪里这个方法?编译 XSLT 通常很慢,但如果这不是花费时间的地方……请查看opensymphony.com/'s OSCore,因为它有一些优化的 XML 实用程序,如果可以的话,可以缓存转换器。
  • @Joseph 在Transformer 的初始化上花费的时间最多。我会考虑如何做缓存。谢谢。

标签: java optimization transform


【解决方案1】:

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

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

【讨论】:

  • +1:不必要的格式转换会浪费大量时间。而且它们很容易引入丑陋的错误。
  • @Ivan:您仍在对结果流进行不必要且可能具有破坏性的 String -> byte -> String 转换。是的,缓存转换器实例可以带来很大的改进,具体取决于相同 XSLT 发生的频率。
【解决方案2】:

您似乎将 XSLT 应用于 XML 文件。为了加快速度,您可以尝试编译 XSLT,例如使用 XSLTC

【讨论】:

  • 虽然我几乎每次调用都得到不同的 XSLT?
【解决方案3】:

我只能想到几件小事:

  • TransformerFactory 可以重复使用。

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

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

【讨论】:

    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-08-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-18
      相关资源
      最近更新 更多