【问题标题】:How to speed up this Linq select code?如何加快这个 Linq 选择代码?
【发布时间】:2012-02-11 20:59:48
【问题描述】:

我有一个 xml 文件,每个项目包含 3 条数据:productName、productCode 和 productPrice。 xml 文件中的项目数约为 7,000。

用户可以通过在文本框中输入“red shirt”来按名称搜索产品。 我的代码执行以下任务:

  1. 标记搜索文本并收集包含所有搜索词的产品名称。

  2. 按产品代码排序

  3. 选择仅显示 productName 和 productPrice(不是仅用于 orderby 的 productCode)

  var products = from d in xElem.Descendants(fileName)
                        where textBox1.Text.ToLower().Split(' ').All(t => d.Element(productName).Value.ToLower().Contains(t))

                        orderby d.Element(productCode).Value ascending
                        select new
                        {
                            Price = (double.Parse(d.Element(productPrice).Value)).ToString(numberFormat),
                            Name = d.Element(Name).Value
                        };

这段代码的瓶颈在哪里?以及如何删除它们? 每次在文本框中输入按键时,我都会执行此 Linq 选择,这意味着实时结果更新(而不是等待 Enter 键)。 谢谢。

【问题讨论】:

  • 您是否尝试分析此代码?结果如何?
  • 在每次击键时进行全新的搜索总是会很慢,尽管 XML 上的 Linq 可能比索引表上的 sql 查询慢。如何加快Linq?不要使用它。所有的抽象都比较慢。
  • 我从未做过任何分析。我正在使用 Visual Studio 2010。将检查此功能是否可用。

标签: xml linq select sql-order-by where


【解决方案1】:

如果没有附加分析器并查看输出,我只能猜测什么是慢的。

  1. where textBox1.Text.ToLower.Split(' ') 可以缓存在查询之外。不过我怀疑这是一个严重的问题。

  2. LINQ to XML 在非常大的 XML 文档上可能会很慢。考虑使用XmlTextReader 以只进的方式快速(但丑陋)访问底层XML。

  3. 如果 XML 适合,则预处理内存中的数据。内存查询应该很快。

  4. 您可以使用 Lucene.Net 之类的东西来索引大量 XML 文件以进行快速搜索。这可能有点矫枉过正,但它非常快速且可扩展。

  5. 多考虑一下这个问题。每次用户按下一个键时,您都在处理 XML DOM 并执行一系列字符串操作。处理 XML 以使您拥有更适合您的任务的表单似乎是一个不错的选择。

请注意,这种性质的自动完成的响应时间非常缓慢,对于大多数用途来说,最多延迟一秒左右是完全可以接受的。

【讨论】:

    猜你喜欢
    • 2012-08-29
    • 1970-01-01
    • 2023-03-16
    • 2011-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多