Back to .md Directory

BENCHMARKS

The math in gf256 is very close to the hardware, and for each algorithm, there

May 2, 2026
0 downloads
3 views
ai
View source

The math in gf256 is very close to the hardware, and for each algorithm, there is usually more than one way to do things.

To make things more complicated, the best implementation depends on a number of things, such as what hardware is available (ie carry-less multiplication ), memory, and constant-time requirements.

To help with this, gf256 uses highly-configurable proc_macros to let users choose the best implementation for their purpose. More information about these macros can be found in README.md.


In order to choose a good default strategy for each algorithm, gf256 has a set of rudimentary benchmarks using Criterion. This lets us easily compare different implementation strategies on different hardware configurations.

It's important to note, these aren't the the most exhaustive benchmarks, and they haven't been ran on the most exhaustive set of hardware. Fortunately, even with rudimentary benchmarking, there's usually a pretty clear winner for each configuration. At least of the options available in gf256.

Feel free to run these benchmarks locally, to find the most performant implementation on your machine:

$ make bench

The following are the most recent results (which are probably already out-of-date). Bold results indicate the fastest implementation in their category.


Carry-less multiplication

AMD Ryzen-3975WX @ 6.3 GHzAMD Ryzen-3975WX @ 6.3 GHz (no-xmul)AMD FX-6300 @ 3.5 GHzAMD FX-6300 @ 3.5 GHz (no-xmul)Arm A72 @ 1.8 GHzArm A72 @ 1.8 GHz (no-xmul)Arm A53 @ 1.4 GHzArm A53 @ 1.4 GHz (no-xmul)
xmul/naive_xmul16.406 ns16.139 ns37.017 ns37.921 ns97.731 ns97.753 ns229.35 ns228.79 ns
xmul/hardware_xmul999.84 ps16.156 ns3.4420 ns36.596 ns4.7512 ns97.766 ns9.3101 ns228.76 ns

Galois-field multiplication

AMD Ryzen-3975WX @ 6.3 GHzAMD Ryzen-3975WX @ 6.3 GHz (no-xmul)AMD FX-6300 @ 3.5 GHzAMD FX-6300 @ 3.5 GHz (no-xmul)Arm A72 @ 1.8 GHzArm A72 @ 1.8 GHz (no-xmul)Arm A53 @ 1.4 GHzArm A53 @ 1.4 GHz (no-xmul)
gfmul/gf256_naive_mul11.129 ns16.953 ns21.706 ns26.184 ns33.356 ns36.286 ns33.851 ns56.792 ns
gfmul/gf256_table_mul983.50 ps1.0578 ns2.2841 ns2.3177 ns3.6110 ns3.6088 ns14.381 ns14.419 ns
gfmul/gf256_rem_table_mul984.46 ps5.0971 ns2.6204 ns11.826 ns5.4644 ns11.723 ns11.588 ns33.700 ns
gfmul/gf256_small_rem_table_mul6.2360 ns10.970 ns18.028 ns21.038 ns18.862 ns26.444 ns41.849 ns70.230 ns
gfmul/gf256_barret_mul2.2866 ns9.3038 ns12.056 ns18.456 ns10.515 ns23.392 ns15.152 ns49.276 ns
AMD Ryzen-3975WX @ 6.3 GHzAMD Ryzen-3975WX @ 6.3 GHz (no-xmul)AMD FX-6300 @ 3.5 GHzAMD FX-6300 @ 3.5 GHz (no-xmul)Arm A72 @ 1.8 GHzArm A72 @ 1.8 GHz (no-xmul)Arm A53 @ 1.4 GHzArm A53 @ 1.4 GHz (no-xmul)
gfmul/gf16_naive_mul7.5132 ns12.575 ns13.817 ns21.909 ns24.037 ns27.576 ns22.778 ns45.215 ns
gfmul/gf16_table_mul1.8285 ns1.8217 ns3.8362 ns3.8429 ns7.1143 ns7.1034 ns14.892 ns14.897 ns
gfmul/gf16_rem_table_mul1.0802 ns2.8074 ns3.1999 ns5.8933 ns5.7304 ns7.8272 ns13.700 ns17.189 ns
gfmul/gf16_small_rem_table_mul6.4772 ns9.4698 ns18.378 ns18.310 ns20.017 ns20.058 ns43.369 ns52.566 ns
gfmul/gf16_barret_mul2.3745 ns1.9874 ns9.4158 ns3.3668 ns13.102 ns21.160 ns18.690 ns23.715 ns
AMD Ryzen-3975WX @ 6.3 GHzAMD Ryzen-3975WX @ 6.3 GHz (no-xmul)AMD FX-6300 @ 3.5 GHzAMD FX-6300 @ 3.5 GHz (no-xmul)Arm A72 @ 1.8 GHzArm A72 @ 1.8 GHz (no-xmul)Arm A53 @ 1.4 GHzArm A53 @ 1.4 GHz (no-xmul)
gfmul/gf2p16_naive_mul15.953 ns26.443 ns27.075 ns41.326 ns40.831 ns57.402 ns50.381 ns99.296 ns
gfmul/gf2p16_rem_table_mul6.7126 ns14.743 ns12.718 ns29.823 ns18.087 ns34.586 ns36.750 ns83.857 ns
gfmul/gf2p16_small_rem_table_mul10.013 ns17.645 ns24.320 ns38.890 ns35.569 ns50.127 ns69.866 ns119.24 ns
gfmul/gf2p16_barret_mul2.2937 ns13.455 ns8.9820 ns31.893 ns9.8849 ns53.460 ns15.426 ns108.54 ns
AMD Ryzen-3975WX @ 6.3 GHzAMD Ryzen-3975WX @ 6.3 GHz (no-xmul)AMD FX-6300 @ 3.5 GHzAMD FX-6300 @ 3.5 GHz (no-xmul)Arm A72 @ 1.8 GHzArm A72 @ 1.8 GHz (no-xmul)Arm A53 @ 1.4 GHzArm A53 @ 1.4 GHz (no-xmul)
gfmul/gf2p32_naive_mul24.942 ns35.281 ns41.008 ns53.034 ns58.916 ns101.61 ns63.794 ns119.28 ns
gfmul/gf2p32_rem_table_mul10.687 ns14.406 ns21.535 ns34.929 ns26.756 ns79.501 ns59.424 ns193.97 ns
gfmul/gf2p32_small_rem_table_mul18.864 ns19.921 ns37.345 ns49.648 ns54.087 ns99.291 ns112.18 ns208.58 ns
gfmul/gf2p32_barret_mul2.2320 ns17.901 ns9.0284 ns33.821 ns9.6186 ns90.596 ns15.807 ns194.67 ns
AMD Ryzen-3975WX @ 6.3 GHzAMD Ryzen-3975WX @ 6.3 GHz (no-xmul)AMD FX-6300 @ 3.5 GHzAMD FX-6300 @ 3.5 GHz (no-xmul)Arm A72 @ 1.8 GHzArm A72 @ 1.8 GHz (no-xmul)Arm A53 @ 1.4 GHzArm A53 @ 1.4 GHz (no-xmul)
gfmul/gf2p64_naive_mul83.672 ns110.04 ns129.96 ns214.52 ns221.70 ns418.54 ns283.20 ns667.17 ns
gfmul/gf2p64_rem_table_mul20.533 ns35.096 ns34.605 ns124.94 ns48.117 ns249.24 ns109.16 ns506.18 ns
gfmul/gf2p64_small_rem_table_mul36.280 ns50.096 ns61.355 ns152.01 ns102.13 ns298.31 ns213.93 ns613.42 ns
gfmul/gf2p64_barret_mul1.8085 ns45.276 ns6.9333 ns120.59 ns9.2153 ns313.76 ns15.890 ns618.90 ns

Galois-field division

AMD Ryzen-3975WX @ 6.3 GHzAMD Ryzen-3975WX @ 6.3 GHz (no-xmul)AMD FX-6300 @ 3.5 GHzAMD FX-6300 @ 3.5 GHz (no-xmul)Arm A72 @ 1.8 GHzArm A72 @ 1.8 GHz (no-xmul)Arm A53 @ 1.4 GHzArm A53 @ 1.4 GHz (no-xmul)
gfdiv/gf256_naive_div118.69 ns154.64 ns271.21 ns324.45 ns397.56 ns446.31 ns440.14 ns752.00 ns
gfdiv/gf256_table_div972.08 ps957.69 ps2.3997 ns2.6109 ns4.1131 ns4.1154 ns15.102 ns15.128 ns
gfdiv/gf256_rem_table_div19.690 ns82.690 ns59.391 ns146.69 ns95.588 ns190.76 ns117.64 ns365.01 ns
gfdiv/gf256_small_rem_table_div73.855 ns138.28 ns178.03 ns272.30 ns238.57 ns334.75 ns461.02 ns849.28 ns
gfdiv/gf256_barret_div61.260 ns112.78 ns221.96 ns230.49 ns244.08 ns340.33 ns182.47 ns738.94 ns
AMD Ryzen-3975WX @ 6.3 GHzAMD Ryzen-3975WX @ 6.3 GHz (no-xmul)AMD FX-6300 @ 3.5 GHzAMD FX-6300 @ 3.5 GHz (no-xmul)Arm A72 @ 1.8 GHzArm A72 @ 1.8 GHz (no-xmul)Arm A53 @ 1.4 GHzArm A53 @ 1.4 GHz (no-xmul)
gfdiv/gf16_naive_div31.564 ns47.578 ns69.057 ns96.437 ns110.71 ns140.21 ns120.36 ns282.55 ns
gfdiv/gf16_table_div2.1055 ns2.0982 ns3.8425 ns4.1275 ns6.6130 ns6.6105 ns14.999 ns14.952 ns
gfdiv/gf16_rem_table_div10.205 ns18.079 ns33.548 ns33.175 ns52.817 ns44.515 ns77.164 ns102.05 ns
gfdiv/gf16_small_rem_table_div36.017 ns47.200 ns92.921 ns82.143 ns122.92 ns106.78 ns233.20 ns266.85 ns
gfdiv/gf16_barret_div27.939 ns35.534 ns111.64 ns67.928 ns124.02 ns117.35 ns107.55 ns223.28 ns
AMD Ryzen-3975WX @ 6.3 GHzAMD Ryzen-3975WX @ 6.3 GHz (no-xmul)AMD FX-6300 @ 3.5 GHzAMD FX-6300 @ 3.5 GHz (no-xmul)Arm A72 @ 1.8 GHzArm A72 @ 1.8 GHz (no-xmul)Arm A53 @ 1.4 GHzArm A53 @ 1.4 GHz (no-xmul)
gfdiv/gf2p16_naive_div432.36 ns757.89 ns728.90 ns1.3381 us1.0561 us1.5762 us1.2732 us2.8786 us
gfdiv/gf2p16_rem_table_div160.22 ns406.33 ns364.29 ns884.03 ns592.46 ns1.1292 us1.0873 us2.6141 us
gfdiv/gf2p16_small_rem_table_div375.07 ns550.93 ns585.41 ns1.0450 us1.0087 us1.5059 us1.8075 us3.2385 us
gfdiv/gf2p16_barret_div149.24 ns432.70 ns440.55 ns954.82 ns517.61 ns1.6336 us452.15 ns3.0219 us
AMD Ryzen-3975WX @ 6.3 GHzAMD Ryzen-3975WX @ 6.3 GHz (no-xmul)AMD FX-6300 @ 3.5 GHzAMD FX-6300 @ 3.5 GHz (no-xmul)Arm A72 @ 1.8 GHzArm A72 @ 1.8 GHz (no-xmul)Arm A53 @ 1.4 GHzArm A53 @ 1.4 GHz (no-xmul)
gfdiv/gf2p32_naive_div1.3246 us1.9433 us2.1068 us2.8985 us3.0042 us5.5931 us3.2607 us6.6853 us
gfdiv/gf2p32_rem_table_div587.34 ns895.70 ns1.2291 us2.1905 us1.6276 us4.4786 us3.2995 us9.9253 us
gfdiv/gf2p32_small_rem_table_div1.1231 us1.5014 us2.1185 us3.2455 us3.3309 us6.6975 us6.3128 us14.666 us
gfdiv/gf2p32_barret_div275.00 ns1.2688 us917.81 ns2.5065 us1.0120 us5.7242 us848.13 ns12.123 us
AMD Ryzen-3975WX @ 6.3 GHzAMD Ryzen-3975WX @ 6.3 GHz (no-xmul)AMD FX-6300 @ 3.5 GHzAMD FX-6300 @ 3.5 GHz (no-xmul)Arm A72 @ 1.8 GHzArm A72 @ 1.8 GHz (no-xmul)Arm A53 @ 1.4 GHzArm A53 @ 1.4 GHz (no-xmul)
gfdiv/gf2p64_naive_div8.0257 us11.473 us13.535 us25.363 us21.452 us50.114 us27.224 us78.147 us
gfdiv/gf2p64_rem_table_div2.2686 us4.9446 us4.0306 us16.621 us6.0299 us34.536 us13.017 us64.879 us
gfdiv/gf2p64_small_rem_table_div4.7742 us6.9519 us7.6062 us19.217 us14.480 us41.218 us25.220 us77.527 us
gfdiv/gf2p64_barret_div395.02 ns5.9427 us1.2398 us15.405 us1.9941 us43.758 us1.5969 us82.216 us

LFSRs

AMD Ryzen-3975WX @ 6.3 GHzAMD Ryzen-3975WX @ 6.3 GHz (no-xmul)AMD FX-6300 @ 3.5 GHzAMD FX-6300 @ 3.5 GHz (no-xmul)Arm A72 @ 1.8 GHzArm A72 @ 1.8 GHz (no-xmul)Arm A53 @ 1.4 GHzArm A53 @ 1.4 GHz (no-xmul)
lfsr/lfsr64_naive127.34 MiB/s126.65 MiB/s95.677 MiB/s89.662 MiB/s71.481 MiB/s71.480 MiB/s52.768 MiB/s52.676 MiB/s
lfsr/lfsr64_divrem49.718 MiB/s50.553 MiB/s27.616 MiB/s27.371 MiB/s17.307 MiB/s17.302 MiB/s12.324 MiB/s12.312 MiB/s
lfsr/lfsr64_table540.48 MiB/s540.38 MiB/s414.77 MiB/s404.96 MiB/s240.76 MiB/s240.76 MiB/s167.68 MiB/s167.88 MiB/s
lfsr/lfsr64_small_table269.88 MiB/s267.43 MiB/s244.64 MiB/s242.61 MiB/s121.45 MiB/s121.45 MiB/s86.121 MiB/s86.094 MiB/s
lfsr/lfsr64_barret79.492 MiB/s69.227 MiB/s45.364 MiB/s40.412 MiB/s30.900 MiB/s20.358 MiB/s21.647 MiB/s11.715 MiB/s
lfsr/lfsr64_table_barret155.21 MiB/s43.711 MiB/s49.520 MiB/s21.622 MiB/s46.972 MiB/s7.3621 MiB/s36.694 MiB/s3.1524 MiB/s
lfsr/lfsr64_small_table_barret77.618 MiB/s21.981 MiB/s25.389 MiB/s11.254 MiB/s23.147 MiB/s3.6297 MiB/s16.867 MiB/s1.5732 MiB/s
AMD Ryzen-3975WX @ 6.3 GHzAMD Ryzen-3975WX @ 6.3 GHz (no-xmul)AMD FX-6300 @ 3.5 GHzAMD FX-6300 @ 3.5 GHz (no-xmul)Arm A72 @ 1.8 GHzArm A72 @ 1.8 GHz (no-xmul)Arm A53 @ 1.4 GHzArm A53 @ 1.4 GHz (no-xmul)
lfsr/xorshift644.9006 GiB/s4.9463 GiB/s2.9912 GiB/s2.9687 GiB/s2.2308 GiB/s2.2316 GiB/s1.7497 GiB/s1.7466 GiB/s

CRCs

AMD Ryzen-3975WX @ 6.3 GHzAMD Ryzen-3975WX @ 6.3 GHz (no-xmul)AMD FX-6300 @ 3.5 GHzAMD FX-6300 @ 3.5 GHz (no-xmul)Arm A72 @ 1.8 GHzArm A72 @ 1.8 GHz (no-xmul)Arm A53 @ 1.4 GHzArm A53 @ 1.4 GHz (no-xmul)
crc/naive_crc70.162 MiB/s72.168 MiB/s50.933 MiB/s51.872 MiB/s37.713 MiB/s37.731 MiB/s27.545 MiB/s27.569 MiB/s
crc/less_naive_crc76.072 MiB/s77.650 MiB/s50.547 MiB/s50.812 MiB/s39.730 MiB/s39.721 MiB/s26.656 MiB/s26.766 MiB/s
crc/word_less_naive_crc143.77 MiB/s144.38 MiB/s91.878 MiB/s103.83 MiB/s73.326 MiB/s73.330 MiB/s61.919 MiB/s61.920 MiB/s
crc/table_crc476.43 MiB/s475.45 MiB/s412.85 MiB/s444.69 MiB/s213.55 MiB/s213.32 MiB/s148.11 MiB/s147.55 MiB/s
crc/small_table_crc213.63 MiB/s215.92 MiB/s186.30 MiB/s199.50 MiB/s95.077 MiB/s95.093 MiB/s80.944 MiB/s81.181 MiB/s
crc/barret_crc147.86 MiB/s50.603 MiB/s45.476 MiB/s27.352 MiB/s44.161 MiB/s16.026 MiB/s34.457 MiB/s6.8674 MiB/s
crc/word_barret_crc664.75 MiB/s209.72 MiB/s208.67 MiB/s108.86 MiB/s213.85 MiB/s67.776 MiB/s362.81 MiB/s27.877 MiB/s
crc/reversed_barret_crc127.57 MiB/s50.016 MiB/s39.038 MiB/s24.993 MiB/s38.342 MiB/s12.993 MiB/s24.023 MiB/s5.6548 MiB/s
crc/word_reversed_barret_crc592.13 MiB/s214.57 MiB/s194.16 MiB/s110.00 MiB/s191.32 MiB/s56.501 MiB/s166.23 MiB/s22.548 MiB/s

Related Documents