Thanks for participating! I agree. There are some nuances to the algorithm but my second approach was reasonably close to what you offered. And here are the results (where original_luhn is the list version and string_luhn is the recursive pattern matching version:
Operating System: Linux
CPU Information: Intel(R) Core(TM) i5-9300H CPU @ 2.40GHz
Number of Available Cores: 8
Available memory: 15.79 GB
Elixir 1.10.3
Erlang 22.3.4.1
Benchmark suite executing with the following configuration:
warmup: 2 s
time: 5 s
memory time: 0 ns
parallel: 1
inputs: none specified
Estimated total run time: 14 s
Benchmarking original_luhn...
Benchmarking string_luhn...
Name ips average deviation median 99th %
original_luhn 440.61 K 2.27 μs ±925.00% 2.10 μs 3.20 μs
string_luhn 325.14 K 3.08 μs ±1930.38% 2.80 μs 3.70 μs
Comparison:
original_luhn 440.61 K
string_luhn 325.14 K - 1.36x slower +0.81 μs
I found these results to be pretty surprising. I am wondering if the explanation is that I am unaware of something expensive in the string version, something optimized in the list version, or if I am benchmarking/interpreting the benchmark wrong.
Here is a link to the repo with both versions and a full explanation of the algorithm.


















