Linq Count()比List.Count或Array.Length更快还是更慢?

Linq Count( )方法是否比List<>.CountArray.Length更快或更慢?


一般来说比较慢。 一般而言,LINQ的Count是O(N)操作,而List.CountArray.Length都保证为O(1)

但是,在某些情况下,LINQ将特殊情况下的IEnumerable<T>参数转换为某些接口类型,如IList<T>ICollection<T> 。 然后它将使用该Count方法来执行实际的Count()操作。 所以它会回落到O(1) 。 但你仍然支付演员和接口调用的小额费用。


Enumerable.Count()方法使用.Count检查ICollection<T> - 所以对于数组和列表来说,效率并不是非常低效(只是额外的间接级别)。


马克有正确的答案,但魔鬼的细节。

在我的机器上:

  • 对于数组,.Length比.Count()快大约100倍
  • 对于列表.Count比.Count()快大约10倍 - 注意:我希望所有实现IList<T>集合具有相似的性能,
  • 数组起始速度较慢,因为.Length只涉及单个操作。数组上的计数涉及一个间接层。 所以.Count数组的起始速度要慢10倍(在我的机器上),这可能是接口明确实现的原因之一。 想象一下,如果你有一个有两个公共属性的对象,.Count和.Length。 两者完全相同,但是.Count速度慢了10倍。

    当然,这不会造成太大的变化,因为您必须计算您的阵列并每秒列出数百万次以感受性能。

    码:

        static void TimeAction(string description, int times, Action func) {
            var watch = new Stopwatch();
            watch.Start();
            for (int i = 0; i < times; i++) {
                func();
            }
            watch.Stop();
            Console.Write(description);
            Console.WriteLine(" Time Elapsed {0} ms", watch.ElapsedMilliseconds);
        } 
    
        static void Main(string[] args) {
            var array = Enumerable.Range(0, 10000000).ToArray();
            var list = Enumerable.Range(0, 10000000).ToArray().ToList();
    
            // jit
            TimeAction("Ignore and jit", 1 ,() =>
            {
                var junk = array.Length;
                var junk2 = list.Count;
                array.Count();
                list.Count();
            });
    
    
            TimeAction("Array Length", 1000000, () => {
                var tmp1 = array.Length;
            });
    
            TimeAction("Array Count()", 1000000, () =>
            {
                var tmp2 = array.Count();
            });
    
            TimeAction("Array Length through cast", 1000000, () =>
            {
                var tmp3 = (array as ICollection<int>).Count;
            });
    
    
            TimeAction("List Count", 1000000, () =>
            {
                var tmp1 = list.Count;
            });
    
            TimeAction("List Count()", 1000000, () =>
            {
                var tmp2 = list.Count();
            });
    
            Console.ReadKey();
        }
    

    结果:

    Array Length Time Elapsed 3 ms
    Array Count() Time Elapsed 264 ms
    Array Length through cast Time Elapsed 16 ms
    List Count Time Elapsed 3 ms
    List Count() Time Elapsed 18 ms
    
    链接地址: http://www.djcxy.com/p/53923.html

    上一篇: Is the Linq Count() faster or slower than List.Count or Array.Length?

    下一篇: List<T> or IList<T>