回覆列表
  • 1 # 滴逃逃

    LINQ to XML的效能測試

    很多同學已經做過效能測試了,我就不重複了,如下連結:

    XML資料讀取方式效能比較(一)

    XML資料讀取方式效能比較(二)

    從上面的結果我們不能看出,Linq to Xml的效能明顯是優於XmlDocument的。我這人比較喜歡追根溯源,如果單從這個,總是有人會產生各種悖論,比如:

    2個40多秒的都有這Add

    其實他的問題都沒到點上,這裡根本就不是Add的問題,Linq的ToList()方法肯定也幹了這事,如果懷疑這裡,完全可以自己去寫個測試。所以我覺得有必要說下為什麼LINQ to XML效能優於XmlDocument的緣由了。

    為什麼LINQ to XML效能優於XmlDocument?

    首先,我們需要明白的一點是:

    LINQ to XML有一位優秀的母親——XmlReader。

    LINQ to XML 在 XmlReader 基礎之上實現的,也就是LINQ to XML源於XmlReader,高於XmlReader。

    遺傳基因很重要!

    XmlReader 是一種快速的只進非快取分析器。他丫的對XML 資料流的訪問是隻讀的。

    其次,LINQ to XML有一位出色的父親——Linq。

    LINQ to XML 的一個最重要的效能優勢(與 XmlDocument 相比)為:LINQ to XML 中的查詢是靜態編譯的,而 XPath 查詢則必須在執行時進行解釋。

    這個因素是效能中至關重要的,所謂”子不教,父之過“!

    也就是說,LINQ to XML的查詢被編譯成靜態連結的方法呼叫,這樣的效能提升是巨大的。反觀XmlDocument,它在每次呼叫 SelectNodes 方法時,都必須在內部執行以下操作:

    分析包含 XPath 表示式的字串,並將字串劃分成多個標記。

    驗證這些標記以確保 XPath 表示式有效。

    將表示式轉換為內部表示式樹。

    迴圈訪問節點,為基於表示式計算的結果集選擇適當的節點。

    與相應的 LINQ to XML 查詢完成的工作相比,這需要執行非常多的工作。

    除此之外,LINQ to XML還繼承了父親的延遲執行的優良傳統,也能夠提高效能。

    父親這麼優秀,XmlDocument自然無法相比了。

    所以,富二代和官二代起點就比你高,你如果不比他們多付出N倍的努力,你甚至連他們的起點都無法到達。

    科普下延遲執行的知識:

    延遲執行意味著表示式的計算延遲,直到真正需要它的實現值為止。 當必須操作大型資料集合,特別是在包含一系列連結的查詢或操作的程式中操作時,延遲執行可以大大改善效能。 在最佳情況下,延遲執行只允許對源集合的單個迴圈訪問。

    LINQ 技術廣泛應用了延遲執行,包括在核心 System.Linq 類的成員和不同 LINQ 名稱空間中的擴充套件方法(如 System.Xml.Linq.Extensions)中使用。

  • 中秋節和大豐收的關聯?
  • 年糕生產裝置的生產工藝是如何的呢?