[英]Best/Fastest way to find values of a element in a xml file
我的程序基本上做的是它搜索 xml 並返回那些在元素中具有特定值的文件名。
我想我必須先向您展示我的 xml,然后才能繼續:
<DocumentElement>
<Protocol>
<DateTime>10.03.2003</DateTime>
<Item>Date</Item>
<Value />
</Protocol>
<Protocol>
<DateTime>05.11.2020</DateTime>
<Item>Status</Item>
<Value>Ok</Value>
</Protocol>
</DocumentElement>
我有幾千個 xml 文件,它們具有這種精確的布局。 用戶可以使用以下方法獲取所有文件的列表:
public List<string> GetFiles(string itemValue, string element, string value)
{
return compatibleFiles.Where(path => XmlHasValue(path, itemValue, element, value)).ToList();
}
並且此方法返回 xml 是否具有所需值:
private bool XmlHasValue(string filePath, string itemValue, string element, string value)
{
try
{
string foundValue = XDocument.Load(filePath)
.Descendants()
.Where(el => el.Name == "Item" && el.Value == itemValue)
.First()
.Parent
.Descendants()
.Where(des => des.Name == element && des.Value == value)
.First()
.Value;
return foundValue == value;
}
catch (Exception)
{
return false;
}
}
compatibleFiles
是一個列表,其中包含具有正確布局/格式(上面的 xml 代碼)的 xml 文件的所有路徑。 用戶向GetFiles
方法提供以下內容:
itemValue
-> 'Item' 元素應該具有的值,例如“狀態”element
-> 他想要檢查的元素的名稱(在同一個“協議”元素中),fE“值”或“日期”value
-> element
元素的值,在我們的示例中為“Ok” 問題是,這些方法需要很長時間才能完成,而且我幾乎可以肯定有更好更快的方法來做我想做的事。 我不知道GetFiles
可以更快,但XmlHasValue
肯定可以。 以下是一些測試結果:
你們知道有什么更快的方法嗎? 這真的很有幫助。
更新
原來這一切都只是因為 IO 線程。 如果你有同樣的問題並認為你的代碼很糟糕,你應該首先檢查它是否只是一個使用所有 CPU 能力的線程。
正如@Sinatr 所提到的。 在調查性能時,分析應該始終是第一步。
關於什么需要時間的合理猜測是
可以通過獲得更快的磁盤或在 RAM 中緩存結果來改進 IO。 如果進行多次搜索,后者可能會大大提高性能,但會引入緩存無效等問題。
根據“ What is the best way to parse (big) XML in C# Code ”,XmlReader 是解析 xml 的最快方法。 這個博客建議 XmlReader 大約快 2.5 倍。
如果您有多個文件,您也可以嘗試並行處理多個文件。 請記住,IO 主要是串行的,因此除非您的 SSD 可以比文件處理速度更快地傳輸數據,否則您可能一無所獲。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.