【发布时间】:2021-09-26 20:39:28
【问题描述】:
我需要一种快速而肮脏的方法来计算数组,但只选择元素是否包含值。经过一番修改后,我想出了这个:
int count = 0;
for (int i = 0; i < array.Length; i++)
{
if (array[i] != null)
count++;
}
return count;
真的,一个快速的方法来克服这个问题,没有无用的细节 - 然后在搜索 stackoverflow 后,我注意到之前有人问过这个问题:Count non null elements in an array of lists
一个非常优雅的答案:使用Enumerable.Count()! 强大的计算机之神给了我们这个名为 LINQ 的宝贵工具,我认为我们使用它的次数超出了我们的预期。
array.Count(x => x != null)
看起来很甜美易懂
为了测试它的性能,我创建了一个包含“yes”字符串但只留下 1 的 1 亿元素数组。使用 Stopwatch 类运行测试后,结果相当令人惊讶:
Enumerable.Count:~600 毫秒 脏代码块:~60 ms
在重复执行方面有很大的不同。 这背后的原因可能是什么?我不认为微软的任何工程师都像我一样愚蠢。
【问题讨论】:
-
这不是关于聪明与否,而是关于一些特殊的东西(你的数组实现)与一些通用的东西(适用于任何
IEnumerble<T>)。在大多数情况下,当您真正关心性能时,LINQ 并不是要走的路(它主要是为了易于使用和通用化)。也就是说,还请记住,很难进行良好的性能测试,它们应该以最佳方式进行热身运行,然后进行多次运行,丢弃异常值等(有框架可以为您完成所有这些)
标签: c# arrays performance