.NET: the cost of returning an empty collection

.NET: the cost of returning an empty collection

Dealing with empty lists is an everyday situation in .NET. An empty list is often preferred to a null in order to control the logic. But how expensive is it to return an empty list?

The options

A List can currently - .NET 9 - be initialized in several ways

VariantDescription
new List()Creates a list with the default capacity 0
new List(0)Creates a list with the default capacity 0
new List(1)Creates a list with the default capacity 4
new List(31)Creates a list with the default capacity 31
[]Creates a list with the default capacity 0

The notation [] is the latest and currently recommended notation. This is because this applies not only to List, but to all .NET collections.

In contrast to List, the most efficient option is not the constructor, but Array.Empty. [] for arrays is therefore an alias for Array.Empty.

Benchmark

The benchmark shows very clearly why [] is the recommended spelling: it always guarantees the most efficient solution.

BenchmarkDotNet v0.13.12, Windows 10 (10.0.19045.4651/22H2/2022Update)
AMD Ryzen 9 5950X, 1 CPU, 32 logical and 16 physical cores
.NET SDK 9.0.100-preview.5.24307.3
  [Host]   : .NET 9.0.0 (9.0.24.30607), X64 RyuJIT AVX2
  .NET 9.0 : .NET 9.0.0 (9.0.24.30607), X64 RyuJIT AVX2

| Method      | Mean      | Ratio | Gen0   | Allocated |
|------------ |----------:|------:|-------:|----------:|
| List()      | 2.7975 ns |  1.00 | 0.0019 |      32 B |
| List(0)     | 2.9224 ns |  1.04 | 0.0019 |      32 B |
| List []     | 2.7643 ns |  0.99 | 0.0019 |      32 B |
| Array.Empty | 0.4912 ns |  0.18 |      - |         - |
| Array []    | 0.4835 ns |  0.18 |      - |         - |
| HashSet()   | 4.0250 ns |  1.48 | 0.0038 |      64 B |
| HashSet []  | 4.0798 ns |  1.46 | 0.0038 |      64 B |

The bechmark: https://github.com/BenjaminAbt/SustainableCode/tree/main/csharp/list-empty-return