Comparing Luhn algorithm implementation of popular C# libraries and own methods (includes naive approach, platform-specific and platform-agnostic vectorization approaches).
Disassembly for naive and vectorized approaches is available in the disassembly
directory. Currently Windows x86_64 and Linux ARM64 disassembly listings are provided.
BenchmarkDotNet v0.13.11, Windows 10 (10.0.19045.3803/22H2/2022Update)
AMD Ryzen 5 3600, 1 CPU, 12 logical and 6 physical cores
.NET SDK 8.0.100
[Host] : .NET 8.0.0 (8.0.23.53103), X64 RyuJIT AVX2
.NET 8.0 : .NET 8.0.0 (8.0.23.53103), X64 RyuJIT AVX2
Job=.NET 8.0 Runtime=.NET 8.0
Method | Mean | Error | StdDev | Ratio | RatioSD | Code Size |
---|---|---|---|---|---|---|
GenerateLuhnDigitCreditCardValidator | 1,038.352 ns | 3.0367 ns | 2.8406 ns | 62.11 | 0.29 | 1,074 B |
GenerateLuhnDigitLuhnNet | 197.936 ns | 2.1991 ns | 2.0570 ns | 11.84 | 0.15 | 319 B |
GenerateLuhnDigitSlxLuhnLibrary | 151.931 ns | 0.3132 ns | 0.2777 ns | 9.09 | 0.06 | 326 B |
GenerateLuhnDigit | 16.717 ns | 0.1046 ns | 0.0978 ns | 1.00 | 0.00 | 150 B |
GenerateLuhnDigitSimdSse2 | 4.782 ns | 0.0120 ns | 0.0101 ns | 0.29 | 0.00 | 316 B |
GenerateLuhnDigitSimdSse41 | 3.730 ns | 0.0108 ns | 0.0096 ns | 0.22 | 0.00 | 251 B |
GenerateLuhnDigitSimdVector128 | 12.885 ns | 0.0300 ns | 0.0281 ns | 0.77 | 0.00 | 221 B |
BenchmarkDotNet v0.13.11, macOS Sonoma 14.1.1 (23B81) [Darwin 23.1.0]
Apple M1 Pro, 1 CPU, 8 logical and 8 physical cores
.NET SDK 8.0.100
[Host] : .NET 8.0.0 (8.0.23.53103), Arm64 RyuJIT AdvSIMD
.NET 8.0 : .NET 8.0.0 (8.0.23.53103), Arm64 RyuJIT AdvSIMD
Job=.NET 8.0 Runtime=.NET 8.0
Method | Mean | Error | StdDev | Ratio | RatioSD |
---|---|---|---|---|---|
GenerateLuhnDigitCreditCardValidator | 690.063 ns | 1.4416 ns | 1.2779 ns | 46.66 | 0.09 |
GenerateLuhnDigitLuhnNet | 133.107 ns | 0.3315 ns | 0.2939 ns | 9.00 | 0.03 |
GenerateLuhnDigitSlxLuhnLibrary | 75.508 ns | 0.0411 ns | 0.0344 ns | 5.11 | 0.01 |
GenerateLuhnDigit | 14.789 ns | 0.0244 ns | 0.0204 ns | 1.00 | 0.00 |
GenerateLuhnDigitSimdArm64 | 1.512 ns | 0.0025 ns | 0.0024 ns | 0.10 | 0.00 |
GenerateLuhnDigitSimdVector128 | 1.142 ns | 0.0034 ns | 0.0030 ns | 0.08 | 0.00 |
BenchmarkDotNet v0.13.11, Debian GNU/Linux 12 (bookworm) (container)
Unknown processor
.NET SDK 8.0.100
[Host] : .NET 8.0.0 (8.0.23.53103), Arm64 RyuJIT AdvSIMD
.NET 8.0 : .NET 8.0.0 (8.0.23.53103), Arm64 RyuJIT AdvSIMD
Job=.NET 8.0 Runtime=.NET 8.0
Method | Mean | Error | StdDev | Ratio | RatioSD | Code Size |
---|---|---|---|---|---|---|
GenerateLuhnDigitCreditCardValidator | 697.941 ns | 2.5455 ns | 2.3810 ns | 46.94 | 0.13 | 1,420 B |
GenerateLuhnDigitLuhnNet | 115.922 ns | 0.0747 ns | 0.0663 ns | 7.80 | 0.01 | 468 B |
GenerateLuhnDigitSlxLuhnLibrary | 77.040 ns | 0.6014 ns | 0.5332 ns | 5.18 | 0.04 | 556 B |
GenerateLuhnDigit | 14.862 ns | 0.0083 ns | 0.0073 ns | 1.00 | 0.00 | 200 B |
GenerateLuhnDigitSimdArm64 | 1.506 ns | 0.0013 ns | 0.0011 ns | 0.10 | 0.00 | 252 B |
GenerateLuhnDigitSimdVector128 | 1.108 ns | 0.0010 ns | 0.0009 ns | 0.07 | 0.00 | 200 B |