This library prioritizes performance as a core design principle. While it doesn't aim to replace feature-rich libraries like
Michael Altmann 's excellent FluentResults or
Steve Smith 's popular Ardalis.Result . LightResults strives
for exceptional performance by intentionally simplifying its API.
Comparison
Below are comparisons of LightResults against other result pattern implementations.
BenchmarkDotNet v0.15.2, Windows 11 (10.0.26100.4652/24H2/2024Update/HudsonValley)
13th Gen Intel Core i7-13700KF 3.40GHz, 1 CPU, 24 logical and 16 physical cores
.NET SDK 9.0.303
[Host] : .NET 9.0.7 (9.0.725.31616), X64 RyuJIT AVX2
.NET 9.0 : .NET 9.0.7 (9.0.725.31616), X64 RyuJIT AVX2
Job=.NET 9.0 Runtime=.NET 9.0 IterationTime=250ms
Iterations=10
These results were produced using LightResults 9.0.5 and BenchmarkDotNet 0.15.2 .
The comparison implementations used the following package versions:
FluentResults 4.0.0
Ardalis.Result 10.1.0
Returning results
Returning a successful result
Method
Mean
Ratio
Allocated
LightResults: Result.Success()
2.382 ns
1.00
-
FluentResults: Result.Ok()
46.564 ns
19.55
560 B
ArdalisResult: Result.Success()
42.761 ns
17.96
720 B
Returning a successful value result
Method
Mean
Ratio
Allocated
LightResults: Result.Success<T>(value)
2.308 ns
1.00
-
FluentResults: Result.Ok<T>(value)
148.860 ns
64.50
1120 B
ArdalisResult: Result<T>.Success(value)
41.865 ns
18.14
640 B
Returning a failed result
Method
Mean
Ratio
Allocated
LightResults: Result.Failure()
2.099 ns
1.00
-
FluentResults: Result.Fail("")
282.372 ns
134.55
2640 B
ArdalisResult: Result.Error()
47.295 ns
22.54
720 B
Returning a failed result with an error message
Method
Mean
Ratio
Allocated
Alloc Ratio
LightResults: Result.Failure(errorMessage)
21.614 ns
1.00
240 B
1.00
FluentResults: Result.Fail(errorMessage)
120.913 ns
5.60
1120 B
4.67
ArdalisResult: Result.Error(errorMessage)
64.953 ns
3.01
1040 B
4.33
Returning a failed value result
Method
Mean
Ratio
Allocated
LightResults: Result.Failure<T>()
2.500 ns
1.00
-
FluentResults: Result.Fail<T>("")
285.110 ns
114.06
2720 B
ArdalisResult: Result<T>.Error()
53.565 ns
21.43
640 B
Returning a failed value result with an error message
Method
Mean
Ratio
Allocated
Alloc Ratio
LightResults: Result.Failure<T>(errorMessage)
18.487 ns
1.00
240 B
1.00
FluentResults: Result.Fail<T>(errorMessage)
122.375 ns
6.62
1200 B
5.00
ArdalisResult: Result<T>.Error(errorMessage)
61.796 ns
3.34
960 B
4.00
Checking results
Determining if a result is successful
Method
Mean
Ratio
Allocated
LightResults: result.IsSuccess()
2.219 ns
1.00
-
FluentResults: result.IsSuccess
102.670 ns
46.29
480 B
ArdalisResult: result.IsSuccess
2.383 ns
1.07
-
Retrieving the value
Method
Mean
Ratio
Allocated
LightResults: result.IsSuccess(out var value)
2.238 ns
1.00
-
FluentResults: result.Value
95.136 ns
42.52
480 B
ArdalisResult: result.Value
2.240 ns
1.00
-
Determining if a result is failed
Method
Mean
Ratio
Allocated
LightResults: result.IsFailure()
2.196 ns
1.00
-
FluentResults: result.IsFailed
148.292 ns
67.55
880 B
ArdalisResult: !result.IsSuccess
2.334 ns
1.06
-
Determining if a result contains a specific error
Method
Mean
Ratio
Allocated
LightResults: result.HasError<T>()
12.887 ns
1.00
-
FluentResults: result.HasError<T>()
789.100 ns
61.23
3840 B
ArdalisResult: result.Errors.Any(errorMessage => errorMessage.Equals(ErrorMessage))
20.733 ns
1.61
-
Retrieving the first error
Method
Mean
Ratio
Allocated
LightResults: result.Error
3.817 ns
1.00
-
FluentResults: result.Errors[0]
325.418 ns
85.25
1760 B
ArdalisResult: result.Errors.First()
94.840 ns
24.85
-
Getting results as strings
String representation of a successful result
Method
Mean
Ratio
Allocated
LightResults: Result.Success().ToString()
2.595 ns
1.00
-
FluentResults: Result.Ok().ToString()
329.141 ns
126.82
1200 B
ArdalisResult: Result.Success().ToString()
14.724 ns
5.67
-
String representation of a successful value result
Method
Mean
Ratio
Allocated
Alloc Ratio
LightResults: Result.Success<T>(value).ToString()
98.429 ns
1.00
1040 B
1.00
FluentResults: Result.Ok<T>(value).ToString()
557.393 ns
5.66
2800 B
2.69
ArdalisResult: Result<T>.Success(value).ToString()
14.593 ns
0.15
-
0.00
String representation of a failed result
Method
Mean
Ratio
Allocated
LightResults: Result.Failure().ToString()
5.324 ns
1.00
-
FluentResults: Result.Fail("").ToString()
957.111 ns
179.76
3600 B
ArdalisResult: Result.Error().ToString()
15.269 ns
2.87
-
String representation of a failed result with an error message
Method
Mean
Ratio
Allocated
Alloc Ratio
LightResults: Result.Failure(errorMessage).ToString()
108.405 ns
1.00
1600 B
1.00
FluentResults: Result.Fail(errorMessage).ToString()
1,417.229 ns
13.08
9120 B
5.70
ArdalisResult: Result.Error(errorMessage).ToString()
14.672 ns
0.14
-
0.00
String representation of a failed value result
Method
Mean
Ratio
Allocated
LightResults: Result.Failure<T>().ToString()
5.331 ns
1.00
-
FluentResults: Result.Fail<T>("").ToString()
1,177.864 ns
220.96
5520 B
ArdalisResult: Result<T>.Error().ToString()
15.082 ns
2.83
-
String representation of a failed value result with an error message
Method
Mean
Ratio
Allocated
Alloc Ratio
LightResults: Result.Failure<T>(errorMessage).ToString()
105.022 ns
1.00
1600 B
1.00
FluentResults: Result<T>.Error(errorMessage).ToString()
1,720.919 ns
16.39
11920 B
7.45
ArdalisResult: Result.Fail<T>(errorMessage).ToString()
14.643 ns
0.14
-
0.00