Benchmarks
Benchmarks have been implemented with BenchmarkDotNet.
Configuration
BenchmarkDotNet=v0.11.5
OS=Windows 10.0.18362
Processor=Intel Core i7-7700K CPU 4.20GHz (Kaby Lake), 1 CPU, 8 logical and 4 physical cores
[Host] : .NET Framework 4.7.2 (CLR 4.0.30319.42000), 64bit RyuJIT-v4.8.3815.0
DefaultJob : .NET Framework 4.7.2 (CLR 4.0.30319.42000), 64bit RyuJIT-v4.8.3815.0
Implementation details
These benchmarks have been done by making multiple get of attribute.
The property cache is implemented with an array storing all attributes of a given property.
The Property_ByImmediateReflection_GetAttribute benchmark by getting attributes from a standard PropertyInfo with ImmediateReflection helpers.
Results
| Method | Mean | Error | StdDev | Ratio | RatioSD |
|---|---|---|---|---|---|
| Property_GetAttribute | 3,189.22 ns | 78.6381 ns | 102.2517 ns | 1.00 | 0.00 |
| PropertyCache_GetAttribute | 76.40 ns | 0.6781 ns | 0.5294 ns | 0.02 | 0.00 |
| FastMember_GetAttribute | 3,188.79 ns | 62.4070 ns | 66.7748 ns | 0.99 | 0.03 |
| ImmediateProperty_GetAttribute | 75.92 ns | 0.3393 ns | 0.3174 ns | 0.02 | 0.00 |
| Property_ByImmediateReflection_GetAttribute | 111.50 ns | 1.2293 ns | 1.1498 ns | 0.03 | 0.00 |
Results demonstrate that keeping the use of ImmediateReflection as much as possible provide the fastest access to Type, FieldInfo and PropertyInfo attributes.
It also shows that getting attributes from standard code is always possible but has a slightly higher cost.