У меня есть этот массив: var arr = new int[] { 1, 1, 0, -1, -1 };
, где мне нужно посчитать количество положительных, отрицательных и нулевых чисел. Я сделал это с foreach
l oop и с 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
l oop, где намного лучше (28 мс), чем метод Linq
(8311 мс), поэтому мой вопрос, почему все это разница в производительности?
Я даже пытался сделайте три foreach
l oop, один для подсчета негативов, один для подсчета позитивов и третий для подсчета нулей, но производительность все равно была лучше, чем метод Linq!
Заранее благодарим за помощь!