代码之家  ›  专栏  ›  技术社区  ›  Binoj Antony

datatable.select vs datatable.rows.find vs foreach vs find(谓词<t>)/lambda

  •  19
  • Binoj Antony  · 技术社区  · 17 年前

    我有一个缓存在内存中的数据表/集合,我想用它作为一个源来为自动完成的文本框生成结果(当然是使用ajax)。 我正在评估快速获取数据的各种选项。 datatable中集合/行中的项目数可以从10000到2000000不等。(这样我们就不会被转移了,目前假设已经做出了决定,我有足够的内存,我将使用缓存而不是数据库查询来完成这个任务)

    我有一些额外的业务逻辑用于此处理;我必须按照 priority 集合中的列(int)。所以如果我有人搜索 Micro 我得到20个单词/句子的结果 微型的 然后我会选择最优先的10个结果项。(因此需要有一个与字符串值关联的优先级属性)。

    集合项已按字母顺序排序。

    在这种情况下,什么是最好的解决方案。
    1。使用datatable.select(。
    2。 Using DataTable.Rows.Find( .
    三。使用自定义集合 foreach or for 迭代它的值。
    4。使用泛型集合 anonymous delegates 或λ since both give same performance not ?)

    5 回复  |  直到 14 年前
        1
  •  8
  •   Jay D    14 年前

    这些图表并没有贴在我的博客上,更多细节可以在 http://msdn.microsoft.com/en-us/library/dd364983.aspx

    我后来发现,对于大型数据集,使用链式通用字典的性能非常好。它也有助于减轻由聚合操作所需的排序操作(如min和max)引起的许多问题 DataTable.Compute LINQ )

    我说的“链式通用词典”是指 Dictionary(Of String, Dictionary(Of String, Dictionary(Of Integer, List(Of DataRow)))) 或者类似的技术,其中每个字典的键是一个搜索词。

    当然,这在所有情况下都不是很有用,但我至少有一个场景实现了这种方法 500x 绩效改进。

    在你的例子中,我会考虑使用一个简单的字典,前面有1-5个字符,然后 List(Of String) . 你必须建立这本字典一次,添加单词到列表的前1-5个字符,但在那之后,你将能够得到非常快的结果。

    我通常把这样的东西包装在一个类中,这样我就可以很容易地添加单词了。您还可以使用 SortedList(Of String) ,以使结果自动排序。这样,您可以快速查找与输入的前n个字符匹配的单词列表。

        2
  •  4
  •   Jay D    14 年前

    在我身上 autocomplete ,我先尝试了 linq/lambda 接近时,表现有点慢。 DataTable.Select linq ,所以我用这个。我还没有比较 datatable.Select datatable.Find

        3
  •  2
  •   James Orr    17 年前

    我们可以整天揣测,但既然这不是一段很大的代码,为什么不编写一段代码,并对它们进行基准测试呢?

    public delegate void TestProcedure();
    
    public TimeSpan Benchmark(TestProcedure tp)
    {
        int testBatchSize = 5;
        List<TimeSpan> results = new List<TimeSpan>();
        for(int i = 0; i<testBatchSize; i++)
        {
            DateTime start = DateTime.Now;
            tp();
            results.Add(DateTime.Now - start);
        }
        return results.Min();
    }
    
        4
  •  1
  •   Amar Khubani    17 年前

    根据以下博客

    http://blog.dotnetspeech.net/archive/2008/08/26/performance----datatable.select-vs-dictionary.aspx

    datatable.rows.find比datatable.select快得多。

        5
  •  0
  •   Dillie-O    17 年前

    数据视图怎么样?您可以应用筛选条件并按优先级排序,并轻松地遍历结果以添加到结果中。