2011-03-30 41 views
1

我有一個非常小的函數,但調用了很多次,我的分析器將其標記爲耗時。它是以下一個:C#通過預加載來優化函數

private static XmlElement SerializeElement(XmlDocument doc, String nodeName, String nodeValue) 
{ 
    XmlElement newElement = doc.CreateElement(nodeName); 
    newElement.InnerXml = nodeValue; 
    return newElement; 
} 

第二行(它進入nodeValue)是需要一些時間。

事情是,我不認爲它可以優化代碼明智,但我仍然對該部分的建議持開放態度。但是,我記得在某處閱讀或聽到說你可以告訴編譯器標記這個函數,這樣它在程序啓動時加載到內存中並且運行得更快。

這只是我的想象或這樣的旗幟存在嗎?

謝謝,

FB。

回答

4

有些方法可以讓它早早地被搞砸,但這不是在這裏傷害你的那一刻。

如果您遇到與Xml序列化相關的性能問題,可以考慮使用XmlWriter而不是XmlDocument,這非常重要。此外,大多數自動序列化系統(包括內置的.NET XML序列化)將動態地發出代碼以執行序列化,然後可以對其進行緩存和重新使用。但是,大多數情況下避免了反射的開銷,而不是實際的XML編寫/解析的開銷。

+0

是的,但我正在序列化4Mo的數據(生成的XML文件的大小),是不是XmlDocument在這種情況下應該更好? – 2011-03-30 19:21:22

+0

XmlDocument提供了一種緩存模型,可以在數據寫入磁盤之前更輕鬆地處理數據結構。如果你需要這種靈活性,XmlDocument更容易處理。但是,如果您已經提前知道結構並且不需要訪問緩存的分層模型,則XmlWriter的性能會更好。這對於大文件尤其如此,因爲它不會緩存除寫入時緩衝到底層流的信息以外的任何信息。 – 2011-03-30 19:24:31

+0

好吧,我會試試,謝謝。 一個側面說明,沒有人真正回答我的原始問題,只是我的想象? – 2011-03-30 19:26:20

3

我不認爲這可以解決使用任何形式的捕捉或內聯。我相信你的想象力。主要是關於表現的部分。你的想法是預先編寫你的代碼。當你的函數被第一次調用時,這個技巧將消除JITer的等待時間。但這只是第一次調用這個函數。它對隨後的調用沒有性能影響。

documentation所述,設置InnterXml將設置的字符串解析爲XML。解析XML字符串可能是昂貴的操作,特別是如果以字符串格式設置xml很複雜。並且文檔甚至包含以下行:

InnerXml不是修改DOM的有效方法。更換複雜節點時可能會出現性能問題。構造節點並使用諸如InsertBefore,InsertAfter,AppendChild和RemoveChild等方法來修改Xml文檔更有效。

因此,如果您是以這種方式創建複雜的XML結構,那麼明智的做法是手動完成。

+2

作爲此答案的必然結果,如果您沒有真正設置內部XML內容,請改用Value。 – 2011-03-30 19:21:45

+0

使用value而不是innerXML使我節省了1%的執行時間。但它完全一樣的東西。我希望沒有錯誤,我不能看到一個。 – 2011-03-30 19:25:59