【问题标题】:XDocument Attribute Performance ConcernsXDocument 属性性能问题
【发布时间】:2011-02-02 02:08:12
【问题描述】:

我有一个加载的 XDocument,我需要有效地获取等于某个值且属于某个元素的所有属性。我现在的

IEnumerable<XElement> vm;
if (!cacher2.TryGetValue(name,out vm)) { 
    vm = project.Descendants(XName.Get(name));
    cacher2.Add(name, vm);
}


XElement[] abdl = (vm.Where(a =>  a.Attribute(attribute).Value == ab)).ToArray();

cacher2 是 Dictionary&lt;string,IEnumerable&lt;XElement&gt;&gt; ToArray 是这样我现在可以评估表达式。我认为这不会引起任何真正的速度问题。问题在于 Where 本身。我正在搜索从 1k 到 10k 的项目。

【问题讨论】:

  • 您是否真的看到了任何性能损失,或者您是否担心如果您的搜索集太大,可能会有一个?
  • 我看到它的最后一行代码很大。最上面的几行只是为了表明我正在尽可能多地缓存。有更多代码可以缓存 abdl 的结果。我需要知道我需要将此 XDocument 转换为什么,或者使用什么特殊方法来允许我需要做的事情......但速度更快。 :-)

标签: c# .net performance caching linq-to-xml


【解决方案1】:

您需要拨打.ToArray吗?我不清楚为什么您不能循环添加到字典(或致电.ToDictionary)。然而;你有简介吗?如果此处存在瓶颈,您可以尝试退回到XmlReader 并将其视为消防软管:

        while (reader.Read())
        {
            if (reader.NodeType == XmlNodeType.Element
                && reader.GetAttribute("attribName") == attribValue)
            {
                /* do something interesting for fun and profit */
            }
        }

不过,使用您现有的代码,我很想实现它:

vm.Where(a =>  (string)a.Attribute(attribute) == ab)

不同之处在于,通过不调用.Value,即使未设置属性,它也应该可以工作。当然,如果您要求始终设置此属性,那么在这种情况下可能会出现异常。

【讨论】:

  • 你知道从我的 vm = project.Descendants(XName.Get(name)); 转换的任何快速方法吗?对 XmlReader 的声明?我会试试看是否有变化。顺便说一下,那一行代码是我的应用程序的瓶颈。我理解重新评估我的需求,但现在这是我要走的路。
  • while(reader.Read()) 将是它的核心。您可以使用ReadSubtree 让子阅读器读取节点,所以也许只使用XElement.Load(reader.ReadSubtree()) 来获取您关心的节点?
  • 我正在使用 someXElement.CreateReader();每次我需要运行这个“查询”时创建一个新的 xmlreader。您是否建议我缓存阅读器并在完成后以某种方式将其设置回开头?还是应该在需要时创建它们?
  • @Dested - 我说的是首先没有XElement 的数据量。如果您已经将 xml 解析为 DOM,那么考虑这些为时已晚。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-21
  • 2023-03-29
  • 2022-06-28
  • 2012-04-23
  • 1970-01-01
  • 1970-01-01
  • 2010-10-18
相关资源
最近更新 更多