哪一个更适合性能:foreach()语句或Where()查询?

时间:2014-03-05 05:30:03

标签: c# linq

我有一个元素列表,我想根据具体情况将元素过滤到其他列表中。我有两种选择:

  1. 使用foreach()语句

        List<Address> allAddress = new List<Address>();
        List<Address> chaplinAddress = new List<Address>();
    
        foreach (Address item in allAddress)
        {
            if (item.city.ToUpper() == "CHAPLIN")
            {
                chaplinAddress.Add(item);
            }
        }
    
  2. 使用Where()子句

        List<Address> allAddress = new List<Address>();
        List<Address> chaplinAddress = new List<Address>();
    
        chaplinAddress = allAddress.Where(p => p.city.ToUpper() == "CHAPLIN").ToList();
    
  3. 上述哪种方法对性能更好?

    我在下面的链接中查找了Where()的执行方式,但我仍然不清楚:

    http://msdn.microsoft.com/en-us/library/bb534803.aspx

3 个答案:

答案 0 :(得分:3)

LINQ无论如何都在内部使用循环...你可以使用.NET Reference Source来检查内部的工作方式:

<强> Enumerable.Where

public static IEnumerable<TSource> Where<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate) {
    if (source == null) throw Error.ArgumentNull("source");
    if (predicate == null) throw Error.ArgumentNull("predicate");
    if (source is Iterator<TSource>) return ((Iterator<TSource>)source).Where(predicate);
    if (source is TSource[]) return new WhereArrayIterator<TSource>((TSource[])source, predicate);
    if (source is List<TSource>) return new WhereListIterator<TSource>((List<TSource>)source, predicate);
    return new WhereEnumerableIterator<TSource>(source, predicate);
}

<强> Enumerable.ToList

public static List<TSource> ToList<TSource>(this IEnumerable<TSource> source) {
    if (source == null) throw Error.ArgumentNull("source");
    return new List<TSource>(source);
}

WhereListIterator(作为一个链接,因为这里粘贴有点长...

使用LINQ时会有一点开销,因为代理调用,但是你根本不应该关心。像这样的过早优化是邪恶的,它甚至比它需要的这么小的时间开销更糟糕。

答案 1 :(得分:2)

决定对此进行测试。 1,000,000,000个随机字符串,插入一个“CHAPLIN”。

  • 一个foreach循环需要6个滴答。
  • LINQ查询占用了296个小时。

看起来foreach更快。

编辑:做了更科学的研究。在发布模式下,在VS之外,每次测试1000次。

  • a,每个循环平均为0刻度。
  • lima查询平均为4个刻度。

请记住,滴答是百万分之一秒,对于1000,000,000个城市的1000次查找,差异为0.0000004秒。

我认为你是个好人。

答案 2 :(得分:0)

您可以使用计时器对象来检查哪一个更快但是LINQ并不比foreach()快,因为它(LINQ语句)也在内部使用循环。另外值得一提的是,LINQ更容易阅读,理解和阅读。适应更少的错误。但是如果你非常关心性能,就不应该使用LINQ

您可以查看LINQ vs FOREACH vs FOR Loop Performance