Skip to content
Rian Stockbower edited this page Feb 19, 2025 · 2 revisions

Code: https://github.com/rianjs/DotNetPerfTesting/blob/master/PerfTesting/PerfTesting/Linq/PredicateLocation.cs

The basic pattern is:

[Benchmark]
public int FirstLarge()
    => _largeNumbers.First(n => n == 667);

[Benchmark]
public int WhereFirstLarge()
    => _largeNumbers.Where(n => n == 667).First();

And then repeating with Single(), SingleOrDefault(), and repeating again with a smaller array of numbers.

.NET 8 on M3 MacBook Pro

Method Mean Error StdDev Gen0 Allocated Speedup %
FirstLarge 655.87 ns 41.464 ns 2.273 ns 0.0038 32 B
WhereFirstLarge 405.15 ns 4.167 ns 0.228 ns 0.0057 48 B 38.2%
FirstOrDefaultLarge 642.73 ns 212.126 ns 11.627 ns 0.0038 32 B
WhereFirstDefaultLarge 405.38 ns 3.845 ns 0.211 ns 0.0057 48 B 37.0%
SingleLarge 951.95 ns 51.710 ns 2.834 ns 0.0038 32 B
WhereSingleLarge 606.69 ns 128.156 ns 7.025 ns 0.0057 48 B 36.3%
SingleOrDefaultLarge 948.28 ns 15.881 ns 0.870 ns 0.0038 32 B
WhereSingleDefaultLarge 604.21 ns 31.579 ns 1.731 ns 0.0057 48 B 36.3%
FirstSmall 32.76 ns 20.769 ns 1.138 ns 0.0038 32 B
WhereFirstSmall 26.84 ns 0.221 ns 0.012 ns 0.0057 48 B 18.1%
FirstOrDefaultSmall 28.50 ns 3.729 ns 0.204 ns 0.0038 32 B
WhereFirstDefaultSmall 26.57 ns 0.048 ns 0.003 ns 0.0057 48 B 6.8%
SingleSmall 49.65 ns 12.350 ns 0.677 ns 0.0038 32 B
WhereSingleSmall 38.79 ns 0.317 ns 0.017 ns 0.0057 48 B 21.9%
SingleOrDefaultSmall 48.62 ns 1.724 ns 0.095 ns 0.0038 32 B
WhereSingleDefaultSmall 38.81 ns 0.868 ns 0.048 ns 0.0057 48 B 20.2%
Clone this wiki locally