.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
Variant | Description |
---|---|
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