【发布时间】:2020-01-31 10:12:43
【问题描述】:
我有这个数组:var arr = new int[] { 1, 1, 0, -1, -1 }; 我需要计算正数、负数和零数的数量。
我使用foreach 循环和Linq 完成了它,并尝试使用Stopwatch 比较两种方法之间的性能这是我的代码:
int pos = 0, neg = 0, zeros = 0;
int p = 0, n = 0, z = 0;
Stopwatch sw = new Stopwatch();
sw.Start();
pos = arr.Sum(e => e > 0 ? 1 : 0);
neg = arr.Sum(e => e < 0 ? 1 : 0);
zeros = arr.Sum(e => e == 0 ? 1 : 0);
sw.Stop();
Stopwatch sw2 = new Stopwatch();
sw2.Start();
foreach (var item in arr)
{
if (item > 0) p++;
else if (item < 0) n++;
else z++;
}
sw2.Stop();
Console.WriteLine("Elapsed={0}", sw.Elapsed); //Elapsed=00:00:00.0008311
Console.WriteLine("Elapsed2={0}", sw2.Elapsed); //Elapsed2=00:00:00.0000028
结果显示foreach 循环比Linq 方法(8311 毫秒)好很多(28 毫秒),所以我的问题是为什么会有这么多性能差异?
我什至尝试了三个foreach循环,一个计算负数,一个数正数,第三个数零,但性能仍然比Linq方法好!
提前感谢您的帮助!
【问题讨论】:
-
那么,您的问题是什么?
-
我相信这是因为您的阵列非常小。 Linq 在内部创建枚举器,这需要一些时间。但是,如果您有包含数千个项目的数组,我认为,Linq 可能会更快。
-
@PavelAnikhouski 为什么会有这么多性能差异?
-
您正在使用 linq 方法创建 3 个序列,而不是 1 个 foreach 循环
-
你也可以稍微改变一下:pos = arr.Count(e => e > 0);否定 = arr.Count(e => e e == 0);
标签: c# .net performance linq