Tylko i wyłącznie za pomocą : https://benchmarkdotnet.org/
[Config(typeof(BenchmarkDotNetConfig))]
public class ArraySum
{
private long[] data;
private long expectedResult;
[Params(1000, 10_000, 100_000)]
public int Size
{
get;
set;
}
[GlobalSetup]
public void GlobalSetup()
{
data = new long[Size];
for (int i = 0; i < Size; ++i)
{
data[i] = i % 100;
}
expectedResult = data.Sum();
}
[Benchmark]
public IEnumerable<long> Case1()
{
var c = data.Where(o => o > 2 && o < 5).ToList();
return c;
}
[Benchmark]
public IEnumerable<long> Case2()
{
var c = data.Where(o => o > 2).Where(o => o < 5).ToList();
return c;
}
[Benchmark]
public IEnumerable<long> Case3()
{
var result = new List<long>(data.Length/10);
foreach(long i in data)
{
if ((i > 2) && (i < 5))
{
result.Add(i);
}
}
return result;
}
}
Method |
Size |
Mean |
Error |
StdDev |
Gen 0 |
Gen 1 |
Allocated |
Case1 |
1000 |
6.122 us |
5.413 us |
0.3058 us |
0.4196 |
- |
672 B |
Case2 |
1000 |
10.937 us |
6.525 us |
0.3687 us |
0.5188 |
- |
824 B |
Case3 |
1000 |
2.469 us |
1.083 us |
0.0612 us |
0.5455 |
- |
864 B |
Case1 |
10000 |
66.598 us |
151.150 us |
8.5403 us |
2.7466 |
- |
4330 B |
Case2 |
10000 |
230.682 us |
501.066 us |
28.3111 us |
2.4414 |
- |
4482 B |
Case3 |
10000 |
23.826 us |
16.956 us |
0.9581 us |
5.0964 |
- |
8066 B |
Case1 |
100000 |
980.513 us |
873.224 us |
49.3388 us |
19.5313 |
- |
33136 B |
Case2 |
100000 |
1,119.897 us |
1,055.583 us |
59.6424 us |
19.5313 |
- |
33304 B |
Case3 |
100000 |
225.888 us |
144.071 us |
8.1403 us |
35.8887 |
8.7891 |
80344 B |
ponieważ każde wywołanie Where powoduje iterację po całej kolekcji.
Guzik prawda, wywołanie where w ogóle nie powoduje itreracji po kolekcji, całe linqu jest zbudowane na yieldach, iteracja następuję dopiero wtedy gdy użyjemy jakiegoś operatora powodującego materializację wyników.