-1

我的程序基本上做的是它搜索 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' 元素应该具有的值,例如“Status”
  • element-> 他要检查的元素的名称(在同一个“协议”元素中),fE“值”或“日期”
  • value->element元素的值,在我们的示例中为“Ok”

问题是,这些方法需要很长时间才能完成,而且我几乎可以肯定有更好更快的方法来做我想做的事。我不知道是否GetFiles可以更快,但XmlHasValue肯定可以。以下是一些测试结果:

在此处输入图像描述

你们知道有什么更快的方法吗?这真的很有帮助。

更新

原来这一切都只是因为 IO 线程。如果你有同样的问题并且认为你的代码很糟糕,你应该首先检查它是否只是一个使用所有 cpu 能力的线程。

4

1 回答 1

1

正如@Sinatr 提到的。在调查性能时,分析应该始终是第一步。

一个合理的猜测是什么需要时间

  1. IO
  2. 解析

可以通过获得更快的磁盘或在 RAM 中缓存结果来改进 IO。如果进行多次搜索,后者可能会大大提高性能,但会引入缓存失效等问题。

根据“在 C# 代码中解析(大)XML 的最佳方法是什么”,XmlReader 是解析 xml 的最快方法。这个博客建议 XmlReader 大约快 2.5 倍

如果您有多个文件,您也可以尝试并行处理多个文件。请记住,IO 主要是串行的,因此除非您拥有能够比文件处理速度更快地传输数据的 SSD,否则您可能不会获得任何收益。

于 2020-11-05T15:48:42.870 回答