Linq Count()比List.Count或Array.Length更快还是更慢?
Linq Count(
)方法是否比List<>.Count
或Array.Length
更快或更慢?
一般来说比较慢。 一般而言,LINQ的Count是O(N)
操作,而List.Count
和Array.Length
都保证为O(1)
。
但是,在某些情况下,LINQ将特殊情况下的IEnumerable<T>
参数转换为某些接口类型,如IList<T>
或ICollection<T>
。 然后它将使用该Count方法来执行实际的Count()
操作。 所以它会回落到O(1)
。 但你仍然支付演员和接口调用的小额费用。
Enumerable.Count()
方法使用.Count
检查ICollection<T>
- 所以对于数组和列表来说,效率并不是非常低效(只是额外的间接级别)。
马克有正确的答案,但魔鬼的细节。
在我的机器上:
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>