c# - 哪个更快 : Single(predicate) or Where(predicate). Single()

标签 c# .net linq

讨论来自 this answer让我好奇。哪个更快:

someEnumerable.Single(predicate);

someEnumerable.Where(predicate).Single();

毕竟,第一个更短、更简洁,而且似乎是专门设计的。

甚至 ReSharper 也建议前者:

enter image description here

我在上一篇文章中争论过,它们在功能上是相同的,并且应该具有非常相似的运行时间。

最佳答案

LINQ 到对象

没有什么比基准更能回答这样的问题了:

(已更新)

class Program
{
    const int N = 10000;
    volatile private static int s_val;

    static void DoTest(IEnumerable<int> data, int[] selectors) {
        Stopwatch s;

        // Using .Single(predicate)
        s = Stopwatch.StartNew();
        foreach (var t in selectors) {
            s_val = data.Single(x => x == t);
        }
        s.Stop();
        Console.WriteLine("   {0} calls to Single(predicate) took {1} ms.",
            selectors.Length, s.ElapsedMilliseconds);

        // Using .Where(predicate).Single()
        s = Stopwatch.StartNew();
        foreach (int t in selectors) {
            s_val = data.Where(x => x == t).Single();
        }
        s.Stop();
        Console.WriteLine("   {0} calls to Where(predicate).Single() took {1} ms.",
            selectors.Length, s.ElapsedMilliseconds);
    }


    public static void Main(string[] args) {
        var R = new Random();
        var selectors = Enumerable.Range(0, N).Select(_ => R.Next(0, N)).ToArray();

        Console.WriteLine("Using IEnumerable<int>  (Enumerable.Range())");
        DoTest(Enumerable.Range(0, 10 * N), selectors);

        Console.WriteLine("Using int[]");
        DoTest(Enumerable.Range(0, 10*N).ToArray(), selectors);

        Console.WriteLine("Using List<int>");
        DoTest(Enumerable.Range(0, 10 * N).ToList(), selectors);

        Console.ReadKey();
    }
}

有些令人震惊的是,.Where(predicate).Single() 以大约两倍的优势获胜。我什至将这两个案例都运行了两次,以确保缓存等不是一个因素。

1) 10000 calls to Single(predicate) took 7938 ms.
1) 10000 calls to Where(predicate).Single() took 3795 ms.
2) 10000 calls to Single(predicate) took 8132 ms.
2) 10000 calls to Where(predicate).Single() took 4318 ms.

更新结果:

Using IEnumerable<int>  (Enumerable.Range())
   10000 calls to Single(predicate) took 7838 ms.
   10000 calls to Where(predicate).Single() took 8104 ms.
Using int[]
   10000 calls to Single(predicate) took 8859 ms.
   10000 calls to Where(predicate).Single() took 2970 ms.
Using List<int>
   10000 calls to Single(predicate) took 9523 ms.
   10000 calls to Where(predicate).Single() took 3781 ms.

关于c# - 哪个更快 : Single(predicate) or Where(predicate). Single(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21194750/

相关文章:

c# - 在列表中添加对象的两个变量

c# - 检测 PowerPoint 幻灯片是否隐藏

c# - 谁能帮我完成这个从一个列表更新到另一个列表的通用方法?

c# - 逗号分隔值文件(读/写)- C#

c# - 输入字符串的格式不正确?

c# - 在中间件中返回一个状态码 304

.net - 关于 "remoting"的最佳实践,一个带有 WCF 的 .NET 类库

c# - 在关系数据库中保持实体顺序的最佳模式是什么?

c# - 如何将列名作为参数传递给 Entity Framework 中的动态搜索

c# - Linq 多重 where 查询