2011-05-02 31 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流爲基礎來加快速度。