Benchmark run Apple M4 · apple-m4 · full · ef9e82d3
Run Apple M4 · apple-m4 · full · ef9e82d3 started 2026-10-08T02:49:59Z on Apple M4 (macOS 27.0.1, arm64) and timed commit ef9e82d39fbf06c605e1740360370f0003dc4ca4, built by rustc 1.98.1 (48a229cea 2026-09-01) with RUSTFLAGS -C target-cpu=apple-m4, in the full profile.
1523 benchmarks from run Apple M4 · apple-m4 · full · ef9e82d3. Reading a run report explains the values, colours and tags.
Families compared
Each family’s nominal rho, this run’s costs (addition at throughput; hashing, preparation, encoding and decoding batched), the two regimes of Cost in repeated reconciliation for a set of items, a set difference of and a sketch of cells, in which a new item updates cells on average, and the mean time over seeds to find a curve and verify its certificate. Dominance is as defined in Measurement methodology. Additions are 84 to 100% of each rebuilt estimate.
| curve | security | per cell | per new item | per party and round | curve selection | dominated by | ||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| rho | add | encode | decode | hash + prepare | sums retained, | sums rebuilt, , | find | verify | measured method | available tools | ||
| GF(2^127), 16 bytes | ||||||||||||
| gf2_127(X:S:Z:T) extended accumulators, Pornin's formulas; Pornin x1: hash to addend; output already an addend | 62.8 | 14.1 ns (1.44× the best) | 13.1 ns (1.62× the best) | 14.0 ns (1.06× the best) | 61.5 ns (1.15× the best) | 252 ns (1.31× the best) | 19.2 ms (1.44× the best) | 14.6 ms | 150 µs | agm+sieve | Rust (AGM), PARI | none |
| gf2_127-lambdaincompleteλ-projective (X:L:Z) accumulators; Pornin x1: hash to addend; output already an addend | 62.8 | 14.9 ns (1.53× the best) | 10.1 ns (1.25× the best) | 14.0 ns (1.06× the best) | 53.5 ns (tied for the best, within noise) | 256 ns (1.33× the best) | 20.3 ms (1.52× the best) | 14.6 ms | 150 µs | agm+sieve | Rust (AGM), PARI | none |
| gf2_127-wincompleteλ-projective, w codec: hashes and decodes to λ-affine; Pornin x1: hash to addend; output already an addend | 62.8 | 14.9 ns (1.53× the best) | 10.3 ns (1.28× the best) | 15.1 ns (1.14× the best) | 53.5 ns (tied for the best, within noise) | 256 ns (1.32× the best) | 20.3 ms (1.52× the best) | 14.6 ms | 150 µs | agm+sieve | Rust (AGM), PARI | none |
| gf2_127-uunscaled (X:S:Z), w codec, direct addend hashes; Pornin x1: hash to addend; output already an addend | 62.8 | 10.7 ns (1.09× the best) | 9.17 ns (1.14× the best) | 18.3 ns (1.39× the best) | 57.2 ns (1.07× the best) | 202 ns (1.05× the best) | 14.6 ms (1.09× the best) | 14.6 ms | 150 µs | agm+sieve | Rust (AGM), PARI | none |
| GF(2^122) = GF(2^61)[u], dense constant, 16 bytes | ||||||||||||
| gf2_122(X:S:Z:T) extended; Pornin x1: hash to addend; output already an addend | 60.3 | 17.8 ns (1.83× the best) | 15.7 ns (1.94× the best) | 13.5 ns (1.02× the best) | 62.8 ns (1.17× the best) | 305 ns (1.58× the best) | 24.3 ms (1.82× the best) | 17.6 ms | 86.8 µs | agm | Rust (AGM), PARI | none |
| gf2_122-lambdaincompleteλ-projective; Pornin x1: hash to addend; output already an addend | 60.3 | 16.6 ns (1.70× the best) | 11.9 ns (1.48× the best) | 13.5 ns (1.02× the best) | 53.9 ns (1.01× the best) | 279 ns (1.44× the best) | 22.6 ms (1.69× the best) | 17.6 ms | 86.8 µs | agm | Rust (AGM), PARI | none |
| gf2_122-wincompleteλ-projective, w codec; Pornin x1: hash to addend; output already an addend | 60.3 | 16.6 ns (1.70× the best) | 14.4 ns (1.79× the best) | 14.4 ns (1.09× the best) | 54.0 ns (1.01× the best) | 279 ns (1.44× the best) | 22.6 ms (1.69× the best) | 17.6 ms | 86.8 µs | agm | Rust (AGM), PARI | gf2_127-lambda |
| gf2_122-uunscaled (X:S:Z), w codec; Pornin x1: hash to addend; output already an addend | 60.3 | 13.1 ns (1.34× the best) | 12.1 ns (1.49× the best) | 18.7 ns (1.42× the best) | 57.1 ns (1.07× the best) | 234 ns (1.21× the best) | 17.8 ms (1.34× the best) | 17.6 ms | 86.8 µs | agm | Rust (AGM), PARI | none |
| GF(2^122), constant in GF(2^61) (GLS-shaped), 16 bytes | ||||||||||||
| gf2_122-gls(X:S:Z:T) extended; Pornin x1: hash to addend; output already an addend | 59.8 | 16.8 ns (1.72× the best) | 15.2 ns (1.88× the best) | 13.2 ns (tied for the best, within noise) | 62.0 ns (1.16× the best) | 290 ns (1.50× the best) | 22.9 ms (1.71× the best) | 5.48 ms | 107 µs | agm | Rust (AGM), PARI | none |
| gf2_122-gls-lambdaincompleteλ-projective; Pornin x1: hash to addend; output already an addend | 59.8 | 16.6 ns (1.70× the best) | 11.6 ns (1.44× the best) | 13.2 ns (tied for the best, within noise, 1.00×) | 55.4 ns (1.04× the best) | 280 ns (1.45× the best) | 22.6 ms (1.69× the best) | 5.48 ms | 107 µs | agm | Rust (AGM), PARI | none |
| gf2_122-gls-wincompleteλ-projective, w codec; Pornin x1: hash to addend; output already an addend | 59.8 | 16.6 ns (1.70× the best) | 14.4 ns (1.79× the best) | 14.3 ns (1.08× the best) | 55.4 ns (1.04× the best) | 280 ns (1.45× the best) | 22.6 ms (1.69× the best) | 5.48 ms | 107 µs | agm | Rust (AGM), PARI | gf2_127-lambda |
| gf2_122-gls-uunscaled (X:S:Z), w codec; Pornin x1: hash to addend; output already an addend | 59.8 | 13.1 ns (1.34× the best) | 12.3 ns (1.52× the best) | 16.8 ns (1.27× the best) | 55.7 ns (1.04× the best) | 233 ns (1.21× the best) | 17.9 ms (1.34× the best) | 5.48 ms | 107 µs | agm | Rust (AGM), PARI | none |
| GF(2^109), 14 bytes | ||||||||||||
| gf2_109(X:S:Z:T) extended; Pornin x1: hash to addend; output already an addend | 53.8 | 12.8 ns (1.32× the best) | 10.9 ns (1.36× the best) | 14.2 ns (1.08× the best) | 63.7 ns (1.19× the best) | 238 ns (1.23× the best) | 17.5 ms (1.31× the best) | 17.8 ms | 93.6 µs | agm+factor | Rust (AGM), PARI | none |
| gf2_109-lambdaincompleteλ-projective; Pornin x1: hash to addend; output already an addend | 53.8 | 12.0 ns (1.23× the best) | 8.13 ns (1.01× the best) | 14.1 ns (1.07× the best) | 55.2 ns (1.03× the best) | 218 ns (1.13× the best) | 16.4 ms (1.23× the best) | 17.8 ms | 93.6 µs | agm+factor | Rust (AGM), PARI | none |
| gf2_109-wincompleteλ-projective, w codec; Pornin x1: hash to addend; output already an addend | 53.8 | 12.0 ns (1.23× the best) | 10.4 ns (1.28× the best) | 15.5 ns (1.17× the best) | 54.5 ns (1.02× the best) | 217 ns (1.12× the best) | 16.3 ms (1.22× the best) | 17.8 ms | 93.6 µs | agm+factor | Rust (AGM), PARI | none |
| gf2_109-uunscaled (X:S:Z), w codec; Pornin x1: hash to addend; output already an addend | 53.8 | 9.76 ns (best) | 9.88 ns (1.22× the best) | 18.4 ns (1.39× the best) | 60.7 ns (1.13× the best) | 193 ns (best) | 13.3 ms (best) | 17.8 ms | 93.6 µs | agm+factor | Rust (AGM), PARI | none |
| F_p, p = 2^127 − 1, 16 bytes | ||||||||||||
| edwards127a = 1 Edwards, extended += cached | 62.3 | 20.1 ns (2.06× the best) | 22.0 ns (2.72× the best) | 486 ns (36.80× the best) | 1.10 µs (20.50× the best) | 1.37 µs (7.09× the best) | 29.0 ms (2.17× the best) | 760 ms | 435 µs | pari+sieve | PARI | gf2_127, gf2_127-lambda, gf2_127-u, gf2_127-w |
| weier127short Weierstrass, projective += affine | 63.3 | 45.4 ns (4.65× the best) | 10.1 ns (1.25× the best) | 485 ns (36.73× the best) | 1.04 µs (19.37× the best) | 1.65 µs (8.56× the best) | 63.3 ms (4.74× the best) | 888 ms | 210 µs | pari+sieve | PARI | none |
| weier127-jacobianincompleteshort Weierstrass, Jacobian += affine | 63.3 | 37.5 ns (3.84× the best) | 15.7 ns (1.94× the best) | 485 ns (36.77× the best) | 1.04 µs (19.42× the best) | 1.55 µs (8.01× the best) | 52.6 ms (3.94× the best) | 888 ms | 210 µs | pari+sieve | PARI | none |
| F_p, p = 2^107 − 1, 14 bytes | ||||||||||||
| edwards107a = 1 Edwards, extended += cached | 52.3 | 15.5 ns (1.59× the best) | 20.3 ns (2.51× the best) | 354 ns (26.79× the best) | 828 ns (15.47× the best) | 1.04 µs (5.37× the best) | 22.3 ms (1.67× the best) | Sage | gf2_109, gf2_109-lambda, gf2_109-u, gf2_109-w, gf2_122-gls-u, gf2_122-u, gf2_127, gf2_127-lambda, gf2_127-u, gf2_127-w | |||
| weier107short Weierstrass, projective += affine | 53.3 | 30.5 ns (3.12× the best) | 11.5 ns (1.42× the best) | 352 ns (26.66× the best) | 749 ns (13.99× the best) | 1.16 µs (6.02× the best) | 42.6 ms (3.19× the best) | Sage | gf2_109, gf2_109-lambda, gf2_109-u, gf2_109-w, gf2_127-lambda, gf2_127-u, gf2_127-w | |||
| weier107-jacobianincompleteshort Weierstrass, Jacobian += affine | 53.3 | 28.7 ns (2.94× the best) | 15.3 ns (1.90× the best) | 352 ns (26.63× the best) | 746 ns (13.94× the best) | 1.13 µs (5.88× the best) | 40.2 ms (3.01× the best) | Sage | gf2_109, gf2_109-lambda, gf2_109-u, gf2_109-w, gf2_122-gls, gf2_122-gls-lambda, gf2_122-gls-u, gf2_122-gls-w, gf2_122-lambda, gf2_122-u, gf2_122-w, gf2_127, gf2_127-lambda, gf2_127-u, gf2_127-w | |||
| F_p, p = 2^128 − 275, 16 bytes | ||||||||||||
| twisted128a = −1 twisted Edwards modulo 2-torsion, extended += cached | 62.8 | 23.9 ns (2.45× the best) | 16.0 ns (1.98× the best) | 952 ns (72.09× the best) | 1.93 µs (36.08× the best) | 2.25 µs (11.68× the best) | 35.7 ms (2.67× the best) | Sage | gf2_127, gf2_127-lambda, gf2_127-u, gf2_127-w, twisted64x2 | |||
| F_{p²}, p = 2^61 − 1, 16 bytes | ||||||||||||
| edwards61x2a = 1 Edwards, signed-x codec, extended += cached | 59.8 | 13.3 ns (1.37× the best) | 16.2 ns (2.01× the best) | 404 ns (30.63× the best) | 639 ns (11.94× the best) | 820 ns (4.25× the best) | 19.3 ms (1.45× the best) | 360 ms | 200 µs | pari+sieve | PARI | gf2_122-gls-u, gf2_122-u, gf2_127-u |
| weier61x2short Weierstrass, signed-x codec, projective += affine | 60.8 | 26.8 ns (2.74× the best) | 8.11 ns (tied for the best, within noise, 1.00×) | 412 ns (31.22× the best) | 637 ns (11.91× the best) | 1.00 µs (5.18× the best) | 37.5 ms (2.81× the best) | 401 ms | 132 µs | pari+sieve | PARI | none |
| weier61x2-jacobianincompleteshort Weierstrass, signed-x codec, Jacobian += affine | 60.8 | 31.6 ns (3.24× the best) | 11.7 ns (1.45× the best) | 413 ns (31.25× the best) | 638 ns (11.92× the best) | 1.07 µs (5.53× the best) | 44.2 ms (3.31× the best) | 401 ms | 132 µs | pari+sieve | PARI | gf2_127-lambda, gf2_127-u, gf2_127-w |
| twisted61x2a = −1 Edwards modulo 2-torsion, extended += cached | 59.8 | 12.5 ns (1.28× the best) | 8.07 ns (tied for the best, within noise) | 420 ns (31.80× the best) | 636 ns (11.88× the best) | 805 ns (4.17× the best) | 18.2 ms (1.36× the best) | 803 ms | 272 µs | pari+sieve | PARI | none |
| F_{p²}, p = 2^64 − 59, 16 bytes | ||||||||||||
| twisted64x2a = −1 Edwards modulo 2-torsion, extended += cached | 62.8 | 17.2 ns (1.77× the best) | 10.3 ns (1.28× the best) | 718 ns (54.39× the best) | 1.11 µs (20.66× the best) | 1.34 µs (6.94× the best) | 25.5 ms (1.91× the best) | 1.33 s | 545 µs | pari+sieve | PARI | gf2_127-lambda, gf2_127-u |
| F_{p²}, p = 2^64 − 2^32 + 1, 16 bytes | ||||||||||||
| twisted-goldilocks2a = −1 Edwards modulo 2-torsion, extended += cached | 62.8 | 15.0 ns (1.54× the best) | 11.3 ns (1.40× the best) | 1.52 µs (114.99× the best) | 1.76 µs (32.80× the best) | 1.96 µs (10.14× the best) | 24.2 ms (1.81× the best) | 1.19 s | 596 µs | pari+sieve | PARI | gf2_127-lambda, gf2_127-u, gf2_127-w |
bold: the best of its column; italic, dotted: tied with the best within the confidence intervals; shading: ratio to the best, pale yellow at 1× to purple at 16× or more; grey: baseline, not compared.
Machine
| Apple M4 · apple-m4 · full · ef9e82d3 | |
|---|---|
| CPU | Apple M4, 10 cores, 24 GiB |
| OS | macOS 27.0.1 (Darwin 27.0.0, arm64) |
| rustc | rustc 1.98.1 (48a229cea 2026-09-01) |
| RUSTFLAGS | -C target-cpu=apple-m4 |
| field backend features | aes, neon |
| commit | ef9e82d39fbf06c605e1740360370f0003dc4ca4 |
| suites | compare compare107 compare109 compare122 compare_fp2 group riblt agm sieve curvegen |
| profile | full |
| criterion arguments | –warm-up-time 3 –measurement-time 5 –sample-size 100 –nresamples 100000 |
| run | 2026-10-08T02:49:59Z .. 2026-10-08T07:06:13Z |
Load averages by phase while the run timed (Measurement methodology).
| phase | seconds | 1-minute average, mean | runnable, mean | runnable, most |
|---|---|---|---|---|
| idle before | 25 | 3.47 | 1.87 | 4.0 |
| compare | 670 | 3.86 | 3.95 | 26.0 |
| compare107 | 245 | 3.89 | 3.72 | 14.0 |
| compare109 | 250 | 4.58 | 5.03 | 11.0 |
| compare122 | 410 | 5.07 | 4.72 | 15.0 |
| compare_fp2 | 565 | 3.41 | 3.43 | 6.0 |
| group | 3660 | 1.99 | 1.99 | 18.0 |
| group wide | 2740 | 2.28 | 2.25 | 59.1 |
| riblt mapping | 310 | 1.78 | 1.87 | 10.1 |
| riblt plan | 20 | 2.52 | 2.75 | 4.0 |
| riblt | 5680 | 2.02 | 2.01 | 50.1 |
| agm | 85 | 2.25 | 2.75 | 12.0 |
| sieve | 225 | 2.00 | 1.91 | 4.1 |
| curvegen | 90 | 2.00 | 2.06 | 6.2 |
| curvegen searches | 235 | 2.19 | 2.35 | 7.9 |
| idle after | 25 | 2.66 | 2.39 | 3.0 |
Group benchmark plan
Which families the group suite’s second pass timed. Its first pass timed every family’s core rows; from them and the comparison maps, bench-run chose the families whose modeled insertion at was within 50% of the cheapest (lead) and, if none of them was over a field of odd characteristic, the cheapest that was (contrast). The second pass added the batch sweep, subtraction, equality on pure cells and the hashes of IDs (The group plan).
| family | role |
|---|---|
| binary-u.109 | lead |
| binary-u.127 | lead |
| binary-w.109 | lead |
| binary-lambda.109 | lead |
| binary-u.122-gls | lead |
| binary-u.122 | lead |
| binary.109 | lead |
| binary.127 | lead |
| binary-w.127 | lead |
| binary-lambda.127 | lead |
| binary-lambda.122 | lead |
| binary-w.122 | lead |
| binary-w.122-gls | lead |
| binary-lambda.122-gls | lead |
| twisted.61x2 | contrast |
RIBLT benchmark plan
Which RIBLT benchmarks this run generated. Before the RIBLT suite ran, bench-run chose from this run’s group and hash-to-curve results, for each family below, the hash its RIBLT benchmarks use and their scope: every sweep (full), each axis’s endpoints and middle (buffer), or one point of each benchmark (spot); and for full and buffer scope, the field whose projection hashes the family’s IDs cheapest and the one whose projection seeds mappings cheapest, under which it also encodes and peels cells keyed by IDs. The plan records what was measured, not a result; the XOR checksums and ristretto255 are timed in full regardless (The RIBLT plan).
| family | hash | scope | projection | mapping projection |
|---|---|---|---|---|
| binary-lambda.109 | pornin-addend | full | gf2_127 | gf2_127 |
| binary-lambda.122 | pornin-addend | buffer | gf2_127 | gf2_127 |
| binary-lambda.122-gls | pornin-addend | buffer | gf2_127 | gf2_127 |
| binary-lambda.127 | pornin-addend | buffer | gf2_127 | gf2_127 |
| binary-u.109 | pornin-addend | full | gf2_127 | gf2_127 |
| binary-u.122 | pornin-addend | buffer | gf2_127 | gf2_127 |
| binary-u.122-gls | pornin-addend | buffer | gf2_127 | gf2_127 |
| binary-u.127 | pornin-addend | full | gf2_127 | gf2_127 |
| binary-w.109 | pornin-addend | full | gf2_127 | gf2_127 |
| binary-w.122 | pornin-addend | buffer | gf2_127 | gf2_127 |
| binary-w.122-gls | pornin-addend | buffer | gf2_127 | gf2_127 |
| binary-w.127 | pornin-addend | buffer | gf2_127 | gf2_127 |
| binary.109 | pornin | buffer | gf2_127 | gf2_127 |
| binary.122 | pornin | buffer | ||
| binary.122-gls | pornin | buffer | ||
| binary.127 | pornin | buffer | gf2_127 | gf2_127 |
| edwards.107 | ti | spot | ||
| edwards.127 | ti | spot | ||
| edwards.61x2 | ti | spot | ||
| twisted.128 | ti | spot | ||
| twisted.61x2 | ti | spot | ||
| twisted.64x2 | ti | spot | ||
| twisted.goldilocks2 | ti | spot | ||
| weier-jacobian.107 | ti | spot | ||
| weier-jacobian.127 | ti | spot | ||
| weier-jacobian.61x2 | ti | spot | ||
| weier.107 | ti | spot | ||
| weier.127 | ti | spot | ||
| weier.61x2 | ti | spot |
Insertion
Modeled insertion per item into a sketch of cells: a hash, a prepare, and an addition to each of the cells the item maps to on average (: ; : ; : ; : ; : ), by compatible recipes (Reading a run report). The references (xor, ristretto255) have no batched hash: they hash one item at a time, add the hash output as is, and are in the figure and the second grid. Each total also counts, the same for every family, the salted SHA-256 map digest and the xoshiro256pp walk through the item’s indices below (riblt.mapping): 39.4 ns at , 44.6 ns at , 54.4 ns at , 68.8 ns at , 90.0 ns at . The key XOR and count of each cell are not modelled; riblt.cells measures them with the rest of the cell updates.
| curve | per item, once | per cell | per item, into k cells | |||||
|---|---|---|---|---|---|---|---|---|
| hash (batched) | prepare (batched) | add (throughput) | : | : | : | : | : | |
| GF(2^127), 16 bytes | ||||||||
| gf2_127(X:S:Z:T) extended accumulators, Pornin's formulas | 72.9 ns (1.36× the best) | 3.54 ns (7.69× the best) | 14.1 ns (1.44× the best) | 157 ns (1.23× the best) | 195 ns (1.25× the best) | 260 ns (1.27× the best) | 336 ns (1.28× the best) | 419 ns (1.29× the best) |
| gf2_127compare suitePornin x1: hash to addend; output already an addend | 61.5 ns (1.15× the best) | in the hash | 14.1 ns (1.44× the best) | 142 ns (1.11× the best) | 180 ns (1.15× the best) | 245 ns (1.20× the best) | 321 ns (1.23× the best) | 404 ns (1.24× the best) |
| gf2_127-lambdaincompleteλ-projective (X:L:Z) accumulators | 75.6 ns (1.41× the best) | 6.33 ns (13.74× the best) | 14.9 ns (1.53× the best) | 165 ns (1.29× the best) | 205 ns (1.31× the best) | 274 ns (1.34× the best) | 353 ns (1.35× the best) | 440 ns (1.35× the best) |
| gf2_127-lambdaincompletecompare suitehashed straight to : no prepare | 72.8 ns (1.36× the best) | in the hash | 14.9 ns (1.53× the best) | 156 ns (1.22× the best) | 196 ns (1.25× the best) | 264 ns (1.29× the best) | 344 ns (1.31× the best) | 431 ns (1.32× the best) |
| gf2_127-lambdaincompletecompare suitePornin x1: hash to addend; output already an addend | 53.5 ns (tied for the best, within noise) | in the hash | 14.9 ns (1.53× the best) | 136 ns (1.07× the best) | 177 ns (1.13× the best) | 245 ns (1.20× the best) | 325 ns (1.24× the best) | 412 ns (1.26× the best) |
| gf2_127-wincompleteλ-projective, w codec: hashes and decodes to λ-affine | 83.3 ns (1.56× the best) | 0.48 ns (1.05× the best) | 14.9 ns (1.53× the best) | 166 ns (1.30× the best) | 207 ns (1.32× the best) | 275 ns (1.34× the best) | 355 ns (1.35× the best) | 441 ns (1.35× the best) |
| gf2_127-wincompletecompare suitePornin x1: hash to addend; output already an addend | 53.5 ns (tied for the best, within noise) | in the hash | 14.9 ns (1.53× the best) | 136 ns (1.07× the best) | 177 ns (1.13× the best) | 245 ns (1.20× the best) | 324 ns (1.24× the best) | 411 ns (1.26× the best) |
| gf2_127-uunscaled (X:S:Z), w codec, direct addend hashes | 85.8 ns (1.60× the best) | 0.49 ns (1.06× the best) | 10.7 ns (1.09× the best) | 157 ns (1.23× the best) | 187 ns (1.19× the best) | 239 ns (1.17× the best) | 300 ns (1.14× the best) | 368 ns (1.13× the best) |
| gf2_127-ucompare suitePornin x1: hash to addend; output already an addend | 57.2 ns (1.07× the best) | in the hash | 10.7 ns (1.09× the best) | 128 ns (tied for the best, within noise) | 158 ns (tied for the best, within noise, 1.01×) | 210 ns (1.02× the best) | 271 ns (1.03× the best) | 339 ns (1.04× the best) |
| GF(2^122) = GF(2^61)[u], dense constant, 16 bytes | ||||||||
| gf2_122(X:S:Z:T) extended | 74.9 ns (1.40× the best) | 5.02 ns (10.91× the best) | 17.8 ns (1.83× the best) | 171 ns (1.34× the best) | 219 ns (1.40× the best) | 298 ns (1.46× the best) | 391 ns (1.49× the best) | 490 ns (1.50× the best) |
| gf2_122compare suitePornin x1: hash to addend; output already an addend | 62.8 ns (1.17× the best) | in the hash | 17.8 ns (1.83× the best) | 154 ns (1.21× the best) | 202 ns (1.29× the best) | 281 ns (1.37× the best) | 374 ns (1.43× the best) | 473 ns (1.45× the best) |
| gf2_122-lambdaincompleteλ-projective | 74.9 ns (1.40× the best) | 7.55 ns (16.38× the best) | 16.6 ns (1.70× the best) | 170 ns (1.33× the best) | 215 ns (1.37× the best) | 289 ns (1.41× the best) | 376 ns (1.44× the best) | 470 ns (1.44× the best) |
| gf2_122-lambdaincompletecompare suitehashed straight to : no prepare | 72.3 ns (1.35× the best) | in the hash | 16.6 ns (1.70× the best) | 160 ns (1.25× the best) | 204 ns (1.30× the best) | 279 ns (1.36× the best) | 366 ns (1.40× the best) | 460 ns (1.41× the best) |
| gf2_122-lambdaincompletecompare suitePornin x1: hash to addend; output already an addend | 53.9 ns (1.01× the best) | in the hash | 16.6 ns (1.70× the best) | 141 ns (1.11× the best) | 186 ns (1.19× the best) | 261 ns (1.27× the best) | 347 ns (1.33× the best) | 441 ns (1.35× the best) |
| gf2_122-wincompleteλ-projective, w codec | 76.8 ns (1.43× the best) | 0.46 ns (tied for the best, within noise) | 16.6 ns (1.70× the best) | 165 ns (1.29× the best) | 209 ns (1.34× the best) | 284 ns (1.39× the best) | 371 ns (1.42× the best) | 465 ns (1.43× the best) |
| gf2_122-wincompletecompare suitePornin x1: hash to addend; output already an addend | 54.0 ns (1.01× the best) | in the hash | 16.6 ns (1.70× the best) | 141 ns (1.11× the best) | 186 ns (1.19× the best) | 261 ns (1.27× the best) | 348 ns (1.33× the best) | 442 ns (1.35× the best) |
| gf2_122-uunscaled (X:S:Z), w codec | 87.6 ns (1.64× the best) | 0.48 ns (1.04× the best) | 13.1 ns (1.34× the best) | 165 ns (1.30× the best) | 202 ns (1.29× the best) | 263 ns (1.28× the best) | 334 ns (1.28× the best) | 413 ns (1.27× the best) |
| gf2_122-ucompare suitePornin x1: hash to addend; output already an addend | 57.1 ns (1.07× the best) | in the hash | 13.1 ns (1.34× the best) | 134 ns (1.05× the best) | 171 ns (1.09× the best) | 232 ns (1.13× the best) | 303 ns (1.16× the best) | 382 ns (1.17× the best) |
| GF(2^122), constant in GF(2^61) (GLS-shaped), 16 bytes | ||||||||
| gf2_122-gls(X:S:Z:T) extended | 74.7 ns (1.40× the best) | 4.44 ns (9.63× the best) | 16.8 ns (1.72× the best) | 167 ns (1.31× the best) | 213 ns (1.35× the best) | 288 ns (1.41× the best) | 376 ns (1.43× the best) | 471 ns (1.44× the best) |
| gf2_122-glscompare suitePornin x1: hash to addend; output already an addend | 62.0 ns (1.16× the best) | in the hash | 16.8 ns (1.72× the best) | 150 ns (1.18× the best) | 195 ns (1.25× the best) | 271 ns (1.32× the best) | 358 ns (1.37× the best) | 453 ns (1.39× the best) |
| gf2_122-gls-lambdaincompleteλ-projective | 76.5 ns (1.43× the best) | 7.53 ns (16.36× the best) | 16.6 ns (1.70× the best) | 171 ns (1.34× the best) | 216 ns (1.38× the best) | 291 ns (1.42× the best) | 378 ns (1.44× the best) | 472 ns (1.45× the best) |
| gf2_122-gls-lambdaincompletecompare suitehashed straight to : no prepare | 73.8 ns (1.38× the best) | in the hash | 16.6 ns (1.70× the best) | 161 ns (1.26× the best) | 206 ns (1.31× the best) | 281 ns (1.37× the best) | 367 ns (1.40× the best) | 461 ns (1.42× the best) |
| gf2_122-gls-lambdaincompletecompare suitePornin x1: hash to addend; output already an addend | 55.4 ns (1.04× the best) | in the hash | 16.6 ns (1.70× the best) | 143 ns (1.12× the best) | 188 ns (1.20× the best) | 262 ns (1.28× the best) | 349 ns (1.33× the best) | 443 ns (1.36× the best) |
| gf2_122-gls-wincompleteλ-projective, w codec | 78.6 ns (1.47× the best) | 0.49 ns (1.06× the best) | 16.6 ns (1.70× the best) | 167 ns (1.31× the best) | 211 ns (1.35× the best) | 286 ns (1.40× the best) | 373 ns (1.42× the best) | 467 ns (1.43× the best) |
| gf2_122-gls-wincompletecompare suitePornin x1: hash to addend; output already an addend | 55.4 ns (1.04× the best) | in the hash | 16.6 ns (1.70× the best) | 143 ns (1.12× the best) | 188 ns (1.20× the best) | 262 ns (1.28× the best) | 349 ns (1.33× the best) | 443 ns (1.36× the best) |
| gf2_122-gls-uunscaled (X:S:Z), w codec | 80.2 ns (1.50× the best) | 0.48 ns (1.04× the best) | 13.1 ns (1.34× the best) | 158 ns (1.24× the best) | 195 ns (1.24× the best) | 255 ns (1.25× the best) | 327 ns (1.25× the best) | 406 ns (1.25× the best) |
| gf2_122-gls-ucompare suitePornin x1: hash to addend; output already an addend | 55.7 ns (1.04× the best) | in the hash | 13.1 ns (1.34× the best) | 133 ns (1.04× the best) | 170 ns (1.08× the best) | 231 ns (1.13× the best) | 302 ns (1.15× the best) | 381 ns (1.17× the best) |
| GF(2^109), 14 bytes | ||||||||
| gf2_109(X:S:Z:T) extended | 81.7 ns (1.53× the best) | 2.79 ns (6.06× the best) | 12.8 ns (1.32× the best) | 161 ns (1.26× the best) | 197 ns (1.26× the best) | 257 ns (1.25× the best) | 328 ns (1.25× the best) | 405 ns (1.24× the best) |
| gf2_109compare suitePornin x1: hash to addend; output already an addend | 63.7 ns (1.19× the best) | in the hash | 12.8 ns (1.32× the best) | 140 ns (1.10× the best) | 176 ns (1.12× the best) | 236 ns (1.15× the best) | 307 ns (1.17× the best) | 385 ns (1.18× the best) |
| gf2_109-lambdaincompleteλ-projective | 82.0 ns (1.53× the best) | 5.17 ns (11.22× the best) | 12.0 ns (1.23× the best) | 161 ns (1.27× the best) | 195 ns (1.24× the best) | 252 ns (1.23× the best) | 319 ns (1.22× the best) | 392 ns (1.20× the best) |
| gf2_109-lambdaincompletecompare suitehashed straight to : no prepare | 77.6 ns (1.45× the best) | in the hash | 12.0 ns (1.23× the best) | 152 ns (1.19× the best) | 186 ns (1.18× the best) | 242 ns (1.18× the best) | 309 ns (1.18× the best) | 383 ns (1.17× the best) |
| gf2_109-lambdaincompletecompare suitePornin x1: hash to addend; output already an addend | 55.2 ns (1.03× the best) | in the hash | 12.0 ns (1.23× the best) | 129 ns (1.01× the best) | 163 ns (1.04× the best) | 220 ns (1.07× the best) | 287 ns (1.09× the best) | 361 ns (1.11× the best) |
| gf2_109-wincompleteλ-projective, w codec | 79.4 ns (1.48× the best) | 0.48 ns (1.04× the best) | 12.0 ns (1.23× the best) | 154 ns (1.21× the best) | 188 ns (1.20× the best) | 244 ns (1.19× the best) | 311 ns (1.19× the best) | 385 ns (1.18× the best) |
| gf2_109-wincompletecompare suitePornin x1: hash to addend; output already an addend | 54.5 ns (1.02× the best) | in the hash | 12.0 ns (1.23× the best) | 129 ns (tied for the best, within noise, 1.01×) | 162 ns (1.04× the best) | 219 ns (1.07× the best) | 286 ns (1.09× the best) | 360 ns (1.10× the best) |
| gf2_109-uunscaled (X:S:Z), w codec | 81.2 ns (1.52× the best) | 0.49 ns (1.05× the best) | 9.76 ns (tied for the best, within noise) | 149 ns (1.17× the best) | 178 ns (1.13× the best) | 226 ns (1.10× the best) | 283 ns (1.08× the best) | 347 ns (1.06× the best) |
| gf2_109-ucompare suitePornin x1: hash to addend; output already an addend | 60.7 ns (1.13× the best) | in the hash | 9.76 ns (tied for the best, within noise) | 128 ns (tied for the best, within noise, 1.01×) | 157 ns (tied for the best, within noise) | 205 ns (best) | 262 ns (best) | 326 ns (best) |
| F_p, p = 2^127 − 1, 16 bytes | ||||||||
| edwards127a = 1 Edwards, extended += cached | 1.07 µs (19.97× the best) | 28.3 ns (61.37× the best) | 20.1 ns (2.06× the best) | 1.19 µs (9.37× the best) | 1.25 µs (7.95× the best) | 1.34 µs (6.52× the best) | 1.44 µs (5.49× the best) | 1.55 µs (4.75× the best) |
| weier127short Weierstrass, projective += affine | 1.04 µs (19.36× the best) | 0.46 ns (tied for the best, within noise, 1.00×) | 45.4 ns (4.65× the best) | 1.21 µs (9.47× the best) | 1.32 µs (8.42× the best) | 1.51 µs (7.36× the best) | 1.72 µs (6.57× the best) | 1.94 µs (5.96× the best) |
| weier127-jacobianincompleteshort Weierstrass, Jacobian += affine | 1.04 µs (19.41× the best) | 0.49 ns (1.06× the best) | 37.5 ns (3.84× the best) | 1.19 µs (9.31× the best) | 1.28 µs (8.17× the best) | 1.44 µs (7.02× the best) | 1.62 µs (6.17× the best) | 1.80 µs (5.53× the best) |
| F_p, p = 2^107 − 1, 14 bytes | ||||||||
| edwards107a = 1 Edwards, extended += cached | 805 ns (15.04× the best) | 22.7 ns (49.36× the best) | 15.5 ns (1.59× the best) | 912 ns (7.15× the best) | 954 ns (6.08× the best) | 1.02 µs (5.00× the best) | 1.11 µs (4.23× the best) | 1.20 µs (3.67× the best) |
| weier107short Weierstrass, projective += affine | 748 ns (13.98× the best) | 0.49 ns (1.07× the best) | 30.5 ns (3.12× the best) | 876 ns (6.87× the best) | 954 ns (6.08× the best) | 1.08 µs (5.29× the best) | 1.23 µs (4.70× the best) | 1.39 µs (4.25× the best) |
| weier107-jacobianincompleteshort Weierstrass, Jacobian += affine | 745 ns (13.93× the best) | 0.48 ns (1.04× the best) | 28.7 ns (2.94× the best) | 868 ns (6.81× the best) | 942 ns (6.01× the best) | 1.06 µs (5.19× the best) | 1.20 µs (4.60× the best) | 1.35 µs (4.14× the best) |
| F_p, p = 2^128 − 275, 16 bytes | ||||||||
| twisted128a = −1 twisted Edwards modulo 2-torsion, extended += cached | 1.92 µs (35.93× the best) | 8.08 ns (17.55× the best) | 23.9 ns (2.45× the best) | 2.04 µs (15.99× the best) | 2.10 µs (13.40× the best) | 2.20 µs (10.77× the best) | 2.32 µs (8.87× the best) | 2.45 µs (7.51× the best) |
| F_{p²}, p = 2^61 − 1, 16 bytes | ||||||||
| edwards61x2a = 1 Edwards, signed-x codec, extended += cached | 620 ns (11.59× the best) | 18.8 ns (40.87× the best) | 13.3 ns (1.37× the best) | 717 ns (5.62× the best) | 754 ns (4.81× the best) | 816 ns (3.98× the best) | 889 ns (3.39× the best) | 969 ns (2.97× the best) |
| weier61x2short Weierstrass, signed-x codec, projective += affine | 637 ns (11.90× the best) | 0.72 ns (1.56× the best) | 26.8 ns (2.74× the best) | 754 ns (5.92× the best) | 824 ns (5.25× the best) | 938 ns (4.58× the best) | 1.07 µs (4.08× the best) | 1.21 µs (3.71× the best) |
| weier61x2-jacobianincompleteshort Weierstrass, signed-x codec, Jacobian += affine | 638 ns (11.91× the best) | 0.54 ns (1.18× the best) | 31.6 ns (3.24× the best) | 769 ns (6.03× the best) | 850 ns (5.42× the best) | 984 ns (4.80× the best) | 1.14 µs (4.34× the best) | 1.30 µs (3.98× the best) |
| twisted61x2a = −1 Edwards modulo 2-torsion, extended += cached | 632 ns (11.81× the best) | 3.60 ns (7.81× the best) | 12.5 ns (1.28× the best) | 711 ns (5.58× the best) | 746 ns (4.76× the best) | 805 ns (3.93× the best) | 874 ns (3.34× the best) | 950 ns (2.91× the best) |
| F_{p²}, p = 2^64 − 59, 16 bytes | ||||||||
| twisted64x2a = −1 Edwards modulo 2-torsion, extended += cached | 1.10 µs (20.55× the best) | 5.51 ns (11.96× the best) | 17.2 ns (1.77× the best) | 1.19 µs (9.37× the best) | 1.24 µs (7.91× the best) | 1.32 µs (6.44× the best) | 1.41 µs (5.38× the best) | 1.51 µs (4.62× the best) |
| F_{p²}, p = 2^64 − 2^32 + 1, 16 bytes | ||||||||
| twisted-goldilocks2a = −1 Edwards modulo 2-torsion, extended += cached | 1.75 µs (32.71× the best) | 4.51 ns (9.78× the best) | 15.0 ns (1.54× the best) | 1.84 µs (14.41× the best) | 1.88 µs (11.98× the best) | 1.95 µs (9.51× the best) | 2.03 µs (7.74× the best) | 2.11 µs (6.49× the best) |
bold: the best of its column; italic, dotted: tied with the best within the confidence intervals; shading: ratio to the best, pale yellow at 1× to purple at 16× or more; grey: baseline, not compared.
Hashing and preparing one item at a time
| curve | per item, once | per cell | per item, into k cells | |||||
|---|---|---|---|---|---|---|---|---|
| hash (alone) | prepare (alone) | add (throughput) | : | : | : | : | : | |
| baseline | ||||||||
| xorcompare suitehash output added as is: no prepare | 24.2 ns | in the hash | 0.71 ns | 65.6 ns | 72.5 ns | 85.1 ns | 103 ns | 127 ns |
| GF(2^127), 16 bytes | ||||||||
| gf2_127(X:S:Z:T) extended accumulators, Pornin's formulas | 779 ns (2.47× the best) | 3.88 ns (6.33× the best) | 14.1 ns (1.44× the best) | 863 ns (2.18× the best) | 902 ns (2.08× the best) | 967 ns (1.96× the best) | 1.04 µs (1.84× the best) | 1.13 µs (1.75× the best) |
| gf2_127compare suitePornin x1: hash to addend; output already an addend | 485 ns (1.54× the best) | in the hash | 14.1 ns (1.44× the best) | 566 ns (1.43× the best) | 604 ns (1.40× the best) | 669 ns (1.36× the best) | 745 ns (1.32× the best) | 828 ns (1.29× the best) |
| gf2_127compare suitePornin x2: hash to addend; output already an addend | 916 ns (2.91× the best) | in the hash | 14.1 ns (1.44× the best) | 996 ns (2.51× the best) | 1.03 µs (2.39× the best) | 1.10 µs (2.23× the best) | 1.18 µs (2.08× the best) | 1.26 µs (1.95× the best) |
| gf2_127-lambdaincompleteλ-projective (X:L:Z) accumulators | 806 ns (2.56× the best) | 340 ns (553.91× the best) | 14.9 ns (1.53× the best) | 1.23 µs (3.10× the best) | 1.27 µs (2.93× the best) | 1.34 µs (2.71× the best) | 1.42 µs (2.51× the best) | 1.50 µs (2.33× the best) |
| gf2_127-lambdaincompletecompare suitehashed straight to : no prepare | 761 ns (2.42× the best) | in the hash | 14.9 ns (1.53× the best) | 843 ns (2.13× the best) | 884 ns (2.04× the best) | 952 ns (1.93× the best) | 1.03 µs (1.83× the best) | 1.12 µs (1.74× the best) |
| gf2_127-lambdaincompletecompare suitePornin x1: hash to addend; output already an addend | 456 ns (1.45× the best) | in the hash | 14.9 ns (1.53× the best) | 538 ns (1.36× the best) | 579 ns (1.34× the best) | 647 ns (1.31× the best) | 727 ns (1.29× the best) | 814 ns (1.26× the best) |
| gf2_127-wincompleteλ-projective, w codec: hashes and decodes to λ-affine | 865 ns (2.75× the best) | 0.63 ns (1.02× the best) | 14.9 ns (1.53× the best) | 948 ns (2.39× the best) | 989 ns (2.28× the best) | 1.06 µs (2.14× the best) | 1.14 µs (2.01× the best) | 1.22 µs (1.90× the best) |
| gf2_127-wincompletecompare suitePornin x1: hash to addend; output already an addend | 455 ns (1.44× the best) | in the hash | 14.9 ns (1.53× the best) | 538 ns (1.36× the best) | 578 ns (1.34× the best) | 646 ns (1.31× the best) | 726 ns (1.28× the best) | 812 ns (1.26× the best) |
| gf2_127-uunscaled (X:S:Z), w codec, direct addend hashes | 869 ns (2.76× the best) | 0.63 ns (1.03× the best) | 10.7 ns (1.09× the best) | 940 ns (2.37× the best) | 971 ns (2.24× the best) | 1.02 µs (2.07× the best) | 1.08 µs (1.92× the best) | 1.15 µs (1.79× the best) |
| gf2_127-ucompare suitePornin x1: hash to addend; output already an addend | 461 ns (1.46× the best) | in the hash | 10.7 ns (1.09× the best) | 531 ns (1.34× the best) | 562 ns (1.30× the best) | 613 ns (1.24× the best) | 674 ns (1.19× the best) | 742 ns (1.15× the best) |
| GF(2^122) = GF(2^61)[u], dense constant, 16 bytes | ||||||||
| gf2_122(X:S:Z:T) extended | 510 ns (1.62× the best) | 4.92 ns (8.02× the best) | 17.8 ns (1.83× the best) | 606 ns (1.53× the best) | 653 ns (1.51× the best) | 733 ns (1.48× the best) | 825 ns (1.46× the best) | 925 ns (1.44× the best) |
| gf2_122compare suitePornin x1: hash to addend; output already an addend | 373 ns (1.18× the best) | in the hash | 17.8 ns (1.83× the best) | 464 ns (1.17× the best) | 512 ns (1.18× the best) | 591 ns (1.20× the best) | 684 ns (1.21× the best) | 783 ns (1.22× the best) |
| gf2_122-lambdaincompleteλ-projective | 509 ns (1.62× the best) | 166 ns (271.21× the best) | 16.6 ns (1.70× the best) | 762 ns (1.92× the best) | 807 ns (1.86× the best) | 882 ns (1.79× the best) | 968 ns (1.71× the best) | 1.06 µs (1.65× the best) |
| gf2_122-lambdaincompletecompare suitehashed straight to : no prepare | 520 ns (1.65× the best) | in the hash | 16.6 ns (1.70× the best) | 607 ns (1.53× the best) | 652 ns (1.51× the best) | 727 ns (1.47× the best) | 813 ns (1.44× the best) | 907 ns (1.41× the best) |
| gf2_122-lambdaincompletecompare suitePornin x1: hash to addend; output already an addend | 326 ns (1.04× the best) | in the hash | 16.6 ns (1.70× the best) | 414 ns (1.04× the best) | 459 ns (1.06× the best) | 533 ns (1.08× the best) | 620 ns (1.10× the best) | 714 ns (1.11× the best) |
| gf2_122-wincompleteλ-projective, w codec | 517 ns (1.64× the best) | 0.63 ns (1.03× the best) | 16.6 ns (1.70× the best) | 605 ns (1.53× the best) | 650 ns (1.50× the best) | 724 ns (1.47× the best) | 811 ns (1.43× the best) | 905 ns (1.40× the best) |
| gf2_122-wincompletecompare suitePornin x1: hash to addend; output already an addend | 326 ns (1.04× the best) | in the hash | 16.6 ns (1.70× the best) | 414 ns (1.04× the best) | 459 ns (1.06× the best) | 533 ns (1.08× the best) | 620 ns (1.10× the best) | 714 ns (1.11× the best) |
| gf2_122-uunscaled (X:S:Z), w codec | 531 ns (1.69× the best) | 0.61 ns (tied for the best, within noise, 1.00×) | 13.1 ns (1.34× the best) | 609 ns (1.54× the best) | 646 ns (1.49× the best) | 706 ns (1.43× the best) | 778 ns (1.38× the best) | 857 ns (1.33× the best) |
| gf2_122-ucompare suitePornin x1: hash to addend; output already an addend | 326 ns (1.03× the best) | in the hash | 13.1 ns (1.34× the best) | 403 ns (1.02× the best) | 440 ns (1.02× the best) | 500 ns (1.01× the best) | 572 ns (1.01× the best) | 651 ns (1.01× the best) |
| GF(2^122), constant in GF(2^61) (GLS-shaped), 16 bytes | ||||||||
| gf2_122-gls(X:S:Z:T) extended | 535 ns (1.70× the best) | 4.31 ns (7.02× the best) | 16.8 ns (1.72× the best) | 628 ns (1.58× the best) | 673 ns (1.55× the best) | 748 ns (1.52× the best) | 836 ns (1.48× the best) | 931 ns (1.44× the best) |
| gf2_122-glscompare suitePornin x1: hash to addend; output already an addend | 369 ns (1.17× the best) | in the hash | 16.8 ns (1.72× the best) | 457 ns (1.15× the best) | 502 ns (1.16× the best) | 577 ns (1.17× the best) | 665 ns (1.18× the best) | 760 ns (1.18× the best) |
| gf2_122-gls-lambdaincompleteλ-projective | 515 ns (1.64× the best) | 167 ns (273.01× the best) | 16.6 ns (1.70× the best) | 770 ns (1.94× the best) | 815 ns (1.88× the best) | 889 ns (1.80× the best) | 976 ns (1.73× the best) | 1.07 µs (1.66× the best) |
| gf2_122-gls-lambdaincompletecompare suitehashed straight to : no prepare | 504 ns (1.60× the best) | in the hash | 16.6 ns (1.70× the best) | 592 ns (1.49× the best) | 637 ns (1.47× the best) | 711 ns (1.44× the best) | 798 ns (1.41× the best) | 892 ns (1.38× the best) |
| gf2_122-gls-lambdaincompletecompare suitePornin x1: hash to addend; output already an addend | 315 ns (tied for the best, within noise) | in the hash | 16.6 ns (1.70× the best) | 402 ns (1.01× the best) | 447 ns (1.03× the best) | 522 ns (1.06× the best) | 608 ns (1.08× the best) | 703 ns (1.09× the best) |
| gf2_122-gls-wincompleteλ-projective, w codec | 509 ns (1.62× the best) | 0.63 ns (1.03× the best) | 16.6 ns (1.70× the best) | 597 ns (1.51× the best) | 642 ns (1.48× the best) | 716 ns (1.45× the best) | 803 ns (1.42× the best) | 897 ns (1.39× the best) |
| gf2_122-gls-wincompletecompare suitePornin x1: hash to addend; output already an addend | 316 ns (tied for the best, within noise, 1.00×) | in the hash | 16.6 ns (1.70× the best) | 403 ns (1.02× the best) | 448 ns (1.03× the best) | 522 ns (1.06× the best) | 609 ns (1.08× the best) | 703 ns (1.09× the best) |
| gf2_122-gls-uunscaled (X:S:Z), w codec | 522 ns (1.66× the best) | 0.63 ns (1.02× the best) | 13.1 ns (1.34× the best) | 600 ns (1.51× the best) | 637 ns (1.47× the best) | 698 ns (1.41× the best) | 769 ns (1.36× the best) | 848 ns (1.32× the best) |
| gf2_122-gls-ucompare suitePornin x1: hash to addend; output already an addend | 319 ns (1.01× the best) | in the hash | 13.1 ns (1.34× the best) | 396 ns (best) | 433 ns (best) | 494 ns (best) | 565 ns (best) | 644 ns (best) |
| GF(2^109), 14 bytes | ||||||||
| gf2_109(X:S:Z:T) extended | 870 ns (2.76× the best) | 2.77 ns (4.51× the best) | 12.8 ns (1.32× the best) | 949 ns (2.40× the best) | 985 ns (2.28× the best) | 1.05 µs (2.12× the best) | 1.12 µs (1.97× the best) | 1.19 µs (1.85× the best) |
| gf2_109compare suitePornin x1: hash to addend; output already an addend | 560 ns (1.78× the best) | in the hash | 12.8 ns (1.32× the best) | 637 ns (1.61× the best) | 673 ns (1.55× the best) | 733 ns (1.48× the best) | 803 ns (1.42× the best) | 881 ns (1.37× the best) |
| gf2_109-lambdaincompleteλ-projective | 873 ns (2.77× the best) | 349 ns (568.88× the best) | 12.0 ns (1.23× the best) | 1.30 µs (3.27× the best) | 1.33 µs (3.07× the best) | 1.39 µs (2.81× the best) | 1.45 µs (2.57× the best) | 1.53 µs (2.37× the best) |
| gf2_109-lambdaincompletecompare suitehashed straight to : no prepare | 938 ns (2.98× the best) | in the hash | 12.0 ns (1.23× the best) | 1.01 µs (2.55× the best) | 1.05 µs (2.42× the best) | 1.10 µs (2.23× the best) | 1.17 µs (2.07× the best) | 1.24 µs (1.93× the best) |
| gf2_109-lambdaincompletecompare suitePornin x1: hash to addend; output already an addend | 550 ns (1.75× the best) | in the hash | 12.0 ns (1.23× the best) | 624 ns (1.58× the best) | 658 ns (1.52× the best) | 715 ns (1.45× the best) | 782 ns (1.38× the best) | 856 ns (1.33× the best) |
| gf2_109-wincompleteλ-projective, w codec | 855 ns (2.72× the best) | 0.61 ns (tied for the best, within noise) | 12.0 ns (1.23× the best) | 930 ns (2.35× the best) | 964 ns (2.23× the best) | 1.02 µs (2.07× the best) | 1.09 µs (1.92× the best) | 1.16 µs (1.80× the best) |
| gf2_109-wincompletecompare suitePornin x1: hash to addend; output already an addend | 535 ns (1.70× the best) | in the hash | 12.0 ns (1.23× the best) | 609 ns (1.54× the best) | 643 ns (1.48× the best) | 699 ns (1.42× the best) | 766 ns (1.35× the best) | 840 ns (1.30× the best) |
| gf2_109-uunscaled (X:S:Z), w codec | 874 ns (2.77× the best) | 0.63 ns (1.02× the best) | 9.76 ns (tied for the best, within noise) | 942 ns (2.38× the best) | 970 ns (2.24× the best) | 1.02 µs (2.06× the best) | 1.08 µs (1.90× the best) | 1.14 µs (1.77× the best) |
| gf2_109-ucompare suitePornin x1: hash to addend; output already an addend | 533 ns (1.69× the best) | in the hash | 9.76 ns (tied for the best, within noise) | 600 ns (1.51× the best) | 629 ns (1.45× the best) | 677 ns (1.37× the best) | 734 ns (1.30× the best) | 798 ns (1.24× the best) |
| F_p, p = 2^127 − 1, 16 bytes | ||||||||
| edwards127a = 1 Edwards, extended += cached | 1.07 µs (3.39× the best) | 582 ns (948.36× the best) | 20.1 ns (2.06× the best) | 1.75 µs (4.41× the best) | 1.80 µs (4.16× the best) | 1.89 µs (3.83× the best) | 1.99 µs (3.52× the best) | 2.10 µs (3.26× the best) |
| edwards127compare suiteElligator 2 x1: hash + prepare | 1.29 µs (4.08× the best) | 582 ns (948.36× the best) | 20.1 ns (2.06× the best) | 1.96 µs (4.96× the best) | 2.02 µs (4.66× the best) | 2.11 µs (4.26× the best) | 2.21 µs (3.90× the best) | 2.32 µs (3.60× the best) |
| weier127short Weierstrass, projective += affine | 1.03 µs (3.26× the best) | 0.61 ns (tied for the best, within noise, 1.00×) | 45.4 ns (4.65× the best) | 1.20 µs (3.02× the best) | 1.31 µs (3.03× the best) | 1.50 µs (3.04× the best) | 1.71 µs (3.03× the best) | 1.93 µs (3.00× the best) |
| weier127compare suiteSSWU x1: hash + prepare | 1.10 µs (3.50× the best) | 0.61 ns (tied for the best, within noise, 1.00×) | 45.4 ns (4.65× the best) | 1.27 µs (3.21× the best) | 1.39 µs (3.20× the best) | 1.57 µs (3.19× the best) | 1.79 µs (3.16× the best) | 2.01 µs (3.12× the best) |
| weier127-jacobianincompleteshort Weierstrass, Jacobian += affine | 1.03 µs (3.28× the best) | 0.62 ns (tied for the best, within noise, 1.01×) | 37.5 ns (3.84× the best) | 1.18 µs (2.98× the best) | 1.28 µs (2.95× the best) | 1.43 µs (2.90× the best) | 1.61 µs (2.85× the best) | 1.80 µs (2.79× the best) |
| F_p, p = 2^107 − 1, 14 bytes | ||||||||
| edwards107a = 1 Edwards, extended += cached | 806 ns (2.56× the best) | 546 ns (889.89× the best) | 15.5 ns (1.59× the best) | 1.44 µs (3.62× the best) | 1.48 µs (3.41× the best) | 1.55 µs (3.14× the best) | 1.63 µs (2.88× the best) | 1.72 µs (2.67× the best) |
| edwards107compare suiteElligator 2 x1: hash + prepare | 1.07 µs (3.38× the best) | 546 ns (889.89× the best) | 15.5 ns (1.59× the best) | 1.70 µs (4.28× the best) | 1.74 µs (4.01× the best) | 1.81 µs (3.66× the best) | 1.89 µs (3.34× the best) | 1.98 µs (3.07× the best) |
| weier107short Weierstrass, projective += affine | 746 ns (2.37× the best) | 0.62 ns (tied for the best, within noise, 1.01×) | 30.5 ns (3.12× the best) | 874 ns (2.21× the best) | 952 ns (2.20× the best) | 1.08 µs (2.19× the best) | 1.23 µs (2.17× the best) | 1.38 µs (2.15× the best) |
| weier107compare suiteSSWU x1: hash + prepare | 1.04 µs (3.30× the best) | 0.62 ns (tied for the best, within noise, 1.01×) | 30.5 ns (3.12× the best) | 1.17 µs (2.95× the best) | 1.25 µs (2.88× the best) | 1.37 µs (2.78× the best) | 1.52 µs (2.69× the best) | 1.68 µs (2.60× the best) |
| weier107-jacobianincompleteshort Weierstrass, Jacobian += affine | 742 ns (2.36× the best) | 0.62 ns (tied for the best, within noise, 1.00×) | 28.7 ns (2.94× the best) | 866 ns (2.18× the best) | 939 ns (2.17× the best) | 1.06 µs (2.15× the best) | 1.20 µs (2.12× the best) | 1.35 µs (2.09× the best) |
| F_p, p = 2^128 − 275, 16 bytes | ||||||||
| twisted128a = −1 twisted Edwards modulo 2-torsion, extended += cached | 1.92 µs (6.11× the best) | 8.24 ns (13.43× the best) | 23.9 ns (2.45× the best) | 2.04 µs (5.15× the best) | 2.10 µs (4.86× the best) | 2.21 µs (4.47× the best) | 2.33 µs (4.11× the best) | 2.45 µs (3.81× the best) |
| twisted128compare suiteElligator 2 x1: hash + prepare | 3.32 µs (10.55× the best) | 8.24 ns (13.43× the best) | 23.9 ns (2.45× the best) | 3.44 µs (8.68× the best) | 3.50 µs (8.09× the best) | 3.60 µs (7.30× the best) | 3.72 µs (6.58× the best) | 3.85 µs (5.98× the best) |
| F_{p²}, p = 2^61 − 1, 16 bytes | ||||||||
| edwards61x2a = 1 Edwards, signed-x codec, extended += cached | 624 ns (1.98× the best) | 216 ns (352.47× the best) | 13.3 ns (1.37× the best) | 918 ns (2.32× the best) | 956 ns (2.21× the best) | 1.02 µs (2.06× the best) | 1.09 µs (1.93× the best) | 1.17 µs (1.82× the best) |
| edwards61x2compare suiteElligator 2 x1: hash + prepare | 734 ns (2.33× the best) | 216 ns (352.47× the best) | 13.3 ns (1.37× the best) | 1.03 µs (2.59× the best) | 1.07 µs (2.46× the best) | 1.13 µs (2.28× the best) | 1.20 µs (2.12× the best) | 1.28 µs (1.99× the best) |
| weier61x2short Weierstrass, signed-x codec, projective += affine | 637 ns (2.02× the best) | 0.63 ns (1.02× the best) | 26.8 ns (2.74× the best) | 755 ns (1.90× the best) | 824 ns (1.90× the best) | 938 ns (1.90× the best) | 1.07 µs (1.89× the best) | 1.21 µs (1.88× the best) |
| weier61x2compare suiteSSWU x1: hash + prepare | 703 ns (2.23× the best) | 0.63 ns (1.02× the best) | 26.8 ns (2.74× the best) | 820 ns (2.07× the best) | 889 ns (2.05× the best) | 1.00 µs (2.03× the best) | 1.14 µs (2.01× the best) | 1.27 µs (1.98× the best) |
| weier61x2-jacobianincompleteshort Weierstrass, signed-x codec, Jacobian += affine | 638 ns (2.03× the best) | 0.63 ns (1.02× the best) | 31.6 ns (3.24× the best) | 770 ns (1.94× the best) | 851 ns (1.97× the best) | 985 ns (1.99× the best) | 1.14 µs (2.01× the best) | 1.30 µs (2.01× the best) |
| twisted61x2a = −1 Edwards modulo 2-torsion, extended += cached | 630 ns (2.00× the best) | 3.41 ns (5.55× the best) | 12.5 ns (1.28× the best) | 709 ns (1.79× the best) | 744 ns (1.72× the best) | 803 ns (1.63× the best) | 872 ns (1.54× the best) | 948 ns (1.47× the best) |
| twisted61x2compare suiteElligator 2 x1: hash + prepare | 892 ns (2.83× the best) | 3.41 ns (5.55× the best) | 12.5 ns (1.28× the best) | 971 ns (2.45× the best) | 1.01 µs (2.33× the best) | 1.07 µs (2.16× the best) | 1.13 µs (2.01× the best) | 1.21 µs (1.88× the best) |
| F_{p²}, p = 2^64 − 59, 16 bytes | ||||||||
| twisted64x2a = −1 Edwards modulo 2-torsion, extended += cached | 1.10 µs (3.49× the best) | 5.43 ns (8.85× the best) | 17.2 ns (1.77× the best) | 1.19 µs (3.01× the best) | 1.24 µs (2.86× the best) | 1.32 µs (2.67× the best) | 1.41 µs (2.49× the best) | 1.50 µs (2.33× the best) |
| twisted64x2compare suiteElligator 2 x1: hash + prepare | 1.53 µs (4.85× the best) | 5.43 ns (8.85× the best) | 17.2 ns (1.77× the best) | 1.62 µs (4.09× the best) | 1.67 µs (3.85× the best) | 1.75 µs (3.53× the best) | 1.84 µs (3.25× the best) | 1.93 µs (3.00× the best) |
| F_{p²}, p = 2^64 − 2^32 + 1, 16 bytes | ||||||||
| twisted-goldilocks2a = −1 Edwards modulo 2-torsion, extended += cached | 1.73 µs (5.50× the best) | 4.48 ns (7.30× the best) | 15.0 ns (1.54× the best) | 1.82 µs (4.59× the best) | 1.86 µs (4.30× the best) | 1.93 µs (3.90× the best) | 2.01 µs (3.55× the best) | 2.10 µs (3.25× the best) |
| twisted-goldilocks2compare suiteElligator 2 x1: hash + prepare | 2.16 µs (6.87× the best) | 4.48 ns (7.30× the best) | 15.0 ns (1.54× the best) | 2.25 µs (5.68× the best) | 2.29 µs (5.29× the best) | 2.36 µs (4.78× the best) | 2.44 µs (4.31× the best) | 2.53 µs (3.92× the best) |
| references, 32 and 33 bytes | ||||||||
| ristretto255compare suitehash output added as is: no prepare | 4.72 µs (14.98× the best) | in the hash | 65.1 ns (6.67× the best) | 4.95 µs (12.48× the best) | 5.11 µs (11.80× the best) | 5.37 µs (10.87× the best) | 5.67 µs (10.03× the best) | 5.98 µs (9.28× the best) |
bold: the best of its column; italic, dotted: tied with the best within the confidence intervals; shading: ratio to the best, pale yellow at 1× to purple at 16× or more; grey: baseline, not compared.
Batching
Batched against individual time per element. The inversions-shared column divides the saving by the difference between individual and batched field inversion; it also absorbs allocation and control flow.
| curve | hash to curve | prepare | encode | decode | ||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| alone | batched | faster by | inversions shared | alone | batched | faster by | inversions shared | alone | batched | faster by | inversions shared | alone | batched | faster by | inversions shared | |
| GF(2^127), 16 bytes | ||||||||||||||||
| gf2_127(X:S:Z:T) extended accumulators, Pornin's formulas | 779 ns | 72.9 ns (best) | 10.7× | 2.3 | 3.88 ns | 3.54 ns (7.69× the best) | 1.1× | 0 | 371 ns | 13.1 ns (1.62× the best) | 28.3× | 1.1 | 367 ns | 14.0 ns (1.06× the best) | 26.2× | 1.1 |
| gf2_127-lambdaincompleteλ-projective (X:L:Z) accumulators | 806 ns | 75.6 ns (1.04× the best) | 10.7× | 2.3 | 340 ns | 6.33 ns (13.74× the best) | 53.7× | 1.1 | 361 ns | 10.1 ns (1.25× the best) | 35.7× | 1.1 | 364 ns | 14.0 ns (1.06× the best) | 26.1× | 1.1 |
| gf2_127-wincompleteλ-projective, w codec: hashes and decodes to λ-affine | 865 ns | 83.3 ns (1.14× the best) | 10.4× | 2.5 | 0.63 ns | 0.48 ns (1.05× the best) | 1.3× | 0 | 361 ns | 10.3 ns (1.28× the best) | 35.0× | 1.1 | 361 ns | 15.1 ns (1.14× the best) | 24.0× | 1.1 |
| gf2_127-uunscaled (X:S:Z), w codec, direct addend hashes | 869 ns | 85.8 ns (1.18× the best) | 10.1× | 2.5 | 0.63 ns | 0.49 ns (1.06× the best) | 1.3× | 0 | 355 ns | 9.17 ns (1.14× the best) | 38.7× | 1.1 | 376 ns | 18.3 ns (1.39× the best) | 20.5× | 1.1 |
| GF(2^122) = GF(2^61)[u], dense constant, 16 bytes | ||||||||||||||||
| gf2_122(X:S:Z:T) extended | 510 ns | 74.9 ns (1.03× the best) | 6.8× | 2.8 | 4.92 ns | 5.02 ns (10.91× the best) | 1.0× | 0 | 211 ns | 15.7 ns (1.94× the best) | 13.5× | 1.3 | 197 ns | 13.5 ns (1.02× the best) | 14.5× | 1.2 |
| gf2_122-lambdaincompleteλ-projective | 509 ns | 74.9 ns (1.03× the best) | 6.8× | 2.8 | 166 ns | 7.55 ns (16.38× the best) | 22.0× | 1 | 189 ns | 11.9 ns (1.48× the best) | 15.9× | 1.1 | 196 ns | 13.5 ns (1.02× the best) | 14.5× | 1.2 |
| gf2_122-wincompleteλ-projective, w codec | 517 ns | 76.8 ns (1.05× the best) | 6.7× | 2.8 | 0.63 ns | 0.46 ns (best) | 1.4× | 0 | 204 ns | 14.4 ns (1.79× the best) | 14.2× | 1.2 | 193 ns | 14.4 ns (1.09× the best) | 13.3× | 1.2 |
| gf2_122-uunscaled (X:S:Z), w codec | 531 ns | 87.6 ns (1.20× the best) | 6.1× | 2.9 | 0.61 ns | 0.48 ns (1.04× the best) | 1.3× | 0 | 206 ns | 12.1 ns (1.49× the best) | 17.1× | 1.3 | 223 ns | 18.7 ns (1.42× the best) | 11.9× | 1.3 |
| GF(2^122), constant in GF(2^61) (GLS-shaped), 16 bytes | ||||||||||||||||
| gf2_122-gls(X:S:Z:T) extended | 535 ns | 74.7 ns (1.02× the best) | 7.2× | 3 | 4.31 ns | 4.44 ns (9.63× the best) | 1.0× | 0 | 209 ns | 15.2 ns (1.88× the best) | 13.7× | 1.3 | 195 ns | 13.2 ns (best) | 14.7× | 1.2 |
| gf2_122-gls-lambdaincompleteλ-projective | 515 ns | 76.5 ns (1.05× the best) | 6.7× | 2.8 | 167 ns | 7.53 ns (16.36× the best) | 22.2× | 1 | 189 ns | 11.6 ns (1.44× the best) | 16.3× | 1.1 | 187 ns | 13.2 ns (1.00× the best) | 14.2× | 1.1 |
| gf2_122-gls-wincompleteλ-projective, w codec | 509 ns | 78.6 ns (1.08× the best) | 6.5× | 2.8 | 0.63 ns | 0.49 ns (1.06× the best) | 1.3× | 0 | 204 ns | 14.4 ns (1.79× the best) | 14.1× | 1.2 | 191 ns | 14.3 ns (1.08× the best) | 13.3× | 1.1 |
| gf2_122-gls-uunscaled (X:S:Z), w codec | 522 ns | 80.2 ns (1.10× the best) | 6.5× | 2.9 | 0.63 ns | 0.48 ns (1.04× the best) | 1.3× | 0 | 195 ns | 12.3 ns (1.52× the best) | 15.9× | 1.2 | 207 ns | 16.8 ns (1.27× the best) | 12.3× | 1.2 |
| GF(2^109), 14 bytes | ||||||||||||||||
| gf2_109(X:S:Z:T) extended | 870 ns | 81.7 ns (1.12× the best) | 10.7× | 2.3 | 2.77 ns | 2.79 ns (6.06× the best) | 1.0× | 0 | 381 ns | 10.9 ns (1.36× the best) | 34.8× | 1.1 | 380 ns | 14.2 ns (1.08× the best) | 26.8× | 1.1 |
| gf2_109-lambdaincompleteλ-projective | 873 ns | 82.0 ns (1.12× the best) | 10.6× | 2.3 | 349 ns | 5.17 ns (11.22× the best) | 67.5× | 1 | 366 ns | 8.13 ns (1.01× the best) | 45.0× | 1.1 | 381 ns | 14.1 ns (1.07× the best) | 27.0× | 1.1 |
| gf2_109-wincompleteλ-projective, w codec | 855 ns | 79.4 ns (1.09× the best) | 10.8× | 2.3 | 0.61 ns | 0.48 ns (1.04× the best) | 1.3× | 0 | 359 ns | 10.4 ns (1.28× the best) | 34.6× | 1 | 378 ns | 15.5 ns (1.17× the best) | 24.4× | 1.1 |
| gf2_109-uunscaled (X:S:Z), w codec | 874 ns | 81.2 ns (1.11× the best) | 10.8× | 2.3 | 0.63 ns | 0.49 ns (1.05× the best) | 1.3× | 0 | 397 ns | 9.88 ns (1.22× the best) | 40.2× | 1.1 | 398 ns | 18.4 ns (1.39× the best) | 21.7× | 1.1 |
| F_p, p = 2^127 − 1, 16 bytes | ||||||||||||||||
| edwards127a = 1 Edwards, extended += cached | 1.07 µs | 1.07 µs (14.65× the best) | 1.0× | 0 | 582 ns | 28.3 ns (61.37× the best) | 20.6× | 1.1 | 549 ns | 22.0 ns (2.72× the best) | 25.0× | 1 | 489 ns | 486 ns (36.80× the best) | 1.0× | 0 |
| weier127short Weierstrass, projective += affine | 1.03 µs | 1.04 µs (14.20× the best) | 1.0× | 0 | 0.61 ns | 0.46 ns (1.00× the best) | 1.3× | 0 | 536 ns | 10.1 ns (1.25× the best) | 53.2× | 1 | 489 ns | 485 ns (36.73× the best) | 1.0× | 0 |
| weier127-jacobianincompleteshort Weierstrass, Jacobian += affine | 1.03 µs | 1.04 µs (14.24× the best) | 1.0× | 0 | 0.62 ns | 0.49 ns (1.06× the best) | 1.3× | 0 | 533 ns | 15.7 ns (1.94× the best) | 33.9× | 1 | 492 ns | 485 ns (36.77× the best) | 1.0× | 0 |
| F_p, p = 2^107 − 1, 14 bytes | ||||||||||||||||
| edwards107a = 1 Edwards, extended += cached | 806 ns | 805 ns (11.04× the best) | 1.0× | 0 | 546 ns | 22.7 ns (49.36× the best) | 24.0× | 1.1 | 506 ns | 20.3 ns (2.51× the best) | 25.0× | 1 | 359 ns | 354 ns (26.79× the best) | 1.0× | 0 |
| weier107short Weierstrass, projective += affine | 746 ns | 748 ns (10.26× the best) | 1.0× | 0 | 0.62 ns | 0.49 ns (1.07× the best) | 1.3× | 0 | 497 ns | 11.5 ns (1.42× the best) | 43.2× | 1 | 358 ns | 352 ns (26.66× the best) | 1.0× | 0 |
| weier107-jacobianincompleteshort Weierstrass, Jacobian += affine | 742 ns | 745 ns (10.22× the best) | 1.0× | 0 | 0.62 ns | 0.48 ns (1.04× the best) | 1.3× | 0 | 502 ns | 15.3 ns (1.90× the best) | 32.8× | 1 | 351 ns | 352 ns (26.63× the best) | 1.0× | 0 |
| F_p, p = 2^128 − 275, 16 bytes | ||||||||||||||||
| twisted128a = −1 twisted Edwards modulo 2-torsion, extended += cached | 1.92 µs | 1.92 µs (26.36× the best) | 1.0× | 8.24 ns | 8.08 ns (17.55× the best) | 1.0× | 939 ns | 16.0 ns (1.98× the best) | 58.7× | 949 ns | 952 ns (72.09× the best) | 1.0× | ||||
| F_{p²}, p = 2^61 − 1, 16 bytes | ||||||||||||||||
| edwards61x2a = 1 Edwards, signed-x codec, extended += cached | 624 ns | 620 ns (8.50× the best) | 1.0× | 0 | 216 ns | 18.8 ns (40.87× the best) | 11.5× | 1.3 | 181 ns | 16.2 ns (2.01× the best) | 11.1× | 1.1 | 405 ns | 404 ns (30.63× the best) | 1.0× | 0 |
| weier61x2short Weierstrass, signed-x codec, projective += affine | 637 ns | 637 ns (8.73× the best) | 1.0× | 0 | 0.63 ns | 0.72 ns (1.56× the best) | 0.9× | 0 | 170 ns | 8.11 ns (1.00× the best) | 20.9× | 1 | 416 ns | 412 ns (31.22× the best) | 1.0× | 0 |
| weier61x2-jacobianincompleteshort Weierstrass, signed-x codec, Jacobian += affine | 638 ns | 638 ns (8.74× the best) | 1.0× | 0 | 0.63 ns | 0.54 ns (1.18× the best) | 1.2× | 0 | 179 ns | 11.7 ns (1.45× the best) | 15.3× | 1.1 | 417 ns | 413 ns (31.25× the best) | 1.0× | 0 |
| twisted61x2a = −1 Edwards modulo 2-torsion, extended += cached | 630 ns | 632 ns (8.66× the best) | 1.0× | 0 | 3.41 ns | 3.60 ns (7.81× the best) | 0.9× | 0 | 179 ns | 8.07 ns (best) | 22.1× | 1.1 | 425 ns | 420 ns (31.80× the best) | 1.0× | 0 |
| F_{p²}, p = 2^64 − 59, 16 bytes | ||||||||||||||||
| twisted64x2a = −1 Edwards modulo 2-torsion, extended += cached | 1.10 µs | 1.10 µs (15.08× the best) | 1.0× | 0 | 5.43 ns | 5.51 ns (11.96× the best) | 1.0× | 0 | 290 ns | 10.3 ns (1.28× the best) | 28.1× | 1 | 721 ns | 718 ns (54.39× the best) | 1.0× | 0 |
| F_{p²}, p = 2^64 − 2^32 + 1, 16 bytes | ||||||||||||||||
| twisted-goldilocks2a = −1 Edwards modulo 2-torsion, extended += cached | 1.73 µs | 1.75 µs (24.00× the best) | 1.0× | -0.1 | 4.48 ns | 4.51 ns (9.78× the best) | 1.0× | 0 | 197 ns | 11.3 ns (1.40× the best) | 17.5× | 1 | 1.53 µs | 1.52 µs (114.99× the best) | 1.0× | 0.1 |
bold: the best of its column; italic, dotted: tied with the best within the confidence intervals; shading: ratio to the best, pale yellow at 1× to purple at 16× or more; grey: baseline, not compared.
Time per element against batch size.
| curve | hash to curve | prepare | encode | decode | ||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| alone | alone | alone | alone | |||||||||||||
| GF(2^127), 16 bytes | ||||||||||||||||
| gf2_127(X:S:Z:T) extended accumulators, Pornin's formulas | 779 ns (1.53× the best) | 322 ns (1.30× the best) | 127 ns (1.16× the best) | 72.9 ns (best) | 3.88 ns (6.33× the best) | 4.37 ns (3.14× the best) | 3.68 ns (7.31× the best) | 3.54 ns (7.69× the best) | 371 ns (2.19× the best) | 71.6 ns (1.58× the best) | 21.7 ns (1.57× the best) | 13.1 ns (1.62× the best) | 367 ns (1.96× the best) | 76.4 ns (1.33× the best) | 22.1 ns (1.14× the best) | 14.0 ns (1.06× the best) |
| gf2_127-lambdaincompleteλ-projective (X:L:Z) accumulators | 806 ns (1.58× the best) | 318 ns (1.28× the best) | 127 ns (1.15× the best) | 75.6 ns (1.04× the best) | 340 ns (553.91× the best) | 64.1 ns (46.03× the best) | 14.2 ns (28.19× the best) | 6.33 ns (13.74× the best) | 361 ns (2.13× the best) | 68.2 ns (1.50× the best) | 18.4 ns (1.33× the best) | 10.1 ns (1.25× the best) | 364 ns (1.95× the best) | 76.3 ns (1.33× the best) | 22.1 ns (1.14× the best) | 14.0 ns (1.06× the best) |
| gf2_127-wincompleteλ-projective, w codec: hashes and decodes to λ-affine | 865 ns (1.70× the best) | 346 ns (1.39× the best) | 138 ns (1.26× the best) | 83.3 ns (1.14× the best) | 0.63 ns (1.02× the best) | 1.40 ns (tied for the best, within noise, 1.01×) | 0.51 ns (1.01× the best) | 0.48 ns (1.05× the best) | 361 ns (2.13× the best) | 67.8 ns (1.49× the best) | 18.6 ns (1.34× the best) | 10.3 ns (1.28× the best) | 361 ns (1.93× the best) | 78.2 ns (1.36× the best) | 23.0 ns (1.18× the best) | 15.1 ns (1.14× the best) |
| gf2_127-uunscaled (X:S:Z), w codec, direct addend hashes | 869 ns (1.71× the best) | 351 ns (1.41× the best) | 142 ns (1.29× the best) | 85.8 ns (1.18× the best) | 0.63 ns (1.03× the best) | 1.41 ns (1.01× the best) | 0.51 ns (1.01× the best) | 0.49 ns (1.06× the best) | 355 ns (2.09× the best) | 65.7 ns (1.45× the best) | 17.2 ns (1.24× the best) | 9.17 ns (1.14× the best) | 376 ns (2.01× the best) | 82.4 ns (1.44× the best) | 26.9 ns (1.39× the best) | 18.3 ns (1.39× the best) |
| GF(2^122) = GF(2^61)[u], dense constant, 16 bytes | ||||||||||||||||
| gf2_122(X:S:Z:T) extended | 510 ns (tied for the best, within noise, 1.00×) | 74.9 ns (1.03× the best) | 4.92 ns (8.02× the best) | 5.02 ns (10.91× the best) | 211 ns (1.24× the best) | 15.7 ns (1.94× the best) | 197 ns (1.05× the best) | 13.5 ns (1.02× the best) | ||||||||
| gf2_122-lambdaincompleteλ-projective | 509 ns (tied for the best, within noise) | 249 ns (best) | 110 ns (best) | 74.9 ns (1.03× the best) | 166 ns (271.21× the best) | 46.9 ns (33.69× the best) | 13.1 ns (26.00× the best) | 7.55 ns (16.38× the best) | 189 ns (1.12× the best) | 52.8 ns (1.16× the best) | 17.8 ns (1.28× the best) | 11.9 ns (1.48× the best) | 196 ns (1.04× the best) | 57.4 ns (best) | 19.8 ns (1.02× the best) | 13.5 ns (1.02× the best) |
| gf2_122-wincompleteλ-projective, w codec | 517 ns (1.02× the best) | 257 ns (1.04× the best) | 114 ns (1.04× the best) | 76.8 ns (1.05× the best) | 0.63 ns (1.03× the best) | 1.39 ns (tied for the best, within noise) | 0.51 ns (tied for the best, within noise, 1.00×) | 0.46 ns (tied for the best, within noise) | 204 ns (1.21× the best) | 55.6 ns (1.22× the best) | 20.6 ns (1.49× the best) | 14.4 ns (1.79× the best) | 193 ns (1.03× the best) | 59.0 ns (1.03× the best) | 20.6 ns (1.06× the best) | 14.4 ns (1.09× the best) |
| gf2_122-uunscaled (X:S:Z), w codec | 531 ns (1.04× the best) | 268 ns (1.08× the best) | 125 ns (1.14× the best) | 87.6 ns (1.20× the best) | 0.61 ns (tied for the best, within noise, 1.00×) | 1.41 ns (1.01× the best) | 0.50 ns (tied for the best, within noise) | 0.48 ns (1.04× the best) | 206 ns (1.22× the best) | 50.6 ns (1.11× the best) | 18.1 ns (1.31× the best) | 12.1 ns (1.49× the best) | 223 ns (1.19× the best) | 65.6 ns (1.14× the best) | 25.2 ns (1.30× the best) | 18.7 ns (1.42× the best) |
| GF(2^122), constant in GF(2^61) (GLS-shaped), 16 bytes | ||||||||||||||||
| gf2_122-gls(X:S:Z:T) extended | 535 ns (1.05× the best) | 74.7 ns (1.02× the best) | 4.31 ns (7.02× the best) | 4.44 ns (9.63× the best) | 209 ns (1.23× the best) | 15.2 ns (1.88× the best) | 195 ns (1.04× the best) | 13.2 ns (tied for the best, within noise) | ||||||||
| gf2_122-gls-lambdaincompleteλ-projective | 515 ns (1.01× the best) | 265 ns (1.07× the best) | 114 ns (1.04× the best) | 76.5 ns (1.05× the best) | 167 ns (273.01× the best) | 47.8 ns (34.38× the best) | 13.1 ns (26.05× the best) | 7.53 ns (16.36× the best) | 189 ns (1.12× the best) | 53.2 ns (1.17× the best) | 17.7 ns (1.28× the best) | 11.6 ns (1.44× the best) | 187 ns (best) | 57.7 ns (1.01× the best) | 19.4 ns (best) | 13.2 ns (tied for the best, within noise, 1.00×) |
| gf2_122-gls-wincompleteλ-projective, w codec | 509 ns (tied for the best, within noise, 1.00×) | 256 ns (1.03× the best) | 115 ns (1.05× the best) | 78.6 ns (1.08× the best) | 0.63 ns (1.03× the best) | 1.42 ns (1.02× the best) | 0.51 ns (1.01× the best) | 0.49 ns (1.06× the best) | 204 ns (1.21× the best) | 55.5 ns (1.22× the best) | 20.6 ns (1.49× the best) | 14.4 ns (1.79× the best) | 191 ns (1.02× the best) | 58.4 ns (1.02× the best) | 20.1 ns (1.03× the best) | 14.3 ns (1.08× the best) |
| gf2_122-gls-uunscaled (X:S:Z), w codec | 522 ns (1.03× the best) | 258 ns (1.04× the best) | 117 ns (1.06× the best) | 80.2 ns (1.10× the best) | 0.63 ns (1.02× the best) | 1.42 ns (1.02× the best) | 0.51 ns (1.01× the best) | 0.48 ns (1.04× the best) | 195 ns (1.15× the best) | 51.2 ns (1.13× the best) | 18.1 ns (1.31× the best) | 12.3 ns (1.52× the best) | 207 ns (1.10× the best) | 62.1 ns (1.08× the best) | 22.6 ns (1.16× the best) | 16.8 ns (1.27× the best) |
| GF(2^109), 14 bytes | ||||||||||||||||
| gf2_109(X:S:Z:T) extended | 870 ns (1.71× the best) | 360 ns (1.45× the best) | 139 ns (1.27× the best) | 81.7 ns (1.12× the best) | 2.77 ns (4.51× the best) | 4.00 ns (2.87× the best) | 2.83 ns (5.61× the best) | 2.79 ns (6.06× the best) | 381 ns (2.25× the best) | 76.6 ns (1.69× the best) | 20.3 ns (1.47× the best) | 10.9 ns (1.36× the best) | 380 ns (2.03× the best) | 82.3 ns (1.43× the best) | 23.5 ns (1.21× the best) | 14.2 ns (1.08× the best) |
| gf2_109-lambdaincompleteλ-projective | 873 ns (1.72× the best) | 360 ns (1.45× the best) | 139 ns (1.26× the best) | 82.0 ns (1.12× the best) | 349 ns (568.88× the best) | 68.7 ns (49.37× the best) | 14.0 ns (27.78× the best) | 5.17 ns (11.22× the best) | 366 ns (2.16× the best) | 73.3 ns (1.62× the best) | 17.5 ns (1.26× the best) | 8.13 ns (1.01× the best) | 381 ns (2.04× the best) | 82.3 ns (1.44× the best) | 23.6 ns (1.21× the best) | 14.1 ns (1.07× the best) |
| gf2_109-wincompleteλ-projective, w codec | 855 ns (1.68× the best) | 346 ns (1.39× the best) | 131 ns (1.20× the best) | 79.4 ns (1.09× the best) | 0.61 ns (tied for the best, within noise) | 1.40 ns (1.01× the best) | 0.51 ns (1.01× the best) | 0.48 ns (1.04× the best) | 359 ns (2.12× the best) | 76.3 ns (1.68× the best) | 19.7 ns (1.42× the best) | 10.4 ns (1.28× the best) | 378 ns (2.02× the best) | 83.9 ns (1.46× the best) | 24.4 ns (1.26× the best) | 15.5 ns (1.17× the best) |
| gf2_109-uunscaled (X:S:Z), w codec | 874 ns (1.72× the best) | 349 ns (1.41× the best) | 135 ns (1.23× the best) | 81.2 ns (1.11× the best) | 0.63 ns (1.02× the best) | 1.42 ns (1.02× the best) | 0.51 ns (1.01× the best) | 0.49 ns (1.05× the best) | 397 ns (2.34× the best) | 74.5 ns (1.64× the best) | 19.1 ns (1.38× the best) | 9.88 ns (1.22× the best) | 398 ns (2.13× the best) | 87.4 ns (1.52× the best) | 26.7 ns (1.38× the best) | 18.4 ns (1.39× the best) |
| F_p, p = 2^127 − 1, 16 bytes | ||||||||||||||||
| edwards127a = 1 Edwards, extended += cached | 1.07 µs (2.10× the best) | 1.07 µs (14.65× the best) | 582 ns (948.36× the best) | 28.3 ns (61.37× the best) | 549 ns (3.24× the best) | 22.0 ns (2.72× the best) | 489 ns (2.61× the best) | 486 ns (36.80× the best) | ||||||||
| weier127short Weierstrass, projective += affine | 1.03 µs (2.02× the best) | 1.04 µs (14.20× the best) | 0.61 ns (tied for the best, within noise, 1.00×) | 0.46 ns (tied for the best, within noise, 1.00×) | 536 ns (3.16× the best) | 10.1 ns (1.25× the best) | 489 ns (2.61× the best) | 485 ns (36.73× the best) | ||||||||
| weier127-jacobianincompleteshort Weierstrass, Jacobian += affine | 1.03 µs (2.03× the best) | 1.04 µs (14.24× the best) | 0.62 ns (tied for the best, within noise, 1.01×) | 0.49 ns (1.06× the best) | 533 ns (3.14× the best) | 15.7 ns (1.94× the best) | 492 ns (2.63× the best) | 485 ns (36.77× the best) | ||||||||
| F_p, p = 2^107 − 1, 14 bytes | ||||||||||||||||
| edwards107a = 1 Edwards, extended += cached | 806 ns (1.58× the best) | 805 ns (11.04× the best) | 546 ns (889.89× the best) | 22.7 ns (49.36× the best) | 506 ns (2.99× the best) | 20.3 ns (2.51× the best) | 359 ns (1.92× the best) | 354 ns (26.79× the best) | ||||||||
| weier107short Weierstrass, projective += affine | 746 ns (1.47× the best) | 748 ns (10.26× the best) | 0.62 ns (tied for the best, within noise, 1.01×) | 0.49 ns (1.07× the best) | 497 ns (2.93× the best) | 11.5 ns (1.42× the best) | 358 ns (1.91× the best) | 352 ns (26.66× the best) | ||||||||
| weier107-jacobianincompleteshort Weierstrass, Jacobian += affine | 742 ns (1.46× the best) | 745 ns (10.22× the best) | 0.62 ns (tied for the best, within noise, 1.00×) | 0.48 ns (1.04× the best) | 502 ns (2.96× the best) | 15.3 ns (1.90× the best) | 351 ns (1.88× the best) | 352 ns (26.63× the best) | ||||||||
| F_p, p = 2^128 − 275, 16 bytes | ||||||||||||||||
| twisted128a = −1 twisted Edwards modulo 2-torsion, extended += cached | 1.92 µs (3.78× the best) | 1.92 µs (26.36× the best) | 8.24 ns (13.43× the best) | 8.08 ns (17.55× the best) | 939 ns (5.54× the best) | 16.0 ns (1.98× the best) | 949 ns (5.07× the best) | 952 ns (72.09× the best) | ||||||||
| F_{p²}, p = 2^61 − 1, 16 bytes | ||||||||||||||||
| edwards61x2a = 1 Edwards, signed-x codec, extended += cached | 624 ns (1.23× the best) | 620 ns (8.50× the best) | 216 ns (352.47× the best) | 18.8 ns (40.87× the best) | 181 ns (1.07× the best) | 16.2 ns (2.01× the best) | 405 ns (2.16× the best) | 404 ns (30.63× the best) | ||||||||
| weier61x2short Weierstrass, signed-x codec, projective += affine | 637 ns (1.25× the best) | 637 ns (8.73× the best) | 0.63 ns (1.02× the best) | 0.72 ns (1.56× the best) | 170 ns (best) | 8.11 ns (tied for the best, within noise, 1.00×) | 416 ns (2.22× the best) | 412 ns (31.22× the best) | ||||||||
| weier61x2-jacobianincompleteshort Weierstrass, signed-x codec, Jacobian += affine | 638 ns (1.26× the best) | 638 ns (8.74× the best) | 0.63 ns (1.02× the best) | 0.54 ns (1.18× the best) | 179 ns (1.06× the best) | 11.7 ns (1.45× the best) | 417 ns (2.23× the best) | 413 ns (31.25× the best) | ||||||||
| twisted61x2a = −1 Edwards modulo 2-torsion, extended += cached | 630 ns (1.24× the best) | 646 ns (2.60× the best) | 641 ns (5.84× the best) | 632 ns (8.66× the best) | 3.41 ns (5.55× the best) | 6.03 ns (4.34× the best) | 3.80 ns (7.54× the best) | 3.60 ns (7.81× the best) | 179 ns (1.05× the best) | 45.4 ns (best) | 13.8 ns (best) | 8.07 ns (tied for the best, within noise) | 425 ns (2.27× the best) | 423 ns (7.37× the best) | 418 ns (21.53× the best) | 420 ns (31.80× the best) |
| F_{p²}, p = 2^64 − 59, 16 bytes | ||||||||||||||||
| twisted64x2a = −1 Edwards modulo 2-torsion, extended += cached | 1.10 µs (2.16× the best) | 1.10 µs (15.08× the best) | 5.43 ns (8.85× the best) | 5.51 ns (11.96× the best) | 290 ns (1.71× the best) | 10.3 ns (1.28× the best) | 721 ns (3.85× the best) | 718 ns (54.39× the best) | ||||||||
| F_{p²}, p = 2^64 − 2^32 + 1, 16 bytes | ||||||||||||||||
| twisted-goldilocks2a = −1 Edwards modulo 2-torsion, extended += cached | 1.73 µs (3.40× the best) | 1.75 µs (24.00× the best) | 4.48 ns (7.30× the best) | 4.51 ns (9.78× the best) | 197 ns (1.16× the best) | 11.3 ns (1.40× the best) | 1.53 µs (8.18× the best) | 1.52 µs (114.99× the best) | ||||||||
bold: the best of its column; italic, dotted: tied with the best within the confidence intervals; shading: ratio to the best, pale yellow at 1× to purple at 16× or more; grey: baseline, not compared.
Costs by lifetime
What an insertion into cells keyed by IDs costs by how long each part stays valid, for each family the RIBLT suite timed so (proj=): the ID once per item; the curve and each hash’s keys once per salt; the hash to the addend, the mapping’s seed and its walk once per salt and item; and the addition, encoding and decoding of each cell. Salted SHA-256 hashes the ID anew under each salt; each projection, the checksum’s and the mapping’s in fields chosen apart, multiplies its halves by the salt’s keys. The last row is the measured encoding of n = 3500 items into m = 1350 cells, per item: by salted SHA-256 of the items themselves, and by projections of their IDs, computed beforehand (Costs by lifetime).
binary.109, pornin, checksum projected in , mapping in
| lifetime | term | salted SHA-256 | projection |
|---|---|---|---|
| per item | ID, the item’s SHA-256 | 33.1 ns | 33.1 ns |
| per salt | accept the curve | 55.2 µs | 55.2 µs |
| per salt | checksum keys | 74.7 ns | 257 ns |
| per salt | mapping keys | 74.7 ns | 257 ns |
| per salt and item | hash to the addend | 64.2 ns | 41.7 ns |
| per salt and item | mapping seed | 33.0 ns | 5.11 ns |
| per salt and item | mapping walk below m = 1350 | 34.2 ns | 34.2 ns |
| per cell | add | 12.8 ns | 12.8 ns |
| per cell | encode | 10.9 ns | 10.9 ns |
| per cell | decode | 14.2 ns | 14.2 ns |
| measured | insertion per item, k = 13.57 cells | 324 ns | 265 ns |
binary-lambda.109, pornin-addend, checksum projected in , mapping in
| lifetime | term | salted SHA-256 | projection |
|---|---|---|---|
| per item | ID, the item’s SHA-256 | 33.1 ns | 33.1 ns |
| per salt | accept the curve | 55.2 µs | 55.2 µs |
| per salt | checksum keys | 74.7 ns | 257 ns |
| per salt | mapping keys | 74.7 ns | 257 ns |
| per salt and item | hash to the addend | 57.7 ns | 34.2 ns |
| per salt and item | mapping seed | 33.0 ns | 5.11 ns |
| per salt and item | mapping walk below m = 1350 | 34.2 ns | 34.2 ns |
| per cell | add | 12.0 ns | 12.0 ns |
| per cell | encode | 8.13 ns | 8.13 ns |
| per cell | decode | 14.1 ns | 14.1 ns |
| measured | insertion per item, k = 13.57 cells | 303 ns | 244 ns |
binary-u.109, pornin-addend, checksum projected in , mapping in
| lifetime | term | salted SHA-256 | projection |
|---|---|---|---|
| per item | ID, the item’s SHA-256 | 33.1 ns | 33.1 ns |
| per salt | accept the curve | 55.2 µs | 55.2 µs |
| per salt | checksum keys | 74.7 ns | 257 ns |
| per salt | mapping keys | 74.7 ns | 257 ns |
| per salt and item | hash to the addend | 61.6 ns | 38.1 ns |
| per salt and item | mapping seed | 33.0 ns | 5.11 ns |
| per salt and item | mapping walk below m = 1350 | 34.2 ns | 34.2 ns |
| per cell | add | 9.76 ns | 9.76 ns |
| per cell | encode | 9.88 ns | 9.88 ns |
| per cell | decode | 18.4 ns | 18.4 ns |
| measured | insertion per item, k = 13.57 cells | 282 ns | 222 ns |
binary-w.109, pornin-addend, checksum projected in , mapping in
| lifetime | term | salted SHA-256 | projection |
|---|---|---|---|
| per item | ID, the item’s SHA-256 | 33.1 ns | 33.1 ns |
| per salt | accept the curve | 55.2 µs | 55.2 µs |
| per salt | checksum keys | 74.7 ns | 257 ns |
| per salt | mapping keys | 74.7 ns | 257 ns |
| per salt and item | hash to the addend | 57.6 ns | 34.2 ns |
| per salt and item | mapping seed | 33.0 ns | 5.11 ns |
| per salt and item | mapping walk below m = 1350 | 34.2 ns | 34.2 ns |
| per cell | add | 12.0 ns | 12.0 ns |
| per cell | encode | 10.4 ns | 10.4 ns |
| per cell | decode | 15.5 ns | 15.5 ns |
| measured | insertion per item, k = 13.57 cells | 302 ns | 239 ns |
binary-lambda.122-gls, pornin-addend, checksum projected in , mapping in
| lifetime | term | salted SHA-256 | projection |
|---|---|---|---|
| per item | ID, the item’s SHA-256 | 33.1 ns | 33.1 ns |
| per salt | accept the curve | 58.6 µs | 58.6 µs |
| per salt | checksum keys | 74.7 ns | 257 ns |
| per salt | mapping keys | 74.7 ns | 257 ns |
| per salt and item | hash to the addend | 58.8 ns | 35.0 ns |
| per salt and item | mapping seed | 33.0 ns | 5.11 ns |
| per salt and item | mapping walk below m = 1350 | 34.2 ns | 34.2 ns |
| per cell | add | 16.6 ns | 16.6 ns |
| per cell | encode | 11.6 ns | 11.6 ns |
| per cell | decode | 13.2 ns | 13.2 ns |
| measured | insertion per item, k = 13.57 cells | 342 ns | 286 ns |
binary-u.122-gls, pornin-addend, checksum projected in , mapping in
| lifetime | term | salted SHA-256 | projection |
|---|---|---|---|
| per item | ID, the item’s SHA-256 | 33.1 ns | 33.1 ns |
| per salt | accept the curve | 58.6 µs | 58.6 µs |
| per salt | checksum keys | 74.7 ns | 257 ns |
| per salt | mapping keys | 74.7 ns | 257 ns |
| per salt and item | hash to the addend | 60.2 ns | 36.1 ns |
| per salt and item | mapping seed | 33.0 ns | 5.11 ns |
| per salt and item | mapping walk below m = 1350 | 34.2 ns | 34.2 ns |
| per cell | add | 13.1 ns | 13.1 ns |
| per cell | encode | 12.3 ns | 12.3 ns |
| per cell | decode | 16.8 ns | 16.8 ns |
| measured | insertion per item, k = 13.57 cells | 306 ns | 252 ns |
binary-w.122-gls, pornin-addend, checksum projected in , mapping in
| lifetime | term | salted SHA-256 | projection |
|---|---|---|---|
| per item | ID, the item’s SHA-256 | 33.1 ns | 33.1 ns |
| per salt | accept the curve | 58.6 µs | 58.6 µs |
| per salt | checksum keys | 74.7 ns | 257 ns |
| per salt | mapping keys | 74.7 ns | 257 ns |
| per salt and item | hash to the addend | 59.3 ns | 34.9 ns |
| per salt and item | mapping seed | 33.0 ns | 5.11 ns |
| per salt and item | mapping walk below m = 1350 | 34.2 ns | 34.2 ns |
| per cell | add | 16.6 ns | 16.6 ns |
| per cell | encode | 14.4 ns | 14.4 ns |
| per cell | decode | 14.3 ns | 14.3 ns |
| measured | insertion per item, k = 13.57 cells | 340 ns | 281 ns |
binary-lambda.122, pornin-addend, checksum projected in , mapping in
| lifetime | term | salted SHA-256 | projection |
|---|---|---|---|
| per item | ID, the item’s SHA-256 | 33.1 ns | 33.1 ns |
| per salt | accept the curve | 55.2 µs | 55.2 µs |
| per salt | checksum keys | 74.7 ns | 257 ns |
| per salt | mapping keys | 74.7 ns | 257 ns |
| per salt and item | hash to the addend | 59.3 ns | 33.6 ns |
| per salt and item | mapping seed | 33.0 ns | 5.11 ns |
| per salt and item | mapping walk below m = 1350 | 34.2 ns | 34.2 ns |
| per cell | add | 16.6 ns | 16.6 ns |
| per cell | encode | 11.9 ns | 11.9 ns |
| per cell | decode | 13.5 ns | 13.5 ns |
| measured | insertion per item, k = 13.57 cells | 341 ns | 284 ns |
binary-u.122, pornin-addend, checksum projected in , mapping in
| lifetime | term | salted SHA-256 | projection |
|---|---|---|---|
| per item | ID, the item’s SHA-256 | 33.1 ns | 33.1 ns |
| per salt | accept the curve | 55.2 µs | 55.2 µs |
| per salt | checksum keys | 74.7 ns | 257 ns |
| per salt | mapping keys | 74.7 ns | 257 ns |
| per salt and item | hash to the addend | 63.2 ns | 38.8 ns |
| per salt and item | mapping seed | 33.0 ns | 5.11 ns |
| per salt and item | mapping walk below m = 1350 | 34.2 ns | 34.2 ns |
| per cell | add | 13.1 ns | 13.1 ns |
| per cell | encode | 12.1 ns | 12.1 ns |
| per cell | decode | 18.7 ns | 18.7 ns |
| measured | insertion per item, k = 13.57 cells | 308 ns | 253 ns |
binary-w.122, pornin-addend, checksum projected in , mapping in
| lifetime | term | salted SHA-256 | projection |
|---|---|---|---|
| per item | ID, the item’s SHA-256 | 33.1 ns | 33.1 ns |
| per salt | accept the curve | 55.2 µs | 55.2 µs |
| per salt | checksum keys | 74.7 ns | 257 ns |
| per salt | mapping keys | 74.7 ns | 257 ns |
| per salt and item | hash to the addend | 58.6 ns | 33.2 ns |
| per salt and item | mapping seed | 33.0 ns | 5.11 ns |
| per salt and item | mapping walk below m = 1350 | 34.2 ns | 34.2 ns |
| per cell | add | 16.6 ns | 16.6 ns |
| per cell | encode | 14.4 ns | 14.4 ns |
| per cell | decode | 14.4 ns | 14.4 ns |
| measured | insertion per item, k = 13.57 cells | 341 ns | 285 ns |
binary.127, pornin, checksum projected in , mapping in
| lifetime | term | salted SHA-256 | projection |
|---|---|---|---|
| per item | ID, the item’s SHA-256 | 33.1 ns | 33.1 ns |
| per salt | accept the curve | 56.1 µs | 56.1 µs |
| per salt | checksum keys | 74.7 ns | 257 ns |
| per salt | mapping keys | 74.7 ns | 257 ns |
| per salt and item | hash to the addend | 62.6 ns | 39.1 ns |
| per salt and item | mapping seed | 33.0 ns | 5.11 ns |
| per salt and item | mapping walk below m = 1350 | 34.2 ns | 34.2 ns |
| per cell | add | 14.1 ns | 14.1 ns |
| per cell | encode | 13.1 ns | 13.1 ns |
| per cell | decode | 14.0 ns | 14.0 ns |
| measured | insertion per item, k = 13.57 cells | 329 ns | 273 ns |
binary-lambda.127, pornin-addend, checksum projected in , mapping in
| lifetime | term | salted SHA-256 | projection |
|---|---|---|---|
| per item | ID, the item’s SHA-256 | 33.1 ns | 33.1 ns |
| per salt | accept the curve | 56.1 µs | 56.1 µs |
| per salt | checksum keys | 74.7 ns | 257 ns |
| per salt | mapping keys | 74.7 ns | 257 ns |
| per salt and item | hash to the addend | 58.4 ns | 34.1 ns |
| per salt and item | mapping seed | 33.0 ns | 5.11 ns |
| per salt and item | mapping walk below m = 1350 | 34.2 ns | 34.2 ns |
| per cell | add | 14.9 ns | 14.9 ns |
| per cell | encode | 10.1 ns | 10.1 ns |
| per cell | decode | 14.0 ns | 14.0 ns |
| measured | insertion per item, k = 13.57 cells | 326 ns | 268 ns |
binary-u.127, pornin-addend, checksum projected in , mapping in
| lifetime | term | salted SHA-256 | projection |
|---|---|---|---|
| per item | ID, the item’s SHA-256 | 33.1 ns | 33.1 ns |
| per salt | accept the curve | 56.1 µs | 56.1 µs |
| per salt | checksum keys | 74.7 ns | 257 ns |
| per salt | mapping keys | 74.7 ns | 257 ns |
| per salt and item | hash to the addend | 61.4 ns | 37.2 ns |
| per salt and item | mapping seed | 33.0 ns | 5.11 ns |
| per salt and item | mapping walk below m = 1350 | 34.2 ns | 34.2 ns |
| per cell | add | 10.7 ns | 10.7 ns |
| per cell | encode | 9.17 ns | 9.17 ns |
| per cell | decode | 18.3 ns | 18.3 ns |
| measured | insertion per item, k = 13.57 cells | 288 ns | 227 ns |
binary-w.127, pornin-addend, checksum projected in , mapping in
| lifetime | term | salted SHA-256 | projection |
|---|---|---|---|
| per item | ID, the item’s SHA-256 | 33.1 ns | 33.1 ns |
| per salt | accept the curve | 56.1 µs | 56.1 µs |
| per salt | checksum keys | 74.7 ns | 257 ns |
| per salt | mapping keys | 74.7 ns | 257 ns |
| per salt and item | hash to the addend | 58.5 ns | 34.2 ns |
| per salt and item | mapping seed | 33.0 ns | 5.11 ns |
| per salt and item | mapping walk below m = 1350 | 34.2 ns | 34.2 ns |
| per cell | add | 14.9 ns | 14.9 ns |
| per cell | encode | 10.3 ns | 10.3 ns |
| per cell | decode | 15.1 ns | 15.1 ns |
| measured | insertion per item, k = 13.57 cells | 325 ns | 268 ns |
Curve selection
Curve selection as this run timed it, once per seed (16 seeds): find searches a seed’s candidates for an acceptable curve; prove searches them again and certifies each rejection and the acceptance; verify checks that certificate. The figure shows each family’s method that finds fastest, a bar at the seeds’ mean in a box from the fastest seed to the slowest, and how the prover’s time divides among the search’s phases; the table lists every method (Parameter selection and verification). Accepting a curve (55.2 µs to 67.6 µs, curvegen/verify_accept) includes the embedding-degree bound, a baby-step giant-step search for with , which alone takes 29.6 µs to 30.7 µs (curvegen/embedding), 45% to 55% of it; rejected candidates do not reach it.
| family | method | shown | seeds | candidates | point counts (prove) | find | prove | verify | counting, of prove |
|---|---|---|---|---|---|---|---|---|---|
| edwards127 | pari+sieve | yes | 16 | 202.9 | 16.4 | 760 ms | 1.05 s | 435 µs | 87% |
| edwards61x2 | pari+sieve | yes | 16 | 122.7 | 10.7 | 360 ms | 503 ms | 200 µs | 91% |
| gf2_109 | agm | 16 | 50.1 | 50.1 | 18.1 ms | 18.3 ms | 107 µs | 97% | |
| gf2_109 | agm+factor | yes | 16 | 50.1 | 50.1 | 17.8 ms | 24.5 ms | 93.6 µs | 73% |
| gf2_109 | pari | 16 | 50.1 | 50.1 | 57.2 ms | 64.3 ms | 93.6 µs | 89% | |
| gf2_122 | agm | yes | 16 | 39.5 | 39.5 | 17.6 ms | 17.2 ms | 86.8 µs | 97% |
| gf2_122 | pari | 16 | 39.5 | 39.5 | 68.0 ms | 68.0 ms | 87.7 µs | 99% | |
| gf2_122-gls | agm | yes | 16 | 47.2 | 47.2 | 5.48 ms | 5.80 ms | 107 µs | 92% |
| gf2_122-gls | pari | 16 | 47.2 | 47.2 | 79.6 ms | 80.4 ms | 111 µs | 99% | |
| gf2_127 | agm+sieve | yes | 16 | 83.6 | 25.1 | 14.6 ms | 14.5 ms | 150 µs | 75% |
| gf2_127 | pari | 16 | 83.6 | 83.6 | 184 ms | 213 ms | 124 µs | 87% | |
| twisted-goldilocks2 | pari+sieve | yes | 16 | 306.9 | 28.4 | 1.19 s | 1.67 s | 596 µs | 87% |
| twisted61x2 | pari+sieve | yes | 16 | 247.9 | 22.4 | 803 ms | 1.06 s | 272 µs | 90% |
| twisted64x2 | pari+sieve | yes | 16 | 347.1 | 28.2 | 1.33 s | 1.79 s | 545 µs | 87% |
| weier127 | pari+sieve | yes | 16 | 179.0 | 19.6 | 888 ms | 1.25 s | 210 µs | 87% |
| weier61x2 | pari+sieve | yes | 16 | 97.5 | 11.1 | 401 ms | 533 ms | 132 µs | 90% |
Group operations
The fastest measurement of each operation and mode per family, the hashes over every construction; rows grouped by field.
| curve | hash to curve | hash to addend | prepare | add | subtract | negate | is identity | equals addend | encode | decode | |||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| alone | batched | alone | batched | alone | batched | throughput | latency | match | mismatch | alone | batched | alone | batched | ||||
| baseline | |||||||||||||||||
| xorSHA-256 digests XORed: no group, 32 bytes | 24.2 ns | 0.71 ns | 0.38 ns | ||||||||||||||
| GF(2^127), 16 bytes | |||||||||||||||||
| gf2_127(X:S:Z:T) extended accumulators, Pornin's formulas | 485 ns (1.32× the best) | 61.5 ns (best) | 3.88 ns (6.33× the best) | 3.54 ns (7.69× the best) | 14.1 ns (1.44× the best) | 22.0 ns (1.26× the best) | 14.7 ns (1.49× the best) | 0.64 ns (1.11× the best) | 0.81 ns (2.38× the best) | 2.98 ns (1.86× the best) | 2.87 ns (1.79× the best) | 371 ns (2.19× the best) | 13.1 ns (1.62× the best) | 367 ns (1.96× the best) | 14.0 ns (1.06× the best) | ||
| gf2_127-lambdaincompleteλ-projective (X:L:Z) accumulators | 806 ns (2.19× the best) | 75.6 ns (1.23× the best) | 456 ns (1.45× the best) | 53.5 ns (tied for the best, within noise) | 340 ns (553.91× the best) | 6.33 ns (13.74× the best) | 14.9 ns (1.53× the best) | 20.2 ns (1.15× the best) | 15.1 ns (1.53× the best) | 0.65 ns (1.11× the best) | 0.84 ns (2.47× the best) | 3.84 ns (2.40× the best) | 3.81 ns (2.38× the best) | 361 ns (2.13× the best) | 10.1 ns (1.25× the best) | 364 ns (1.95× the best) | 14.0 ns (1.06× the best) |
| gf2_127-wincompleteλ-projective, w codec: hashes and decodes to λ-affine | 865 ns (2.35× the best) | 83.3 ns (1.36× the best) | 455 ns (1.44× the best) | 53.5 ns (tied for the best, within noise) | 0.63 ns (1.02× the best) | 0.48 ns (1.05× the best) | 14.9 ns (1.53× the best) | 20.2 ns (1.15× the best) | 14.7 ns (1.49× the best) | 0.65 ns (1.12× the best) | 0.84 ns (2.47× the best) | 3.86 ns (2.41× the best) | 3.84 ns (2.40× the best) | 361 ns (2.13× the best) | 10.3 ns (1.28× the best) | 361 ns (1.93× the best) | 15.1 ns (1.14× the best) |
| gf2_127-uunscaled (X:S:Z), w codec, direct addend hashes | 869 ns (2.36× the best) | 85.8 ns (1.40× the best) | 461 ns (1.46× the best) | 57.2 ns (1.07× the best) | 0.63 ns (1.03× the best) | 0.49 ns (1.06× the best) | 10.7 ns (1.09× the best) | 17.5 ns (best) | 10.8 ns (1.09× the best) | 0.64 ns (1.09× the best) | 0.84 ns (2.47× the best) | 4.67 ns (2.92× the best) | 4.68 ns (2.92× the best) | 355 ns (2.09× the best) | 9.17 ns (1.14× the best) | 376 ns (2.01× the best) | 18.3 ns (1.39× the best) |
| GF(2^122) = GF(2^61)[u], dense constant, 16 bytes | |||||||||||||||||
| gf2_122(X:S:Z:T) extended | 373 ns (1.01× the best) | 62.8 ns (1.02× the best) | 4.92 ns (8.02× the best) | 5.02 ns (10.91× the best) | 17.8 ns (1.83× the best) | 26.1 ns (1.49× the best) | 0.63 ns (1.08× the best) | 0.77 ns (2.28× the best) | 3.75 ns (2.34× the best) | 211 ns (1.24× the best) | 15.7 ns (1.94× the best) | 197 ns (1.05× the best) | 13.5 ns (1.02× the best) | ||||
| gf2_122-lambdaincompleteλ-projective | 509 ns (1.38× the best) | 74.9 ns (1.22× the best) | 326 ns (1.04× the best) | 53.9 ns (1.01× the best) | 166 ns (271.21× the best) | 7.55 ns (16.38× the best) | 16.6 ns (1.70× the best) | 23.0 ns (1.32× the best) | 16.7 ns (1.69× the best) | 0.65 ns (1.12× the best) | 0.77 ns (2.28× the best) | 3.78 ns (2.36× the best) | 3.79 ns (2.37× the best) | 189 ns (1.12× the best) | 11.9 ns (1.48× the best) | 196 ns (1.04× the best) | 13.5 ns (1.02× the best) |
| gf2_122-wincompleteλ-projective, w codec | 517 ns (1.40× the best) | 76.8 ns (1.25× the best) | 326 ns (1.04× the best) | 54.0 ns (1.01× the best) | 0.63 ns (1.03× the best) | 0.46 ns (tied for the best, within noise) | 16.6 ns (1.70× the best) | 23.0 ns (1.31× the best) | 17.1 ns (1.73× the best) | 0.65 ns (1.12× the best) | 0.77 ns (2.28× the best) | 3.77 ns (2.36× the best) | 3.79 ns (2.37× the best) | 204 ns (1.21× the best) | 14.4 ns (1.79× the best) | 193 ns (1.03× the best) | 14.4 ns (1.09× the best) |
| gf2_122-uunscaled (X:S:Z), w codec | 531 ns (1.44× the best) | 87.6 ns (1.43× the best) | 326 ns (1.03× the best) | 57.1 ns (1.07× the best) | 0.61 ns (tied for the best, within noise, 1.00×) | 0.48 ns (1.04× the best) | 13.1 ns (1.34× the best) | 18.8 ns (1.08× the best) | 13.2 ns (1.34× the best) | 0.65 ns (1.12× the best) | 0.77 ns (2.28× the best) | 5.31 ns (3.32× the best) | 5.34 ns (3.34× the best) | 206 ns (1.22× the best) | 12.1 ns (1.49× the best) | 223 ns (1.19× the best) | 18.7 ns (1.42× the best) |
| GF(2^122), constant in GF(2^61) (GLS-shaped), 16 bytes | |||||||||||||||||
| gf2_122-gls(X:S:Z:T) extended | 369 ns (best) | 62.0 ns (1.01× the best) | 4.31 ns (7.02× the best) | 4.44 ns (9.63× the best) | 16.8 ns (1.72× the best) | 23.7 ns (1.36× the best) | 1.12 ns (1.93× the best) | 0.77 ns (2.27× the best) | 3.79 ns (2.37× the best) | 209 ns (1.23× the best) | 15.2 ns (1.88× the best) | 195 ns (1.04× the best) | 13.2 ns (tied for the best, within noise) | ||||
| gf2_122-gls-lambdaincompleteλ-projective | 515 ns (1.40× the best) | 76.5 ns (1.24× the best) | 315 ns (tied for the best, within noise) | 55.4 ns (1.04× the best) | 167 ns (273.01× the best) | 7.53 ns (16.36× the best) | 16.6 ns (1.70× the best) | 23.1 ns (1.32× the best) | 16.7 ns (1.69× the best) | 0.65 ns (1.11× the best) | 0.78 ns (2.28× the best) | 3.79 ns (2.37× the best) | 3.79 ns (2.37× the best) | 189 ns (1.12× the best) | 11.6 ns (1.44× the best) | 187 ns (best) | 13.2 ns (tied for the best, within noise, 1.00×) |
| gf2_122-gls-wincompleteλ-projective, w codec | 509 ns (1.38× the best) | 78.6 ns (1.28× the best) | 316 ns (tied for the best, within noise, 1.00×) | 55.4 ns (1.04× the best) | 0.63 ns (1.03× the best) | 0.49 ns (1.06× the best) | 16.6 ns (1.70× the best) | 23.1 ns (1.32× the best) | 16.8 ns (1.70× the best) | 0.65 ns (1.12× the best) | 0.78 ns (2.28× the best) | 3.79 ns (2.37× the best) | 3.79 ns (2.37× the best) | 204 ns (1.21× the best) | 14.4 ns (1.79× the best) | 191 ns (1.02× the best) | 14.3 ns (1.08× the best) |
| gf2_122-gls-uunscaled (X:S:Z), w codec | 522 ns (1.42× the best) | 80.2 ns (1.30× the best) | 319 ns (1.01× the best) | 55.7 ns (1.04× the best) | 0.63 ns (1.02× the best) | 0.48 ns (1.04× the best) | 13.1 ns (1.34× the best) | 18.9 ns (1.08× the best) | 13.2 ns (1.34× the best) | 0.65 ns (1.12× the best) | 0.78 ns (2.29× the best) | 5.32 ns (3.32× the best) | 5.31 ns (3.32× the best) | 195 ns (1.15× the best) | 12.3 ns (1.52× the best) | 207 ns (1.10× the best) | 16.8 ns (1.27× the best) |
| GF(2^109), 14 bytes | |||||||||||||||||
| gf2_109(X:S:Z:T) extended | 560 ns (1.52× the best) | 63.7 ns (1.04× the best) | 2.77 ns (4.51× the best) | 2.79 ns (6.06× the best) | 12.8 ns (1.32× the best) | 24.3 ns (1.39× the best) | 13.2 ns (1.34× the best) | 0.63 ns (1.08× the best) | 0.64 ns (1.87× the best) | 2.24 ns (1.40× the best) | 2.28 ns (1.43× the best) | 381 ns (2.25× the best) | 10.9 ns (1.36× the best) | 380 ns (2.03× the best) | 14.2 ns (1.08× the best) | ||
| gf2_109-lambdaincompleteλ-projective | 873 ns (2.37× the best) | 82.0 ns (1.33× the best) | 550 ns (1.75× the best) | 55.2 ns (1.03× the best) | 349 ns (568.88× the best) | 5.17 ns (11.22× the best) | 12.0 ns (1.23× the best) | 24.2 ns (1.38× the best) | 12.1 ns (1.22× the best) | 0.65 ns (1.11× the best) | 0.56 ns (1.64× the best) | 1.60 ns (best) | 1.60 ns (best) | 366 ns (2.16× the best) | 8.13 ns (1.01× the best) | 381 ns (2.04× the best) | 14.1 ns (1.07× the best) |
| gf2_109-wincompleteλ-projective, w codec | 855 ns (2.32× the best) | 79.4 ns (1.29× the best) | 535 ns (1.70× the best) | 54.5 ns (1.02× the best) | 0.61 ns (tied for the best, within noise) | 0.48 ns (1.04× the best) | 12.0 ns (1.23× the best) | 24.2 ns (1.38× the best) | 12.1 ns (1.23× the best) | 0.65 ns (1.12× the best) | 0.56 ns (1.64× the best) | 1.82 ns (1.13× the best) | 1.82 ns (1.14× the best) | 359 ns (2.12× the best) | 10.4 ns (1.28× the best) | 378 ns (2.02× the best) | 15.5 ns (1.17× the best) |
| gf2_109-uunscaled (X:S:Z), w codec | 874 ns (2.37× the best) | 81.2 ns (1.32× the best) | 533 ns (1.69× the best) | 60.7 ns (1.13× the best) | 0.63 ns (1.02× the best) | 0.49 ns (1.05× the best) | 9.76 ns (best) | 19.0 ns (1.09× the best) | 9.88 ns (best) | 0.65 ns (1.12× the best) | 0.56 ns (1.64× the best) | 3.46 ns (2.16× the best) | 3.50 ns (2.19× the best) | 397 ns (2.34× the best) | 9.88 ns (1.22× the best) | 398 ns (2.13× the best) | 18.4 ns (1.39× the best) |
| F_p, p = 2^127 − 1, 16 bytes | |||||||||||||||||
| edwards127a = 1 Edwards, extended += cached | 1.07 µs (2.90× the best) | 1.07 µs (17.39× the best) | 582 ns (948.36× the best) | 28.3 ns (61.37× the best) | 20.1 ns (2.06× the best) | 22.2 ns (1.27× the best) | 1.34 ns (2.30× the best) | 0.38 ns (1.12× the best) | 1.97 ns (1.23× the best) | 549 ns (3.24× the best) | 22.0 ns (2.72× the best) | 489 ns (2.61× the best) | 486 ns (36.80× the best) | ||||
| weier127short Weierstrass, projective += affine | 1.03 µs (2.79× the best) | 1.04 µs (16.85× the best) | 0.61 ns (tied for the best, within noise, 1.00×) | 0.46 ns (tied for the best, within noise, 1.00×) | 45.4 ns (4.65× the best) | 46.7 ns (2.67× the best) | 0.69 ns (1.18× the best) | 0.34 ns (tied for the best, within noise, 1.00×) | 2.05 ns (1.28× the best) | 536 ns (3.16× the best) | 10.1 ns (1.25× the best) | 489 ns (2.61× the best) | 485 ns (36.73× the best) | ||||
| weier127-jacobianincompleteshort Weierstrass, Jacobian += affine | 1.03 µs (2.80× the best) | 1.04 µs (16.90× the best) | 0.62 ns (tied for the best, within noise, 1.01×) | 0.49 ns (1.06× the best) | 37.5 ns (3.84× the best) | 45.3 ns (2.59× the best) | 0.69 ns (1.18× the best) | 0.34 ns (tied for the best, within noise) | 4.53 ns (2.83× the best) | 533 ns (3.14× the best) | 15.7 ns (1.94× the best) | 492 ns (2.63× the best) | 485 ns (36.77× the best) | ||||
| F_p, p = 2^107 − 1, 14 bytes | |||||||||||||||||
| edwards107a = 1 Edwards, extended += cached | 806 ns (2.19× the best) | 805 ns (13.10× the best) | 546 ns (889.89× the best) | 22.7 ns (49.36× the best) | 15.5 ns (1.59× the best) | 18.4 ns (1.05× the best) | 0.83 ns (1.42× the best) | 0.75 ns (2.20× the best) | 3.05 ns (1.91× the best) | 506 ns (2.99× the best) | 20.3 ns (2.51× the best) | 359 ns (1.92× the best) | 354 ns (26.79× the best) | ||||
| weier107short Weierstrass, projective += affine | 746 ns (2.02× the best) | 748 ns (12.17× the best) | 0.62 ns (tied for the best, within noise, 1.01×) | 0.49 ns (1.07× the best) | 30.5 ns (3.12× the best) | 32.4 ns (1.85× the best) | 0.58 ns (tied for the best, within noise) | 0.84 ns (2.48× the best) | 3.63 ns (2.27× the best) | 497 ns (2.93× the best) | 11.5 ns (1.42× the best) | 358 ns (1.91× the best) | 352 ns (26.66× the best) | ||||
| weier107-jacobianincompleteshort Weierstrass, Jacobian += affine | 742 ns (2.01× the best) | 745 ns (12.13× the best) | 0.62 ns (tied for the best, within noise, 1.00×) | 0.48 ns (1.04× the best) | 28.7 ns (2.94× the best) | 35.5 ns (2.03× the best) | 0.58 ns (tied for the best, within noise) | 0.84 ns (2.48× the best) | 5.96 ns (3.73× the best) | 502 ns (2.96× the best) | 15.3 ns (1.90× the best) | 351 ns (1.88× the best) | 352 ns (26.63× the best) | ||||
| F_p, p = 2^128 − 275, 16 bytes | |||||||||||||||||
| twisted128a = −1 twisted Edwards modulo 2-torsion, extended += cached | 1.92 µs (5.22× the best) | 1.92 µs (31.28× the best) | 8.24 ns (13.43× the best) | 8.08 ns (17.55× the best) | 23.9 ns (2.45× the best) | 28.8 ns (1.65× the best) | 0.85 ns (1.46× the best) | 0.34 ns (1.01× the best) | 7.51 ns (4.69× the best) | 939 ns (5.54× the best) | 16.0 ns (1.98× the best) | 949 ns (5.07× the best) | 952 ns (72.09× the best) | ||||
| F_{p²}, p = 2^61 − 1, 16 bytes | |||||||||||||||||
| edwards61x2a = 1 Edwards, signed-x codec, extended += cached | 624 ns (1.69× the best) | 620 ns (10.09× the best) | 216 ns (352.47× the best) | 18.8 ns (40.87× the best) | 13.3 ns (1.37× the best) | 22.5 ns (1.29× the best) | 0.88 ns (1.51× the best) | 0.38 ns (1.12× the best) | 1.65 ns (1.03× the best) | 181 ns (1.07× the best) | 16.2 ns (2.01× the best) | 405 ns (2.16× the best) | 404 ns (30.63× the best) | ||||
| weier61x2short Weierstrass, signed-x codec, projective += affine | 637 ns (1.73× the best) | 637 ns (10.36× the best) | 0.63 ns (1.02× the best) | 0.72 ns (1.56× the best) | 26.8 ns (2.74× the best) | 36.2 ns (2.07× the best) | 0.66 ns (1.13× the best) | 0.52 ns (1.55× the best) | 1.70 ns (1.06× the best) | 170 ns (best) | 8.11 ns (tied for the best, within noise, 1.00×) | 416 ns (2.22× the best) | 412 ns (31.22× the best) | ||||
| weier61x2-jacobianincompleteshort Weierstrass, signed-x codec, Jacobian += affine | 638 ns (1.73× the best) | 638 ns (10.37× the best) | 0.63 ns (1.02× the best) | 0.54 ns (1.18× the best) | 31.6 ns (3.24× the best) | 37.2 ns (2.13× the best) | 0.66 ns (1.13× the best) | 0.52 ns (1.54× the best) | 3.59 ns (2.24× the best) | 179 ns (1.06× the best) | 11.7 ns (1.45× the best) | 417 ns (2.23× the best) | 413 ns (31.25× the best) | ||||
| twisted61x2a = −1 Edwards modulo 2-torsion, extended += cached | 630 ns (1.71× the best) | 632 ns (10.28× the best) | 3.41 ns (5.55× the best) | 3.60 ns (7.81× the best) | 12.5 ns (1.28× the best) | 22.3 ns (1.28× the best) | 12.8 ns (1.29× the best) | 0.91 ns (1.56× the best) | 0.34 ns (1.01× the best) | 3.32 ns (2.07× the best) | 3.32 ns (2.07× the best) | 179 ns (1.05× the best) | 8.07 ns (tied for the best, within noise) | 425 ns (2.27× the best) | 420 ns (31.80× the best) | ||
| F_{p²}, p = 2^64 − 59, 16 bytes | |||||||||||||||||
| twisted64x2a = −1 Edwards modulo 2-torsion, extended += cached | 1.10 µs (2.98× the best) | 1.10 µs (17.90× the best) | 5.43 ns (8.85× the best) | 5.51 ns (11.96× the best) | 17.2 ns (1.77× the best) | 28.6 ns (1.64× the best) | 0.91 ns (1.56× the best) | 0.34 ns (1.02× the best) | 5.39 ns (3.36× the best) | 290 ns (1.71× the best) | 10.3 ns (1.28× the best) | 721 ns (3.85× the best) | 718 ns (54.39× the best) | ||||
| F_{p²}, p = 2^64 − 2^32 + 1, 16 bytes | |||||||||||||||||
| twisted-goldilocks2a = −1 Edwards modulo 2-torsion, extended += cached | 1.73 µs (4.70× the best) | 1.75 µs (28.48× the best) | 4.48 ns (7.30× the best) | 4.51 ns (9.78× the best) | 15.0 ns (1.54× the best) | 19.0 ns (1.09× the best) | 1.49 ns (2.55× the best) | 0.52 ns (1.55× the best) | 4.92 ns (3.07× the best) | 197 ns (1.16× the best) | 11.3 ns (1.40× the best) | 1.53 µs (8.18× the best) | 1.52 µs (114.99× the best) | ||||
| references, 32 and 33 bytes | |||||||||||||||||
| ristretto255curve25519-dalek | 4.72 µs (12.80× the best) | 65.1 ns (6.67× the best) | 63.8 ns (3.65× the best) | 64.4 ns (6.52× the best) | 6.20 ns (10.64× the best) | ||||||||||||
| secp256k1libsecp256k1 | 4.49 µs (12.17× the best) | 12.8 ns (22.01× the best) | |||||||||||||||
bold: the best of its column; italic, dotted: tied with the best within the confidence intervals; shading: ratio to the best, pale yellow at 1× to purple at 16× or more; grey: baseline, not compared.
Field operations
Per field; batched inversion per element of a batch of 1024.
| field | mul | square | add | sqrt | sqrt ratio | halftrace | invert | pack | unpack | |||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| throughput | latency | throughput | latency | alone | batched | |||||||
| binary | ||||||||||||
| gf2_127F_2[z]/(z^127 + z^63 + 1) | 1.21 ns (1.17× the best) | 3.75 ns (1.29× the best) | 0.70 ns (best) | 2.08 ns (best) | xor | 1.26 ns (best) | 4.11 ns (1.53× the best) | 317 ns (2.00× the best) | 3.60 ns (1.03× the best) | |||
| gf2_122GF(2^61)[u]/(u^2 + u + 1) | 1.21 ns (1.17× the best) | 4.90 ns (1.69× the best) | 1.09 ns (1.55× the best) | 4.44 ns (2.13× the best) | xor | 2.95 ns (2.35× the best) | 2.69 ns (best) | 159 ns (tied for the best, within noise, 1.00×) | 4.47 ns (1.28× the best) | |||
| gf2_109F_2[z]/(z^109 + z^5 + z^4 + z^2 + 1) | 1.04 ns (best) | 3.92 ns (1.35× the best) | 0.83 ns (1.19× the best) | 2.17 ns (1.04× the best) | xor | 2.77 ns (2.21× the best) | 3.32 ns (1.24× the best) | 341 ns (2.15× the best) | 3.49 ns (best) | |||
| prime | ||||||||||||
| fp127p = 2^127 − 1 | 1.50 ns (1.45× the best) | 3.82 ns (1.32× the best) | 1.78 ns (2.54× the best) | 3.57 ns (1.71× the best) | 0.83 ns (1.62× the best) | 470 ns (374.16× the best) | 518 ns (1.87× the best) | 520 ns (3.28× the best) | 5.64 ns (1.61× the best) | 0.34 ns (1.01× the best) | 0.51 ns (best) | |
| fp107p = 2^107 − 1 | 1.15 ns (1.11× the best) | 3.20 ns (1.10× the best) | 0.97 ns (1.39× the best) | 3.01 ns (1.44× the best) | 0.51 ns (best) | 341 ns (271.16× the best) | 482 ns (1.74× the best) | 477 ns (3.01× the best) | 5.23 ns (1.50× the best) | 0.67 ns (1.96× the best) | 0.51 ns (1.00× the best) | |
| fp128p = 2^128 − 275, for twisted128 | 2.77 ns (2.66× the best) | 6.58 ns (2.27× the best) | 2.58 ns (3.68× the best) | 6.37 ns (3.06× the best) | 0.89 ns (1.74× the best) | 878 ns (698.88× the best) | 932 ns (3.36× the best) | 933 ns (5.88× the best) | 0.34 ns (1.00× the best) | 0.51 ns (1.00× the best) | ||
| quadratic extensions of prime fields | ||||||||||||
| fp61x2GF(p^2) = F_p[i]/(i^2 + 1), p = 2^61 − 1 | 1.26 ns (1.21× the best) | 3.30 ns (1.14× the best) | 1.40 ns (1.99× the best) | 3.48 ns (1.67× the best) | 0.53 ns (1.04× the best) | 277 ns (220.65× the best) | 277 ns (best) | 159 ns (tied for the best, within noise) | 4.67 ns (1.34× the best) | 0.34 ns (best) | 0.72 ns (1.42× the best) | |
| fp64x2GF(p^2) = F_p[i]/(i^2 − 2), p = 2^64 − 59 | 2.24 ns (2.15× the best) | 5.08 ns (1.75× the best) | 2.23 ns (3.19× the best) | 4.92 ns (2.36× the best) | 0.56 ns (1.10× the best) | 485 ns (385.97× the best) | 481 ns (1.74× the best) | 281 ns (1.77× the best) | 5.77 ns (1.65× the best) | 0.34 ns (1.00× the best) | 0.55 ns (1.08× the best) | |
| goldilocks2GF(p^2) = F_p[i]/(i^2 − 7), p = 2^64 − 2^32 + 1 | 1.36 ns (1.31× the best) | 2.90 ns (best) | 1.69 ns (2.42× the best) | 3.43 ns (1.65× the best) | 0.59 ns (1.16× the best) | 727 ns (578.68× the best) | 677 ns (2.44× the best) | 186 ns (1.17× the best) | 5.87 ns (1.68× the best) | 0.40 ns (1.16× the best) | 0.55 ns (1.09× the best) | |
bold: the best of its column; italic, dotted: tied with the best within the confidence intervals; shading: ratio to the best, pale yellow at 1× to purple at 16× or more; grey: baseline, not compared.
Which bench each cell is
| operation | curve | bench | time | 95% CI |
|---|---|---|---|---|
| field mul, throughput | gf2_127 | field/gf2_127/mul throughput (8 chains) | 1.21 ns | 1.21 ns .. 1.21 ns |
| field mul, throughput | gf2_109 | field/gf2_109/mul throughput (8 chains) | 1.04 ns | 1.04 ns .. 1.04 ns |
| field mul, throughput | gf2_122 | field/gf2_122/mul throughput (8 chains) | 1.21 ns | 1.21 ns .. 1.21 ns |
| field mul, throughput | fp127 | field/fp127/mul throughput (8 chains) | 1.50 ns | 1.50 ns .. 1.50 ns |
| field mul, throughput | fp107 | field/fp107 schoolbook/mul throughput (8 chains) | 1.15 ns | 1.15 ns .. 1.15 ns |
| field mul, throughput | fp128 | field/fp128/mul throughput (8 chains) | 2.77 ns | 2.77 ns .. 2.77 ns |
| field mul, throughput | fp61x2 | field/fp61x2/mul throughput (8 chains) | 1.26 ns | 1.26 ns .. 1.26 ns |
| field mul, throughput | fp64x2 | field/fp64x2/mul throughput (8 chains) | 2.24 ns | 2.24 ns .. 2.24 ns |
| field mul, throughput | goldilocks2 | field/goldilocks2/mul throughput (8 chains) | 1.36 ns | 1.35 ns .. 1.38 ns |
| field mul, latency | gf2_127 | field/gf2_127/mul latency (dependent chain) | 3.75 ns | 3.74 ns .. 3.77 ns |
| field mul, latency | gf2_109 | field/gf2_109/mul latency (dependent chain) | 3.92 ns | 3.91 ns .. 3.93 ns |
| field mul, latency | gf2_122 | field/gf2_122/mul latency (dependent chain) | 4.90 ns | 4.90 ns .. 4.90 ns |
| field mul, latency | fp127 | field/fp127/mul latency (dependent chain) | 3.82 ns | 3.81 ns .. 3.82 ns |
| field mul, latency | fp107 | field/fp107 schoolbook/mul latency (dependent chain) | 3.20 ns | 3.20 ns .. 3.21 ns |
| field mul, latency | fp128 | field/fp128/mul latency (dependent chain) | 6.58 ns | 6.57 ns .. 6.58 ns |
| field mul, latency | fp61x2 | field/fp61x2/mul latency (dependent chain) | 3.30 ns | 3.30 ns .. 3.31 ns |
| field mul, latency | fp64x2 | field/fp64x2/mul latency (dependent chain) | 5.08 ns | 5.07 ns .. 5.09 ns |
| field mul, latency | goldilocks2 | field/goldilocks2/mul latency (dependent chain) | 2.90 ns | 2.90 ns .. 2.90 ns |
| field square, throughput | gf2_127 | field/gf2_127/square throughput (8 chains) | 0.70 ns | 0.70 ns .. 0.70 ns |
| field square, throughput | gf2_109 | field/gf2_109/square throughput (8 chains) | 0.83 ns | 0.83 ns .. 0.84 ns |
| field square, throughput | gf2_122 | field/gf2_122/square throughput (8 chains) | 1.09 ns | 1.09 ns .. 1.09 ns |
| field square, throughput | fp127 | field/fp127/square throughput (8 chains) | 1.78 ns | 1.78 ns .. 1.78 ns |
| field square, throughput | fp107 | field/fp107/square throughput (8 chains) | 0.97 ns | 0.97 ns .. 0.97 ns |
| field square, throughput | fp128 | field/fp128/square throughput (8 chains) | 2.58 ns | 2.58 ns .. 2.58 ns |
| field square, throughput | fp61x2 | field/fp61x2/square throughput (8 chains) | 1.40 ns | 1.39 ns .. 1.40 ns |
| field square, throughput | fp64x2 | field/fp64x2/square throughput (8 chains) | 2.23 ns | 2.23 ns .. 2.24 ns |
| field square, throughput | goldilocks2 | field/goldilocks2/square throughput (8 chains) | 1.69 ns | 1.68 ns .. 1.71 ns |
| field square, latency | gf2_127 | field/gf2_127/square latency (dependent chain) | 2.08 ns | 2.08 ns .. 2.09 ns |
| field square, latency | gf2_109 | field/gf2_109/square latency (dependent chain) | 2.17 ns | 2.16 ns .. 2.17 ns |
| field square, latency | gf2_122 | field/gf2_122/square latency (dependent chain) | 4.44 ns | 4.43 ns .. 4.44 ns |
| field square, latency | fp127 | field/fp127/square latency (dependent chain) | 3.57 ns | 3.56 ns .. 3.57 ns |
| field square, latency | fp107 | field/fp107/square latency (dependent chain) | 3.01 ns | 3.00 ns .. 3.02 ns |
| field square, latency | fp128 | field/fp128/square latency (dependent chain) | 6.37 ns | 6.36 ns .. 6.37 ns |
| field square, latency | fp61x2 | field/fp61x2/square latency (dependent chain) | 3.48 ns | 3.48 ns .. 3.49 ns |
| field square, latency | fp64x2 | field/fp64x2/square latency (dependent chain) | 4.92 ns | 4.91 ns .. 4.92 ns |
| field square, latency | goldilocks2 | field/goldilocks2/square latency (dependent chain) | 3.43 ns | 3.43 ns .. 3.44 ns |
| field add | fp127 | field/fp127/add | 0.83 ns | 0.83 ns .. 0.83 ns |
| field add | fp107 | field/fp107/add | 0.51 ns | 0.50 ns .. 0.52 ns |
| field add | fp128 | field/fp128/add | 0.89 ns | 0.89 ns .. 0.89 ns |
| field add | fp61x2 | field/fp61x2/add | 0.53 ns | 0.53 ns .. 0.53 ns |
| field add | fp64x2 | field/fp64x2/add | 0.56 ns | 0.56 ns .. 0.57 ns |
| field add | goldilocks2 | field/goldilocks2/add | 0.59 ns | 0.59 ns .. 0.59 ns |
| field sqrt | gf2_127 | field/gf2_127/sqrt | 1.26 ns | 1.26 ns .. 1.26 ns |
| field sqrt | gf2_109 | field/gf2_109/sqrt | 2.77 ns | 2.77 ns .. 2.78 ns |
| field sqrt | gf2_122 | field/gf2_122/sqrt | 2.95 ns | 2.95 ns .. 2.95 ns |
| field sqrt | fp127 | field/fp127/sqrt (x^(2^125)) | 470 ns | 468 ns .. 472 ns |
| field sqrt | fp107 | field/fp107/sqrt (x^(2^105)) | 341 ns | 340 ns .. 341 ns |
| field sqrt | fp128 | field/fp128/sqrt | 878 ns | 877 ns .. 878 ns |
| field sqrt | fp61x2 | field/fp61x2/sqrt | 277 ns | 277 ns .. 277 ns |
| field sqrt | fp64x2 | field/fp64x2/sqrt | 485 ns | 485 ns .. 485 ns |
| field sqrt | goldilocks2 | field/goldilocks2/sqrt | 727 ns | 724 ns .. 730 ns |
| field sqrt ratio | fp127 | field/fp127/sqrt_ratio | 518 ns | 517 ns .. 519 ns |
| field sqrt ratio | fp107 | field/fp107/sqrt_ratio | 482 ns | 482 ns .. 482 ns |
| field sqrt ratio | fp128 | field/fp128/sqrt_ratio | 932 ns | 932 ns .. 933 ns |
| field sqrt ratio | fp61x2 | field/fp61x2/sqrt_ratio | 277 ns | 277 ns .. 278 ns |
| field sqrt ratio | fp64x2 | field/fp64x2/sqrt_ratio | 481 ns | 481 ns .. 482 ns |
| field sqrt ratio | goldilocks2 | field/goldilocks2/sqrt_ratio | 677 ns | 676 ns .. 678 ns |
| field halftrace | gf2_127 | field/gf2_127/halftrace (byte tables) | 4.11 ns | 4.11 ns .. 4.11 ns |
| field halftrace | gf2_109 | field/gf2_109/halftrace (byte tables) | 3.32 ns | 3.32 ns .. 3.33 ns |
| field halftrace | gf2_122 | field/gf2_122/qsolve (z^2 + z = c, 2 base halftraces) | 2.69 ns | 2.68 ns .. 2.69 ns |
| field invert, one at a time | gf2_127 | field/gf2_127/invert | 317 ns | 317 ns .. 318 ns |
| field invert, one at a time | gf2_109 | field/gf2_109/invert | 341 ns | 340 ns .. 343 ns |
| field invert, one at a time | gf2_122 | field/gf2_122/invert | 159 ns | 159 ns .. 159 ns |
| field invert, one at a time | fp127 | field/fp127/invert | 520 ns | 518 ns .. 522 ns |
| field invert, one at a time | fp107 | field/fp107/invert | 477 ns | 477 ns .. 478 ns |
| field invert, one at a time | fp128 | field/fp128/invert | 933 ns | 932 ns .. 934 ns |
| field invert, one at a time | fp61x2 | field/fp61x2/invert | 159 ns | 159 ns .. 159 ns |
| field invert, one at a time | fp64x2 | field/fp64x2/invert | 281 ns | 280 ns .. 281 ns |
| field invert, one at a time | goldilocks2 | field/goldilocks2/invert | 186 ns | 182 ns .. 190 ns |
| field invert, batched | gf2_127 | field/gf2_127/batch invert (product tree) | 3.60 ns | 3.60 ns .. 3.61 ns |
| field invert, batched | gf2_109 | field/gf2_109/batch invert (product tree) | 3.49 ns | 3.49 ns .. 3.50 ns |
| field invert, batched | gf2_122 | field/gf2_122/batch invert (product tree) | 4.47 ns | 4.47 ns .. 4.47 ns |
| field invert, batched | fp127 | field/fp127/batch invert (product tree) | 5.64 ns | 5.64 ns .. 5.64 ns |
| field invert, batched | fp107 | field/fp107/batch invert (product tree) | 5.23 ns | 5.22 ns .. 5.23 ns |
| field invert, batched | fp61x2 | field/fp61x2/batch invert (product tree) | 4.67 ns | 4.66 ns .. 4.67 ns |
| field invert, batched | fp64x2 | field/fp64x2/batch invert (product tree) | 5.77 ns | 5.77 ns .. 5.78 ns |
| field invert, batched | goldilocks2 | field/goldilocks2/batch invert (product tree) | 5.87 ns | 5.85 ns .. 5.89 ns |
| field pack | fp127 | field/fp127/pack | 0.34 ns | 0.34 ns .. 0.34 ns |
| field pack | fp107 | field/fp107/pack | 0.67 ns | 0.67 ns .. 0.67 ns |
| field pack | fp128 | field/fp128/pack | 0.34 ns | 0.34 ns .. 0.34 ns |
| field pack | fp61x2 | field/fp61x2/pack | 0.34 ns | 0.34 ns .. 0.34 ns |
| field pack | fp64x2 | field/fp64x2/pack | 0.34 ns | 0.34 ns .. 0.34 ns |
| field pack | goldilocks2 | field/goldilocks2/pack | 0.40 ns | 0.40 ns .. 0.40 ns |
| field unpack | fp127 | field/fp127/unpack | 0.51 ns | 0.51 ns .. 0.51 ns |
| field unpack | fp107 | field/fp107/unpack | 0.51 ns | 0.51 ns .. 0.51 ns |
| field unpack | fp128 | field/fp128/unpack | 0.51 ns | 0.51 ns .. 0.51 ns |
| field unpack | fp61x2 | field/fp61x2/unpack | 0.72 ns | 0.72 ns .. 0.72 ns |
| field unpack | fp64x2 | field/fp64x2/unpack | 0.55 ns | 0.55 ns .. 0.55 ns |
| field unpack | goldilocks2 | field/goldilocks2/unpack | 0.55 ns | 0.55 ns .. 0.55 ns |
| point add, throughput | xor | add/xor-sha256/xor 32B, 8 accumulators | 0.71 ns | 0.70 ns .. 0.71 ns |
| point add, throughput | gf2_127 | group.add/binary.127/mode=throughput | 14.1 ns | 14.1 ns .. 14.1 ns |
| point add, throughput | gf2_127-lambda | group.add/binary-lambda.127/mode=throughput | 14.9 ns | 14.9 ns .. 14.9 ns |
| point add, throughput | gf2_127-w | group.add/binary-w.127/mode=throughput | 14.9 ns | 14.8 ns .. 14.9 ns |
| point add, throughput | gf2_127-u | group.add/binary-u.127/mode=throughput | 10.7 ns | 10.6 ns .. 10.7 ns |
| point add, throughput | gf2_109 | group.add/binary.109/mode=throughput | 12.8 ns | 12.8 ns .. 12.9 ns |
| point add, throughput | gf2_109-lambda | group.add/binary-lambda.109/mode=throughput | 12.0 ns | 12.0 ns .. 12.0 ns |
| point add, throughput | gf2_109-w | group.add/binary-w.109/mode=throughput | 12.0 ns | 11.9 ns .. 12.0 ns |
| point add, throughput | gf2_109-u | group.add/binary-u.109/mode=throughput | 9.76 ns | 9.74 ns .. 9.78 ns |
| point add, throughput | gf2_122 | group.add/binary.122/mode=throughput | 17.8 ns | 17.8 ns .. 17.9 ns |
| point add, throughput | gf2_122-lambda | group.add/binary-lambda.122/mode=throughput | 16.6 ns | 16.5 ns .. 16.6 ns |
| point add, throughput | gf2_122-w | group.add/binary-w.122/mode=throughput | 16.6 ns | 16.5 ns .. 16.6 ns |
| point add, throughput | gf2_122-u | group.add/binary-u.122/mode=throughput | 13.1 ns | 13.0 ns .. 13.1 ns |
| point add, throughput | gf2_122-gls | group.add/binary.122-gls/mode=throughput | 16.8 ns | 16.7 ns .. 16.8 ns |
| point add, throughput | gf2_122-gls-lambda | group.add/binary-lambda.122-gls/mode=throughput | 16.6 ns | 16.5 ns .. 16.6 ns |
| point add, throughput | gf2_122-gls-w | group.add/binary-w.122-gls/mode=throughput | 16.6 ns | 16.5 ns .. 16.6 ns |
| point add, throughput | gf2_122-gls-u | group.add/binary-u.122-gls/mode=throughput | 13.1 ns | 13.1 ns .. 13.1 ns |
| point add, throughput | edwards127 | group.add/edwards.127/mode=throughput | 20.1 ns | 20.0 ns .. 20.1 ns |
| point add, throughput | edwards107 | group.add/edwards.107/mode=throughput | 15.5 ns | 15.4 ns .. 15.5 ns |
| point add, throughput | twisted128 | group.add/twisted.128/mode=throughput | 23.9 ns | 23.8 ns .. 24.0 ns |
| point add, throughput | weier127 | group.add/weier.127/mode=throughput | 45.4 ns | 45.3 ns .. 45.5 ns |
| point add, throughput | weier127-jacobian | group.add/weier-jacobian.127/mode=throughput | 37.5 ns | 37.4 ns .. 37.6 ns |
| point add, throughput | weier107 | group.add/weier.107/mode=throughput | 30.5 ns | 30.4 ns .. 30.5 ns |
| point add, throughput | weier107-jacobian | group.add/weier-jacobian.107/mode=throughput | 28.7 ns | 28.6 ns .. 28.7 ns |
| point add, throughput | edwards61x2 | group.add/edwards.61x2/mode=throughput | 13.3 ns | 13.3 ns .. 13.4 ns |
| point add, throughput | weier61x2 | group.add/weier.61x2/mode=throughput | 26.8 ns | 26.7 ns .. 26.8 ns |
| point add, throughput | weier61x2-jacobian | group.add/weier-jacobian.61x2/mode=throughput | 31.6 ns | 31.6 ns .. 31.7 ns |
| point add, throughput | twisted61x2 | group.add/twisted.61x2/mode=throughput | 12.5 ns | 12.4 ns .. 12.6 ns |
| point add, throughput | twisted64x2 | group.add/twisted.64x2/mode=throughput | 17.2 ns | 17.2 ns .. 17.3 ns |
| point add, throughput | twisted-goldilocks2 | group.add/twisted.goldilocks2/mode=throughput | 15.0 ns | 15.0 ns .. 15.1 ns |
| point add, throughput | ristretto255 | add/ristretto255/+=, 8 accumulators | 65.1 ns | 64.8 ns .. 65.5 ns |
| point add, latency | xor | add/xor-sha256/xor 32B, 1 accumulator | 0.38 ns | 0.37 ns .. 0.38 ns |
| point add, latency | gf2_127 | group.add/binary.127/mode=latency | 22.0 ns | 21.9 ns .. 22.0 ns |
| point add, latency | gf2_127-lambda | group.add/binary-lambda.127/mode=latency | 20.2 ns | 20.1 ns .. 20.2 ns |
| point add, latency | gf2_127-w | group.add/binary-w.127/mode=latency | 20.2 ns | 20.1 ns .. 20.2 ns |
| point add, latency | gf2_127-u | group.add/binary-u.127/mode=latency | 17.5 ns | 17.4 ns .. 17.5 ns |
| point add, latency | gf2_109 | group.add/binary.109/mode=latency | 24.3 ns | 24.2 ns .. 24.4 ns |
| point add, latency | gf2_109-lambda | group.add/binary-lambda.109/mode=latency | 24.2 ns | 24.1 ns .. 24.3 ns |
| point add, latency | gf2_109-w | group.add/binary-w.109/mode=latency | 24.2 ns | 24.2 ns .. 24.3 ns |
| point add, latency | gf2_109-u | group.add/binary-u.109/mode=latency | 19.0 ns | 18.9 ns .. 19.0 ns |
| point add, latency | gf2_122 | group.add/binary.122/mode=latency | 26.1 ns | 26.1 ns .. 26.2 ns |
| point add, latency | gf2_122-lambda | group.add/binary-lambda.122/mode=latency | 23.0 ns | 23.0 ns .. 23.1 ns |
| point add, latency | gf2_122-w | group.add/binary-w.122/mode=latency | 23.0 ns | 22.9 ns .. 23.0 ns |
| point add, latency | gf2_122-u | group.add/binary-u.122/mode=latency | 18.8 ns | 18.8 ns .. 18.9 ns |
| point add, latency | gf2_122-gls | group.add/binary.122-gls/mode=latency | 23.7 ns | 23.7 ns .. 23.8 ns |
| point add, latency | gf2_122-gls-lambda | group.add/binary-lambda.122-gls/mode=latency | 23.1 ns | 23.1 ns .. 23.2 ns |
| point add, latency | gf2_122-gls-w | group.add/binary-w.122-gls/mode=latency | 23.1 ns | 23.0 ns .. 23.1 ns |
| point add, latency | gf2_122-gls-u | group.add/binary-u.122-gls/mode=latency | 18.9 ns | 18.8 ns .. 18.9 ns |
| point add, latency | edwards127 | group.add/edwards.127/mode=latency | 22.2 ns | 22.2 ns .. 22.2 ns |
| point add, latency | edwards107 | group.add/edwards.107/mode=latency | 18.4 ns | 18.3 ns .. 18.4 ns |
| point add, latency | twisted128 | group.add/twisted.128/mode=latency | 28.8 ns | 28.7 ns .. 28.8 ns |
| point add, latency | weier127 | group.add/weier.127/mode=latency | 46.7 ns | 46.5 ns .. 46.8 ns |
| point add, latency | weier127-jacobian | group.add/weier-jacobian.127/mode=latency | 45.3 ns | 45.1 ns .. 45.6 ns |
| point add, latency | weier107 | group.add/weier.107/mode=latency | 32.4 ns | 32.3 ns .. 32.4 ns |
| point add, latency | weier107-jacobian | group.add/weier-jacobian.107/mode=latency | 35.5 ns | 35.4 ns .. 35.6 ns |
| point add, latency | edwards61x2 | group.add/edwards.61x2/mode=latency | 22.5 ns | 22.4 ns .. 22.5 ns |
| point add, latency | weier61x2 | group.add/weier.61x2/mode=latency | 36.2 ns | 36.2 ns .. 36.3 ns |
| point add, latency | weier61x2-jacobian | group.add/weier-jacobian.61x2/mode=latency | 37.2 ns | 37.1 ns .. 37.3 ns |
| point add, latency | twisted61x2 | group.add/twisted.61x2/mode=latency | 22.3 ns | 22.3 ns .. 22.3 ns |
| point add, latency | twisted64x2 | group.add/twisted.64x2/mode=latency | 28.6 ns | 28.5 ns .. 28.7 ns |
| point add, latency | twisted-goldilocks2 | group.add/twisted.goldilocks2/mode=latency | 19.0 ns | 18.9 ns .. 19.0 ns |
| point add, latency | ristretto255 | add/ristretto255/+=, 1 accumulator | 63.8 ns | 63.7 ns .. 63.8 ns |
| point subtract | gf2_127 | group.sub/binary.127/mode=throughput | 14.7 ns | 14.7 ns .. 14.7 ns |
| point subtract | gf2_127-lambda | group.sub/binary-lambda.127/mode=throughput | 15.1 ns | 15.1 ns .. 15.2 ns |
| point subtract | gf2_127-w | group.sub/binary-w.127/mode=throughput | 14.7 ns | 14.6 ns .. 14.8 ns |
| point subtract | gf2_127-u | group.sub/binary-u.127/mode=throughput | 10.8 ns | 10.7 ns .. 10.8 ns |
| point subtract | gf2_109 | group.sub/binary.109/mode=throughput | 13.2 ns | 13.2 ns .. 13.3 ns |
| point subtract | gf2_109-lambda | group.sub/binary-lambda.109/mode=throughput | 12.1 ns | 12.1 ns .. 12.1 ns |
| point subtract | gf2_109-w | group.sub/binary-w.109/mode=throughput | 12.1 ns | 12.1 ns .. 12.1 ns |
| point subtract | gf2_109-u | group.sub/binary-u.109/mode=throughput | 9.88 ns | 9.86 ns .. 9.90 ns |
| point subtract | gf2_122-lambda | group.sub/binary-lambda.122/mode=throughput | 16.7 ns | 16.7 ns .. 16.8 ns |
| point subtract | gf2_122-w | group.sub/binary-w.122/mode=throughput | 17.1 ns | 16.7 ns .. 17.5 ns |
| point subtract | gf2_122-u | group.sub/binary-u.122/mode=throughput | 13.2 ns | 13.2 ns .. 13.2 ns |
| point subtract | gf2_122-gls-lambda | group.sub/binary-lambda.122-gls/mode=throughput | 16.7 ns | 16.7 ns .. 16.8 ns |
| point subtract | gf2_122-gls-w | group.sub/binary-w.122-gls/mode=throughput | 16.8 ns | 16.7 ns .. 16.9 ns |
| point subtract | gf2_122-gls-u | group.sub/binary-u.122-gls/mode=throughput | 13.2 ns | 13.2 ns .. 13.2 ns |
| point subtract | twisted61x2 | group.sub/twisted.61x2/mode=throughput | 12.8 ns | 12.7 ns .. 12.8 ns |
| point subtract | ristretto255 | add/ristretto255/-=, 8 accumulators | 64.4 ns | 64.1 ns .. 64.7 ns |
| point negate | gf2_127 | negate/gf2_127/affine (y += x) | 0.64 ns | 0.64 ns .. 0.64 ns |
| point negate | gf2_127-lambda | group.neg/binary-lambda.127 | 0.65 ns | 0.65 ns .. 0.65 ns |
| point negate | gf2_127-w | group.neg/binary-w.127 | 0.65 ns | 0.65 ns .. 0.65 ns |
| point negate | gf2_127-u | group.neg/binary-u.127 | 0.64 ns | 0.63 ns .. 0.64 ns |
| point negate | gf2_109 | negate/gf2_109/affine (y += x) | 0.63 ns | 0.63 ns .. 0.63 ns |
| point negate | gf2_109-lambda | group.neg/binary-lambda.109 | 0.65 ns | 0.65 ns .. 0.65 ns |
| point negate | gf2_109-w | group.neg/binary-w.109 | 0.65 ns | 0.65 ns .. 0.65 ns |
| point negate | gf2_109-u | group.neg/binary-u.109 | 0.65 ns | 0.65 ns .. 0.65 ns |
| point negate | gf2_122 | negate/gf2_122/affine (y += x) | 0.63 ns | 0.63 ns .. 0.63 ns |
| point negate | gf2_122-lambda | group.neg/binary-lambda.122 | 0.65 ns | 0.65 ns .. 0.65 ns |
| point negate | gf2_122-w | group.neg/binary-w.122 | 0.65 ns | 0.65 ns .. 0.65 ns |
| point negate | gf2_122-u | group.neg/binary-u.122 | 0.65 ns | 0.65 ns .. 0.65 ns |
| point negate | gf2_122-gls | group.neg/binary.122-gls | 1.12 ns | 1.12 ns .. 1.13 ns |
| point negate | gf2_122-gls-lambda | group.neg/binary-lambda.122-gls | 0.65 ns | 0.65 ns .. 0.65 ns |
| point negate | gf2_122-gls-w | group.neg/binary-w.122-gls | 0.65 ns | 0.65 ns .. 0.65 ns |
| point negate | gf2_122-gls-u | group.neg/binary-u.122-gls | 0.65 ns | 0.65 ns .. 0.65 ns |
| point negate | edwards127 | group.neg/edwards.127 | 1.34 ns | 1.33 ns .. 1.34 ns |
| point negate | edwards107 | group.neg/edwards.107 | 0.83 ns | 0.82 ns .. 0.83 ns |
| point negate | twisted128 | group.neg/twisted.128 | 0.85 ns | 0.85 ns .. 0.86 ns |
| point negate | weier127 | group.neg/weier.127 | 0.69 ns | 0.69 ns .. 0.69 ns |
| point negate | weier127-jacobian | group.neg/weier-jacobian.127 | 0.69 ns | 0.69 ns .. 0.69 ns |
| point negate | weier107 | group.neg/weier.107 | 0.58 ns | 0.58 ns .. 0.58 ns |
| point negate | weier107-jacobian | group.neg/weier-jacobian.107 | 0.58 ns | 0.58 ns .. 0.58 ns |
| point negate | edwards61x2 | group.neg/edwards.61x2 | 0.88 ns | 0.88 ns .. 0.88 ns |
| point negate | weier61x2 | group.neg/weier.61x2 | 0.66 ns | 0.66 ns .. 0.66 ns |
| point negate | weier61x2-jacobian | group.neg/weier-jacobian.61x2 | 0.66 ns | 0.66 ns .. 0.66 ns |
| point negate | twisted61x2 | group.neg/twisted.61x2 | 0.91 ns | 0.90 ns .. 0.92 ns |
| point negate | twisted64x2 | group.neg/twisted.64x2 | 0.91 ns | 0.90 ns .. 0.91 ns |
| point negate | twisted-goldilocks2 | group.neg/twisted.goldilocks2 | 1.49 ns | 1.48 ns .. 1.49 ns |
| point negate | ristretto255 | negate/ristretto255/-P | 6.20 ns | 6.17 ns .. 6.22 ns |
| point negate | secp256k1 | negate/secp256k1/PublicKey::negate | 12.8 ns | 12.7 ns .. 12.9 ns |
| point prepare, one at a time | gf2_127 | group.prepare/binary.127/mode=indep | 3.88 ns | 3.87 ns .. 3.91 ns |
| point prepare, one at a time | gf2_127-lambda | group.prepare/binary-lambda.127/mode=indep | 340 ns | 339 ns .. 340 ns |
| point prepare, one at a time | gf2_127-w | group.prepare/binary-w.127/mode=indep | 0.63 ns | 0.62 ns .. 0.63 ns |
| point prepare, one at a time | gf2_127-u | group.prepare/binary-u.127/mode=indep | 0.63 ns | 0.63 ns .. 0.63 ns |
| point prepare, one at a time | gf2_109 | group.prepare/binary.109/mode=indep | 2.77 ns | 2.76 ns .. 2.77 ns |
| point prepare, one at a time | gf2_109-lambda | group.prepare/binary-lambda.109/mode=indep | 349 ns | 348 ns .. 350 ns |
| point prepare, one at a time | gf2_109-w | group.prepare/binary-w.109/mode=indep | 0.61 ns | 0.61 ns .. 0.62 ns |
| point prepare, one at a time | gf2_109-u | group.prepare/binary-u.109/mode=indep | 0.63 ns | 0.63 ns .. 0.63 ns |
| point prepare, one at a time | gf2_122 | group.prepare/binary.122/mode=indep | 4.92 ns | 4.90 ns .. 4.93 ns |
| point prepare, one at a time | gf2_122-lambda | group.prepare/binary-lambda.122/mode=indep | 166 ns | 166 ns .. 167 ns |
| point prepare, one at a time | gf2_122-w | group.prepare/binary-w.122/mode=indep | 0.63 ns | 0.63 ns .. 0.63 ns |
| point prepare, one at a time | gf2_122-u | group.prepare/binary-u.122/mode=indep | 0.61 ns | 0.61 ns .. 0.62 ns |
| point prepare, one at a time | gf2_122-gls | group.prepare/binary.122-gls/mode=indep | 4.31 ns | 4.29 ns .. 4.32 ns |
| point prepare, one at a time | gf2_122-gls-lambda | group.prepare/binary-lambda.122-gls/mode=indep | 167 ns | 167 ns .. 168 ns |
| point prepare, one at a time | gf2_122-gls-w | group.prepare/binary-w.122-gls/mode=indep | 0.63 ns | 0.63 ns .. 0.63 ns |
| point prepare, one at a time | gf2_122-gls-u | group.prepare/binary-u.122-gls/mode=indep | 0.63 ns | 0.63 ns .. 0.63 ns |
| point prepare, one at a time | edwards127 | group.prepare/edwards.127/mode=indep | 582 ns | 581 ns .. 583 ns |
| point prepare, one at a time | edwards107 | group.prepare/edwards.107/mode=indep | 546 ns | 544 ns .. 548 ns |
| point prepare, one at a time | twisted128 | group.prepare/twisted.128/mode=indep | 8.24 ns | 8.22 ns .. 8.26 ns |
| point prepare, one at a time | weier127 | group.prepare/weier.127/mode=indep | 0.61 ns | 0.61 ns .. 0.62 ns |
| point prepare, one at a time | weier127-jacobian | group.prepare/weier-jacobian.127/mode=indep | 0.62 ns | 0.62 ns .. 0.62 ns |
| point prepare, one at a time | weier107 | group.prepare/weier.107/mode=indep | 0.62 ns | 0.62 ns .. 0.62 ns |
| point prepare, one at a time | weier107-jacobian | group.prepare/weier-jacobian.107/mode=indep | 0.62 ns | 0.61 ns .. 0.62 ns |
| point prepare, one at a time | edwards61x2 | group.prepare/edwards.61x2/mode=indep | 216 ns | 216 ns .. 217 ns |
| point prepare, one at a time | weier61x2 | group.prepare/weier.61x2/mode=indep | 0.63 ns | 0.63 ns .. 0.63 ns |
| point prepare, one at a time | weier61x2-jacobian | group.prepare/weier-jacobian.61x2/mode=indep | 0.63 ns | 0.63 ns .. 0.63 ns |
| point prepare, one at a time | twisted61x2 | group.prepare/twisted.61x2/mode=indep | 3.41 ns | 3.40 ns .. 3.41 ns |
| point prepare, one at a time | twisted64x2 | group.prepare/twisted.64x2/mode=indep | 5.43 ns | 5.41 ns .. 5.44 ns |
| point prepare, one at a time | twisted-goldilocks2 | group.prepare/twisted.goldilocks2/mode=indep | 4.48 ns | 4.46 ns .. 4.49 ns |
| point prepare, batched | gf2_127 | group.prepare/binary.127/mode=batch,n=1024 | 3.54 ns | 3.54 ns .. 3.54 ns |
| point prepare, batched | gf2_127-lambda | group.prepare/binary-lambda.127/mode=batch,n=1024 | 6.33 ns | 6.30 ns .. 6.35 ns |
| point prepare, batched | gf2_127-w | group.prepare/binary-w.127/mode=batch,n=1024 | 0.48 ns | 0.47 ns .. 0.49 ns |
| point prepare, batched | gf2_127-u | group.prepare/binary-u.127/mode=batch,n=1024 | 0.49 ns | 0.48 ns .. 0.49 ns |
| point prepare, batched | gf2_109 | group.prepare/binary.109/mode=batch,n=1024 | 2.79 ns | 2.79 ns .. 2.80 ns |
| point prepare, batched | gf2_109-lambda | group.prepare/binary-lambda.109/mode=batch,n=1024 | 5.17 ns | 5.16 ns .. 5.18 ns |
| point prepare, batched | gf2_109-w | group.prepare/binary-w.109/mode=batch,n=1024 | 0.48 ns | 0.47 ns .. 0.48 ns |
| point prepare, batched | gf2_109-u | group.prepare/binary-u.109/mode=batch,n=1024 | 0.49 ns | 0.48 ns .. 0.49 ns |
| point prepare, batched | gf2_122 | group.prepare/binary.122/mode=batch,n=1024 | 5.02 ns | 5.01 ns .. 5.03 ns |
| point prepare, batched | gf2_122-lambda | group.prepare/binary-lambda.122/mode=batch,n=1024 | 7.55 ns | 7.53 ns .. 7.56 ns |
| point prepare, batched | gf2_122-w | group.prepare/binary-w.122/mode=batch,n=1024 | 0.46 ns | 0.45 ns .. 0.47 ns |
| point prepare, batched | gf2_122-u | group.prepare/binary-u.122/mode=batch,n=1024 | 0.48 ns | 0.47 ns .. 0.48 ns |
| point prepare, batched | gf2_122-gls | group.prepare/binary.122-gls/mode=batch,n=1024 | 4.44 ns | 4.42 ns .. 4.45 ns |
| point prepare, batched | gf2_122-gls-lambda | group.prepare/binary-lambda.122-gls/mode=batch,n=1024 | 7.53 ns | 7.52 ns .. 7.55 ns |
| point prepare, batched | gf2_122-gls-w | group.prepare/binary-w.122-gls/mode=batch,n=1024 | 0.49 ns | 0.48 ns .. 0.50 ns |
| point prepare, batched | gf2_122-gls-u | group.prepare/binary-u.122-gls/mode=batch,n=1024 | 0.48 ns | 0.47 ns .. 0.48 ns |
| point prepare, batched | edwards127 | group.prepare/edwards.127/mode=batch,n=1024 | 28.3 ns | 28.2 ns .. 28.3 ns |
| point prepare, batched | edwards107 | group.prepare/edwards.107/mode=batch,n=1024 | 22.7 ns | 22.6 ns .. 22.8 ns |
| point prepare, batched | twisted128 | group.prepare/twisted.128/mode=batch,n=1024 | 8.08 ns | 8.06 ns .. 8.10 ns |
| point prepare, batched | weier127 | group.prepare/weier.127/mode=batch,n=1024 | 0.46 ns | 0.46 ns .. 0.47 ns |
| point prepare, batched | weier127-jacobian | group.prepare/weier-jacobian.127/mode=batch,n=1024 | 0.49 ns | 0.48 ns .. 0.50 ns |
| point prepare, batched | weier107 | group.prepare/weier.107/mode=batch,n=1024 | 0.49 ns | 0.48 ns .. 0.50 ns |
| point prepare, batched | weier107-jacobian | group.prepare/weier-jacobian.107/mode=batch,n=1024 | 0.48 ns | 0.48 ns .. 0.49 ns |
| point prepare, batched | edwards61x2 | group.prepare/edwards.61x2/mode=batch,n=1024 | 18.8 ns | 18.8 ns .. 18.9 ns |
| point prepare, batched | weier61x2 | group.prepare/weier.61x2/mode=batch,n=1024 | 0.72 ns | 0.66 ns .. 0.78 ns |
| point prepare, batched | weier61x2-jacobian | group.prepare/weier-jacobian.61x2/mode=batch,n=1024 | 0.54 ns | 0.52 ns .. 0.58 ns |
| point prepare, batched | twisted61x2 | group.prepare/twisted.61x2/mode=batch,n=1024 | 3.60 ns | 3.59 ns .. 3.60 ns |
| point prepare, batched | twisted64x2 | group.prepare/twisted.64x2/mode=batch,n=1024 | 5.51 ns | 5.49 ns .. 5.53 ns |
| point prepare, batched | twisted-goldilocks2 | group.prepare/twisted.goldilocks2/mode=batch,n=1024 | 4.51 ns | 4.48 ns .. 4.53 ns |
| is identity | gf2_127 | group.is_identity/binary.127 | 0.81 ns | 0.81 ns .. 0.81 ns |
| is identity | gf2_127-lambda | group.is_identity/binary-lambda.127 | 0.84 ns | 0.84 ns .. 0.84 ns |
| is identity | gf2_127-w | group.is_identity/binary-w.127 | 0.84 ns | 0.84 ns .. 0.84 ns |
| is identity | gf2_127-u | group.is_identity/binary-u.127 | 0.84 ns | 0.84 ns .. 0.84 ns |
| is identity | gf2_109 | group.is_identity/binary.109 | 0.64 ns | 0.63 ns .. 0.64 ns |
| is identity | gf2_109-lambda | group.is_identity/binary-lambda.109 | 0.56 ns | 0.55 ns .. 0.56 ns |
| is identity | gf2_109-w | group.is_identity/binary-w.109 | 0.56 ns | 0.56 ns .. 0.56 ns |
| is identity | gf2_109-u | group.is_identity/binary-u.109 | 0.56 ns | 0.55 ns .. 0.56 ns |
| is identity | gf2_122 | group.is_identity/binary.122 | 0.77 ns | 0.77 ns .. 0.78 ns |
| is identity | gf2_122-lambda | group.is_identity/binary-lambda.122 | 0.77 ns | 0.77 ns .. 0.78 ns |
| is identity | gf2_122-w | group.is_identity/binary-w.122 | 0.77 ns | 0.77 ns .. 0.78 ns |
| is identity | gf2_122-u | group.is_identity/binary-u.122 | 0.77 ns | 0.77 ns .. 0.78 ns |
| is identity | gf2_122-gls | group.is_identity/binary.122-gls | 0.77 ns | 0.77 ns .. 0.77 ns |
| is identity | gf2_122-gls-lambda | group.is_identity/binary-lambda.122-gls | 0.78 ns | 0.77 ns .. 0.78 ns |
| is identity | gf2_122-gls-w | group.is_identity/binary-w.122-gls | 0.78 ns | 0.77 ns .. 0.78 ns |
| is identity | gf2_122-gls-u | group.is_identity/binary-u.122-gls | 0.78 ns | 0.77 ns .. 0.78 ns |
| is identity | edwards127 | group.is_identity/edwards.127 | 0.38 ns | 0.38 ns .. 0.38 ns |
| is identity | edwards107 | group.is_identity/edwards.107 | 0.75 ns | 0.74 ns .. 0.75 ns |
| is identity | twisted128 | group.is_identity/twisted.128 | 0.34 ns | 0.34 ns .. 0.35 ns |
| is identity | weier127 | group.is_identity/weier.127 | 0.34 ns | 0.34 ns .. 0.34 ns |
| is identity | weier127-jacobian | group.is_identity/weier-jacobian.127 | 0.34 ns | 0.34 ns .. 0.34 ns |
| is identity | weier107 | group.is_identity/weier.107 | 0.84 ns | 0.84 ns .. 0.84 ns |
| is identity | weier107-jacobian | group.is_identity/weier-jacobian.107 | 0.84 ns | 0.84 ns .. 0.84 ns |
| is identity | edwards61x2 | group.is_identity/edwards.61x2 | 0.38 ns | 0.38 ns .. 0.38 ns |
| is identity | weier61x2 | group.is_identity/weier.61x2 | 0.52 ns | 0.52 ns .. 0.53 ns |
| is identity | weier61x2-jacobian | group.is_identity/weier-jacobian.61x2 | 0.52 ns | 0.52 ns .. 0.53 ns |
| is identity | twisted61x2 | group.is_identity/twisted.61x2 | 0.34 ns | 0.34 ns .. 0.35 ns |
| is identity | twisted64x2 | group.is_identity/twisted.64x2 | 0.34 ns | 0.34 ns .. 0.35 ns |
| is identity | twisted-goldilocks2 | group.is_identity/twisted.goldilocks2 | 0.52 ns | 0.52 ns .. 0.53 ns |
| equals addend, match | gf2_127 | group.equals/binary.127/mode=match | 2.98 ns | 2.97 ns .. 2.99 ns |
| equals addend, match | gf2_127-lambda | group.equals/binary-lambda.127/mode=match | 3.84 ns | 3.83 ns .. 3.85 ns |
| equals addend, match | gf2_127-w | group.equals/binary-w.127/mode=match | 3.86 ns | 3.84 ns .. 3.89 ns |
| equals addend, match | gf2_127-u | group.equals/binary-u.127/mode=match | 4.67 ns | 4.66 ns .. 4.68 ns |
| equals addend, match | gf2_109 | group.equals/binary.109/mode=match | 2.24 ns | 2.23 ns .. 2.26 ns |
| equals addend, match | gf2_109-lambda | group.equals/binary-lambda.109/mode=match | 1.60 ns | 1.60 ns .. 1.61 ns |
| equals addend, match | gf2_109-w | group.equals/binary-w.109/mode=match | 1.82 ns | 1.81 ns .. 1.82 ns |
| equals addend, match | gf2_109-u | group.equals/binary-u.109/mode=match | 3.46 ns | 3.46 ns .. 3.47 ns |
| equals addend, match | gf2_122-lambda | group.equals/binary-lambda.122/mode=match | 3.78 ns | 3.77 ns .. 3.79 ns |
| equals addend, match | gf2_122-w | group.equals/binary-w.122/mode=match | 3.77 ns | 3.77 ns .. 3.78 ns |
| equals addend, match | gf2_122-u | group.equals/binary-u.122/mode=match | 5.31 ns | 5.30 ns .. 5.32 ns |
| equals addend, match | gf2_122-gls-lambda | group.equals/binary-lambda.122-gls/mode=match | 3.79 ns | 3.78 ns .. 3.80 ns |
| equals addend, match | gf2_122-gls-w | group.equals/binary-w.122-gls/mode=match | 3.79 ns | 3.78 ns .. 3.80 ns |
| equals addend, match | gf2_122-gls-u | group.equals/binary-u.122-gls/mode=match | 5.32 ns | 5.30 ns .. 5.33 ns |
| equals addend, match | twisted61x2 | group.equals/twisted.61x2/mode=match | 3.32 ns | 3.31 ns .. 3.33 ns |
| equals addend, mismatch | gf2_127 | group.equals/binary.127/mode=mismatch | 2.87 ns | 2.87 ns .. 2.88 ns |
| equals addend, mismatch | gf2_127-lambda | group.equals/binary-lambda.127/mode=mismatch | 3.81 ns | 3.79 ns .. 3.82 ns |
| equals addend, mismatch | gf2_127-w | group.equals/binary-w.127/mode=mismatch | 3.84 ns | 3.83 ns .. 3.84 ns |
| equals addend, mismatch | gf2_127-u | group.equals/binary-u.127/mode=mismatch | 4.68 ns | 4.68 ns .. 4.69 ns |
| equals addend, mismatch | gf2_109 | group.equals/binary.109/mode=mismatch | 2.28 ns | 2.28 ns .. 2.29 ns |
| equals addend, mismatch | gf2_109-lambda | group.equals/binary-lambda.109/mode=mismatch | 1.60 ns | 1.60 ns .. 1.60 ns |
| equals addend, mismatch | gf2_109-w | group.equals/binary-w.109/mode=mismatch | 1.82 ns | 1.82 ns .. 1.82 ns |
| equals addend, mismatch | gf2_109-u | group.equals/binary-u.109/mode=mismatch | 3.50 ns | 3.48 ns .. 3.53 ns |
| equals addend, mismatch | gf2_122 | group.equals/binary.122/mode=mismatch | 3.75 ns | 3.73 ns .. 3.76 ns |
| equals addend, mismatch | gf2_122-lambda | group.equals/binary-lambda.122/mode=mismatch | 3.79 ns | 3.79 ns .. 3.80 ns |
| equals addend, mismatch | gf2_122-w | group.equals/binary-w.122/mode=mismatch | 3.79 ns | 3.78 ns .. 3.79 ns |
| equals addend, mismatch | gf2_122-u | group.equals/binary-u.122/mode=mismatch | 5.34 ns | 5.32 ns .. 5.36 ns |
| equals addend, mismatch | gf2_122-gls | group.equals/binary.122-gls/mode=mismatch | 3.79 ns | 3.78 ns .. 3.79 ns |
| equals addend, mismatch | gf2_122-gls-lambda | group.equals/binary-lambda.122-gls/mode=mismatch | 3.79 ns | 3.79 ns .. 3.80 ns |
| equals addend, mismatch | gf2_122-gls-w | group.equals/binary-w.122-gls/mode=mismatch | 3.79 ns | 3.78 ns .. 3.79 ns |
| equals addend, mismatch | gf2_122-gls-u | group.equals/binary-u.122-gls/mode=mismatch | 5.31 ns | 5.30 ns .. 5.32 ns |
| equals addend, mismatch | edwards127 | group.equals/edwards.127/mode=mismatch | 1.97 ns | 1.97 ns .. 1.98 ns |
| equals addend, mismatch | edwards107 | group.equals/edwards.107/mode=mismatch | 3.05 ns | 3.04 ns .. 3.06 ns |
| equals addend, mismatch | twisted128 | group.equals/twisted.128/mode=mismatch | 7.51 ns | 7.49 ns .. 7.53 ns |
| equals addend, mismatch | weier127 | group.equals/weier.127/mode=mismatch | 2.05 ns | 2.04 ns .. 2.06 ns |
| equals addend, mismatch | weier127-jacobian | group.equals/weier-jacobian.127/mode=mismatch | 4.53 ns | 4.52 ns .. 4.54 ns |
| equals addend, mismatch | weier107 | group.equals/weier.107/mode=mismatch | 3.63 ns | 3.62 ns .. 3.64 ns |
| equals addend, mismatch | weier107-jacobian | group.equals/weier-jacobian.107/mode=mismatch | 5.96 ns | 5.95 ns .. 5.98 ns |
| equals addend, mismatch | edwards61x2 | group.equals/edwards.61x2/mode=mismatch | 1.65 ns | 1.64 ns .. 1.66 ns |
| equals addend, mismatch | weier61x2 | group.equals/weier.61x2/mode=mismatch | 1.70 ns | 1.69 ns .. 1.71 ns |
| equals addend, mismatch | weier61x2-jacobian | group.equals/weier-jacobian.61x2/mode=mismatch | 3.59 ns | 3.57 ns .. 3.62 ns |
| equals addend, mismatch | twisted61x2 | group.equals/twisted.61x2/mode=mismatch | 3.32 ns | 3.31 ns .. 3.32 ns |
| equals addend, mismatch | twisted64x2 | group.equals/twisted.64x2/mode=mismatch | 5.39 ns | 5.37 ns .. 5.40 ns |
| equals addend, mismatch | twisted-goldilocks2 | group.equals/twisted.goldilocks2/mode=mismatch | 4.92 ns | 4.89 ns .. 4.95 ns |
| encode, one at a time | gf2_127 | group.encode/binary.127/mode=indep | 371 ns | 370 ns .. 372 ns |
| encode, one at a time | gf2_127-lambda | group.encode/binary-lambda.127/mode=indep | 361 ns | 360 ns .. 362 ns |
| encode, one at a time | gf2_127-w | group.encode/binary-w.127/mode=indep | 361 ns | 360 ns .. 361 ns |
| encode, one at a time | gf2_127-u | group.encode/binary-u.127/mode=indep | 355 ns | 354 ns .. 355 ns |
| encode, one at a time | gf2_109 | group.encode/binary.109/mode=indep | 381 ns | 381 ns .. 382 ns |
| encode, one at a time | gf2_109-lambda | group.encode/binary-lambda.109/mode=indep | 366 ns | 364 ns .. 368 ns |
| encode, one at a time | gf2_109-w | group.encode/binary-w.109/mode=indep | 359 ns | 357 ns .. 361 ns |
| encode, one at a time | gf2_109-u | group.encode/binary-u.109/mode=indep | 397 ns | 394 ns .. 401 ns |
| encode, one at a time | gf2_122 | group.encode/binary.122/mode=indep | 211 ns | 210 ns .. 212 ns |
| encode, one at a time | gf2_122-lambda | group.encode/binary-lambda.122/mode=indep | 189 ns | 189 ns .. 189 ns |
| encode, one at a time | gf2_122-w | group.encode/binary-w.122/mode=indep | 204 ns | 204 ns .. 205 ns |
| encode, one at a time | gf2_122-u | group.encode/binary-u.122/mode=indep | 206 ns | 206 ns .. 207 ns |
| encode, one at a time | gf2_122-gls | group.encode/binary.122-gls/mode=indep | 209 ns | 208 ns .. 209 ns |
| encode, one at a time | gf2_122-gls-lambda | group.encode/binary-lambda.122-gls/mode=indep | 189 ns | 189 ns .. 190 ns |
| encode, one at a time | gf2_122-gls-w | group.encode/binary-w.122-gls/mode=indep | 204 ns | 204 ns .. 205 ns |
| encode, one at a time | gf2_122-gls-u | group.encode/binary-u.122-gls/mode=indep | 195 ns | 195 ns .. 196 ns |
| encode, one at a time | edwards127 | group.encode/edwards.127/mode=indep | 549 ns | 548 ns .. 551 ns |
| encode, one at a time | edwards107 | group.encode/edwards.107/mode=indep | 506 ns | 505 ns .. 507 ns |
| encode, one at a time | twisted128 | group.encode/twisted.128/mode=indep | 939 ns | 937 ns .. 941 ns |
| encode, one at a time | weier127 | group.encode/weier.127/mode=indep | 536 ns | 534 ns .. 537 ns |
| encode, one at a time | weier127-jacobian | group.encode/weier-jacobian.127/mode=indep | 533 ns | 530 ns .. 536 ns |
| encode, one at a time | weier107 | group.encode/weier.107/mode=indep | 497 ns | 496 ns .. 498 ns |
| encode, one at a time | weier107-jacobian | group.encode/weier-jacobian.107/mode=indep | 502 ns | 501 ns .. 503 ns |
| encode, one at a time | edwards61x2 | group.encode/edwards.61x2/mode=indep | 181 ns | 180 ns .. 181 ns |
| encode, one at a time | weier61x2 | group.encode/weier.61x2/mode=indep | 170 ns | 169 ns .. 170 ns |
| encode, one at a time | weier61x2-jacobian | group.encode/weier-jacobian.61x2/mode=indep | 179 ns | 179 ns .. 180 ns |
| encode, one at a time | twisted61x2 | group.encode/twisted.61x2/mode=indep | 179 ns | 178 ns .. 179 ns |
| encode, one at a time | twisted64x2 | group.encode/twisted.64x2/mode=indep | 290 ns | 290 ns .. 291 ns |
| encode, one at a time | twisted-goldilocks2 | group.encode/twisted.goldilocks2/mode=indep | 197 ns | 194 ns .. 201 ns |
| encode, batched | gf2_127 | group.encode/binary.127/mode=batch,n=1024 | 13.1 ns | 13.0 ns .. 13.2 ns |
| encode, batched | gf2_127-lambda | group.encode/binary-lambda.127/mode=batch,n=1024 | 10.1 ns | 10.1 ns .. 10.2 ns |
| encode, batched | gf2_127-w | group.encode/binary-w.127/mode=batch,n=1024 | 10.3 ns | 10.3 ns .. 10.3 ns |
| encode, batched | gf2_127-u | group.encode/binary-u.127/mode=batch,n=1024 | 9.17 ns | 9.15 ns .. 9.20 ns |
| encode, batched | gf2_109 | group.encode/binary.109/mode=batch,n=1024 | 10.9 ns | 10.9 ns .. 11.0 ns |
| encode, batched | gf2_109-lambda | group.encode/binary-lambda.109/mode=batch,n=1024 | 8.13 ns | 8.12 ns .. 8.15 ns |
| encode, batched | gf2_109-w | group.encode/binary-w.109/mode=batch,n=1024 | 10.4 ns | 10.3 ns .. 10.4 ns |
| encode, batched | gf2_109-u | group.encode/binary-u.109/mode=batch,n=1024 | 9.88 ns | 9.84 ns .. 9.92 ns |
| encode, batched | gf2_122 | group.encode/binary.122/mode=batch,n=1024 | 15.7 ns | 15.6 ns .. 15.7 ns |
| encode, batched | gf2_122-lambda | group.encode/binary-lambda.122/mode=batch,n=1024 | 11.9 ns | 11.9 ns .. 11.9 ns |
| encode, batched | gf2_122-w | group.encode/binary-w.122/mode=batch,n=1024 | 14.4 ns | 14.4 ns .. 14.5 ns |
| encode, batched | gf2_122-u | group.encode/binary-u.122/mode=batch,n=1024 | 12.1 ns | 12.0 ns .. 12.1 ns |
| encode, batched | gf2_122-gls | group.encode/binary.122-gls/mode=batch,n=1024 | 15.2 ns | 15.2 ns .. 15.2 ns |
| encode, batched | gf2_122-gls-lambda | group.encode/binary-lambda.122-gls/mode=batch,n=1024 | 11.6 ns | 11.6 ns .. 11.6 ns |
| encode, batched | gf2_122-gls-w | group.encode/binary-w.122-gls/mode=batch,n=1024 | 14.4 ns | 14.4 ns .. 14.5 ns |
| encode, batched | gf2_122-gls-u | group.encode/binary-u.122-gls/mode=batch,n=1024 | 12.3 ns | 12.3 ns .. 12.3 ns |
| encode, batched | edwards127 | group.encode/edwards.127/mode=batch,n=1024 | 22.0 ns | 21.9 ns .. 22.0 ns |
| encode, batched | edwards107 | group.encode/edwards.107/mode=batch,n=1024 | 20.3 ns | 20.2 ns .. 20.3 ns |
| encode, batched | twisted128 | group.encode/twisted.128/mode=batch,n=1024 | 16.0 ns | 16.0 ns .. 16.0 ns |
| encode, batched | weier127 | group.encode/weier.127/mode=batch,n=1024 | 10.1 ns | 10.1 ns .. 10.1 ns |
| encode, batched | weier127-jacobian | group.encode/weier-jacobian.127/mode=batch,n=1024 | 15.7 ns | 15.7 ns .. 15.7 ns |
| encode, batched | weier107 | group.encode/weier.107/mode=batch,n=1024 | 11.5 ns | 11.5 ns .. 11.5 ns |
| encode, batched | weier107-jacobian | group.encode/weier-jacobian.107/mode=batch,n=1024 | 15.3 ns | 15.3 ns .. 15.3 ns |
| encode, batched | edwards61x2 | group.encode/edwards.61x2/mode=batch,n=1024 | 16.2 ns | 16.2 ns .. 16.3 ns |
| encode, batched | weier61x2 | group.encode/weier.61x2/mode=batch,n=1024 | 8.11 ns | 8.09 ns .. 8.12 ns |
| encode, batched | weier61x2-jacobian | group.encode/weier-jacobian.61x2/mode=batch,n=1024 | 11.7 ns | 11.7 ns .. 11.7 ns |
| encode, batched | twisted61x2 | group.encode/twisted.61x2/mode=batch,n=1024 | 8.07 ns | 8.05 ns .. 8.09 ns |
| encode, batched | twisted64x2 | group.encode/twisted.64x2/mode=batch,n=1024 | 10.3 ns | 10.3 ns .. 10.4 ns |
| encode, batched | twisted-goldilocks2 | group.encode/twisted.goldilocks2/mode=batch,n=1024 | 11.3 ns | 11.2 ns .. 11.3 ns |
| decode, one at a time | gf2_127 | group.decode/binary.127/mode=indep | 367 ns | 366 ns .. 368 ns |
| decode, one at a time | gf2_127-lambda | group.decode/binary-lambda.127/mode=indep | 364 ns | 364 ns .. 365 ns |
| decode, one at a time | gf2_127-w | group.decode/binary-w.127/mode=indep | 361 ns | 361 ns .. 362 ns |
| decode, one at a time | gf2_127-u | group.decode/binary-u.127/mode=indep | 376 ns | 375 ns .. 377 ns |
| decode, one at a time | gf2_109 | group.decode/binary.109/mode=indep | 380 ns | 379 ns .. 381 ns |
| decode, one at a time | gf2_109-lambda | group.decode/binary-lambda.109/mode=indep | 381 ns | 381 ns .. 382 ns |
| decode, one at a time | gf2_109-w | group.decode/binary-w.109/mode=indep | 378 ns | 377 ns .. 379 ns |
| decode, one at a time | gf2_109-u | group.decode/binary-u.109/mode=indep | 398 ns | 397 ns .. 400 ns |
| decode, one at a time | gf2_122 | group.decode/binary.122/mode=indep | 197 ns | 196 ns .. 197 ns |
| decode, one at a time | gf2_122-lambda | group.decode/binary-lambda.122/mode=indep | 196 ns | 195 ns .. 196 ns |
| decode, one at a time | gf2_122-w | group.decode/binary-w.122/mode=indep | 193 ns | 192 ns .. 193 ns |
| decode, one at a time | gf2_122-u | group.decode/binary-u.122/mode=indep | 223 ns | 222 ns .. 223 ns |
| decode, one at a time | gf2_122-gls | group.decode/binary.122-gls/mode=indep | 195 ns | 194 ns .. 195 ns |
| decode, one at a time | gf2_122-gls-lambda | group.decode/binary-lambda.122-gls/mode=indep | 187 ns | 187 ns .. 188 ns |
| decode, one at a time | gf2_122-gls-w | group.decode/binary-w.122-gls/mode=indep | 191 ns | 191 ns .. 191 ns |
| decode, one at a time | gf2_122-gls-u | group.decode/binary-u.122-gls/mode=indep | 207 ns | 206 ns .. 207 ns |
| decode, one at a time | edwards127 | group.decode/edwards.127/mode=indep | 489 ns | 488 ns .. 490 ns |
| decode, one at a time | edwards107 | group.decode/edwards.107/mode=indep | 359 ns | 359 ns .. 360 ns |
| decode, one at a time | twisted128 | group.decode/twisted.128/mode=indep | 949 ns | 946 ns .. 953 ns |
| decode, one at a time | weier127 | group.decode/weier.127/mode=indep | 489 ns | 487 ns .. 490 ns |
| decode, one at a time | weier127-jacobian | group.decode/weier-jacobian.127/mode=indep | 492 ns | 490 ns .. 493 ns |
| decode, one at a time | weier107 | group.decode/weier.107/mode=indep | 358 ns | 357 ns .. 358 ns |
| decode, one at a time | weier107-jacobian | group.decode/weier-jacobian.107/mode=indep | 351 ns | 350 ns .. 352 ns |
| decode, one at a time | edwards61x2 | group.decode/edwards.61x2/mode=indep | 405 ns | 404 ns .. 406 ns |
| decode, one at a time | weier61x2 | group.decode/weier.61x2/mode=indep | 416 ns | 416 ns .. 417 ns |
| decode, one at a time | weier61x2-jacobian | group.decode/weier-jacobian.61x2/mode=indep | 417 ns | 415 ns .. 418 ns |
| decode, one at a time | twisted61x2 | group.decode/twisted.61x2/mode=indep | 425 ns | 425 ns .. 426 ns |
| decode, one at a time | twisted64x2 | group.decode/twisted.64x2/mode=indep | 721 ns | 719 ns .. 722 ns |
| decode, one at a time | twisted-goldilocks2 | group.decode/twisted.goldilocks2/mode=indep | 1.53 µs | 1.53 µs .. 1.54 µs |
| decode, batched | gf2_127 | group.decode/binary.127/mode=batch,n=1024 | 14.0 ns | 14.0 ns .. 14.0 ns |
| decode, batched | gf2_127-lambda | group.decode/binary-lambda.127/mode=batch,n=1024 | 14.0 ns | 14.0 ns .. 14.0 ns |
| decode, batched | gf2_127-w | group.decode/binary-w.127/mode=batch,n=1024 | 15.1 ns | 15.1 ns .. 15.1 ns |
| decode, batched | gf2_127-u | group.decode/binary-u.127/mode=batch,n=1024 | 18.3 ns | 18.3 ns .. 18.4 ns |
| decode, batched | gf2_109 | group.decode/binary.109/mode=batch,n=1024 | 14.2 ns | 14.2 ns .. 14.2 ns |
| decode, batched | gf2_109-lambda | group.decode/binary-lambda.109/mode=batch,n=1024 | 14.1 ns | 14.1 ns .. 14.2 ns |
| decode, batched | gf2_109-w | group.decode/binary-w.109/mode=batch,n=1024 | 15.5 ns | 15.4 ns .. 15.5 ns |
| decode, batched | gf2_109-u | group.decode/binary-u.109/mode=batch,n=1024 | 18.4 ns | 18.4 ns .. 18.4 ns |
| decode, batched | gf2_122 | group.decode/binary.122/mode=batch,n=1024 | 13.5 ns | 13.5 ns .. 13.5 ns |
| decode, batched | gf2_122-lambda | group.decode/binary-lambda.122/mode=batch,n=1024 | 13.5 ns | 13.5 ns .. 13.5 ns |
| decode, batched | gf2_122-w | group.decode/binary-w.122/mode=batch,n=1024 | 14.4 ns | 14.4 ns .. 14.5 ns |
| decode, batched | gf2_122-u | group.decode/binary-u.122/mode=batch,n=1024 | 18.7 ns | 18.7 ns .. 18.8 ns |
| decode, batched | gf2_122-gls | group.decode/binary.122-gls/mode=batch,n=1024 | 13.2 ns | 13.2 ns .. 13.2 ns |
| decode, batched | gf2_122-gls-lambda | group.decode/binary-lambda.122-gls/mode=batch,n=1024 | 13.2 ns | 13.2 ns .. 13.2 ns |
| decode, batched | gf2_122-gls-w | group.decode/binary-w.122-gls/mode=batch,n=1024 | 14.3 ns | 14.3 ns .. 14.3 ns |
| decode, batched | gf2_122-gls-u | group.decode/binary-u.122-gls/mode=batch,n=1024 | 16.8 ns | 16.8 ns .. 16.8 ns |
| decode, batched | edwards127 | group.decode/edwards.127/mode=batch,n=1024 | 486 ns | 484 ns .. 488 ns |
| decode, batched | edwards107 | group.decode/edwards.107/mode=batch,n=1024 | 354 ns | 353 ns .. 355 ns |
| decode, batched | twisted128 | group.decode/twisted.128/mode=batch,n=1024 | 952 ns | 948 ns .. 956 ns |
| decode, batched | weier127 | group.decode/weier.127/mode=batch,n=1024 | 485 ns | 483 ns .. 487 ns |
| decode, batched | weier127-jacobian | group.decode/weier-jacobian.127/mode=batch,n=1024 | 485 ns | 484 ns .. 487 ns |
| decode, batched | weier107 | group.decode/weier.107/mode=batch,n=1024 | 352 ns | 351 ns .. 353 ns |
| decode, batched | weier107-jacobian | group.decode/weier-jacobian.107/mode=batch,n=1024 | 352 ns | 351 ns .. 352 ns |
| decode, batched | edwards61x2 | group.decode/edwards.61x2/mode=batch,n=1024 | 404 ns | 403 ns .. 405 ns |
| decode, batched | weier61x2 | group.decode/weier.61x2/mode=batch,n=1024 | 412 ns | 411 ns .. 413 ns |
| decode, batched | weier61x2-jacobian | group.decode/weier-jacobian.61x2/mode=batch,n=1024 | 413 ns | 412 ns .. 414 ns |
| decode, batched | twisted61x2 | group.decode/twisted.61x2/mode=batch,n=1024 | 420 ns | 419 ns .. 421 ns |
| decode, batched | twisted64x2 | group.decode/twisted.64x2/mode=batch,n=1024 | 718 ns | 717 ns .. 720 ns |
| decode, batched | twisted-goldilocks2 | group.decode/twisted.goldilocks2/mode=batch,n=1024 | 1.52 µs | 1.51 µs .. 1.52 µs |
| hash to curve, one at a time | xor | hash_to_curve/sha256 (XOR baseline) | 24.2 ns | 23.9 ns .. 24.6 ns |
| hash to curve, one at a time | gf2_127 | hash_to_curve/gf2_127/pornin map x1 | 485 ns | 485 ns .. 486 ns |
| hash to curve, one at a time | gf2_127-lambda | h2c/binary-lambda.127/mode=indep | 806 ns | 804 ns .. 808 ns |
| hash to curve, one at a time | gf2_127-w | h2c/binary-w.127/mode=indep | 865 ns | 863 ns .. 866 ns |
| hash to curve, one at a time | gf2_127-u | h2c/binary-u.127/mode=indep | 869 ns | 865 ns .. 874 ns |
| hash to curve, one at a time | gf2_109 | hash_to_curve/gf2_109/pornin map x1 | 560 ns | 559 ns .. 561 ns |
| hash to curve, one at a time | gf2_109-lambda | h2c/binary-lambda.109/mode=indep | 873 ns | 871 ns .. 875 ns |
| hash to curve, one at a time | gf2_109-w | h2c/binary-w.109/mode=indep | 855 ns | 854 ns .. 857 ns |
| hash to curve, one at a time | gf2_109-u | h2c/binary-u.109/mode=indep | 874 ns | 872 ns .. 875 ns |
| hash to curve, one at a time | gf2_122 | hash_to_curve/gf2_122/pornin map x1 | 373 ns | 373 ns .. 373 ns |
| hash to curve, one at a time | gf2_122-lambda | h2c/binary-lambda.122/mode=indep | 509 ns | 507 ns .. 510 ns |
| hash to curve, one at a time | gf2_122-w | h2c/binary-w.122/mode=indep | 517 ns | 516 ns .. 518 ns |
| hash to curve, one at a time | gf2_122-u | h2c/binary-u.122/mode=indep | 531 ns | 530 ns .. 532 ns |
| hash to curve, one at a time | gf2_122-gls | hash_to_curve/gf2_122-gls/pornin map x1 | 369 ns | 367 ns .. 370 ns |
| hash to curve, one at a time | gf2_122-gls-lambda | h2c/binary-lambda.122-gls/mode=indep | 515 ns | 513 ns .. 517 ns |
| hash to curve, one at a time | gf2_122-gls-w | h2c/binary-w.122-gls/mode=indep | 509 ns | 507 ns .. 511 ns |
| hash to curve, one at a time | gf2_122-gls-u | h2c/binary-u.122-gls/mode=indep | 522 ns | 521 ns .. 524 ns |
| hash to curve, one at a time | edwards127 | h2c/edwards.127/mode=indep | 1.07 µs | 1.06 µs .. 1.07 µs |
| hash to curve, one at a time | edwards107 | h2c/edwards.107/mode=indep | 806 ns | 802 ns .. 809 ns |
| hash to curve, one at a time | twisted128 | h2c/twisted.128/mode=indep | 1.92 µs | 1.92 µs .. 1.93 µs |
| hash to curve, one at a time | weier127 | h2c/weier.127/mode=indep | 1.03 µs | 1.02 µs .. 1.03 µs |
| hash to curve, one at a time | weier127-jacobian | h2c/weier-jacobian.127/mode=indep | 1.03 µs | 1.03 µs .. 1.03 µs |
| hash to curve, one at a time | weier107 | h2c/weier.107/mode=indep | 746 ns | 744 ns .. 747 ns |
| hash to curve, one at a time | weier107-jacobian | h2c/weier-jacobian.107/mode=indep | 742 ns | 741 ns .. 744 ns |
| hash to curve, one at a time | edwards61x2 | h2c/edwards.61x2/mode=indep | 624 ns | 622 ns .. 626 ns |
| hash to curve, one at a time | weier61x2 | h2c/weier.61x2/mode=indep | 637 ns | 635 ns .. 639 ns |
| hash to curve, one at a time | weier61x2-jacobian | h2c/weier-jacobian.61x2/mode=indep | 638 ns | 637 ns .. 640 ns |
| hash to curve, one at a time | twisted61x2 | h2c/twisted.61x2/mode=indep | 630 ns | 629 ns .. 631 ns |
| hash to curve, one at a time | twisted64x2 | h2c/twisted.64x2/mode=indep | 1.10 µs | 1.10 µs .. 1.10 µs |
| hash to curve, one at a time | twisted-goldilocks2 | h2c/twisted.goldilocks2/mode=indep | 1.73 µs | 1.72 µs .. 1.74 µs |
| hash to curve, one at a time | ristretto255 | hash_to_curve/ristretto255/hash_from_bytes<Sha512> | 4.72 µs | 4.70 µs .. 4.73 µs |
| hash to curve, one at a time | secp256k1 | hash_to_curve/secp256k1/try-and-increment (parse) | 4.49 µs | 4.48 µs .. 4.49 µs |
| hash to curve, batched | gf2_127 | hash_to_curve/gf2_127/pornin map x1, batched | 61.5 ns | 61.4 ns .. 61.5 ns |
| hash to curve, batched | gf2_127-lambda | h2c/binary-lambda.127/mode=batch,n=1024 | 75.6 ns | 75.5 ns .. 75.7 ns |
| hash to curve, batched | gf2_127-w | h2c/binary-w.127/mode=batch,n=1024 | 83.3 ns | 83.2 ns .. 83.4 ns |
| hash to curve, batched | gf2_127-u | h2c/binary-u.127/mode=batch,n=1024 | 85.8 ns | 85.5 ns .. 86.1 ns |
| hash to curve, batched | gf2_109 | hash_to_curve/gf2_109/pornin map x1, batched | 63.7 ns | 63.7 ns .. 63.8 ns |
| hash to curve, batched | gf2_109-lambda | h2c/binary-lambda.109/mode=batch,n=1024 | 82.0 ns | 81.9 ns .. 82.1 ns |
| hash to curve, batched | gf2_109-w | h2c/binary-w.109/mode=batch,n=1024 | 79.4 ns | 79.3 ns .. 79.5 ns |
| hash to curve, batched | gf2_109-u | h2c/binary-u.109/mode=batch,n=1024 | 81.2 ns | 81.1 ns .. 81.4 ns |
| hash to curve, batched | gf2_122 | hash_to_curve/gf2_122/pornin map x1, batched | 62.8 ns | 62.8 ns .. 62.8 ns |
| hash to curve, batched | gf2_122-lambda | h2c/binary-lambda.122/mode=batch,n=1024 | 74.9 ns | 74.8 ns .. 75.1 ns |
| hash to curve, batched | gf2_122-w | h2c/binary-w.122/mode=batch,n=1024 | 76.8 ns | 76.6 ns .. 76.9 ns |
| hash to curve, batched | gf2_122-u | h2c/binary-u.122/mode=batch,n=1024 | 87.6 ns | 87.5 ns .. 87.7 ns |
| hash to curve, batched | gf2_122-gls | hash_to_curve/gf2_122-gls/pornin map x1, batched | 62.0 ns | 61.9 ns .. 62.0 ns |
| hash to curve, batched | gf2_122-gls-lambda | h2c/binary-lambda.122-gls/mode=batch,n=1024 | 76.5 ns | 76.3 ns .. 76.6 ns |
| hash to curve, batched | gf2_122-gls-w | h2c/binary-w.122-gls/mode=batch,n=1024 | 78.6 ns | 78.5 ns .. 78.8 ns |
| hash to curve, batched | gf2_122-gls-u | h2c/binary-u.122-gls/mode=batch,n=1024 | 80.2 ns | 80.1 ns .. 80.3 ns |
| hash to curve, batched | edwards127 | h2c/edwards.127/mode=batch,n=1024 | 1.07 µs | 1.07 µs .. 1.07 µs |
| hash to curve, batched | edwards107 | h2c/edwards.107/mode=batch,n=1024 | 805 ns | 801 ns .. 810 ns |
| hash to curve, batched | twisted128 | h2c/twisted.128/mode=batch,n=1024 | 1.92 µs | 1.92 µs .. 1.93 µs |
| hash to curve, batched | weier127 | h2c/weier.127/mode=batch,n=1024 | 1.04 µs | 1.03 µs .. 1.04 µs |
| hash to curve, batched | weier127-jacobian | h2c/weier-jacobian.127/mode=batch,n=1024 | 1.04 µs | 1.04 µs .. 1.04 µs |
| hash to curve, batched | weier107 | h2c/weier.107/mode=batch,n=1024 | 748 ns | 747 ns .. 750 ns |
| hash to curve, batched | weier107-jacobian | h2c/weier-jacobian.107/mode=batch,n=1024 | 745 ns | 743 ns .. 748 ns |
| hash to curve, batched | edwards61x2 | h2c/edwards.61x2/mode=batch,n=1024 | 620 ns | 617 ns .. 623 ns |
| hash to curve, batched | weier61x2 | h2c/weier.61x2/mode=batch,n=1024 | 637 ns | 635 ns .. 638 ns |
| hash to curve, batched | weier61x2-jacobian | h2c/weier-jacobian.61x2/mode=batch,n=1024 | 638 ns | 636 ns .. 639 ns |
| hash to curve, batched | twisted61x2 | h2c/twisted.61x2/mode=batch,n=1024 | 632 ns | 630 ns .. 634 ns |
| hash to curve, batched | twisted64x2 | h2c/twisted.64x2/mode=batch,n=1024 | 1.10 µs | 1.10 µs .. 1.10 µs |
| hash to curve, batched | twisted-goldilocks2 | h2c/twisted.goldilocks2/mode=batch,n=1024 | 1.75 µs | 1.74 µs .. 1.76 µs |
| hash to addend, one at a time | gf2_127-lambda | hash_to_curve/gf2_127-lambda/pornin map x1 to (x, λ) | 456 ns | 455 ns .. 457 ns |
| hash to addend, one at a time | gf2_127-w | hash_to_curve/gf2_127-w/pornin map x1 to (x, λ) | 455 ns | 454 ns .. 456 ns |
| hash to addend, one at a time | gf2_127-u | hash_to_curve/gf2_127-u/pornin map x1 to (u, v) | 461 ns | 460 ns .. 462 ns |
| hash to addend, one at a time | gf2_109-lambda | hash_to_curve/gf2_109-lambda/pornin map x1 to (x, λ) | 550 ns | 548 ns .. 553 ns |
| hash to addend, one at a time | gf2_109-w | hash_to_curve/gf2_109-w/pornin map x1 to (x, λ) | 535 ns | 534 ns .. 535 ns |
| hash to addend, one at a time | gf2_109-u | hash_to_curve/gf2_109-u/pornin map x1 to (u, v) | 533 ns | 532 ns .. 533 ns |
| hash to addend, one at a time | gf2_122-lambda | hash_to_curve/gf2_122-lambda/pornin map x1 to (x, λ) | 326 ns | 326 ns .. 327 ns |
| hash to addend, one at a time | gf2_122-w | hash_to_curve/gf2_122-w/pornin map x1 to (x, λ) | 326 ns | 326 ns .. 327 ns |
| hash to addend, one at a time | gf2_122-u | hash_to_curve/gf2_122-u/pornin map x1 to (u, v) | 326 ns | 325 ns .. 326 ns |
| hash to addend, one at a time | gf2_122-gls-lambda | hash_to_curve/gf2_122-gls-lambda/pornin map x1 to (x, λ) | 315 ns | 314 ns .. 316 ns |
| hash to addend, one at a time | gf2_122-gls-w | hash_to_curve/gf2_122-gls-w/pornin map x1 to (x, λ) | 316 ns | 315 ns .. 317 ns |
| hash to addend, one at a time | gf2_122-gls-u | hash_to_curve/gf2_122-gls-u/pornin map x1 to (u, v) | 319 ns | 318 ns .. 320 ns |
| hash to addend, batched | gf2_127-lambda | hash_to_curve/gf2_127-lambda/pornin map x1 to (x, λ), batched | 53.5 ns | 53.4 ns .. 53.6 ns |
| hash to addend, batched | gf2_127-w | hash_to_curve/gf2_127-w/pornin map x1 to (x, λ), batched | 53.5 ns | 53.4 ns .. 53.6 ns |
| hash to addend, batched | gf2_127-u | hash_to_curve/gf2_127-u/pornin map x1 to (u, v), batched | 57.2 ns | 57.2 ns .. 57.3 ns |
| hash to addend, batched | gf2_109-lambda | hash_to_curve/gf2_109-lambda/pornin map x1 to (x, λ), batched | 55.2 ns | 55.0 ns .. 55.5 ns |
| hash to addend, batched | gf2_109-w | hash_to_curve/gf2_109-w/pornin map x1 to (x, λ), batched | 54.5 ns | 54.5 ns .. 54.5 ns |
| hash to addend, batched | gf2_109-u | hash_to_curve/gf2_109-u/pornin map x1 to (u, v), batched | 60.7 ns | 60.3 ns .. 61.0 ns |
| hash to addend, batched | gf2_122-lambda | hash_to_curve/gf2_122-lambda/pornin map x1 to (x, λ), batched | 53.9 ns | 53.9 ns .. 54.0 ns |
| hash to addend, batched | gf2_122-w | hash_to_curve/gf2_122-w/pornin map x1 to (x, λ), batched | 54.0 ns | 53.9 ns .. 54.0 ns |
| hash to addend, batched | gf2_122-u | hash_to_curve/gf2_122-u/pornin map x1 to (u, v), batched | 57.1 ns | 57.0 ns .. 57.1 ns |
| hash to addend, batched | gf2_122-gls-lambda | hash_to_curve/gf2_122-gls-lambda/pornin map x1 to (x, λ), batched | 55.4 ns | 55.4 ns .. 55.5 ns |
| hash to addend, batched | gf2_122-gls-w | hash_to_curve/gf2_122-gls-w/pornin map x1 to (x, λ), batched | 55.4 ns | 55.4 ns .. 55.4 ns |
| hash to addend, batched | gf2_122-gls-u | hash_to_curve/gf2_122-gls-u/pornin map x1 to (u, v), batched | 55.7 ns | 55.7 ns .. 55.8 ns |
Coverage
Benchmarks per hot-path operation and family; an empty cell was not measured.
| curve | hash to curve | prepare | add | subtract | negate | is identity | equals addend | encode | decode | RIBLT | ||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| encode | cells | peel | ||||||||||
| baseline | ||||||||||||
| xorSHA-256 digests XORed: no group, 32 bytes | 1 | 2 | 5 | 1 | 1 | |||||||
| xor-siphashSipHash-2-4 hashes XORed: no group, 8 bytes | 10 | 1 | 1 | |||||||||
| GF(2^127), 16 bytes | ||||||||||||
| gf2_127(X:S:Z:T) extended accumulators, Pornin's formulas | 4 | 4 | 3 | 1 | 2 | 1 | 2 | 4 | 4 | 11 | 3 | 6 |
| gf2_127-lambdaincompleteλ-projective (X:L:Z) accumulators | 4 | 4 | 2 | 1 | 1 | 1 | 2 | 4 | 4 | 6 | 3 | 6 |
| gf2_127-wincompleteλ-projective, w codec: hashes and decodes to λ-affine | 4 | 4 | 2 | 1 | 1 | 1 | 2 | 4 | 4 | 6 | 3 | 6 |
| gf2_127-uunscaled (X:S:Z), w codec, direct addend hashes | 4 | 4 | 2 | 1 | 1 | 1 | 2 | 4 | 4 | 8 | 5 | 23 |
| GF(2^122) = GF(2^61)[u], dense constant, 16 bytes | ||||||||||||
| gf2_122(X:S:Z:T) extended | 2 | 2 | 3 | 2 | 1 | 1 | 2 | 2 | 3 | 3 | 3 | |
| gf2_122-lambdaincompleteλ-projective | 4 | 4 | 2 | 1 | 1 | 1 | 2 | 4 | 4 | 6 | 3 | 6 |
| gf2_122-wincompleteλ-projective, w codec | 4 | 4 | 2 | 1 | 1 | 1 | 2 | 4 | 4 | 6 | 3 | 6 |
| gf2_122-uunscaled (X:S:Z), w codec | 4 | 4 | 2 | 1 | 1 | 1 | 2 | 4 | 4 | 6 | 3 | 6 |
| GF(2^122), constant in GF(2^61) (GLS-shaped), 16 bytes | ||||||||||||
| gf2_122-gls(X:S:Z:T) extended | 2 | 2 | 3 | 1 | 1 | 1 | 2 | 2 | 3 | 3 | 3 | |
| gf2_122-gls-lambdaincompleteλ-projective | 4 | 4 | 2 | 1 | 1 | 1 | 2 | 4 | 4 | 6 | 3 | 6 |
| gf2_122-gls-wincompleteλ-projective, w codec | 4 | 4 | 2 | 1 | 1 | 1 | 2 | 4 | 4 | 6 | 3 | 6 |
| gf2_122-gls-uunscaled (X:S:Z), w codec | 4 | 4 | 2 | 1 | 1 | 1 | 2 | 4 | 4 | 6 | 3 | 6 |
| GF(2^109), 14 bytes | ||||||||||||
| gf2_109(X:S:Z:T) extended | 4 | 4 | 3 | 1 | 2 | 1 | 2 | 4 | 4 | 6 | 3 | 6 |
| gf2_109-lambdaincompleteλ-projective | 4 | 4 | 2 | 1 | 1 | 1 | 2 | 4 | 4 | 8 | 5 | 23 |
| gf2_109-wincompleteλ-projective, w codec | 4 | 4 | 2 | 1 | 1 | 1 | 2 | 4 | 4 | 8 | 5 | 23 |
| gf2_109-uunscaled (X:S:Z), w codec | 4 | 4 | 2 | 1 | 1 | 1 | 2 | 4 | 4 | 8 | 5 | 23 |
| F_p, p = 2^127 − 1, 16 bytes | ||||||||||||
| edwards127a = 1 Edwards, extended += cached | 3 | 2 | 3 | 2 | 1 | 1 | 2 | 2 | 1 | 1 | 1 | |
| weier127short Weierstrass, projective += affine | 2 | 2 | 2 | 2 | 1 | 1 | 2 | 2 | 1 | 1 | 1 | |
| weier127-jacobianincompleteshort Weierstrass, Jacobian += affine | 2 | 2 | 2 | 1 | 1 | 1 | 2 | 2 | 1 | 1 | 1 | |
| F_p, p = 2^107 − 1, 14 bytes | ||||||||||||
| edwards107a = 1 Edwards, extended += cached | 3 | 2 | 3 | 2 | 1 | 1 | 2 | 2 | 1 | 1 | 1 | |
| weier107short Weierstrass, projective += affine | 2 | 2 | 2 | 2 | 1 | 1 | 2 | 2 | 1 | 1 | 1 | |
| weier107-jacobianincompleteshort Weierstrass, Jacobian += affine | 2 | 2 | 2 | 1 | 1 | 1 | 2 | 2 | 1 | 1 | 1 | |
| F_p, p = 2^128 − 275, 16 bytes | ||||||||||||
| twisted128a = −1 twisted Edwards modulo 2-torsion, extended += cached | 2 | 2 | 2 | 1 | 1 | 1 | 2 | 2 | 1 | 1 | 1 | |
| F_{p²}, p = 2^61 − 1, 16 bytes | ||||||||||||
| edwards61x2a = 1 Edwards, signed-x codec, extended += cached | 2 | 2 | 2 | 1 | 1 | 1 | 2 | 2 | 1 | 1 | 1 | |
| weier61x2short Weierstrass, signed-x codec, projective += affine | 2 | 2 | 2 | 1 | 1 | 1 | 2 | 2 | 1 | 1 | 1 | |
| weier61x2-jacobianincompleteshort Weierstrass, signed-x codec, Jacobian += affine | 2 | 2 | 2 | 1 | 1 | 1 | 2 | 2 | 1 | 1 | 1 | |
| twisted61x2a = −1 Edwards modulo 2-torsion, extended += cached | 4 | 4 | 2 | 1 | 1 | 1 | 2 | 4 | 4 | 1 | 1 | 1 |
| F_{p²}, p = 2^64 − 59, 16 bytes | ||||||||||||
| twisted64x2a = −1 Edwards modulo 2-torsion, extended += cached | 2 | 2 | 2 | 1 | 1 | 1 | 2 | 2 | 1 | 1 | 1 | |
| F_{p²}, p = 2^64 − 2^32 + 1, 16 bytes | ||||||||||||
| twisted-goldilocks2a = −1 Edwards modulo 2-torsion, extended += cached | 2 | 2 | 2 | 1 | 1 | 1 | 2 | 2 | 1 | 1 | 1 | |
| references, 32 and 33 bytes | ||||||||||||
| ristretto255curve25519-dalek | 1 | 2 | 1 | 1 | 10 | 1 | 1 | |||||
| secp256k1libsecp256k1 | 2 | 1 | ||||||||||
bold: the best of its column; italic, dotted: tied with the best within the confidence intervals; shading: ratio to the best, pale yellow at 1× to purple at 16× or more; grey: baseline, not compared.
All benchmarks
Every observation: a figure and a table per layer.
field
116 benchmarks
| operation | benchmark | family | mode | time | 95% CI | unit |
|---|---|---|---|---|---|---|
| batch invert | gf2_109/batch invert (product tree) | gf2_109 | batch | 3.49 ns | 3.49 ns .. 3.50 ns | per elem |
| batch invert | gf2_122/batch invert (product tree) | gf2_122 | batch | 4.47 ns | 4.47 ns .. 4.47 ns | per elem |
| batch invert | gf2_127/batch invert (product tree) | gf2_127 | batch | 3.60 ns | 3.60 ns .. 3.61 ns | per elem |
| batch invert | fp107/batch invert (product tree) | fp107 | batch | 5.23 ns | 5.22 ns .. 5.23 ns | per elem |
| batch invert | fp127/batch invert (product tree) | fp127 | batch | 5.64 ns | 5.64 ns .. 5.64 ns | per elem |
| batch invert | fp61x2/batch invert (product tree) | fp61x2 | batch | 4.67 ns | 4.66 ns .. 4.67 ns | per elem |
| batch invert | fp64x2/batch invert (product tree) | fp64x2 | batch | 5.77 ns | 5.77 ns .. 5.78 ns | per elem |
| batch invert | goldilocks2/batch invert (product tree) | goldilocks2 | batch | 5.87 ns | 5.85 ns .. 5.89 ns | per elem |
| halftrace | gf2_109/halftrace | gf2_109 | per-element | 37.2 ns | 37.2 ns .. 37.2 ns | per elem |
| halftrace | gf2_109/halftrace (byte tables) | gf2_109 | per-element | 3.32 ns | 3.32 ns .. 3.33 ns | per elem |
| halftrace | gf2_122/qsolve (z^2 + z = c, 2 base halftraces) | gf2_122 | per-element | 2.69 ns | 2.68 ns .. 2.69 ns | per elem |
| halftrace | gf2_127/halftrace | gf2_127 | per-element | 30.0 ns | 29.9 ns .. 30.0 ns | per elem |
| halftrace | gf2_127/halftrace (byte tables) | gf2_127 | per-element | 4.11 ns | 4.11 ns .. 4.11 ns | per elem |
| halftrace | gf2_127/halftrace (nibble tables) | gf2_127 | per-element | 17.2 ns | 17.2 ns .. 17.2 ns | per elem |
| pack | fp107/pack | fp107 | per-element | 0.67 ns | 0.67 ns .. 0.67 ns | per elem |
| pack | fp127/pack | fp127 | per-element | 0.34 ns | 0.34 ns .. 0.34 ns | per elem |
| pack | fp128/pack | fp128 | per-element | 0.34 ns | 0.34 ns .. 0.34 ns | per elem |
| pack | fp61x2/pack | fp61x2 | per-element | 0.34 ns | 0.34 ns .. 0.34 ns | per elem |
| pack | fp64x2/pack | fp64x2 | per-element | 0.34 ns | 0.34 ns .. 0.34 ns | per elem |
| pack | goldilocks2/pack | goldilocks2 | per-element | 0.40 ns | 0.40 ns .. 0.40 ns | per elem |
| trace | gf2_109/trace | gf2_109 | per-element | 0.46 ns | 0.46 ns .. 0.46 ns | per elem |
| trace | gf2_122/trace | gf2_122 | per-element | 0.35 ns | 0.34 ns .. 0.35 ns | per elem |
| trace | gf2_127/trace | gf2_127 | per-element | 0.33 ns | 0.33 ns .. 0.33 ns | per elem |
| neg | fp107/neg | fp107 | per-element | 0.42 ns | 0.42 ns .. 0.43 ns | per elem |
| neg | fp127/neg | fp127 | per-element | 0.66 ns | 0.66 ns .. 0.66 ns | per elem |
| neg | fp128/neg | fp128 | per-element | 0.40 ns | 0.40 ns .. 0.40 ns | per elem |
| neg | fp61x2/neg | fp61x2 | per-element | 0.38 ns | 0.38 ns .. 0.38 ns | per elem |
| neg | fp64x2/neg | fp64x2 | per-element | 0.40 ns | 0.40 ns .. 0.40 ns | per elem |
| neg | goldilocks2/neg | goldilocks2 | per-element | 0.39 ns | 0.39 ns .. 0.39 ns | per elem |
| mul_u2 | gf2_122/mul_u2 (by a^2 = 1 + a) latency (dependent chain) | gf2_122 | latency | 0.63 ns | 0.63 ns .. 0.63 ns | per elem |
| mul_u2 | gf2_122/mul_u2 (by a^2 = 1 + a) throughput (8 chains) | gf2_122 | throughput | 0.20 ns | 0.20 ns .. 0.20 ns | per elem |
| normalize | gf2_109/normalize (to_u128) | gf2_109 | per-element | 0.45 ns | 0.45 ns .. 0.45 ns | per elem |
| normalize | gf2_122/normalize (to_u128) | gf2_122 | per-element | 0.65 ns | 0.65 ns .. 0.65 ns | per elem |
| normalize | gf2_127/normalize (to_u128) | gf2_127 | per-element | 0.41 ns | 0.41 ns .. 0.41 ns | per elem |
| unpack | fp107/unpack | fp107 | per-element | 0.51 ns | 0.51 ns .. 0.51 ns | per elem |
| unpack | fp127/unpack | fp127 | per-element | 0.51 ns | 0.51 ns .. 0.51 ns | per elem |
| unpack | fp128/unpack | fp128 | per-element | 0.51 ns | 0.51 ns .. 0.51 ns | per elem |
| unpack | fp61x2/unpack | fp61x2 | per-element | 0.72 ns | 0.72 ns .. 0.72 ns | per elem |
| unpack | fp64x2/unpack | fp64x2 | per-element | 0.55 ns | 0.55 ns .. 0.55 ns | per elem |
| unpack | goldilocks2/unpack | goldilocks2 | per-element | 0.55 ns | 0.55 ns .. 0.55 ns | per elem |
| sub | fp128/sub | fp128 | per-element | 0.60 ns | 0.60 ns .. 0.60 ns | per elem |
| sub | fp61x2/sub | fp61x2 | per-element | 0.55 ns | 0.55 ns .. 0.55 ns | per elem |
| sub | fp64x2/sub | fp64x2 | per-element | 0.53 ns | 0.53 ns .. 0.54 ns | per elem |
| sub | goldilocks2/sub | goldilocks2 | per-element | 0.59 ns | 0.59 ns .. 0.60 ns | per elem |
| add | fp107/add | fp107 | per-element | 0.51 ns | 0.50 ns .. 0.52 ns | per elem |
| add | fp127/add | fp127 | per-element | 0.83 ns | 0.83 ns .. 0.83 ns | per elem |
| add | fp128/add | fp128 | per-element | 0.89 ns | 0.89 ns .. 0.89 ns | per elem |
| add | fp61x2/add | fp61x2 | per-element | 0.53 ns | 0.53 ns .. 0.53 ns | per elem |
| add | fp64x2/add | fp64x2 | per-element | 0.56 ns | 0.56 ns .. 0.57 ns | per elem |
| add | goldilocks2/add | goldilocks2 | per-element | 0.59 ns | 0.59 ns .. 0.59 ns | per elem |
| square | gf2_109/square latency (dependent chain) | gf2_109 | latency | 2.17 ns | 2.16 ns .. 2.17 ns | per elem |
| square | gf2_109/square throughput (8 chains) | gf2_109 | throughput | 0.83 ns | 0.83 ns .. 0.84 ns | per elem |
| square | gf2_122/square latency (dependent chain) | gf2_122 | latency | 4.44 ns | 4.43 ns .. 4.44 ns | per elem |
| square | gf2_122/square throughput (8 chains) | gf2_122 | throughput | 1.09 ns | 1.09 ns .. 1.09 ns | per elem |
| square | gf2_127/square latency (dependent chain) | gf2_127 | latency | 2.08 ns | 2.08 ns .. 2.09 ns | per elem |
| square | gf2_127/square throughput (8 chains) | gf2_127 | throughput | 0.70 ns | 0.70 ns .. 0.70 ns | per elem |
| square | fp107/square latency (dependent chain) | fp107 | latency | 3.01 ns | 3.00 ns .. 3.02 ns | per elem |
| square | fp107/square throughput (8 chains) | fp107 | throughput | 0.97 ns | 0.97 ns .. 0.97 ns | per elem |
| square | fp127/square latency (dependent chain) | fp127 | latency | 3.57 ns | 3.56 ns .. 3.57 ns | per elem |
| square | fp127/square throughput (8 chains) | fp127 | throughput | 1.78 ns | 1.78 ns .. 1.78 ns | per elem |
| square | fp128/square latency (dependent chain) | fp128 | latency | 6.37 ns | 6.36 ns .. 6.37 ns | per elem |
| square | fp128/square throughput (8 chains) | fp128 | throughput | 2.58 ns | 2.58 ns .. 2.58 ns | per elem |
| square | fp61x2/square latency (dependent chain) | fp61x2 | latency | 3.48 ns | 3.48 ns .. 3.49 ns | per elem |
| square | fp61x2/square throughput (8 chains) | fp61x2 | throughput | 1.40 ns | 1.39 ns .. 1.40 ns | per elem |
| square | fp64x2/square latency (dependent chain) | fp64x2 | latency | 4.92 ns | 4.91 ns .. 4.92 ns | per elem |
| square | fp64x2/square throughput (8 chains) | fp64x2 | throughput | 2.23 ns | 2.23 ns .. 2.24 ns | per elem |
| square | goldilocks2/square latency (dependent chain) | goldilocks2 | latency | 3.43 ns | 3.43 ns .. 3.44 ns | per elem |
| square | goldilocks2/square throughput (8 chains) | goldilocks2 | throughput | 1.69 ns | 1.68 ns .. 1.71 ns | per elem |
| mul_base | gf2_122/mul_base (by a GF(2^61) constant) latency (dependent chain) | gf2_122 | latency | 3.52 ns | 3.52 ns .. 3.52 ns | per elem |
| mul_base | gf2_122/mul_base (by a GF(2^61) constant) throughput (8 chains) | gf2_122 | throughput | 1.14 ns | 1.14 ns .. 1.14 ns | per elem |
| mul | gf2_109/mul latency (dependent chain) | gf2_109 | latency | 3.92 ns | 3.91 ns .. 3.93 ns | per elem |
| mul | gf2_109/mul throughput (8 chains) | gf2_109 | throughput | 1.04 ns | 1.04 ns .. 1.04 ns | per elem |
| mul | gf2_122/mul latency (dependent chain) | gf2_122 | latency | 4.90 ns | 4.90 ns .. 4.90 ns | per elem |
| mul | gf2_122/mul throughput (8 chains) | gf2_122 | throughput | 1.21 ns | 1.21 ns .. 1.21 ns | per elem |
| mul | gf2_127/mul latency (dependent chain) | gf2_127 | latency | 3.75 ns | 3.74 ns .. 3.77 ns | per elem |
| mul | gf2_127/mul throughput (8 chains) | gf2_127 | throughput | 1.21 ns | 1.21 ns .. 1.21 ns | per elem |
| mul | fp107 schoolbook/mul latency (dependent chain) | fp107 | latency | 3.20 ns | 3.20 ns .. 3.21 ns | per elem |
| mul | fp107 schoolbook/mul throughput (8 chains) | fp107 | throughput | 1.15 ns | 1.15 ns .. 1.15 ns | per elem |
| mul | fp107/mul latency (dependent chain) | fp107 | latency | 3.49 ns | 3.48 ns .. 3.50 ns | per elem |
| mul | fp107/mul throughput (8 chains) | fp107 | throughput | 1.29 ns | 1.29 ns .. 1.29 ns | per elem |
| mul | fp127/mul latency (dependent chain) | fp127 | latency | 3.82 ns | 3.81 ns .. 3.82 ns | per elem |
| mul | fp127/mul throughput (8 chains) | fp127 | throughput | 1.50 ns | 1.50 ns .. 1.50 ns | per elem |
| mul | fp128/mul latency (dependent chain) | fp128 | latency | 6.58 ns | 6.57 ns .. 6.58 ns | per elem |
| mul | fp128/mul throughput (8 chains) | fp128 | throughput | 2.77 ns | 2.77 ns .. 2.77 ns | per elem |
| mul | fp61x2/mul latency (dependent chain) | fp61x2 | latency | 3.30 ns | 3.30 ns .. 3.31 ns | per elem |
| mul | fp61x2/mul throughput (8 chains) | fp61x2 | throughput | 1.26 ns | 1.26 ns .. 1.26 ns | per elem |
| mul | fp64x2/mul latency (dependent chain) | fp64x2 | latency | 5.08 ns | 5.07 ns .. 5.09 ns | per elem |
| mul | fp64x2/mul throughput (8 chains) | fp64x2 | throughput | 2.24 ns | 2.24 ns .. 2.24 ns | per elem |
| mul | goldilocks2/mul latency (dependent chain) | goldilocks2 | latency | 2.90 ns | 2.90 ns .. 2.90 ns | per elem |
| mul | goldilocks2/mul throughput (8 chains) | goldilocks2 | throughput | 1.36 ns | 1.35 ns .. 1.38 ns | per elem |
| invert | gf2_109/invert | gf2_109 | per-element | 341 ns | 340 ns .. 343 ns | per elem |
| invert | gf2_122/invert | gf2_122 | per-element | 159 ns | 159 ns .. 159 ns | per elem |
| invert | gf2_127/invert | gf2_127 | per-element | 317 ns | 317 ns .. 318 ns | per elem |
| invert | fp107/invert | fp107 | per-element | 477 ns | 477 ns .. 478 ns | per elem |
| invert | fp127/invert | fp127 | per-element | 520 ns | 518 ns .. 522 ns | per elem |
| invert | fp128/invert | fp128 | per-element | 933 ns | 932 ns .. 934 ns | per elem |
| invert | fp61x2/invert | fp61x2 | per-element | 159 ns | 159 ns .. 159 ns | per elem |
| invert | fp64x2/invert | fp64x2 | per-element | 281 ns | 280 ns .. 281 ns | per elem |
| invert | goldilocks2/invert | goldilocks2 | per-element | 186 ns | 182 ns .. 190 ns | per elem |
| sqrt | gf2_109/sqrt | gf2_109 | per-element | 2.77 ns | 2.77 ns .. 2.78 ns | per elem |
| sqrt | gf2_122/sqrt | gf2_122 | per-element | 2.95 ns | 2.95 ns .. 2.95 ns | per elem |
| sqrt | gf2_127/sqrt | gf2_127 | per-element | 1.26 ns | 1.26 ns .. 1.26 ns | per elem |
| sqrt | fp107/sqrt (x^(2^105)) | fp107 | per-element | 341 ns | 340 ns .. 341 ns | per elem |
| sqrt | fp127/sqrt (x^(2^125)) | fp127 | per-element | 470 ns | 468 ns .. 472 ns | per elem |
| sqrt | fp128/sqrt | fp128 | per-element | 878 ns | 877 ns .. 878 ns | per elem |
| sqrt | fp61x2/sqrt | fp61x2 | per-element | 277 ns | 277 ns .. 277 ns | per elem |
| sqrt | fp64x2/sqrt | fp64x2 | per-element | 485 ns | 485 ns .. 485 ns | per elem |
| sqrt | goldilocks2/sqrt | goldilocks2 | per-element | 727 ns | 724 ns .. 730 ns | per elem |
| pow_p34 | fp107/pow_p34 (x^(2^105-1)) | fp107 | per-element | 469 ns | 468 ns .. 470 ns | per elem |
| pow_p34 | fp127/pow_p34 (x^(2^125-1)) | fp127 | per-element | 494 ns | 493 ns .. 495 ns | per elem |
| sqrt_ratio | fp107/sqrt_ratio | fp107 | per-element | 482 ns | 482 ns .. 482 ns | per elem |
| sqrt_ratio | fp127/sqrt_ratio | fp127 | per-element | 518 ns | 517 ns .. 519 ns | per elem |
| sqrt_ratio | fp128/sqrt_ratio | fp128 | per-element | 932 ns | 932 ns .. 933 ns | per elem |
| sqrt_ratio | fp61x2/sqrt_ratio | fp61x2 | per-element | 277 ns | 277 ns .. 278 ns | per elem |
| sqrt_ratio | fp64x2/sqrt_ratio | fp64x2 | per-element | 481 ns | 481 ns .. 482 ns | per elem |
| sqrt_ratio | goldilocks2/sqrt_ratio | goldilocks2 | per-element | 677 ns | 676 ns .. 678 ns | per elem |
group ops
470 benchmarks
| operation | benchmark | family | mode | time | 95% CI | unit |
|---|---|---|---|---|---|---|
| prepare | binary.109/mode=batch,n=1024 | gf2_109 | batch | 2.79 ns | 2.79 ns .. 2.80 ns | per elem |
| prepare | binary.109/mode=batch,n=64 | gf2_109 | batch | 2.83 ns | 2.82 ns .. 2.83 ns | per elem |
| prepare | binary.109/mode=batch,n=8 | gf2_109 | batch | 4.00 ns | 3.99 ns .. 4.01 ns | per elem |
| prepare | binary.109/mode=indep | gf2_109 | per-element | 2.77 ns | 2.76 ns .. 2.77 ns | per elem |
| prepare | binary-lambda.109/mode=batch,n=1024 | gf2_109-lambda | batch | 5.17 ns | 5.16 ns .. 5.18 ns | per elem |
| prepare | binary-lambda.109/mode=batch,n=64 | gf2_109-lambda | batch | 14.0 ns | 14.0 ns .. 14.0 ns | per elem |
| prepare | binary-lambda.109/mode=batch,n=8 | gf2_109-lambda | batch | 68.7 ns | 68.5 ns .. 68.9 ns | per elem |
| prepare | binary-lambda.109/mode=indep | gf2_109-lambda | per-element | 349 ns | 348 ns .. 350 ns | per elem |
| prepare | binary-u.109/mode=batch,n=1024 | gf2_109-u | batch | 0.49 ns | 0.48 ns .. 0.49 ns | per elem |
| prepare | binary-u.109/mode=batch,n=64 | gf2_109-u | batch | 0.51 ns | 0.51 ns .. 0.51 ns | per elem |
| prepare | binary-u.109/mode=batch,n=8 | gf2_109-u | batch | 1.42 ns | 1.41 ns .. 1.42 ns | per elem |
| prepare | binary-u.109/mode=indep | gf2_109-u | per-element | 0.63 ns | 0.63 ns .. 0.63 ns | per elem |
| prepare | binary-w.109/mode=batch,n=1024 | gf2_109-w | batch | 0.48 ns | 0.47 ns .. 0.48 ns | per elem |
| prepare | binary-w.109/mode=batch,n=64 | gf2_109-w | batch | 0.51 ns | 0.51 ns .. 0.51 ns | per elem |
| prepare | binary-w.109/mode=batch,n=8 | gf2_109-w | batch | 1.40 ns | 1.40 ns .. 1.41 ns | per elem |
| prepare | binary-w.109/mode=indep | gf2_109-w | per-element | 0.61 ns | 0.61 ns .. 0.62 ns | per elem |
| prepare | binary.122/mode=batch,n=1024 | gf2_122 | batch | 5.02 ns | 5.01 ns .. 5.03 ns | per elem |
| prepare | binary.122/mode=indep | gf2_122 | per-element | 4.92 ns | 4.90 ns .. 4.93 ns | per elem |
| prepare | binary.122-gls/mode=batch,n=1024 | gf2_122-gls | batch | 4.44 ns | 4.42 ns .. 4.45 ns | per elem |
| prepare | binary.122-gls/mode=indep | gf2_122-gls | per-element | 4.31 ns | 4.29 ns .. 4.32 ns | per elem |
| prepare | binary-lambda.122-gls/mode=batch,n=1024 | gf2_122-gls-lambda | batch | 7.53 ns | 7.52 ns .. 7.55 ns | per elem |
| prepare | binary-lambda.122-gls/mode=batch,n=64 | gf2_122-gls-lambda | batch | 13.1 ns | 13.1 ns .. 13.2 ns | per elem |
| prepare | binary-lambda.122-gls/mode=batch,n=8 | gf2_122-gls-lambda | batch | 47.8 ns | 47.7 ns .. 48.0 ns | per elem |
| prepare | binary-lambda.122-gls/mode=indep | gf2_122-gls-lambda | per-element | 167 ns | 167 ns .. 168 ns | per elem |
| prepare | binary-u.122-gls/mode=batch,n=1024 | gf2_122-gls-u | batch | 0.48 ns | 0.47 ns .. 0.48 ns | per elem |
| prepare | binary-u.122-gls/mode=batch,n=64 | gf2_122-gls-u | batch | 0.51 ns | 0.51 ns .. 0.51 ns | per elem |
| prepare | binary-u.122-gls/mode=batch,n=8 | gf2_122-gls-u | batch | 1.42 ns | 1.41 ns .. 1.42 ns | per elem |
| prepare | binary-u.122-gls/mode=indep | gf2_122-gls-u | per-element | 0.63 ns | 0.63 ns .. 0.63 ns | per elem |
| prepare | binary-w.122-gls/mode=batch,n=1024 | gf2_122-gls-w | batch | 0.49 ns | 0.48 ns .. 0.50 ns | per elem |
| prepare | binary-w.122-gls/mode=batch,n=64 | gf2_122-gls-w | batch | 0.51 ns | 0.51 ns .. 0.51 ns | per elem |
| prepare | binary-w.122-gls/mode=batch,n=8 | gf2_122-gls-w | batch | 1.42 ns | 1.41 ns .. 1.42 ns | per elem |
| prepare | binary-w.122-gls/mode=indep | gf2_122-gls-w | per-element | 0.63 ns | 0.63 ns .. 0.63 ns | per elem |
| prepare | binary-lambda.122/mode=batch,n=1024 | gf2_122-lambda | batch | 7.55 ns | 7.53 ns .. 7.56 ns | per elem |
| prepare | binary-lambda.122/mode=batch,n=64 | gf2_122-lambda | batch | 13.1 ns | 13.1 ns .. 13.1 ns | per elem |
| prepare | binary-lambda.122/mode=batch,n=8 | gf2_122-lambda | batch | 46.9 ns | 46.8 ns .. 47.0 ns | per elem |
| prepare | binary-lambda.122/mode=indep | gf2_122-lambda | per-element | 166 ns | 166 ns .. 167 ns | per elem |
| prepare | binary-u.122/mode=batch,n=1024 | gf2_122-u | batch | 0.48 ns | 0.47 ns .. 0.48 ns | per elem |
| prepare | binary-u.122/mode=batch,n=64 | gf2_122-u | batch | 0.50 ns | 0.50 ns .. 0.51 ns | per elem |
| prepare | binary-u.122/mode=batch,n=8 | gf2_122-u | batch | 1.41 ns | 1.41 ns .. 1.42 ns | per elem |
| prepare | binary-u.122/mode=indep | gf2_122-u | per-element | 0.61 ns | 0.61 ns .. 0.62 ns | per elem |
| prepare | binary-w.122/mode=batch,n=1024 | gf2_122-w | batch | 0.46 ns | 0.45 ns .. 0.47 ns | per elem |
| prepare | binary-w.122/mode=batch,n=64 | gf2_122-w | batch | 0.51 ns | 0.50 ns .. 0.51 ns | per elem |
| prepare | binary-w.122/mode=batch,n=8 | gf2_122-w | batch | 1.39 ns | 1.39 ns .. 1.40 ns | per elem |
| prepare | binary-w.122/mode=indep | gf2_122-w | per-element | 0.63 ns | 0.63 ns .. 0.63 ns | per elem |
| prepare | binary.127/mode=batch,n=1024 | gf2_127 | batch | 3.54 ns | 3.54 ns .. 3.54 ns | per elem |
| prepare | binary.127/mode=batch,n=64 | gf2_127 | batch | 3.68 ns | 3.68 ns .. 3.69 ns | per elem |
| prepare | binary.127/mode=batch,n=8 | gf2_127 | batch | 4.37 ns | 4.36 ns .. 4.38 ns | per elem |
| prepare | binary.127/mode=indep | gf2_127 | per-element | 3.88 ns | 3.87 ns .. 3.91 ns | per elem |
| prepare | binary-lambda.127/mode=batch,n=1024 | gf2_127-lambda | batch | 6.33 ns | 6.30 ns .. 6.35 ns | per elem |
| prepare | binary-lambda.127/mode=batch,n=64 | gf2_127-lambda | batch | 14.2 ns | 14.2 ns .. 14.2 ns | per elem |
| prepare | binary-lambda.127/mode=batch,n=8 | gf2_127-lambda | batch | 64.1 ns | 63.9 ns .. 64.2 ns | per elem |
| prepare | binary-lambda.127/mode=indep | gf2_127-lambda | per-element | 340 ns | 339 ns .. 340 ns | per elem |
| prepare | binary-u.127/mode=batch,n=1024 | gf2_127-u | batch | 0.49 ns | 0.48 ns .. 0.49 ns | per elem |
| prepare | binary-u.127/mode=batch,n=64 | gf2_127-u | batch | 0.51 ns | 0.51 ns .. 0.51 ns | per elem |
| prepare | binary-u.127/mode=batch,n=8 | gf2_127-u | batch | 1.41 ns | 1.40 ns .. 1.41 ns | per elem |
| prepare | binary-u.127/mode=indep | gf2_127-u | per-element | 0.63 ns | 0.63 ns .. 0.63 ns | per elem |
| prepare | binary-w.127/mode=batch,n=1024 | gf2_127-w | batch | 0.48 ns | 0.47 ns .. 0.49 ns | per elem |
| prepare | binary-w.127/mode=batch,n=64 | gf2_127-w | batch | 0.51 ns | 0.51 ns .. 0.51 ns | per elem |
| prepare | binary-w.127/mode=batch,n=8 | gf2_127-w | batch | 1.40 ns | 1.40 ns .. 1.41 ns | per elem |
| prepare | binary-w.127/mode=indep | gf2_127-w | per-element | 0.63 ns | 0.62 ns .. 0.63 ns | per elem |
| prepare | edwards.107/mode=batch,n=1024 | edwards107 | batch | 22.7 ns | 22.6 ns .. 22.8 ns | per elem |
| prepare | edwards.107/mode=indep | edwards107 | per-element | 546 ns | 544 ns .. 548 ns | per elem |
| prepare | edwards.127/mode=batch,n=1024 | edwards127 | batch | 28.3 ns | 28.2 ns .. 28.3 ns | per elem |
| prepare | edwards.127/mode=indep | edwards127 | per-element | 582 ns | 581 ns .. 583 ns | per elem |
| prepare | edwards.61x2/mode=batch,n=1024 | edwards61x2 | batch | 18.8 ns | 18.8 ns .. 18.9 ns | per elem |
| prepare | edwards.61x2/mode=indep | edwards61x2 | per-element | 216 ns | 216 ns .. 217 ns | per elem |
| prepare | twisted.goldilocks2/mode=batch,n=1024 | twisted-goldilocks2 | batch | 4.51 ns | 4.48 ns .. 4.53 ns | per elem |
| prepare | twisted.goldilocks2/mode=indep | twisted-goldilocks2 | per-element | 4.48 ns | 4.46 ns .. 4.49 ns | per elem |
| prepare | twisted.128/mode=batch,n=1024 | twisted128 | batch | 8.08 ns | 8.06 ns .. 8.10 ns | per elem |
| prepare | twisted.128/mode=indep | twisted128 | per-element | 8.24 ns | 8.22 ns .. 8.26 ns | per elem |
| prepare | twisted.61x2/mode=batch,n=1024 | twisted61x2 | batch | 3.60 ns | 3.59 ns .. 3.60 ns | per elem |
| prepare | twisted.61x2/mode=batch,n=64 | twisted61x2 | batch | 3.80 ns | 3.79 ns .. 3.81 ns | per elem |
| prepare | twisted.61x2/mode=batch,n=8 | twisted61x2 | batch | 6.03 ns | 6.02 ns .. 6.05 ns | per elem |
| prepare | twisted.61x2/mode=indep | twisted61x2 | per-element | 3.41 ns | 3.40 ns .. 3.41 ns | per elem |
| prepare | twisted.64x2/mode=batch,n=1024 | twisted64x2 | batch | 5.51 ns | 5.49 ns .. 5.53 ns | per elem |
| prepare | twisted.64x2/mode=indep | twisted64x2 | per-element | 5.43 ns | 5.41 ns .. 5.44 ns | per elem |
| prepare | weier.107/mode=batch,n=1024 | weier107 | batch | 0.49 ns | 0.48 ns .. 0.50 ns | per elem |
| prepare | weier.107/mode=indep | weier107 | per-element | 0.62 ns | 0.62 ns .. 0.62 ns | per elem |
| prepare | weier-jacobian.107/mode=batch,n=1024 | weier107-jacobian | batch | 0.48 ns | 0.48 ns .. 0.49 ns | per elem |
| prepare | weier-jacobian.107/mode=indep | weier107-jacobian | per-element | 0.62 ns | 0.61 ns .. 0.62 ns | per elem |
| prepare | weier.127/mode=batch,n=1024 | weier127 | batch | 0.46 ns | 0.46 ns .. 0.47 ns | per elem |
| prepare | weier.127/mode=indep | weier127 | per-element | 0.61 ns | 0.61 ns .. 0.62 ns | per elem |
| prepare | weier-jacobian.127/mode=batch,n=1024 | weier127-jacobian | batch | 0.49 ns | 0.48 ns .. 0.50 ns | per elem |
| prepare | weier-jacobian.127/mode=indep | weier127-jacobian | per-element | 0.62 ns | 0.62 ns .. 0.62 ns | per elem |
| prepare | weier.61x2/mode=batch,n=1024 | weier61x2 | batch | 0.72 ns | 0.66 ns .. 0.78 ns | per elem |
| prepare | weier.61x2/mode=indep | weier61x2 | per-element | 0.63 ns | 0.63 ns .. 0.63 ns | per elem |
| prepare | weier-jacobian.61x2/mode=batch,n=1024 | weier61x2-jacobian | batch | 0.54 ns | 0.52 ns .. 0.58 ns | per elem |
| prepare | weier-jacobian.61x2/mode=indep | weier61x2-jacobian | per-element | 0.63 ns | 0.63 ns .. 0.63 ns | per elem |
| add | xor-sha256/xor 32B, 1 accumulator | xor | latency | 0.38 ns | 0.37 ns .. 0.38 ns | per elem |
| add | xor-sha256/xor 32B, 8 accumulators | xor | throughput | 0.71 ns | 0.70 ns .. 0.71 ns | per elem |
| add | binary.109/mode=latency | gf2_109 | latency | 24.3 ns | 24.2 ns .. 24.4 ns | per elem |
| add | binary.109/mode=throughput | gf2_109 | throughput | 12.8 ns | 12.8 ns .. 12.9 ns | per elem |
| add | gf2_109/extended += affine, 8 accumulators | gf2_109 | throughput | 16.0 ns | 16.0 ns .. 16.0 ns | per elem |
| add | binary-lambda.109/mode=latency | gf2_109-lambda | latency | 24.2 ns | 24.1 ns .. 24.3 ns | per elem |
| add | binary-lambda.109/mode=throughput | gf2_109-lambda | throughput | 12.0 ns | 12.0 ns .. 12.0 ns | per elem |
| add | binary-u.109/mode=latency | gf2_109-u | latency | 19.0 ns | 18.9 ns .. 19.0 ns | per elem |
| add | binary-u.109/mode=throughput | gf2_109-u | throughput | 9.76 ns | 9.74 ns .. 9.78 ns | per elem |
| add | binary-w.109/mode=latency | gf2_109-w | latency | 24.2 ns | 24.2 ns .. 24.3 ns | per elem |
| add | binary-w.109/mode=throughput | gf2_109-w | throughput | 12.0 ns | 11.9 ns .. 12.0 ns | per elem |
| add | binary.122/mode=latency | gf2_122 | latency | 26.1 ns | 26.1 ns .. 26.2 ns | per elem |
| add | binary.122/mode=throughput | gf2_122 | throughput | 17.8 ns | 17.8 ns .. 17.9 ns | per elem |
| add | gf2_122/extended += affine, 8 accumulators | gf2_122 | throughput | 22.2 ns | 22.2 ns .. 22.2 ns | per elem |
| add | binary.122-gls/mode=latency | gf2_122-gls | latency | 23.7 ns | 23.7 ns .. 23.8 ns | per elem |
| add | binary.122-gls/mode=throughput | gf2_122-gls | throughput | 16.8 ns | 16.7 ns .. 16.8 ns | per elem |
| add | gf2_122-gls/extended += affine, 8 accumulators | gf2_122-gls | throughput | 20.1 ns | 20.1 ns .. 20.1 ns | per elem |
| add | binary-lambda.122-gls/mode=latency | gf2_122-gls-lambda | latency | 23.1 ns | 23.1 ns .. 23.2 ns | per elem |
| add | binary-lambda.122-gls/mode=throughput | gf2_122-gls-lambda | throughput | 16.6 ns | 16.5 ns .. 16.6 ns | per elem |
| add | binary-u.122-gls/mode=latency | gf2_122-gls-u | latency | 18.9 ns | 18.8 ns .. 18.9 ns | per elem |
| add | binary-u.122-gls/mode=throughput | gf2_122-gls-u | throughput | 13.1 ns | 13.1 ns .. 13.1 ns | per elem |
| add | binary-w.122-gls/mode=latency | gf2_122-gls-w | latency | 23.1 ns | 23.0 ns .. 23.1 ns | per elem |
| add | binary-w.122-gls/mode=throughput | gf2_122-gls-w | throughput | 16.6 ns | 16.5 ns .. 16.6 ns | per elem |
| add | binary-lambda.122/mode=latency | gf2_122-lambda | latency | 23.0 ns | 23.0 ns .. 23.1 ns | per elem |
| add | binary-lambda.122/mode=throughput | gf2_122-lambda | throughput | 16.6 ns | 16.5 ns .. 16.6 ns | per elem |
| add | binary-u.122/mode=latency | gf2_122-u | latency | 18.8 ns | 18.8 ns .. 18.9 ns | per elem |
| add | binary-u.122/mode=throughput | gf2_122-u | throughput | 13.1 ns | 13.0 ns .. 13.1 ns | per elem |
| add | binary-w.122/mode=latency | gf2_122-w | latency | 23.0 ns | 22.9 ns .. 23.0 ns | per elem |
| add | binary-w.122/mode=throughput | gf2_122-w | throughput | 16.6 ns | 16.5 ns .. 16.6 ns | per elem |
| add | binary.127/mode=latency | gf2_127 | latency | 22.0 ns | 21.9 ns .. 22.0 ns | per elem |
| add | binary.127/mode=throughput | gf2_127 | throughput | 14.1 ns | 14.1 ns .. 14.1 ns | per elem |
| add | gf2_127/extended += affine, 8 accumulators | gf2_127 | throughput | 18.8 ns | 18.8 ns .. 18.9 ns | per elem |
| add | binary-lambda.127/mode=latency | gf2_127-lambda | latency | 20.2 ns | 20.1 ns .. 20.2 ns | per elem |
| add | binary-lambda.127/mode=throughput | gf2_127-lambda | throughput | 14.9 ns | 14.9 ns .. 14.9 ns | per elem |
| add | binary-u.127/mode=latency | gf2_127-u | latency | 17.5 ns | 17.4 ns .. 17.5 ns | per elem |
| add | binary-u.127/mode=throughput | gf2_127-u | throughput | 10.7 ns | 10.6 ns .. 10.7 ns | per elem |
| add | binary-w.127/mode=latency | gf2_127-w | latency | 20.2 ns | 20.1 ns .. 20.2 ns | per elem |
| add | binary-w.127/mode=throughput | gf2_127-w | throughput | 14.9 ns | 14.8 ns .. 14.9 ns | per elem |
| add | edwards.107/mode=latency | edwards107 | latency | 18.4 ns | 18.3 ns .. 18.4 ns | per elem |
| add | edwards.107/mode=throughput | edwards107 | throughput | 15.5 ns | 15.4 ns .. 15.5 ns | per elem |
| add | edwards107/+= montgomery affine, 8 accumulators | edwards107 | throughput | 29.1 ns | 29.1 ns .. 29.1 ns | per elem |
| add | edwards.127/mode=latency | edwards127 | latency | 22.2 ns | 22.2 ns .. 22.2 ns | per elem |
| add | edwards.127/mode=throughput | edwards127 | throughput | 20.1 ns | 20.0 ns .. 20.1 ns | per elem |
| add | edwards127/+= montgomery affine, 8 accumulators | edwards127 | throughput | 40.1 ns | 40.1 ns .. 40.1 ns | per elem |
| add | edwards.61x2/mode=latency | edwards61x2 | latency | 22.5 ns | 22.4 ns .. 22.5 ns | per elem |
| add | edwards.61x2/mode=throughput | edwards61x2 | throughput | 13.3 ns | 13.3 ns .. 13.4 ns | per elem |
| add | twisted.goldilocks2/mode=latency | twisted-goldilocks2 | latency | 19.0 ns | 18.9 ns .. 19.0 ns | per elem |
| add | twisted.goldilocks2/mode=throughput | twisted-goldilocks2 | throughput | 15.0 ns | 15.0 ns .. 15.1 ns | per elem |
| add | twisted.128/mode=latency | twisted128 | latency | 28.8 ns | 28.7 ns .. 28.8 ns | per elem |
| add | twisted.128/mode=throughput | twisted128 | throughput | 23.9 ns | 23.8 ns .. 24.0 ns | per elem |
| add | twisted.61x2/mode=latency | twisted61x2 | latency | 22.3 ns | 22.3 ns .. 22.3 ns | per elem |
| add | twisted.61x2/mode=throughput | twisted61x2 | throughput | 12.5 ns | 12.4 ns .. 12.6 ns | per elem |
| add | twisted.64x2/mode=latency | twisted64x2 | latency | 28.6 ns | 28.5 ns .. 28.7 ns | per elem |
| add | twisted.64x2/mode=throughput | twisted64x2 | throughput | 17.2 ns | 17.2 ns .. 17.3 ns | per elem |
| add | weier.107/mode=latency | weier107 | latency | 32.4 ns | 32.3 ns .. 32.4 ns | per elem |
| add | weier.107/mode=throughput | weier107 | throughput | 30.5 ns | 30.4 ns .. 30.5 ns | per elem |
| add | weier-jacobian.107/mode=latency | weier107-jacobian | latency | 35.5 ns | 35.4 ns .. 35.6 ns | per elem |
| add | weier-jacobian.107/mode=throughput | weier107-jacobian | throughput | 28.7 ns | 28.6 ns .. 28.7 ns | per elem |
| add | weier.127/mode=latency | weier127 | latency | 46.7 ns | 46.5 ns .. 46.8 ns | per elem |
| add | weier.127/mode=throughput | weier127 | throughput | 45.4 ns | 45.3 ns .. 45.5 ns | per elem |
| add | weier-jacobian.127/mode=latency | weier127-jacobian | latency | 45.3 ns | 45.1 ns .. 45.6 ns | per elem |
| add | weier-jacobian.127/mode=throughput | weier127-jacobian | throughput | 37.5 ns | 37.4 ns .. 37.6 ns | per elem |
| add | weier.61x2/mode=latency | weier61x2 | latency | 36.2 ns | 36.2 ns .. 36.3 ns | per elem |
| add | weier.61x2/mode=throughput | weier61x2 | throughput | 26.8 ns | 26.7 ns .. 26.8 ns | per elem |
| add | weier-jacobian.61x2/mode=latency | weier61x2-jacobian | latency | 37.2 ns | 37.1 ns .. 37.3 ns | per elem |
| add | weier-jacobian.61x2/mode=throughput | weier61x2-jacobian | throughput | 31.6 ns | 31.6 ns .. 31.7 ns | per elem |
| add | ristretto255/+=, 1 accumulator | ristretto255 | latency | 63.8 ns | 63.7 ns .. 63.8 ns | per elem |
| add | ristretto255/+=, 8 accumulators | ristretto255 | throughput | 65.1 ns | 64.8 ns .. 65.5 ns | per elem |
| subtract | binary.109/mode=throughput | gf2_109 | throughput | 13.2 ns | 13.2 ns .. 13.3 ns | per elem |
| subtract | binary-lambda.109/mode=throughput | gf2_109-lambda | throughput | 12.1 ns | 12.1 ns .. 12.1 ns | per elem |
| subtract | binary-u.109/mode=throughput | gf2_109-u | throughput | 9.88 ns | 9.86 ns .. 9.90 ns | per elem |
| subtract | binary-w.109/mode=throughput | gf2_109-w | throughput | 12.1 ns | 12.1 ns .. 12.1 ns | per elem |
| subtract | binary-lambda.122-gls/mode=throughput | gf2_122-gls-lambda | throughput | 16.7 ns | 16.7 ns .. 16.8 ns | per elem |
| subtract | binary-u.122-gls/mode=throughput | gf2_122-gls-u | throughput | 13.2 ns | 13.2 ns .. 13.2 ns | per elem |
| subtract | binary-w.122-gls/mode=throughput | gf2_122-gls-w | throughput | 16.8 ns | 16.7 ns .. 16.9 ns | per elem |
| subtract | binary-lambda.122/mode=throughput | gf2_122-lambda | throughput | 16.7 ns | 16.7 ns .. 16.8 ns | per elem |
| subtract | binary-u.122/mode=throughput | gf2_122-u | throughput | 13.2 ns | 13.2 ns .. 13.2 ns | per elem |
| subtract | binary-w.122/mode=throughput | gf2_122-w | throughput | 17.1 ns | 16.7 ns .. 17.5 ns | per elem |
| subtract | binary.127/mode=throughput | gf2_127 | throughput | 14.7 ns | 14.7 ns .. 14.7 ns | per elem |
| subtract | binary-lambda.127/mode=throughput | gf2_127-lambda | throughput | 15.1 ns | 15.1 ns .. 15.2 ns | per elem |
| subtract | binary-u.127/mode=throughput | gf2_127-u | throughput | 10.8 ns | 10.7 ns .. 10.8 ns | per elem |
| subtract | binary-w.127/mode=throughput | gf2_127-w | throughput | 14.7 ns | 14.6 ns .. 14.8 ns | per elem |
| subtract | twisted.61x2/mode=throughput | twisted61x2 | throughput | 12.8 ns | 12.7 ns .. 12.8 ns | per elem |
| subtract | ristretto255/-=, 8 accumulators | ristretto255 | throughput | 64.4 ns | 64.1 ns .. 64.7 ns | per elem |
| negate | binary.109 | gf2_109 | per-element | 1.13 ns | 1.13 ns .. 1.13 ns | per elem |
| negate | gf2_109/affine (y += x) | gf2_109 | per-element | 0.63 ns | 0.63 ns .. 0.63 ns | per elem |
| negate | binary-lambda.109 | gf2_109-lambda | per-element | 0.65 ns | 0.65 ns .. 0.65 ns | per elem |
| negate | binary-u.109 | gf2_109-u | per-element | 0.65 ns | 0.65 ns .. 0.65 ns | per elem |
| negate | binary-w.109 | gf2_109-w | per-element | 0.65 ns | 0.65 ns .. 0.65 ns | per elem |
| negate | binary.122 | gf2_122 | per-element | 1.13 ns | 1.13 ns .. 1.13 ns | per elem |
| negate | gf2_122/affine (y += x) | gf2_122 | per-element | 0.63 ns | 0.63 ns .. 0.63 ns | per elem |
| negate | binary.122-gls | gf2_122-gls | per-element | 1.12 ns | 1.12 ns .. 1.13 ns | per elem |
| negate | binary-lambda.122-gls | gf2_122-gls-lambda | per-element | 0.65 ns | 0.65 ns .. 0.65 ns | per elem |
| negate | binary-u.122-gls | gf2_122-gls-u | per-element | 0.65 ns | 0.65 ns .. 0.65 ns | per elem |
| negate | binary-w.122-gls | gf2_122-gls-w | per-element | 0.65 ns | 0.65 ns .. 0.65 ns | per elem |
| negate | binary-lambda.122 | gf2_122-lambda | per-element | 0.65 ns | 0.65 ns .. 0.65 ns | per elem |
| negate | binary-u.122 | gf2_122-u | per-element | 0.65 ns | 0.65 ns .. 0.65 ns | per elem |
| negate | binary-w.122 | gf2_122-w | per-element | 0.65 ns | 0.65 ns .. 0.65 ns | per elem |
| negate | binary.127 | gf2_127 | per-element | 1.08 ns | 1.08 ns .. 1.09 ns | per elem |
| negate | gf2_127/affine (y += x) | gf2_127 | per-element | 0.64 ns | 0.64 ns .. 0.64 ns | per elem |
| negate | binary-lambda.127 | gf2_127-lambda | per-element | 0.65 ns | 0.65 ns .. 0.65 ns | per elem |
| negate | binary-u.127 | gf2_127-u | per-element | 0.64 ns | 0.63 ns .. 0.64 ns | per elem |
| negate | binary-w.127 | gf2_127-w | per-element | 0.65 ns | 0.65 ns .. 0.65 ns | per elem |
| negate | edwards.107 | edwards107 | per-element | 0.83 ns | 0.82 ns .. 0.83 ns | per elem |
| negate | edwards107/extended (-X, -T) | edwards107 | per-element | 1.02 ns | 1.02 ns .. 1.02 ns | per elem |
| negate | edwards.127 | edwards127 | per-element | 1.34 ns | 1.33 ns .. 1.34 ns | per elem |
| negate | edwards127/extended (-X, -T) | edwards127 | per-element | 1.44 ns | 1.43 ns .. 1.45 ns | per elem |
| negate | edwards.61x2 | edwards61x2 | per-element | 0.88 ns | 0.88 ns .. 0.88 ns | per elem |
| negate | twisted.goldilocks2 | twisted-goldilocks2 | per-element | 1.49 ns | 1.48 ns .. 1.49 ns | per elem |
| negate | twisted.128 | twisted128 | per-element | 0.85 ns | 0.85 ns .. 0.86 ns | per elem |
| negate | twisted.61x2 | twisted61x2 | per-element | 0.91 ns | 0.90 ns .. 0.92 ns | per elem |
| negate | twisted.64x2 | twisted64x2 | per-element | 0.91 ns | 0.90 ns .. 0.91 ns | per elem |
| negate | weier.107 | weier107 | per-element | 0.58 ns | 0.58 ns .. 0.58 ns | per elem |
| negate | weier107/projective (-Y) | weier107 | per-element | 0.80 ns | 0.80 ns .. 0.80 ns | per elem |
| negate | weier-jacobian.107 | weier107-jacobian | per-element | 0.58 ns | 0.58 ns .. 0.58 ns | per elem |
| negate | weier.127 | weier127 | per-element | 0.69 ns | 0.69 ns .. 0.69 ns | per elem |
| negate | weier127/projective (-Y) | weier127 | per-element | 0.93 ns | 0.92 ns .. 0.93 ns | per elem |
| negate | weier-jacobian.127 | weier127-jacobian | per-element | 0.69 ns | 0.69 ns .. 0.69 ns | per elem |
| negate | weier.61x2 | weier61x2 | per-element | 0.66 ns | 0.66 ns .. 0.66 ns | per elem |
| negate | weier-jacobian.61x2 | weier61x2-jacobian | per-element | 0.66 ns | 0.66 ns .. 0.66 ns | per elem |
| negate | ristretto255/-P | ristretto255 | per-element | 6.20 ns | 6.17 ns .. 6.22 ns | per elem |
| negate | secp256k1/PublicKey::negate | secp256k1 | per-element | 12.8 ns | 12.7 ns .. 12.9 ns | per elem |
| is identity | binary.109 | gf2_109 | per-element | 0.64 ns | 0.63 ns .. 0.64 ns | per elem |
| is identity | binary-lambda.109 | gf2_109-lambda | per-element | 0.56 ns | 0.55 ns .. 0.56 ns | per elem |
| is identity | binary-u.109 | gf2_109-u | per-element | 0.56 ns | 0.55 ns .. 0.56 ns | per elem |
| is identity | binary-w.109 | gf2_109-w | per-element | 0.56 ns | 0.56 ns .. 0.56 ns | per elem |
| is identity | binary.122 | gf2_122 | per-element | 0.77 ns | 0.77 ns .. 0.78 ns | per elem |
| is identity | binary.122-gls | gf2_122-gls | per-element | 0.77 ns | 0.77 ns .. 0.77 ns | per elem |
| is identity | binary-lambda.122-gls | gf2_122-gls-lambda | per-element | 0.78 ns | 0.77 ns .. 0.78 ns | per elem |
| is identity | binary-u.122-gls | gf2_122-gls-u | per-element | 0.78 ns | 0.77 ns .. 0.78 ns | per elem |
| is identity | binary-w.122-gls | gf2_122-gls-w | per-element | 0.78 ns | 0.77 ns .. 0.78 ns | per elem |
| is identity | binary-lambda.122 | gf2_122-lambda | per-element | 0.77 ns | 0.77 ns .. 0.78 ns | per elem |
| is identity | binary-u.122 | gf2_122-u | per-element | 0.77 ns | 0.77 ns .. 0.78 ns | per elem |
| is identity | binary-w.122 | gf2_122-w | per-element | 0.77 ns | 0.77 ns .. 0.78 ns | per elem |
| is identity | binary.127 | gf2_127 | per-element | 0.81 ns | 0.81 ns .. 0.81 ns | per elem |
| is identity | binary-lambda.127 | gf2_127-lambda | per-element | 0.84 ns | 0.84 ns .. 0.84 ns | per elem |
| is identity | binary-u.127 | gf2_127-u | per-element | 0.84 ns | 0.84 ns .. 0.84 ns | per elem |
| is identity | binary-w.127 | gf2_127-w | per-element | 0.84 ns | 0.84 ns .. 0.84 ns | per elem |
| is identity | edwards.107 | edwards107 | per-element | 0.75 ns | 0.74 ns .. 0.75 ns | per elem |
| is identity | edwards.127 | edwards127 | per-element | 0.38 ns | 0.38 ns .. 0.38 ns | per elem |
| is identity | edwards.61x2 | edwards61x2 | per-element | 0.38 ns | 0.38 ns .. 0.38 ns | per elem |
| is identity | twisted.goldilocks2 | twisted-goldilocks2 | per-element | 0.52 ns | 0.52 ns .. 0.53 ns | per elem |
| is identity | twisted.128 | twisted128 | per-element | 0.34 ns | 0.34 ns .. 0.35 ns | per elem |
| is identity | twisted.61x2 | twisted61x2 | per-element | 0.34 ns | 0.34 ns .. 0.35 ns | per elem |
| is identity | twisted.64x2 | twisted64x2 | per-element | 0.34 ns | 0.34 ns .. 0.35 ns | per elem |
| is identity | weier.107 | weier107 | per-element | 0.84 ns | 0.84 ns .. 0.84 ns | per elem |
| is identity | weier-jacobian.107 | weier107-jacobian | per-element | 0.84 ns | 0.84 ns .. 0.84 ns | per elem |
| is identity | weier.127 | weier127 | per-element | 0.34 ns | 0.34 ns .. 0.34 ns | per elem |
| is identity | weier-jacobian.127 | weier127-jacobian | per-element | 0.34 ns | 0.34 ns .. 0.34 ns | per elem |
| is identity | weier.61x2 | weier61x2 | per-element | 0.52 ns | 0.52 ns .. 0.53 ns | per elem |
| is identity | weier-jacobian.61x2 | weier61x2-jacobian | per-element | 0.52 ns | 0.52 ns .. 0.53 ns | per elem |
| equals addend | binary.109/mode=match | gf2_109 | match | 2.24 ns | 2.23 ns .. 2.26 ns | per elem |
| equals addend | binary.109/mode=mismatch | gf2_109 | mismatch | 2.28 ns | 2.28 ns .. 2.29 ns | per elem |
| equals addend | binary-lambda.109/mode=match | gf2_109-lambda | match | 1.60 ns | 1.60 ns .. 1.61 ns | per elem |
| equals addend | binary-lambda.109/mode=mismatch | gf2_109-lambda | mismatch | 1.60 ns | 1.60 ns .. 1.60 ns | per elem |
| equals addend | binary-u.109/mode=match | gf2_109-u | match | 3.46 ns | 3.46 ns .. 3.47 ns | per elem |
| equals addend | binary-u.109/mode=mismatch | gf2_109-u | mismatch | 3.50 ns | 3.48 ns .. 3.53 ns | per elem |
| equals addend | binary-w.109/mode=match | gf2_109-w | match | 1.82 ns | 1.81 ns .. 1.82 ns | per elem |
| equals addend | binary-w.109/mode=mismatch | gf2_109-w | mismatch | 1.82 ns | 1.82 ns .. 1.82 ns | per elem |
| equals addend | binary.122/mode=mismatch | gf2_122 | mismatch | 3.75 ns | 3.73 ns .. 3.76 ns | per elem |
| equals addend | binary.122-gls/mode=mismatch | gf2_122-gls | mismatch | 3.79 ns | 3.78 ns .. 3.79 ns | per elem |
| equals addend | binary-lambda.122-gls/mode=match | gf2_122-gls-lambda | match | 3.79 ns | 3.78 ns .. 3.80 ns | per elem |
| equals addend | binary-lambda.122-gls/mode=mismatch | gf2_122-gls-lambda | mismatch | 3.79 ns | 3.79 ns .. 3.80 ns | per elem |
| equals addend | binary-u.122-gls/mode=match | gf2_122-gls-u | match | 5.32 ns | 5.30 ns .. 5.33 ns | per elem |
| equals addend | binary-u.122-gls/mode=mismatch | gf2_122-gls-u | mismatch | 5.31 ns | 5.30 ns .. 5.32 ns | per elem |
| equals addend | binary-w.122-gls/mode=match | gf2_122-gls-w | match | 3.79 ns | 3.78 ns .. 3.80 ns | per elem |
| equals addend | binary-w.122-gls/mode=mismatch | gf2_122-gls-w | mismatch | 3.79 ns | 3.78 ns .. 3.79 ns | per elem |
| equals addend | binary-lambda.122/mode=match | gf2_122-lambda | match | 3.78 ns | 3.77 ns .. 3.79 ns | per elem |
| equals addend | binary-lambda.122/mode=mismatch | gf2_122-lambda | mismatch | 3.79 ns | 3.79 ns .. 3.80 ns | per elem |
| equals addend | binary-u.122/mode=match | gf2_122-u | match | 5.31 ns | 5.30 ns .. 5.32 ns | per elem |
| equals addend | binary-u.122/mode=mismatch | gf2_122-u | mismatch | 5.34 ns | 5.32 ns .. 5.36 ns | per elem |
| equals addend | binary-w.122/mode=match | gf2_122-w | match | 3.77 ns | 3.77 ns .. 3.78 ns | per elem |
| equals addend | binary-w.122/mode=mismatch | gf2_122-w | mismatch | 3.79 ns | 3.78 ns .. 3.79 ns | per elem |
| equals addend | binary.127/mode=match | gf2_127 | match | 2.98 ns | 2.97 ns .. 2.99 ns | per elem |
| equals addend | binary.127/mode=mismatch | gf2_127 | mismatch | 2.87 ns | 2.87 ns .. 2.88 ns | per elem |
| equals addend | binary-lambda.127/mode=match | gf2_127-lambda | match | 3.84 ns | 3.83 ns .. 3.85 ns | per elem |
| equals addend | binary-lambda.127/mode=mismatch | gf2_127-lambda | mismatch | 3.81 ns | 3.79 ns .. 3.82 ns | per elem |
| equals addend | binary-u.127/mode=match | gf2_127-u | match | 4.67 ns | 4.66 ns .. 4.68 ns | per elem |
| equals addend | binary-u.127/mode=mismatch | gf2_127-u | mismatch | 4.68 ns | 4.68 ns .. 4.69 ns | per elem |
| equals addend | binary-w.127/mode=match | gf2_127-w | match | 3.86 ns | 3.84 ns .. 3.89 ns | per elem |
| equals addend | binary-w.127/mode=mismatch | gf2_127-w | mismatch | 3.84 ns | 3.83 ns .. 3.84 ns | per elem |
| equals addend | edwards.107/mode=mismatch | edwards107 | mismatch | 3.05 ns | 3.04 ns .. 3.06 ns | per elem |
| equals addend | edwards.127/mode=mismatch | edwards127 | mismatch | 1.97 ns | 1.97 ns .. 1.98 ns | per elem |
| equals addend | edwards.61x2/mode=mismatch | edwards61x2 | mismatch | 1.65 ns | 1.64 ns .. 1.66 ns | per elem |
| equals addend | twisted.goldilocks2/mode=mismatch | twisted-goldilocks2 | mismatch | 4.92 ns | 4.89 ns .. 4.95 ns | per elem |
| equals addend | twisted.128/mode=mismatch | twisted128 | mismatch | 7.51 ns | 7.49 ns .. 7.53 ns | per elem |
| equals addend | twisted.61x2/mode=match | twisted61x2 | match | 3.32 ns | 3.31 ns .. 3.33 ns | per elem |
| equals addend | twisted.61x2/mode=mismatch | twisted61x2 | mismatch | 3.32 ns | 3.31 ns .. 3.32 ns | per elem |
| equals addend | twisted.64x2/mode=mismatch | twisted64x2 | mismatch | 5.39 ns | 5.37 ns .. 5.40 ns | per elem |
| equals addend | weier.107/mode=mismatch | weier107 | mismatch | 3.63 ns | 3.62 ns .. 3.64 ns | per elem |
| equals addend | weier-jacobian.107/mode=mismatch | weier107-jacobian | mismatch | 5.96 ns | 5.95 ns .. 5.98 ns | per elem |
| equals addend | weier.127/mode=mismatch | weier127 | mismatch | 2.05 ns | 2.04 ns .. 2.06 ns | per elem |
| equals addend | weier-jacobian.127/mode=mismatch | weier127-jacobian | mismatch | 4.53 ns | 4.52 ns .. 4.54 ns | per elem |
| equals addend | weier.61x2/mode=mismatch | weier61x2 | mismatch | 1.70 ns | 1.69 ns .. 1.71 ns | per elem |
| equals addend | weier-jacobian.61x2/mode=mismatch | weier61x2-jacobian | mismatch | 3.59 ns | 3.57 ns .. 3.62 ns | per elem |
| encode | binary.109/mode=batch,n=1024 | gf2_109 | batch | 10.9 ns | 10.9 ns .. 11.0 ns | per elem |
| encode | binary.109/mode=batch,n=64 | gf2_109 | batch | 20.3 ns | 20.3 ns .. 20.4 ns | per elem |
| encode | binary.109/mode=batch,n=8 | gf2_109 | batch | 76.6 ns | 76.4 ns .. 76.8 ns | per elem |
| encode | binary.109/mode=indep | gf2_109 | per-element | 381 ns | 381 ns .. 382 ns | per elem |
| encode | binary-lambda.109/mode=batch,n=1024 | gf2_109-lambda | batch | 8.13 ns | 8.12 ns .. 8.15 ns | per elem |
| encode | binary-lambda.109/mode=batch,n=64 | gf2_109-lambda | batch | 17.5 ns | 17.4 ns .. 17.5 ns | per elem |
| encode | binary-lambda.109/mode=batch,n=8 | gf2_109-lambda | batch | 73.3 ns | 73.1 ns .. 73.5 ns | per elem |
| encode | binary-lambda.109/mode=indep | gf2_109-lambda | per-element | 366 ns | 364 ns .. 368 ns | per elem |
| encode | binary-u.109/mode=batch,n=1024 | gf2_109-u | batch | 9.88 ns | 9.84 ns .. 9.92 ns | per elem |
| encode | binary-u.109/mode=batch,n=64 | gf2_109-u | batch | 19.1 ns | 19.0 ns .. 19.1 ns | per elem |
| encode | binary-u.109/mode=batch,n=8 | gf2_109-u | batch | 74.5 ns | 74.3 ns .. 74.8 ns | per elem |
| encode | binary-u.109/mode=indep | gf2_109-u | per-element | 397 ns | 394 ns .. 401 ns | per elem |
| encode | binary-w.109/mode=batch,n=1024 | gf2_109-w | batch | 10.4 ns | 10.3 ns .. 10.4 ns | per elem |
| encode | binary-w.109/mode=batch,n=64 | gf2_109-w | batch | 19.7 ns | 19.7 ns .. 19.7 ns | per elem |
| encode | binary-w.109/mode=batch,n=8 | gf2_109-w | batch | 76.3 ns | 76.1 ns .. 76.5 ns | per elem |
| encode | binary-w.109/mode=indep | gf2_109-w | per-element | 359 ns | 357 ns .. 361 ns | per elem |
| encode | binary.122/mode=batch,n=1024 | gf2_122 | batch | 15.7 ns | 15.6 ns .. 15.7 ns | per elem |
| encode | binary.122/mode=indep | gf2_122 | per-element | 211 ns | 210 ns .. 212 ns | per elem |
| encode | binary.122-gls/mode=batch,n=1024 | gf2_122-gls | batch | 15.2 ns | 15.2 ns .. 15.2 ns | per elem |
| encode | binary.122-gls/mode=indep | gf2_122-gls | per-element | 209 ns | 208 ns .. 209 ns | per elem |
| encode | binary-lambda.122-gls/mode=batch,n=1024 | gf2_122-gls-lambda | batch | 11.6 ns | 11.6 ns .. 11.6 ns | per elem |
| encode | binary-lambda.122-gls/mode=batch,n=64 | gf2_122-gls-lambda | batch | 17.7 ns | 17.7 ns .. 17.7 ns | per elem |
| encode | binary-lambda.122-gls/mode=batch,n=8 | gf2_122-gls-lambda | batch | 53.2 ns | 53.1 ns .. 53.4 ns | per elem |
| encode | binary-lambda.122-gls/mode=indep | gf2_122-gls-lambda | per-element | 189 ns | 189 ns .. 190 ns | per elem |
| encode | binary-u.122-gls/mode=batch,n=1024 | gf2_122-gls-u | batch | 12.3 ns | 12.3 ns .. 12.3 ns | per elem |
| encode | binary-u.122-gls/mode=batch,n=64 | gf2_122-gls-u | batch | 18.1 ns | 18.1 ns .. 18.2 ns | per elem |
| encode | binary-u.122-gls/mode=batch,n=8 | gf2_122-gls-u | batch | 51.2 ns | 51.1 ns .. 51.3 ns | per elem |
| encode | binary-u.122-gls/mode=indep | gf2_122-gls-u | per-element | 195 ns | 195 ns .. 196 ns | per elem |
| encode | binary-w.122-gls/mode=batch,n=1024 | gf2_122-gls-w | batch | 14.4 ns | 14.4 ns .. 14.5 ns | per elem |
| encode | binary-w.122-gls/mode=batch,n=64 | gf2_122-gls-w | batch | 20.6 ns | 20.6 ns .. 20.7 ns | per elem |
| encode | binary-w.122-gls/mode=batch,n=8 | gf2_122-gls-w | batch | 55.5 ns | 55.4 ns .. 55.6 ns | per elem |
| encode | binary-w.122-gls/mode=indep | gf2_122-gls-w | per-element | 204 ns | 204 ns .. 205 ns | per elem |
| encode | binary-lambda.122/mode=batch,n=1024 | gf2_122-lambda | batch | 11.9 ns | 11.9 ns .. 11.9 ns | per elem |
| encode | binary-lambda.122/mode=batch,n=64 | gf2_122-lambda | batch | 17.8 ns | 17.8 ns .. 17.8 ns | per elem |
| encode | binary-lambda.122/mode=batch,n=8 | gf2_122-lambda | batch | 52.8 ns | 52.6 ns .. 52.9 ns | per elem |
| encode | binary-lambda.122/mode=indep | gf2_122-lambda | per-element | 189 ns | 189 ns .. 189 ns | per elem |
| encode | binary-u.122/mode=batch,n=1024 | gf2_122-u | batch | 12.1 ns | 12.0 ns .. 12.1 ns | per elem |
| encode | binary-u.122/mode=batch,n=64 | gf2_122-u | batch | 18.1 ns | 18.0 ns .. 18.1 ns | per elem |
| encode | binary-u.122/mode=batch,n=8 | gf2_122-u | batch | 50.6 ns | 50.5 ns .. 50.7 ns | per elem |
| encode | binary-u.122/mode=indep | gf2_122-u | per-element | 206 ns | 206 ns .. 207 ns | per elem |
| encode | binary-w.122/mode=batch,n=1024 | gf2_122-w | batch | 14.4 ns | 14.4 ns .. 14.5 ns | per elem |
| encode | binary-w.122/mode=batch,n=64 | gf2_122-w | batch | 20.6 ns | 20.6 ns .. 20.6 ns | per elem |
| encode | binary-w.122/mode=batch,n=8 | gf2_122-w | batch | 55.6 ns | 55.4 ns .. 55.7 ns | per elem |
| encode | binary-w.122/mode=indep | gf2_122-w | per-element | 204 ns | 204 ns .. 205 ns | per elem |
| encode | binary.127/mode=batch,n=1024 | gf2_127 | batch | 13.1 ns | 13.0 ns .. 13.2 ns | per elem |
| encode | binary.127/mode=batch,n=64 | gf2_127 | batch | 21.7 ns | 21.7 ns .. 21.8 ns | per elem |
| encode | binary.127/mode=batch,n=8 | gf2_127 | batch | 71.6 ns | 71.4 ns .. 71.8 ns | per elem |
| encode | binary.127/mode=indep | gf2_127 | per-element | 371 ns | 370 ns .. 372 ns | per elem |
| encode | binary-lambda.127/mode=batch,n=1024 | gf2_127-lambda | batch | 10.1 ns | 10.1 ns .. 10.2 ns | per elem |
| encode | binary-lambda.127/mode=batch,n=64 | gf2_127-lambda | batch | 18.4 ns | 18.3 ns .. 18.4 ns | per elem |
| encode | binary-lambda.127/mode=batch,n=8 | gf2_127-lambda | batch | 68.2 ns | 68.0 ns .. 68.3 ns | per elem |
| encode | binary-lambda.127/mode=indep | gf2_127-lambda | per-element | 361 ns | 360 ns .. 362 ns | per elem |
| encode | binary-u.127/mode=batch,n=1024 | gf2_127-u | batch | 9.17 ns | 9.15 ns .. 9.20 ns | per elem |
| encode | binary-u.127/mode=batch,n=64 | gf2_127-u | batch | 17.2 ns | 17.1 ns .. 17.2 ns | per elem |
| encode | binary-u.127/mode=batch,n=8 | gf2_127-u | batch | 65.7 ns | 65.5 ns .. 65.9 ns | per elem |
| encode | binary-u.127/mode=indep | gf2_127-u | per-element | 355 ns | 354 ns .. 355 ns | per elem |
| encode | binary-w.127/mode=batch,n=1024 | gf2_127-w | batch | 10.3 ns | 10.3 ns .. 10.3 ns | per elem |
| encode | binary-w.127/mode=batch,n=64 | gf2_127-w | batch | 18.6 ns | 18.6 ns .. 18.6 ns | per elem |
| encode | binary-w.127/mode=batch,n=8 | gf2_127-w | batch | 67.8 ns | 67.7 ns .. 68.0 ns | per elem |
| encode | binary-w.127/mode=indep | gf2_127-w | per-element | 361 ns | 360 ns .. 361 ns | per elem |
| encode | edwards.107/mode=batch,n=1024 | edwards107 | batch | 20.3 ns | 20.2 ns .. 20.3 ns | per elem |
| encode | edwards.107/mode=indep | edwards107 | per-element | 506 ns | 505 ns .. 507 ns | per elem |
| encode | edwards.127/mode=batch,n=1024 | edwards127 | batch | 22.0 ns | 21.9 ns .. 22.0 ns | per elem |
| encode | edwards.127/mode=indep | edwards127 | per-element | 549 ns | 548 ns .. 551 ns | per elem |
| encode | edwards.61x2/mode=batch,n=1024 | edwards61x2 | batch | 16.2 ns | 16.2 ns .. 16.3 ns | per elem |
| encode | edwards.61x2/mode=indep | edwards61x2 | per-element | 181 ns | 180 ns .. 181 ns | per elem |
| encode | twisted.goldilocks2/mode=batch,n=1024 | twisted-goldilocks2 | batch | 11.3 ns | 11.2 ns .. 11.3 ns | per elem |
| encode | twisted.goldilocks2/mode=indep | twisted-goldilocks2 | per-element | 197 ns | 194 ns .. 201 ns | per elem |
| encode | twisted.128/mode=batch,n=1024 | twisted128 | batch | 16.0 ns | 16.0 ns .. 16.0 ns | per elem |
| encode | twisted.128/mode=indep | twisted128 | per-element | 939 ns | 937 ns .. 941 ns | per elem |
| encode | twisted.61x2/mode=batch,n=1024 | twisted61x2 | batch | 8.07 ns | 8.05 ns .. 8.09 ns | per elem |
| encode | twisted.61x2/mode=batch,n=64 | twisted61x2 | batch | 13.8 ns | 13.8 ns .. 13.9 ns | per elem |
| encode | twisted.61x2/mode=batch,n=8 | twisted61x2 | batch | 45.4 ns | 45.3 ns .. 45.5 ns | per elem |
| encode | twisted.61x2/mode=indep | twisted61x2 | per-element | 179 ns | 178 ns .. 179 ns | per elem |
| encode | twisted.64x2/mode=batch,n=1024 | twisted64x2 | batch | 10.3 ns | 10.3 ns .. 10.4 ns | per elem |
| encode | twisted.64x2/mode=indep | twisted64x2 | per-element | 290 ns | 290 ns .. 291 ns | per elem |
| encode | weier.107/mode=batch,n=1024 | weier107 | batch | 11.5 ns | 11.5 ns .. 11.5 ns | per elem |
| encode | weier.107/mode=indep | weier107 | per-element | 497 ns | 496 ns .. 498 ns | per elem |
| encode | weier-jacobian.107/mode=batch,n=1024 | weier107-jacobian | batch | 15.3 ns | 15.3 ns .. 15.3 ns | per elem |
| encode | weier-jacobian.107/mode=indep | weier107-jacobian | per-element | 502 ns | 501 ns .. 503 ns | per elem |
| encode | weier.127/mode=batch,n=1024 | weier127 | batch | 10.1 ns | 10.1 ns .. 10.1 ns | per elem |
| encode | weier.127/mode=indep | weier127 | per-element | 536 ns | 534 ns .. 537 ns | per elem |
| encode | weier-jacobian.127/mode=batch,n=1024 | weier127-jacobian | batch | 15.7 ns | 15.7 ns .. 15.7 ns | per elem |
| encode | weier-jacobian.127/mode=indep | weier127-jacobian | per-element | 533 ns | 530 ns .. 536 ns | per elem |
| encode | weier.61x2/mode=batch,n=1024 | weier61x2 | batch | 8.11 ns | 8.09 ns .. 8.12 ns | per elem |
| encode | weier.61x2/mode=indep | weier61x2 | per-element | 170 ns | 169 ns .. 170 ns | per elem |
| encode | weier-jacobian.61x2/mode=batch,n=1024 | weier61x2-jacobian | batch | 11.7 ns | 11.7 ns .. 11.7 ns | per elem |
| encode | weier-jacobian.61x2/mode=indep | weier61x2-jacobian | per-element | 179 ns | 179 ns .. 180 ns | per elem |
| decode | binary.109/mode=batch,n=1024 | gf2_109 | batch | 14.2 ns | 14.2 ns .. 14.2 ns | per elem |
| decode | binary.109/mode=batch,n=64 | gf2_109 | batch | 23.5 ns | 23.4 ns .. 23.6 ns | per elem |
| decode | binary.109/mode=batch,n=8 | gf2_109 | batch | 82.3 ns | 82.1 ns .. 82.5 ns | per elem |
| decode | binary.109/mode=indep | gf2_109 | per-element | 380 ns | 379 ns .. 381 ns | per elem |
| decode | binary-lambda.109/mode=batch,n=1024 | gf2_109-lambda | batch | 14.1 ns | 14.1 ns .. 14.2 ns | per elem |
| decode | binary-lambda.109/mode=batch,n=64 | gf2_109-lambda | batch | 23.6 ns | 23.5 ns .. 23.7 ns | per elem |
| decode | binary-lambda.109/mode=batch,n=8 | gf2_109-lambda | batch | 82.3 ns | 82.1 ns .. 82.6 ns | per elem |
| decode | binary-lambda.109/mode=indep | gf2_109-lambda | per-element | 381 ns | 381 ns .. 382 ns | per elem |
| decode | binary-u.109/mode=batch,n=1024 | gf2_109-u | batch | 18.4 ns | 18.4 ns .. 18.4 ns | per elem |
| decode | binary-u.109/mode=batch,n=64 | gf2_109-u | batch | 26.7 ns | 26.6 ns .. 26.9 ns | per elem |
| decode | binary-u.109/mode=batch,n=8 | gf2_109-u | batch | 87.4 ns | 87.2 ns .. 87.6 ns | per elem |
| decode | binary-u.109/mode=indep | gf2_109-u | per-element | 398 ns | 397 ns .. 400 ns | per elem |
| decode | binary-w.109/mode=batch,n=1024 | gf2_109-w | batch | 15.5 ns | 15.4 ns .. 15.5 ns | per elem |
| decode | binary-w.109/mode=batch,n=64 | gf2_109-w | batch | 24.4 ns | 24.4 ns .. 24.5 ns | per elem |
| decode | binary-w.109/mode=batch,n=8 | gf2_109-w | batch | 83.9 ns | 83.7 ns .. 84.1 ns | per elem |
| decode | binary-w.109/mode=indep | gf2_109-w | per-element | 378 ns | 377 ns .. 379 ns | per elem |
| decode | binary.122/mode=batch,n=1024 | gf2_122 | batch | 13.5 ns | 13.5 ns .. 13.5 ns | per elem |
| decode | binary.122/mode=indep | gf2_122 | per-element | 197 ns | 196 ns .. 197 ns | per elem |
| decode | binary.122-gls/mode=batch,n=1024 | gf2_122-gls | batch | 13.2 ns | 13.2 ns .. 13.2 ns | per elem |
| decode | binary.122-gls/mode=indep | gf2_122-gls | per-element | 195 ns | 194 ns .. 195 ns | per elem |
| decode | binary-lambda.122-gls/mode=batch,n=1024 | gf2_122-gls-lambda | batch | 13.2 ns | 13.2 ns .. 13.2 ns | per elem |
| decode | binary-lambda.122-gls/mode=batch,n=64 | gf2_122-gls-lambda | batch | 19.4 ns | 19.4 ns .. 19.5 ns | per elem |
| decode | binary-lambda.122-gls/mode=batch,n=8 | gf2_122-gls-lambda | batch | 57.7 ns | 57.6 ns .. 57.9 ns | per elem |
| decode | binary-lambda.122-gls/mode=indep | gf2_122-gls-lambda | per-element | 187 ns | 187 ns .. 188 ns | per elem |
| decode | binary-u.122-gls/mode=batch,n=1024 | gf2_122-gls-u | batch | 16.8 ns | 16.8 ns .. 16.8 ns | per elem |
| decode | binary-u.122-gls/mode=batch,n=64 | gf2_122-gls-u | batch | 22.6 ns | 22.5 ns .. 22.6 ns | per elem |
| decode | binary-u.122-gls/mode=batch,n=8 | gf2_122-gls-u | batch | 62.1 ns | 61.9 ns .. 62.4 ns | per elem |
| decode | binary-u.122-gls/mode=indep | gf2_122-gls-u | per-element | 207 ns | 206 ns .. 207 ns | per elem |
| decode | binary-w.122-gls/mode=batch,n=1024 | gf2_122-gls-w | batch | 14.3 ns | 14.3 ns .. 14.3 ns | per elem |
| decode | binary-w.122-gls/mode=batch,n=64 | gf2_122-gls-w | batch | 20.1 ns | 20.0 ns .. 20.1 ns | per elem |
| decode | binary-w.122-gls/mode=batch,n=8 | gf2_122-gls-w | batch | 58.4 ns | 58.3 ns .. 58.5 ns | per elem |
| decode | binary-w.122-gls/mode=indep | gf2_122-gls-w | per-element | 191 ns | 191 ns .. 191 ns | per elem |
| decode | binary-lambda.122/mode=batch,n=1024 | gf2_122-lambda | batch | 13.5 ns | 13.5 ns .. 13.5 ns | per elem |
| decode | binary-lambda.122/mode=batch,n=64 | gf2_122-lambda | batch | 19.8 ns | 19.8 ns .. 19.8 ns | per elem |
| decode | binary-lambda.122/mode=batch,n=8 | gf2_122-lambda | batch | 57.4 ns | 57.1 ns .. 57.6 ns | per elem |
| decode | binary-lambda.122/mode=indep | gf2_122-lambda | per-element | 196 ns | 195 ns .. 196 ns | per elem |
| decode | binary-u.122/mode=batch,n=1024 | gf2_122-u | batch | 18.7 ns | 18.7 ns .. 18.8 ns | per elem |
| decode | binary-u.122/mode=batch,n=64 | gf2_122-u | batch | 25.2 ns | 25.2 ns .. 25.3 ns | per elem |
| decode | binary-u.122/mode=batch,n=8 | gf2_122-u | batch | 65.6 ns | 65.4 ns .. 65.8 ns | per elem |
| decode | binary-u.122/mode=indep | gf2_122-u | per-element | 223 ns | 222 ns .. 223 ns | per elem |
| decode | binary-w.122/mode=batch,n=1024 | gf2_122-w | batch | 14.4 ns | 14.4 ns .. 14.5 ns | per elem |
| decode | binary-w.122/mode=batch,n=64 | gf2_122-w | batch | 20.6 ns | 20.6 ns .. 20.7 ns | per elem |
| decode | binary-w.122/mode=batch,n=8 | gf2_122-w | batch | 59.0 ns | 58.9 ns .. 59.2 ns | per elem |
| decode | binary-w.122/mode=indep | gf2_122-w | per-element | 193 ns | 192 ns .. 193 ns | per elem |
| decode | binary.127/mode=batch,n=1024 | gf2_127 | batch | 14.0 ns | 14.0 ns .. 14.0 ns | per elem |
| decode | binary.127/mode=batch,n=64 | gf2_127 | batch | 22.1 ns | 22.1 ns .. 22.1 ns | per elem |
| decode | binary.127/mode=batch,n=8 | gf2_127 | batch | 76.4 ns | 76.3 ns .. 76.6 ns | per elem |
| decode | binary.127/mode=indep | gf2_127 | per-element | 367 ns | 366 ns .. 368 ns | per elem |
| decode | binary-lambda.127/mode=batch,n=1024 | gf2_127-lambda | batch | 14.0 ns | 14.0 ns .. 14.0 ns | per elem |
| decode | binary-lambda.127/mode=batch,n=64 | gf2_127-lambda | batch | 22.1 ns | 22.1 ns .. 22.1 ns | per elem |
| decode | binary-lambda.127/mode=batch,n=8 | gf2_127-lambda | batch | 76.3 ns | 76.1 ns .. 76.6 ns | per elem |
| decode | binary-lambda.127/mode=indep | gf2_127-lambda | per-element | 364 ns | 364 ns .. 365 ns | per elem |
| decode | binary-u.127/mode=batch,n=1024 | gf2_127-u | batch | 18.3 ns | 18.3 ns .. 18.4 ns | per elem |
| decode | binary-u.127/mode=batch,n=64 | gf2_127-u | batch | 26.9 ns | 26.9 ns .. 27.0 ns | per elem |
| decode | binary-u.127/mode=batch,n=8 | gf2_127-u | batch | 82.4 ns | 82.1 ns .. 82.6 ns | per elem |
| decode | binary-u.127/mode=indep | gf2_127-u | per-element | 376 ns | 375 ns .. 377 ns | per elem |
| decode | binary-w.127/mode=batch,n=1024 | gf2_127-w | batch | 15.1 ns | 15.1 ns .. 15.1 ns | per elem |
| decode | binary-w.127/mode=batch,n=64 | gf2_127-w | batch | 23.0 ns | 22.9 ns .. 23.0 ns | per elem |
| decode | binary-w.127/mode=batch,n=8 | gf2_127-w | batch | 78.2 ns | 78.0 ns .. 78.4 ns | per elem |
| decode | binary-w.127/mode=indep | gf2_127-w | per-element | 361 ns | 361 ns .. 362 ns | per elem |
| decode | edwards.107/mode=batch,n=1024 | edwards107 | batch | 354 ns | 353 ns .. 355 ns | per elem |
| decode | edwards.107/mode=indep | edwards107 | per-element | 359 ns | 359 ns .. 360 ns | per elem |
| decode | edwards.127/mode=batch,n=1024 | edwards127 | batch | 486 ns | 484 ns .. 488 ns | per elem |
| decode | edwards.127/mode=indep | edwards127 | per-element | 489 ns | 488 ns .. 490 ns | per elem |
| decode | edwards.61x2/mode=batch,n=1024 | edwards61x2 | batch | 404 ns | 403 ns .. 405 ns | per elem |
| decode | edwards.61x2/mode=indep | edwards61x2 | per-element | 405 ns | 404 ns .. 406 ns | per elem |
| decode | twisted.goldilocks2/mode=batch,n=1024 | twisted-goldilocks2 | batch | 1.52 µs | 1.51 µs .. 1.52 µs | per elem |
| decode | twisted.goldilocks2/mode=indep | twisted-goldilocks2 | per-element | 1.53 µs | 1.53 µs .. 1.54 µs | per elem |
| decode | twisted.128/mode=batch,n=1024 | twisted128 | batch | 952 ns | 948 ns .. 956 ns | per elem |
| decode | twisted.128/mode=indep | twisted128 | per-element | 949 ns | 946 ns .. 953 ns | per elem |
| decode | twisted.61x2/mode=batch,n=1024 | twisted61x2 | batch | 420 ns | 419 ns .. 421 ns | per elem |
| decode | twisted.61x2/mode=batch,n=64 | twisted61x2 | batch | 418 ns | 418 ns .. 419 ns | per elem |
| decode | twisted.61x2/mode=batch,n=8 | twisted61x2 | batch | 423 ns | 421 ns .. 424 ns | per elem |
| decode | twisted.61x2/mode=indep | twisted61x2 | per-element | 425 ns | 425 ns .. 426 ns | per elem |
| decode | twisted.64x2/mode=batch,n=1024 | twisted64x2 | batch | 718 ns | 717 ns .. 720 ns | per elem |
| decode | twisted.64x2/mode=indep | twisted64x2 | per-element | 721 ns | 719 ns .. 722 ns | per elem |
| decode | weier.107/mode=batch,n=1024 | weier107 | batch | 352 ns | 351 ns .. 353 ns | per elem |
| decode | weier.107/mode=indep | weier107 | per-element | 358 ns | 357 ns .. 358 ns | per elem |
| decode | weier-jacobian.107/mode=batch,n=1024 | weier107-jacobian | batch | 352 ns | 351 ns .. 352 ns | per elem |
| decode | weier-jacobian.107/mode=indep | weier107-jacobian | per-element | 351 ns | 350 ns .. 352 ns | per elem |
| decode | weier.127/mode=batch,n=1024 | weier127 | batch | 485 ns | 483 ns .. 487 ns | per elem |
| decode | weier.127/mode=indep | weier127 | per-element | 489 ns | 487 ns .. 490 ns | per elem |
| decode | weier-jacobian.127/mode=batch,n=1024 | weier127-jacobian | batch | 485 ns | 484 ns .. 487 ns | per elem |
| decode | weier-jacobian.127/mode=indep | weier127-jacobian | per-element | 492 ns | 490 ns .. 493 ns | per elem |
| decode | weier.61x2/mode=batch,n=1024 | weier61x2 | batch | 412 ns | 411 ns .. 413 ns | per elem |
| decode | weier.61x2/mode=indep | weier61x2 | per-element | 416 ns | 416 ns .. 417 ns | per elem |
| decode | weier-jacobian.61x2/mode=batch,n=1024 | weier61x2-jacobian | batch | 413 ns | 412 ns .. 414 ns | per elem |
| decode | weier-jacobian.61x2/mode=indep | weier61x2-jacobian | per-element | 417 ns | 415 ns .. 418 ns | per elem |
| normalize | gf2_109/normalize, batched | gf2_109 | batch | 9.75 ns | 9.74 ns .. 9.76 ns | per elem |
| normalize | gf2_122/normalize, batched | gf2_122 | batch | 14.2 ns | 14.2 ns .. 14.2 ns | per elem |
| normalize | gf2_122-gls/normalize, batched | gf2_122-gls | batch | 13.2 ns | 13.2 ns .. 13.3 ns | per elem |
| batch sum | gf2_109/batch affine (tree sum) | gf2_109 | batch | 14.9 ns | 14.9 ns .. 14.9 ns | per elem |
| batch sum | gf2_122/batch affine (tree sum) | gf2_122 | batch | 15.8 ns | 15.8 ns .. 15.8 ns | per elem |
| batch sum | gf2_127/batch affine (tree sum) | gf2_127 | batch | 16.0 ns | 16.0 ns .. 16.1 ns | per elem |
| batch sum | edwards107/batch montgomery affine (tree sum) | edwards107 | batch | 24.5 ns | 24.5 ns .. 24.5 ns | per elem |
| batch sum | edwards127/batch montgomery affine (tree sum) | edwards127 | batch | 30.3 ns | 30.2 ns .. 30.3 ns | per elem |
| batch sum | weier107/batch affine (tree sum) | weier107 | batch | 23.1 ns | 23.1 ns .. 23.1 ns | per elem |
| batch sum | weier127/batch affine (tree sum) | weier127 | batch | 28.6 ns | 28.5 ns .. 28.6 ns | per elem |
| batch sum | secp256k1/combine_keys (jacobian += affine) | secp256k1 | batch | 88.8 ns | 88.3 ns .. 89.3 ns | per elem |
hash to curve
Figure
242 benchmarks
| operation | benchmark | family | mode | time | 95% CI | unit |
|---|---|---|---|---|---|---|
| hash to curve | sha256 (XOR baseline) | xor | per-element | 24.2 ns | 23.9 ns .. 24.6 ns | per elem |
| hash to curve | binary.109/mode=batch,n=1024 | gf2_109 | batch | 81.7 ns | 81.4 ns .. 81.9 ns | per elem |
| hash to curve | binary.109/mode=batch,n=64 | gf2_109 | batch | 139 ns | 139 ns .. 139 ns | per elem |
| hash to curve | binary.109/mode=batch,n=8 | gf2_109 | batch | 360 ns | 359 ns .. 361 ns | per elem |
| hash to curve | binary.109/mode=indep | gf2_109 | per-element | 870 ns | 869 ns .. 871 ns | per elem |
| hash to curve | binary-lambda.109/mode=batch,n=1024 | gf2_109-lambda | batch | 82.0 ns | 81.9 ns .. 82.1 ns | per elem |
| hash to curve | binary-lambda.109/mode=batch,n=64 | gf2_109-lambda | batch | 139 ns | 138 ns .. 139 ns | per elem |
| hash to curve | binary-lambda.109/mode=batch,n=8 | gf2_109-lambda | batch | 360 ns | 359 ns .. 361 ns | per elem |
| hash to curve | binary-lambda.109/mode=indep | gf2_109-lambda | per-element | 873 ns | 871 ns .. 875 ns | per elem |
| hash to curve | binary-u.109/mode=batch,n=1024 | gf2_109-u | batch | 81.2 ns | 81.1 ns .. 81.4 ns | per elem |
| hash to curve | binary-u.109/mode=batch,n=64 | gf2_109-u | batch | 135 ns | 135 ns .. 135 ns | per elem |
| hash to curve | binary-u.109/mode=batch,n=8 | gf2_109-u | batch | 349 ns | 349 ns .. 350 ns | per elem |
| hash to curve | binary-u.109/mode=indep | gf2_109-u | per-element | 874 ns | 872 ns .. 875 ns | per elem |
| hash to curve | binary-w.109/mode=batch,n=1024 | gf2_109-w | batch | 79.4 ns | 79.3 ns .. 79.5 ns | per elem |
| hash to curve | binary-w.109/mode=batch,n=64 | gf2_109-w | batch | 131 ns | 131 ns .. 132 ns | per elem |
| hash to curve | binary-w.109/mode=batch,n=8 | gf2_109-w | batch | 346 ns | 345 ns .. 347 ns | per elem |
| hash to curve | binary-w.109/mode=indep | gf2_109-w | per-element | 855 ns | 854 ns .. 857 ns | per elem |
| hash to curve | binary.122/mode=batch,n=1024 | gf2_122 | batch | 74.9 ns | 74.8 ns .. 75.1 ns | per elem |
| hash to curve | binary.122/mode=indep | gf2_122 | per-element | 510 ns | 508 ns .. 511 ns | per elem |
| hash to curve | binary.122-gls/mode=batch,n=1024 | gf2_122-gls | batch | 74.7 ns | 74.5 ns .. 74.9 ns | per elem |
| hash to curve | binary.122-gls/mode=indep | gf2_122-gls | per-element | 535 ns | 534 ns .. 537 ns | per elem |
| hash to curve | binary-lambda.122-gls/mode=batch,n=1024 | gf2_122-gls-lambda | batch | 76.5 ns | 76.3 ns .. 76.6 ns | per elem |
| hash to curve | binary-lambda.122-gls/mode=batch,n=64 | gf2_122-gls-lambda | batch | 114 ns | 114 ns .. 114 ns | per elem |
| hash to curve | binary-lambda.122-gls/mode=batch,n=8 | gf2_122-gls-lambda | batch | 265 ns | 265 ns .. 266 ns | per elem |
| hash to curve | binary-lambda.122-gls/mode=indep | gf2_122-gls-lambda | per-element | 515 ns | 513 ns .. 517 ns | per elem |
| hash to curve | binary-u.122-gls/mode=batch,n=1024 | gf2_122-gls-u | batch | 80.2 ns | 80.1 ns .. 80.3 ns | per elem |
| hash to curve | binary-u.122-gls/mode=batch,n=64 | gf2_122-gls-u | batch | 117 ns | 116 ns .. 117 ns | per elem |
| hash to curve | binary-u.122-gls/mode=batch,n=8 | gf2_122-gls-u | batch | 258 ns | 257 ns .. 259 ns | per elem |
| hash to curve | binary-u.122-gls/mode=indep | gf2_122-gls-u | per-element | 522 ns | 521 ns .. 524 ns | per elem |
| hash to curve | binary-w.122-gls/mode=batch,n=1024 | gf2_122-gls-w | batch | 78.6 ns | 78.5 ns .. 78.8 ns | per elem |
| hash to curve | binary-w.122-gls/mode=batch,n=64 | gf2_122-gls-w | batch | 115 ns | 115 ns .. 115 ns | per elem |
| hash to curve | binary-w.122-gls/mode=batch,n=8 | gf2_122-gls-w | batch | 256 ns | 255 ns .. 256 ns | per elem |
| hash to curve | binary-w.122-gls/mode=indep | gf2_122-gls-w | per-element | 509 ns | 507 ns .. 511 ns | per elem |
| hash to curve | binary-lambda.122/mode=batch,n=1024 | gf2_122-lambda | batch | 74.9 ns | 74.8 ns .. 75.1 ns | per elem |
| hash to curve | binary-lambda.122/mode=batch,n=64 | gf2_122-lambda | batch | 110 ns | 110 ns .. 110 ns | per elem |
| hash to curve | binary-lambda.122/mode=batch,n=8 | gf2_122-lambda | batch | 249 ns | 248 ns .. 249 ns | per elem |
| hash to curve | binary-lambda.122/mode=indep | gf2_122-lambda | per-element | 509 ns | 507 ns .. 510 ns | per elem |
| hash to curve | binary-u.122/mode=batch,n=1024 | gf2_122-u | batch | 87.6 ns | 87.5 ns .. 87.7 ns | per elem |
| hash to curve | binary-u.122/mode=batch,n=64 | gf2_122-u | batch | 125 ns | 125 ns .. 126 ns | per elem |
| hash to curve | binary-u.122/mode=batch,n=8 | gf2_122-u | batch | 268 ns | 267 ns .. 268 ns | per elem |
| hash to curve | binary-u.122/mode=indep | gf2_122-u | per-element | 531 ns | 530 ns .. 532 ns | per elem |
| hash to curve | binary-w.122/mode=batch,n=1024 | gf2_122-w | batch | 76.8 ns | 76.6 ns .. 76.9 ns | per elem |
| hash to curve | binary-w.122/mode=batch,n=64 | gf2_122-w | batch | 114 ns | 113 ns .. 114 ns | per elem |
| hash to curve | binary-w.122/mode=batch,n=8 | gf2_122-w | batch | 257 ns | 257 ns .. 258 ns | per elem |
| hash to curve | binary-w.122/mode=indep | gf2_122-w | per-element | 517 ns | 516 ns .. 518 ns | per elem |
| hash to curve | binary.127/mode=batch,n=1024 | gf2_127 | batch | 72.9 ns | 72.9 ns .. 73.0 ns | per elem |
| hash to curve | binary.127/mode=batch,n=64 | gf2_127 | batch | 127 ns | 127 ns .. 127 ns | per elem |
| hash to curve | binary.127/mode=batch,n=8 | gf2_127 | batch | 322 ns | 320 ns .. 325 ns | per elem |
| hash to curve | binary.127/mode=indep | gf2_127 | per-element | 779 ns | 778 ns .. 781 ns | per elem |
| hash to curve | binary-lambda.127/mode=batch,n=1024 | gf2_127-lambda | batch | 75.6 ns | 75.5 ns .. 75.7 ns | per elem |
| hash to curve | binary-lambda.127/mode=batch,n=64 | gf2_127-lambda | batch | 127 ns | 126 ns .. 127 ns | per elem |
| hash to curve | binary-lambda.127/mode=batch,n=8 | gf2_127-lambda | batch | 318 ns | 317 ns .. 319 ns | per elem |
| hash to curve | binary-lambda.127/mode=indep | gf2_127-lambda | per-element | 806 ns | 804 ns .. 808 ns | per elem |
| hash to curve | binary-u.127/mode=batch,n=1024 | gf2_127-u | batch | 85.8 ns | 85.5 ns .. 86.1 ns | per elem |
| hash to curve | binary-u.127/mode=batch,n=64 | gf2_127-u | batch | 142 ns | 141 ns .. 142 ns | per elem |
| hash to curve | binary-u.127/mode=batch,n=8 | gf2_127-u | batch | 351 ns | 350 ns .. 352 ns | per elem |
| hash to curve | binary-u.127/mode=indep | gf2_127-u | per-element | 869 ns | 865 ns .. 874 ns | per elem |
| hash to curve | binary-w.127/mode=batch,n=1024 | gf2_127-w | batch | 83.3 ns | 83.2 ns .. 83.4 ns | per elem |
| hash to curve | binary-w.127/mode=batch,n=64 | gf2_127-w | batch | 138 ns | 138 ns .. 139 ns | per elem |
| hash to curve | binary-w.127/mode=batch,n=8 | gf2_127-w | batch | 346 ns | 345 ns .. 347 ns | per elem |
| hash to curve | binary-w.127/mode=indep | gf2_127-w | per-element | 865 ns | 863 ns .. 866 ns | per elem |
| hash to curve | edwards.107/mode=batch,n=1024 | edwards107 | batch | 805 ns | 801 ns .. 810 ns | per elem |
| hash to curve | edwards.107/mode=indep | edwards107 | per-element | 806 ns | 802 ns .. 809 ns | per elem |
| hash to curve | edwards107/edwards-native try-and-increment | edwards107 | per-element | 1.07 µs | 1.07 µs .. 1.07 µs | per elem |
| hash to curve | edwards.127/mode=batch,n=1024 | edwards127 | batch | 1.07 µs | 1.07 µs .. 1.07 µs | per elem |
| hash to curve | edwards.127/mode=indep | edwards127 | per-element | 1.07 µs | 1.06 µs .. 1.07 µs | per elem |
| hash to curve | edwards127/edwards-native try-and-increment | edwards127 | per-element | 1.10 µs | 1.10 µs .. 1.10 µs | per elem |
| hash to curve | edwards.61x2/mode=batch,n=1024 | edwards61x2 | batch | 620 ns | 617 ns .. 623 ns | per elem |
| hash to curve | edwards.61x2/mode=indep | edwards61x2 | per-element | 624 ns | 622 ns .. 626 ns | per elem |
| hash to curve | twisted.goldilocks2/mode=batch,n=1024 | twisted-goldilocks2 | batch | 1.75 µs | 1.74 µs .. 1.76 µs | per elem |
| hash to curve | twisted.goldilocks2/mode=indep | twisted-goldilocks2 | per-element | 1.73 µs | 1.72 µs .. 1.74 µs | per elem |
| hash to curve | twisted.128/mode=batch,n=1024 | twisted128 | batch | 1.92 µs | 1.92 µs .. 1.93 µs | per elem |
| hash to curve | twisted.128/mode=indep | twisted128 | per-element | 1.92 µs | 1.92 µs .. 1.93 µs | per elem |
| hash to curve | twisted.61x2/mode=batch,n=1024 | twisted61x2 | batch | 632 ns | 630 ns .. 634 ns | per elem |
| hash to curve | twisted.61x2/mode=batch,n=64 | twisted61x2 | batch | 641 ns | 639 ns .. 643 ns | per elem |
| hash to curve | twisted.61x2/mode=batch,n=8 | twisted61x2 | batch | 646 ns | 645 ns .. 648 ns | per elem |
| hash to curve | twisted.61x2/mode=indep | twisted61x2 | per-element | 630 ns | 629 ns .. 631 ns | per elem |
| hash to curve | twisted.64x2/mode=batch,n=1024 | twisted64x2 | batch | 1.10 µs | 1.10 µs .. 1.10 µs | per elem |
| hash to curve | twisted.64x2/mode=indep | twisted64x2 | per-element | 1.10 µs | 1.10 µs .. 1.10 µs | per elem |
| hash to curve | weier.107/mode=batch,n=1024 | weier107 | batch | 748 ns | 747 ns .. 750 ns | per elem |
| hash to curve | weier.107/mode=indep | weier107 | per-element | 746 ns | 744 ns .. 747 ns | per elem |
| hash to curve | weier-jacobian.107/mode=batch,n=1024 | weier107-jacobian | batch | 745 ns | 743 ns .. 748 ns | per elem |
| hash to curve | weier-jacobian.107/mode=indep | weier107-jacobian | per-element | 742 ns | 741 ns .. 744 ns | per elem |
| hash to curve | weier.127/mode=batch,n=1024 | weier127 | batch | 1.04 µs | 1.03 µs .. 1.04 µs | per elem |
| hash to curve | weier.127/mode=indep | weier127 | per-element | 1.03 µs | 1.02 µs .. 1.03 µs | per elem |
| hash to curve | weier-jacobian.127/mode=batch,n=1024 | weier127-jacobian | batch | 1.04 µs | 1.04 µs .. 1.04 µs | per elem |
| hash to curve | weier-jacobian.127/mode=indep | weier127-jacobian | per-element | 1.03 µs | 1.03 µs .. 1.03 µs | per elem |
| hash to curve | weier.61x2/mode=batch,n=1024 | weier61x2 | batch | 637 ns | 635 ns .. 638 ns | per elem |
| hash to curve | weier.61x2/mode=indep | weier61x2 | per-element | 637 ns | 635 ns .. 639 ns | per elem |
| hash to curve | weier-jacobian.61x2/mode=batch,n=1024 | weier61x2-jacobian | batch | 638 ns | 636 ns .. 639 ns | per elem |
| hash to curve | weier-jacobian.61x2/mode=indep | weier61x2-jacobian | per-element | 638 ns | 637 ns .. 640 ns | per elem |
| hash to curve | ristretto255/hash_from_bytes<Sha512> | ristretto255 | per-element | 4.72 µs | 4.70 µs .. 4.73 µs | per elem |
| hash to curve | secp256k1/ellswift decode | secp256k1 | per-element | 4.97 µs | 4.96 µs .. 4.98 µs | per elem |
| hash to curve | secp256k1/try-and-increment (parse) | secp256k1 | per-element | 4.49 µs | 4.48 µs .. 4.49 µs | per elem |
| ID to addend | binary.109/proj=fp127,h2c=pornin,mode=batch,n=1024 | gf2_109 | batch | 43.5 ns | 43.3 ns .. 43.6 ns | per elem |
| ID to addend | binary.109/proj=fp127,h2c=ti,mode=batch,n=1024 | gf2_109 | batch | 47.0 ns | 46.9 ns .. 47.1 ns | per elem |
| ID to addend | binary.109/proj=fp130,h2c=pornin,mode=batch,n=1024 | gf2_109 | batch | 48.1 ns | 48.0 ns .. 48.2 ns | per elem |
| ID to addend | binary.109/proj=fp130,h2c=ti,mode=batch,n=1024 | gf2_109 | batch | 59.3 ns | 59.2 ns .. 59.5 ns | per elem |
| ID to addend | binary.109/proj=gf2_127,h2c=pornin,mode=batch,n=1024 | gf2_109 | batch | 41.7 ns | 41.7 ns .. 41.8 ns | per elem |
| ID to addend | binary.109/proj=gf2_127,h2c=ti,mode=batch,n=1024 | gf2_109 | batch | 43.9 ns | 43.7 ns .. 44.1 ns | per elem |
| ID to addend | binary.109/proj=none,h2c=pornin,mode=batch,n=1024 | gf2_109 | batch | 64.2 ns | 64.1 ns .. 64.3 ns | per elem |
| ID to addend | binary.109/proj=none,h2c=ti,mode=batch,n=1024 | gf2_109 | batch | 74.8 ns | 74.7 ns .. 74.9 ns | per elem |
| ID to addend | binary-lambda.109/proj=fp127,h2c=pornin-addend,mode=batch,n=1024 | gf2_109-lambda | batch | 36.4 ns | 36.3 ns .. 36.4 ns | per elem |
| ID to addend | binary-lambda.109/proj=fp127,h2c=ti,mode=batch,n=1024 | gf2_109-lambda | batch | 49.9 ns | 49.7 ns .. 50.0 ns | per elem |
| ID to addend | binary-lambda.109/proj=fp127,h2c=ti-addend,mode=batch,n=1024 | gf2_109-lambda | batch | 45.1 ns | 45.0 ns .. 45.2 ns | per elem |
| ID to addend | binary-lambda.109/proj=fp130,h2c=pornin-addend,mode=batch,n=1024 | gf2_109-lambda | batch | 40.8 ns | 40.7 ns .. 40.8 ns | per elem |
| ID to addend | binary-lambda.109/proj=fp130,h2c=ti,mode=batch,n=1024 | gf2_109-lambda | batch | 62.1 ns | 61.9 ns .. 62.2 ns | per elem |
| ID to addend | binary-lambda.109/proj=fp130,h2c=ti-addend,mode=batch,n=1024 | gf2_109-lambda | batch | 57.3 ns | 57.2 ns .. 57.4 ns | per elem |
| ID to addend | binary-lambda.109/proj=gf2_127,h2c=pornin-addend,mode=batch,n=1024 | gf2_109-lambda | batch | 34.2 ns | 34.1 ns .. 34.2 ns | per elem |
| ID to addend | binary-lambda.109/proj=gf2_127,h2c=ti,mode=batch,n=1024 | gf2_109-lambda | batch | 47.5 ns | 47.4 ns .. 47.6 ns | per elem |
| ID to addend | binary-lambda.109/proj=gf2_127,h2c=ti-addend,mode=batch,n=1024 | gf2_109-lambda | batch | 42.8 ns | 42.7 ns .. 43.0 ns | per elem |
| ID to addend | binary-lambda.109/proj=none,h2c=pornin-addend,mode=batch,n=1024 | gf2_109-lambda | batch | 57.7 ns | 57.6 ns .. 57.8 ns | per elem |
| ID to addend | binary-lambda.109/proj=none,h2c=ti,mode=batch,n=1024 | gf2_109-lambda | batch | 77.8 ns | 77.5 ns .. 78.1 ns | per elem |
| ID to addend | binary-lambda.109/proj=none,h2c=ti-addend,mode=batch,n=1024 | gf2_109-lambda | batch | 72.6 ns | 72.4 ns .. 72.7 ns | per elem |
| ID to addend | binary-u.109/proj=fp127,h2c=pornin-addend,mode=batch,n=1024 | gf2_109-u | batch | 40.3 ns | 40.2 ns .. 40.3 ns | per elem |
| ID to addend | binary-u.109/proj=fp127,h2c=ti,mode=batch,n=1024 | gf2_109-u | batch | 50.6 ns | 50.4 ns .. 50.7 ns | per elem |
| ID to addend | binary-u.109/proj=fp130,h2c=pornin-addend,mode=batch,n=1024 | gf2_109-u | batch | 44.7 ns | 44.6 ns .. 44.8 ns | per elem |
| ID to addend | binary-u.109/proj=fp130,h2c=ti,mode=batch,n=1024 | gf2_109-u | batch | 60.4 ns | 60.3 ns .. 60.5 ns | per elem |
| ID to addend | binary-u.109/proj=gf2_127,h2c=pornin-addend,mode=batch,n=1024 | gf2_109-u | batch | 38.1 ns | 38.0 ns .. 38.1 ns | per elem |
| ID to addend | binary-u.109/proj=gf2_127,h2c=ti,mode=batch,n=1024 | gf2_109-u | batch | 48.3 ns | 48.2 ns .. 48.4 ns | per elem |
| ID to addend | binary-u.109/proj=none,h2c=pornin-addend,mode=batch,n=1024 | gf2_109-u | batch | 61.6 ns | 61.5 ns .. 61.7 ns | per elem |
| ID to addend | binary-u.109/proj=none,h2c=ti,mode=batch,n=1024 | gf2_109-u | batch | 78.1 ns | 78.0 ns .. 78.3 ns | per elem |
| ID to addend | binary-w.109/proj=fp127,h2c=pornin-addend,mode=batch,n=1024 | gf2_109-w | batch | 36.4 ns | 36.3 ns .. 36.4 ns | per elem |
| ID to addend | binary-w.109/proj=fp127,h2c=ti,mode=batch,n=1024 | gf2_109-w | batch | 47.2 ns | 47.1 ns .. 47.3 ns | per elem |
| ID to addend | binary-w.109/proj=fp130,h2c=pornin-addend,mode=batch,n=1024 | gf2_109-w | batch | 40.6 ns | 40.5 ns .. 40.7 ns | per elem |
| ID to addend | binary-w.109/proj=fp130,h2c=ti,mode=batch,n=1024 | gf2_109-w | batch | 56.5 ns | 56.4 ns .. 56.7 ns | per elem |
| ID to addend | binary-w.109/proj=gf2_127,h2c=pornin-addend,mode=batch,n=1024 | gf2_109-w | batch | 34.2 ns | 34.2 ns .. 34.3 ns | per elem |
| ID to addend | binary-w.109/proj=gf2_127,h2c=ti,mode=batch,n=1024 | gf2_109-w | batch | 44.9 ns | 44.8 ns .. 45.0 ns | per elem |
| ID to addend | binary-w.109/proj=none,h2c=pornin-addend,mode=batch,n=1024 | gf2_109-w | batch | 57.6 ns | 57.5 ns .. 57.7 ns | per elem |
| ID to addend | binary-w.109/proj=none,h2c=ti,mode=batch,n=1024 | gf2_109-w | batch | 75.8 ns | 75.6 ns .. 75.9 ns | per elem |
| ID to addend | binary-lambda.122-gls/proj=fp127,h2c=pornin-addend,mode=batch,n=1024 | gf2_122-gls-lambda | batch | 37.9 ns | 37.9 ns .. 38.0 ns | per elem |
| ID to addend | binary-lambda.122-gls/proj=fp127,h2c=ti,mode=batch,n=1024 | gf2_122-gls-lambda | batch | 50.6 ns | 50.5 ns .. 50.7 ns | per elem |
| ID to addend | binary-lambda.122-gls/proj=fp127,h2c=ti-addend,mode=batch,n=1024 | gf2_122-gls-lambda | batch | 43.6 ns | 43.5 ns .. 43.7 ns | per elem |
| ID to addend | binary-lambda.122-gls/proj=fp130,h2c=pornin-addend,mode=batch,n=1024 | gf2_122-gls-lambda | batch | 42.3 ns | 42.1 ns .. 42.5 ns | per elem |
| ID to addend | binary-lambda.122-gls/proj=fp130,h2c=ti,mode=batch,n=1024 | gf2_122-gls-lambda | batch | 61.0 ns | 60.8 ns .. 61.2 ns | per elem |
| ID to addend | binary-lambda.122-gls/proj=fp130,h2c=ti-addend,mode=batch,n=1024 | gf2_122-gls-lambda | batch | 53.8 ns | 53.5 ns .. 54.1 ns | per elem |
| ID to addend | binary-lambda.122-gls/proj=gf2_127,h2c=pornin-addend,mode=batch,n=1024 | gf2_122-gls-lambda | batch | 35.0 ns | 34.9 ns .. 35.1 ns | per elem |
| ID to addend | binary-lambda.122-gls/proj=gf2_127,h2c=ti,mode=batch,n=1024 | gf2_122-gls-lambda | batch | 45.9 ns | 45.8 ns .. 46.0 ns | per elem |
| ID to addend | binary-lambda.122-gls/proj=gf2_127,h2c=ti-addend,mode=batch,n=1024 | gf2_122-gls-lambda | batch | 38.2 ns | 38.0 ns .. 38.2 ns | per elem |
| ID to addend | binary-lambda.122-gls/proj=none,h2c=pornin-addend,mode=batch,n=1024 | gf2_122-gls-lambda | batch | 58.8 ns | 58.7 ns .. 59.0 ns | per elem |
| ID to addend | binary-lambda.122-gls/proj=none,h2c=ti,mode=batch,n=1024 | gf2_122-gls-lambda | batch | 73.6 ns | 73.4 ns .. 73.8 ns | per elem |
| ID to addend | binary-lambda.122-gls/proj=none,h2c=ti-addend,mode=batch,n=1024 | gf2_122-gls-lambda | batch | 66.4 ns | 66.2 ns .. 66.6 ns | per elem |
| ID to addend | binary-u.122-gls/proj=fp127,h2c=pornin-addend,mode=batch,n=1024 | gf2_122-gls-u | batch | 38.6 ns | 38.3 ns .. 38.9 ns | per elem |
| ID to addend | binary-u.122-gls/proj=fp127,h2c=ti,mode=batch,n=1024 | gf2_122-gls-u | batch | 46.7 ns | 46.7 ns .. 46.8 ns | per elem |
| ID to addend | binary-u.122-gls/proj=fp130,h2c=pornin-addend,mode=batch,n=1024 | gf2_122-gls-u | batch | 42.2 ns | 42.1 ns .. 42.3 ns | per elem |
| ID to addend | binary-u.122-gls/proj=fp130,h2c=ti,mode=batch,n=1024 | gf2_122-gls-u | batch | 57.1 ns | 57.0 ns .. 57.2 ns | per elem |
| ID to addend | binary-u.122-gls/proj=gf2_127,h2c=pornin-addend,mode=batch,n=1024 | gf2_122-gls-u | batch | 36.1 ns | 35.9 ns .. 36.4 ns | per elem |
| ID to addend | binary-u.122-gls/proj=gf2_127,h2c=ti,mode=batch,n=1024 | gf2_122-gls-u | batch | 44.4 ns | 44.3 ns .. 44.5 ns | per elem |
| ID to addend | binary-u.122-gls/proj=none,h2c=pornin-addend,mode=batch,n=1024 | gf2_122-gls-u | batch | 60.2 ns | 60.1 ns .. 60.4 ns | per elem |
| ID to addend | binary-u.122-gls/proj=none,h2c=ti,mode=batch,n=1024 | gf2_122-gls-u | batch | 71.9 ns | 71.8 ns .. 72.1 ns | per elem |
| ID to addend | binary-w.122-gls/proj=fp127,h2c=pornin-addend,mode=batch,n=1024 | gf2_122-gls-w | batch | 38.0 ns | 37.9 ns .. 38.1 ns | per elem |
| ID to addend | binary-w.122-gls/proj=fp127,h2c=ti,mode=batch,n=1024 | gf2_122-gls-w | batch | 44.5 ns | 44.3 ns .. 44.6 ns | per elem |
| ID to addend | binary-w.122-gls/proj=fp130,h2c=pornin-addend,mode=batch,n=1024 | gf2_122-gls-w | batch | 42.4 ns | 42.3 ns .. 42.5 ns | per elem |
| ID to addend | binary-w.122-gls/proj=fp130,h2c=ti,mode=batch,n=1024 | gf2_122-gls-w | batch | 54.5 ns | 54.4 ns .. 54.6 ns | per elem |
| ID to addend | binary-w.122-gls/proj=gf2_127,h2c=pornin-addend,mode=batch,n=1024 | gf2_122-gls-w | batch | 34.9 ns | 34.8 ns .. 34.9 ns | per elem |
| ID to addend | binary-w.122-gls/proj=gf2_127,h2c=ti,mode=batch,n=1024 | gf2_122-gls-w | batch | 40.9 ns | 40.8 ns .. 41.0 ns | per elem |
| ID to addend | binary-w.122-gls/proj=none,h2c=pornin-addend,mode=batch,n=1024 | gf2_122-gls-w | batch | 59.3 ns | 59.1 ns .. 59.5 ns | per elem |
| ID to addend | binary-w.122-gls/proj=none,h2c=ti,mode=batch,n=1024 | gf2_122-gls-w | batch | 72.6 ns | 72.5 ns .. 72.8 ns | per elem |
| ID to addend | binary-lambda.122/proj=fp127,h2c=pornin-addend,mode=batch,n=1024 | gf2_122-lambda | batch | 36.0 ns | 35.9 ns .. 36.1 ns | per elem |
| ID to addend | binary-lambda.122/proj=fp127,h2c=ti,mode=batch,n=1024 | gf2_122-lambda | batch | 53.2 ns | 53.0 ns .. 53.4 ns | per elem |
| ID to addend | binary-lambda.122/proj=fp127,h2c=ti-addend,mode=batch,n=1024 | gf2_122-lambda | batch | 45.6 ns | 45.5 ns .. 45.7 ns | per elem |
| ID to addend | binary-lambda.122/proj=fp130,h2c=pornin-addend,mode=batch,n=1024 | gf2_122-lambda | batch | 40.8 ns | 40.7 ns .. 40.9 ns | per elem |
| ID to addend | binary-lambda.122/proj=fp130,h2c=ti,mode=batch,n=1024 | gf2_122-lambda | batch | 61.8 ns | 61.5 ns .. 62.1 ns | per elem |
| ID to addend | binary-lambda.122/proj=fp130,h2c=ti-addend,mode=batch,n=1024 | gf2_122-lambda | batch | 53.4 ns | 53.2 ns .. 53.7 ns | per elem |
| ID to addend | binary-lambda.122/proj=gf2_127,h2c=pornin-addend,mode=batch,n=1024 | gf2_122-lambda | batch | 33.6 ns | 33.5 ns .. 33.7 ns | per elem |
| ID to addend | binary-lambda.122/proj=gf2_127,h2c=ti,mode=batch,n=1024 | gf2_122-lambda | batch | 45.6 ns | 45.5 ns .. 45.7 ns | per elem |
| ID to addend | binary-lambda.122/proj=gf2_127,h2c=ti-addend,mode=batch,n=1024 | gf2_122-lambda | batch | 37.8 ns | 37.7 ns .. 37.8 ns | per elem |
| ID to addend | binary-lambda.122/proj=none,h2c=pornin-addend,mode=batch,n=1024 | gf2_122-lambda | batch | 59.3 ns | 58.9 ns .. 59.8 ns | per elem |
| ID to addend | binary-lambda.122/proj=none,h2c=ti,mode=batch,n=1024 | gf2_122-lambda | batch | 77.1 ns | 77.0 ns .. 77.2 ns | per elem |
| ID to addend | binary-lambda.122/proj=none,h2c=ti-addend,mode=batch,n=1024 | gf2_122-lambda | batch | 69.6 ns | 69.4 ns .. 69.7 ns | per elem |
| ID to addend | binary-u.122/proj=fp127,h2c=pornin-addend,mode=batch,n=1024 | gf2_122-u | batch | 41.2 ns | 41.1 ns .. 41.3 ns | per elem |
| ID to addend | binary-u.122/proj=fp127,h2c=ti,mode=batch,n=1024 | gf2_122-u | batch | 55.2 ns | 55.0 ns .. 55.3 ns | per elem |
| ID to addend | binary-u.122/proj=fp130,h2c=pornin-addend,mode=batch,n=1024 | gf2_122-u | batch | 45.2 ns | 45.1 ns .. 45.3 ns | per elem |
| ID to addend | binary-u.122/proj=fp130,h2c=ti,mode=batch,n=1024 | gf2_122-u | batch | 64.8 ns | 64.7 ns .. 65.0 ns | per elem |
| ID to addend | binary-u.122/proj=gf2_127,h2c=pornin-addend,mode=batch,n=1024 | gf2_122-u | batch | 38.8 ns | 38.7 ns .. 38.8 ns | per elem |
| ID to addend | binary-u.122/proj=gf2_127,h2c=ti,mode=batch,n=1024 | gf2_122-u | batch | 51.6 ns | 51.5 ns .. 51.7 ns | per elem |
| ID to addend | binary-u.122/proj=none,h2c=pornin-addend,mode=batch,n=1024 | gf2_122-u | batch | 63.2 ns | 63.1 ns .. 63.3 ns | per elem |
| ID to addend | binary-u.122/proj=none,h2c=ti,mode=batch,n=1024 | gf2_122-u | batch | 82.4 ns | 82.2 ns .. 82.5 ns | per elem |
| ID to addend | binary-w.122/proj=fp127,h2c=pornin-addend,mode=batch,n=1024 | gf2_122-w | batch | 36.0 ns | 35.9 ns .. 36.1 ns | per elem |
| ID to addend | binary-w.122/proj=fp127,h2c=ti,mode=batch,n=1024 | gf2_122-w | batch | 45.3 ns | 45.3 ns .. 45.4 ns | per elem |
| ID to addend | binary-w.122/proj=fp130,h2c=pornin-addend,mode=batch,n=1024 | gf2_122-w | batch | 40.6 ns | 40.5 ns .. 40.7 ns | per elem |
| ID to addend | binary-w.122/proj=fp130,h2c=ti,mode=batch,n=1024 | gf2_122-w | batch | 54.5 ns | 54.4 ns .. 54.6 ns | per elem |
| ID to addend | binary-w.122/proj=gf2_127,h2c=pornin-addend,mode=batch,n=1024 | gf2_122-w | batch | 33.2 ns | 33.0 ns .. 33.4 ns | per elem |
| ID to addend | binary-w.122/proj=gf2_127,h2c=ti,mode=batch,n=1024 | gf2_122-w | batch | 41.3 ns | 41.2 ns .. 41.3 ns | per elem |
| ID to addend | binary-w.122/proj=none,h2c=pornin-addend,mode=batch,n=1024 | gf2_122-w | batch | 58.6 ns | 58.5 ns .. 58.7 ns | per elem |
| ID to addend | binary-w.122/proj=none,h2c=ti,mode=batch,n=1024 | gf2_122-w | batch | 71.5 ns | 71.4 ns .. 71.6 ns | per elem |
| ID to addend | binary.127/proj=fp127,h2c=pornin,mode=batch,n=1024 | gf2_127 | batch | 41.7 ns | 41.6 ns .. 41.8 ns | per elem |
| ID to addend | binary.127/proj=fp127,h2c=ti,mode=batch,n=1024 | gf2_127 | batch | 49.5 ns | 49.3 ns .. 49.6 ns | per elem |
| ID to addend | binary.127/proj=fp130,h2c=pornin,mode=batch,n=1024 | gf2_127 | batch | 45.9 ns | 45.8 ns .. 46.0 ns | per elem |
| ID to addend | binary.127/proj=fp130,h2c=ti,mode=batch,n=1024 | gf2_127 | batch | 59.6 ns | 59.5 ns .. 59.8 ns | per elem |
| ID to addend | binary.127/proj=gf2_127,h2c=pornin,mode=batch,n=1024 | gf2_127 | batch | 39.1 ns | 39.0 ns .. 39.2 ns | per elem |
| ID to addend | binary.127/proj=gf2_127,h2c=ti,mode=batch,n=1024 | gf2_127 | batch | 43.0 ns | 42.8 ns .. 43.1 ns | per elem |
| ID to addend | binary.127/proj=none,h2c=pornin,mode=batch,n=1024 | gf2_127 | batch | 62.6 ns | 62.5 ns .. 62.8 ns | per elem |
| ID to addend | binary.127/proj=none,h2c=ti,mode=batch,n=1024 | gf2_127 | batch | 71.3 ns | 71.2 ns .. 71.4 ns | per elem |
| ID to addend | binary-lambda.127/proj=fp127,h2c=pornin-addend,mode=batch,n=1024 | gf2_127-lambda | batch | 36.5 ns | 36.4 ns .. 36.6 ns | per elem |
| ID to addend | binary-lambda.127/proj=fp127,h2c=ti,mode=batch,n=1024 | gf2_127-lambda | batch | 52.4 ns | 52.3 ns .. 52.5 ns | per elem |
| ID to addend | binary-lambda.127/proj=fp127,h2c=ti-addend,mode=batch,n=1024 | gf2_127-lambda | batch | 45.4 ns | 45.3 ns .. 45.5 ns | per elem |
| ID to addend | binary-lambda.127/proj=fp130,h2c=pornin-addend,mode=batch,n=1024 | gf2_127-lambda | batch | 40.9 ns | 40.8 ns .. 41.1 ns | per elem |
| ID to addend | binary-lambda.127/proj=fp130,h2c=ti,mode=batch,n=1024 | gf2_127-lambda | batch | 62.7 ns | 62.6 ns .. 62.9 ns | per elem |
| ID to addend | binary-lambda.127/proj=fp130,h2c=ti-addend,mode=batch,n=1024 | gf2_127-lambda | batch | 55.8 ns | 55.6 ns .. 55.9 ns | per elem |
| ID to addend | binary-lambda.127/proj=gf2_127,h2c=pornin-addend,mode=batch,n=1024 | gf2_127-lambda | batch | 34.1 ns | 33.9 ns .. 34.2 ns | per elem |
| ID to addend | binary-lambda.127/proj=gf2_127,h2c=ti,mode=batch,n=1024 | gf2_127-lambda | batch | 46.1 ns | 46.0 ns .. 46.2 ns | per elem |
| ID to addend | binary-lambda.127/proj=gf2_127,h2c=ti-addend,mode=batch,n=1024 | gf2_127-lambda | batch | 39.4 ns | 39.3 ns .. 39.5 ns | per elem |
| ID to addend | binary-lambda.127/proj=none,h2c=pornin-addend,mode=batch,n=1024 | gf2_127-lambda | batch | 58.4 ns | 58.2 ns .. 58.6 ns | per elem |
| ID to addend | binary-lambda.127/proj=none,h2c=ti,mode=batch,n=1024 | gf2_127-lambda | batch | 74.5 ns | 74.4 ns .. 74.6 ns | per elem |
| ID to addend | binary-lambda.127/proj=none,h2c=ti-addend,mode=batch,n=1024 | gf2_127-lambda | batch | 67.6 ns | 67.4 ns .. 67.7 ns | per elem |
| ID to addend | binary-u.127/proj=fp127,h2c=pornin-addend,mode=batch,n=1024 | gf2_127-u | batch | 39.6 ns | 39.5 ns .. 39.7 ns | per elem |
| ID to addend | binary-u.127/proj=fp127,h2c=ti,mode=batch,n=1024 | gf2_127-u | batch | 48.8 ns | 48.7 ns .. 48.9 ns | per elem |
| ID to addend | binary-u.127/proj=fp130,h2c=pornin-addend,mode=batch,n=1024 | gf2_127-u | batch | 43.8 ns | 43.7 ns .. 43.8 ns | per elem |
| ID to addend | binary-u.127/proj=fp130,h2c=ti,mode=batch,n=1024 | gf2_127-u | batch | 61.1 ns | 61.0 ns .. 61.2 ns | per elem |
| ID to addend | binary-u.127/proj=gf2_127,h2c=pornin-addend,mode=batch,n=1024 | gf2_127-u | batch | 37.2 ns | 37.1 ns .. 37.3 ns | per elem |
| ID to addend | binary-u.127/proj=gf2_127,h2c=ti,mode=batch,n=1024 | gf2_127-u | batch | 44.4 ns | 44.3 ns .. 44.5 ns | per elem |
| ID to addend | binary-u.127/proj=none,h2c=pornin-addend,mode=batch,n=1024 | gf2_127-u | batch | 61.4 ns | 61.3 ns .. 61.6 ns | per elem |
| ID to addend | binary-u.127/proj=none,h2c=ti,mode=batch,n=1024 | gf2_127-u | batch | 75.7 ns | 75.5 ns .. 75.8 ns | per elem |
| ID to addend | binary-w.127/proj=fp127,h2c=pornin-addend,mode=batch,n=1024 | gf2_127-w | batch | 36.3 ns | 36.2 ns .. 36.4 ns | per elem |
| ID to addend | binary-w.127/proj=fp127,h2c=ti,mode=batch,n=1024 | gf2_127-w | batch | 45.4 ns | 45.3 ns .. 45.5 ns | per elem |
| ID to addend | binary-w.127/proj=fp130,h2c=pornin-addend,mode=batch,n=1024 | gf2_127-w | batch | 40.8 ns | 40.7 ns .. 40.9 ns | per elem |
| ID to addend | binary-w.127/proj=fp130,h2c=ti,mode=batch,n=1024 | gf2_127-w | batch | 57.0 ns | 56.9 ns .. 57.2 ns | per elem |
| ID to addend | binary-w.127/proj=gf2_127,h2c=pornin-addend,mode=batch,n=1024 | gf2_127-w | batch | 34.2 ns | 34.0 ns .. 34.3 ns | per elem |
| ID to addend | binary-w.127/proj=gf2_127,h2c=ti,mode=batch,n=1024 | gf2_127-w | batch | 40.9 ns | 40.8 ns .. 41.0 ns | per elem |
| ID to addend | binary-w.127/proj=none,h2c=pornin-addend,mode=batch,n=1024 | gf2_127-w | batch | 58.5 ns | 58.4 ns .. 58.7 ns | per elem |
| ID to addend | binary-w.127/proj=none,h2c=ti,mode=batch,n=1024 | gf2_127-w | batch | 72.7 ns | 72.6 ns .. 72.9 ns | per elem |
| ID to addend | twisted.61x2/proj=fp127,h2c=elligator2,mode=batch,n=1024 | twisted61x2 | batch | 881 ns | 879 ns .. 884 ns | per elem |
| ID to addend | twisted.61x2/proj=fp127,h2c=ti,mode=batch,n=1024 | twisted61x2 | batch | 604 ns | 602 ns .. 605 ns | per elem |
| ID to addend | twisted.61x2/proj=fp130,h2c=elligator2,mode=batch,n=1024 | twisted61x2 | batch | 882 ns | 879 ns .. 884 ns | per elem |
| ID to addend | twisted.61x2/proj=fp130,h2c=ti,mode=batch,n=1024 | twisted61x2 | batch | 612 ns | 610 ns .. 613 ns | per elem |
| ID to addend | twisted.61x2/proj=gf2_127,h2c=elligator2,mode=batch,n=1024 | twisted61x2 | batch | 871 ns | 870 ns .. 873 ns | per elem |
| ID to addend | twisted.61x2/proj=gf2_127,h2c=ti,mode=batch,n=1024 | twisted61x2 | batch | 594 ns | 592 ns .. 595 ns | per elem |
| ID to addend | twisted.61x2/proj=none,h2c=elligator2,mode=batch,n=1024 | twisted61x2 | batch | 916 ns | 914 ns .. 917 ns | per elem |
| ID to addend | twisted.61x2/proj=none,h2c=ti,mode=batch,n=1024 | twisted61x2 | batch | 629 ns | 627 ns .. 630 ns | per elem |
| hash to addend | gf2_109-lambda/try-and-increment to (x, λ) | gf2_109-lambda | per-element | 938 ns | 937 ns .. 939 ns | per elem |
| hash to addend | gf2_109-lambda/try-and-increment to (x, λ), batched | gf2_109-lambda | batch | 77.6 ns | 77.5 ns .. 77.6 ns | per elem |
| hash to addend | gf2_122-gls-lambda/try-and-increment to (x, λ) | gf2_122-gls-lambda | per-element | 504 ns | 503 ns .. 505 ns | per elem |
| hash to addend | gf2_122-gls-lambda/try-and-increment to (x, λ), batched | gf2_122-gls-lambda | batch | 73.8 ns | 73.8 ns .. 73.9 ns | per elem |
| hash to addend | gf2_122-lambda/try-and-increment to (x, λ) | gf2_122-lambda | per-element | 520 ns | 519 ns .. 520 ns | per elem |
| hash to addend | gf2_122-lambda/try-and-increment to (x, λ), batched | gf2_122-lambda | batch | 72.3 ns | 72.3 ns .. 72.3 ns | per elem |
| hash to addend | gf2_127-lambda/try-and-increment to (x, λ) | gf2_127-lambda | per-element | 761 ns | 759 ns .. 762 ns | per elem |
| hash to addend | gf2_127-lambda/try-and-increment to (x, λ), batched | gf2_127-lambda | batch | 72.8 ns | 72.8 ns .. 72.9 ns | per elem |
| steps: digest | digest/sha512 (ristretto input) | ristretto255 | per-element | 60.9 ns | 60.7 ns .. 61.1 ns | per elem |
| steps: ristretto255 | ristretto255/from_uniform_bytes (2 maps + add) | ristretto255 | per-element | 4.78 µs | 4.76 µs .. 4.79 µs | per elem |
| x on curve | ristretto255/decompress (valid, inv sqrt) | ristretto255 | per-element | 2.32 µs | 2.31 µs .. 2.32 µs | per elem |
| x on curve | secp256k1/x: parse compressed (sqrt) | secp256k1 | per-element | 2.25 µs | 2.24 µs .. 2.25 µs | per elem |
comparison maps
Maps from digests to points other than try-and-increment, timed beside it: Pornin’s map on binary curves, Elligator 2 on Edwards curves and simplified SWU on Weierstrass curves, once, and Pornin’s map twice with the points summed; and Pornin’s map taken straight to the unscaled or -affine addend, where it stands for a hash and a prepare together, as try-and-increment to does. One map reaches at most points of , not uniformly. The checksum needs relations to be hard to find among hash outputs within the subset of the group that the hash reaches, not outputs uniform on the group (docs/problem.md, Adversary). Insertion estimates include each measured map with compatible preparation and addition; Pornin already returns an extended binary addend.
Figure
43 benchmarks
| operation | benchmark | family | mode | time | 95% CI | unit |
|---|---|---|---|---|---|---|
| one map to addend | gf2_109-lambda/pornin map x1 to (x, λ) | gf2_109-lambda | per-element | 550 ns | 548 ns .. 553 ns | per elem |
| one map to addend | gf2_109-lambda/pornin map x1 to (x, λ), batched | gf2_109-lambda | batch | 55.2 ns | 55.0 ns .. 55.5 ns | per elem |
| one map to addend | gf2_109-u/pornin map x1 to (u, v) | gf2_109-u | per-element | 533 ns | 532 ns .. 533 ns | per elem |
| one map to addend | gf2_109-u/pornin map x1 to (u, v), batched | gf2_109-u | batch | 60.7 ns | 60.3 ns .. 61.0 ns | per elem |
| one map to addend | gf2_109-w/pornin map x1 to (x, λ) | gf2_109-w | per-element | 535 ns | 534 ns .. 535 ns | per elem |
| one map to addend | gf2_109-w/pornin map x1 to (x, λ), batched | gf2_109-w | batch | 54.5 ns | 54.5 ns .. 54.5 ns | per elem |
| one map to addend | gf2_122-gls-lambda/pornin map x1 to (x, λ) | gf2_122-gls-lambda | per-element | 315 ns | 314 ns .. 316 ns | per elem |
| one map to addend | gf2_122-gls-lambda/pornin map x1 to (x, λ), batched | gf2_122-gls-lambda | batch | 55.4 ns | 55.4 ns .. 55.5 ns | per elem |
| one map to addend | gf2_122-gls-u/pornin map x1 to (u, v) | gf2_122-gls-u | per-element | 319 ns | 318 ns .. 320 ns | per elem |
| one map to addend | gf2_122-gls-u/pornin map x1 to (u, v), batched | gf2_122-gls-u | batch | 55.7 ns | 55.7 ns .. 55.8 ns | per elem |
| one map to addend | gf2_122-gls-w/pornin map x1 to (x, λ) | gf2_122-gls-w | per-element | 316 ns | 315 ns .. 317 ns | per elem |
| one map to addend | gf2_122-gls-w/pornin map x1 to (x, λ), batched | gf2_122-gls-w | batch | 55.4 ns | 55.4 ns .. 55.4 ns | per elem |
| one map to addend | gf2_122-lambda/pornin map x1 to (x, λ) | gf2_122-lambda | per-element | 326 ns | 326 ns .. 327 ns | per elem |
| one map to addend | gf2_122-lambda/pornin map x1 to (x, λ), batched | gf2_122-lambda | batch | 53.9 ns | 53.9 ns .. 54.0 ns | per elem |
| one map to addend | gf2_122-u/pornin map x1 to (u, v) | gf2_122-u | per-element | 326 ns | 325 ns .. 326 ns | per elem |
| one map to addend | gf2_122-u/pornin map x1 to (u, v), batched | gf2_122-u | batch | 57.1 ns | 57.0 ns .. 57.1 ns | per elem |
| one map to addend | gf2_122-w/pornin map x1 to (x, λ) | gf2_122-w | per-element | 326 ns | 326 ns .. 327 ns | per elem |
| one map to addend | gf2_122-w/pornin map x1 to (x, λ), batched | gf2_122-w | batch | 54.0 ns | 53.9 ns .. 54.0 ns | per elem |
| one map to addend | gf2_127-lambda/pornin map x1 to (x, λ) | gf2_127-lambda | per-element | 456 ns | 455 ns .. 457 ns | per elem |
| one map to addend | gf2_127-lambda/pornin map x1 to (x, λ), batched | gf2_127-lambda | batch | 53.5 ns | 53.4 ns .. 53.6 ns | per elem |
| one map to addend | gf2_127-u/pornin map x1 to (u, v) | gf2_127-u | per-element | 461 ns | 460 ns .. 462 ns | per elem |
| one map to addend | gf2_127-u/pornin map x1 to (u, v), batched | gf2_127-u | batch | 57.2 ns | 57.2 ns .. 57.3 ns | per elem |
| one map to addend | gf2_127-w/pornin map x1 to (x, λ) | gf2_127-w | per-element | 455 ns | 454 ns .. 456 ns | per elem |
| one map to addend | gf2_127-w/pornin map x1 to (x, λ), batched | gf2_127-w | batch | 53.5 ns | 53.4 ns .. 53.6 ns | per elem |
| one map | gf2_109/pornin map x1 | gf2_109 | per-element | 560 ns | 559 ns .. 561 ns | per elem |
| one map | gf2_109/pornin map x1, batched | gf2_109 | batch | 63.7 ns | 63.7 ns .. 63.8 ns | per elem |
| one map | gf2_122/pornin map x1 | gf2_122 | per-element | 373 ns | 373 ns .. 373 ns | per elem |
| one map | gf2_122/pornin map x1, batched | gf2_122 | batch | 62.8 ns | 62.8 ns .. 62.8 ns | per elem |
| one map | gf2_122-gls/pornin map x1 | gf2_122-gls | per-element | 369 ns | 367 ns .. 370 ns | per elem |
| one map | gf2_122-gls/pornin map x1, batched | gf2_122-gls | batch | 62.0 ns | 61.9 ns .. 62.0 ns | per elem |
| one map | gf2_127/pornin map x1 | gf2_127 | per-element | 485 ns | 485 ns .. 486 ns | per elem |
| one map | gf2_127/pornin map x1, batched | gf2_127 | batch | 61.5 ns | 61.4 ns .. 61.5 ns | per elem |
| one map | edwards107/elligator2 x1 | edwards107 | per-element | 1.07 µs | 1.06 µs .. 1.07 µs | per elem |
| one map | edwards127/elligator2 x1 | edwards127 | per-element | 1.29 µs | 1.28 µs .. 1.29 µs | per elem |
| one map | edwards61x2/elligator2 x1 | edwards61x2 | per-element | 734 ns | 734 ns .. 735 ns | per elem |
| one map | twisted-goldilocks2/elligator2 x1 | twisted-goldilocks2 | per-element | 2.16 µs | 2.16 µs .. 2.17 µs | per elem |
| one map | twisted128/elligator2 x1 | twisted128 | per-element | 3.32 µs | 3.32 µs .. 3.33 µs | per elem |
| one map | twisted61x2/elligator2 x1 | twisted61x2 | per-element | 892 ns | 891 ns .. 894 ns | per elem |
| one map | twisted64x2/elligator2 x1 | twisted64x2 | per-element | 1.53 µs | 1.53 µs .. 1.53 µs | per elem |
| one map | weier107/sswu x1 | weier107 | per-element | 1.04 µs | 1.04 µs .. 1.04 µs | per elem |
| one map | weier127/sswu x1 | weier127 | per-element | 1.10 µs | 1.10 µs .. 1.10 µs | per elem |
| one map | weier61x2/sswu x1 | weier61x2 | per-element | 703 ns | 701 ns .. 704 ns | per elem |
| two maps summed | gf2_127/pornin map x2 | gf2_127 | per-element | 916 ns | 914 ns .. 917 ns | per elem |
RIBLT workload
Ratios against Go riblt-ecmh also include the mapping generator and the port to Rust, which are not attributed to this project (Workload, Comparison with the reference implementations).
Figure
556 benchmarks
| operation | benchmark | family | mode | time | 95% CI | unit |
|---|---|---|---|---|---|---|
| encode (hash + cells) | xor-sha256.64/m=12150,n=3500 | xor | per-element | 199 ns | 199 ns .. 199 ns | per elem |
| encode (hash + cells) | xor-sha256.64/m=1350,n=3500 | xor | per-element | 165 ns | 165 ns .. 166 ns | per elem |
| encode (hash + cells) | xor-sha256.64/m=150,n=3500 | xor | per-element | 139 ns | 139 ns .. 140 ns | per elem |
| encode (hash + cells) | xor-sha256.64/m=20,n=3500 | xor | per-element | 116 ns | 115 ns .. 116 ns | per elem |
| encode (hash + cells) | xor-sha256.64/m=5,n=3500 | xor | per-element | 95.2 ns | 95.0 ns .. 95.5 ns | per elem |
| encode (hash + cells) | xor-siphash.64/m=12150,n=3500 | xor-siphash | per-element | 188 ns | 187 ns .. 188 ns | per elem |
| encode (hash + cells) | xor-siphash.64/m=12150,n=3500,map=mcg64 | xor-siphash | per-element | 183 ns | 182 ns .. 183 ns | per elem |
| encode (hash + cells) | xor-siphash.64/m=1350,n=3500 | xor-siphash | per-element | 155 ns | 154 ns .. 155 ns | per elem |
| encode (hash + cells) | xor-siphash.64/m=1350,n=3500,map=mcg64 | xor-siphash | per-element | 149 ns | 149 ns .. 150 ns | per elem |
| encode (hash + cells) | xor-siphash.64/m=150,n=3500 | xor-siphash | per-element | 129 ns | 129 ns .. 130 ns | per elem |
| encode (hash + cells) | xor-siphash.64/m=150,n=3500,map=mcg64 | xor-siphash | per-element | 124 ns | 123 ns .. 124 ns | per elem |
| encode (hash + cells) | xor-siphash.64/m=20,n=3500 | xor-siphash | per-element | 104 ns | 104 ns .. 104 ns | per elem |
| encode (hash + cells) | xor-siphash.64/m=20,n=3500,map=mcg64 | xor-siphash | per-element | 99.3 ns | 99.0 ns .. 99.5 ns | per elem |
| encode (hash + cells) | xor-siphash.64/m=5,n=3500 | xor-siphash | per-element | 85.7 ns | 85.5 ns .. 85.9 ns | per elem |
| encode (hash + cells) | xor-siphash.64/m=5,n=3500,map=mcg64 | xor-siphash | per-element | 82.0 ns | 81.8 ns .. 82.2 ns | per elem |
| encode (hash + cells) | binary.109/m=12150,n=3500,h2c=pornin | gf2_109 | per-element | 398 ns | 397 ns .. 399 ns | per elem |
| encode (hash + cells) | binary.109/m=12150,n=3500,h2c=pornin,proj=gf2_127,mapproj=gf2_127 | gf2_109 | per-element | 337 ns | 337 ns .. 338 ns | per elem |
| encode (hash + cells) | binary.109/m=1350,n=3500,h2c=pornin | gf2_109 | per-element | 324 ns | 323 ns .. 325 ns | per elem |
| encode (hash + cells) | binary.109/m=1350,n=3500,h2c=pornin,proj=gf2_127,mapproj=gf2_127 | gf2_109 | per-element | 265 ns | 264 ns .. 265 ns | per elem |
| encode (hash + cells) | binary.109/m=5,n=3500,h2c=pornin | gf2_109 | per-element | 172 ns | 172 ns .. 172 ns | per elem |
| encode (hash + cells) | binary.109/m=5,n=3500,h2c=pornin,proj=gf2_127,mapproj=gf2_127 | gf2_109 | per-element | 109 ns | 108 ns .. 109 ns | per elem |
| encode (hash + cells) | binary-lambda.109/m=12150,n=3500,h2c=pornin-addend | gf2_109-lambda | per-element | 361 ns | 360 ns .. 362 ns | per elem |
| encode (hash + cells) | binary-lambda.109/m=12150,n=3500,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_109-lambda | per-element | 305 ns | 305 ns .. 306 ns | per elem |
| encode (hash + cells) | binary-lambda.109/m=1350,n=3500,h2c=pornin-addend | gf2_109-lambda | per-element | 303 ns | 303 ns .. 304 ns | per elem |
| encode (hash + cells) | binary-lambda.109/m=1350,n=3500,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_109-lambda | per-element | 244 ns | 244 ns .. 244 ns | per elem |
| encode (hash + cells) | binary-lambda.109/m=150,n=3500,h2c=pornin-addend | gf2_109-lambda | per-element | 245 ns | 245 ns .. 245 ns | per elem |
| encode (hash + cells) | binary-lambda.109/m=20,n=3500,h2c=pornin-addend | gf2_109-lambda | per-element | 189 ns | 188 ns .. 189 ns | per elem |
| encode (hash + cells) | binary-lambda.109/m=5,n=3500,h2c=pornin-addend | gf2_109-lambda | per-element | 158 ns | 158 ns .. 159 ns | per elem |
| encode (hash + cells) | binary-lambda.109/m=5,n=3500,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_109-lambda | per-element | 98.5 ns | 98.4 ns .. 98.7 ns | per elem |
| encode (hash + cells) | binary-u.109/m=12150,n=3500,h2c=pornin-addend | gf2_109-u | per-element | 341 ns | 340 ns .. 342 ns | per elem |
| encode (hash + cells) | binary-u.109/m=12150,n=3500,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_109-u | per-element | 290 ns | 289 ns .. 291 ns | per elem |
| encode (hash + cells) | binary-u.109/m=1350,n=3500,h2c=pornin-addend | gf2_109-u | per-element | 282 ns | 281 ns .. 282 ns | per elem |
| encode (hash + cells) | binary-u.109/m=1350,n=3500,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_109-u | per-element | 222 ns | 222 ns .. 223 ns | per elem |
| encode (hash + cells) | binary-u.109/m=150,n=3500,h2c=pornin-addend | gf2_109-u | per-element | 229 ns | 229 ns .. 230 ns | per elem |
| encode (hash + cells) | binary-u.109/m=20,n=3500,h2c=pornin-addend | gf2_109-u | per-element | 185 ns | 184 ns .. 185 ns | per elem |
| encode (hash + cells) | binary-u.109/m=5,n=3500,h2c=pornin-addend | gf2_109-u | per-element | 157 ns | 157 ns .. 157 ns | per elem |
| encode (hash + cells) | binary-u.109/m=5,n=3500,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_109-u | per-element | 94.5 ns | 94.3 ns .. 94.7 ns | per elem |
| encode (hash + cells) | binary-w.109/m=12150,n=3500,h2c=pornin-addend | gf2_109-w | per-element | 361 ns | 360 ns .. 362 ns | per elem |
| encode (hash + cells) | binary-w.109/m=12150,n=3500,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_109-w | per-element | 302 ns | 301 ns .. 302 ns | per elem |
| encode (hash + cells) | binary-w.109/m=1350,n=3500,h2c=pornin-addend | gf2_109-w | per-element | 302 ns | 302 ns .. 303 ns | per elem |
| encode (hash + cells) | binary-w.109/m=1350,n=3500,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_109-w | per-element | 239 ns | 238 ns .. 241 ns | per elem |
| encode (hash + cells) | binary-w.109/m=150,n=3500,h2c=pornin-addend | gf2_109-w | per-element | 245 ns | 244 ns .. 245 ns | per elem |
| encode (hash + cells) | binary-w.109/m=20,n=3500,h2c=pornin-addend | gf2_109-w | per-element | 192 ns | 191 ns .. 192 ns | per elem |
| encode (hash + cells) | binary-w.109/m=5,n=3500,h2c=pornin-addend | gf2_109-w | per-element | 159 ns | 158 ns .. 159 ns | per elem |
| encode (hash + cells) | binary-w.109/m=5,n=3500,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_109-w | per-element | 98.3 ns | 98.1 ns .. 98.4 ns | per elem |
| encode (hash + cells) | binary.122/m=12150,n=3500,h2c=pornin | gf2_122 | per-element | 463 ns | 462 ns .. 463 ns | per elem |
| encode (hash + cells) | binary.122/m=1350,n=3500,h2c=pornin | gf2_122 | per-element | 371 ns | 370 ns .. 372 ns | per elem |
| encode (hash + cells) | binary.122/m=5,n=3500,h2c=pornin | gf2_122 | per-element | 169 ns | 168 ns .. 169 ns | per elem |
| encode (hash + cells) | binary.122-gls/m=12150,n=3500,h2c=pornin | gf2_122-gls | per-element | 446 ns | 445 ns .. 446 ns | per elem |
| encode (hash + cells) | binary.122-gls/m=1350,n=3500,h2c=pornin | gf2_122-gls | per-element | 358 ns | 358 ns .. 359 ns | per elem |
| encode (hash + cells) | binary.122-gls/m=5,n=3500,h2c=pornin | gf2_122-gls | per-element | 167 ns | 166 ns .. 167 ns | per elem |
| encode (hash + cells) | binary-lambda.122-gls/m=12150,n=3500,h2c=pornin-addend | gf2_122-gls-lambda | per-element | 417 ns | 416 ns .. 418 ns | per elem |
| encode (hash + cells) | binary-lambda.122-gls/m=12150,n=3500,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_122-gls-lambda | per-element | 358 ns | 357 ns .. 359 ns | per elem |
| encode (hash + cells) | binary-lambda.122-gls/m=1350,n=3500,h2c=pornin-addend | gf2_122-gls-lambda | per-element | 342 ns | 341 ns .. 342 ns | per elem |
| encode (hash + cells) | binary-lambda.122-gls/m=1350,n=3500,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_122-gls-lambda | per-element | 286 ns | 285 ns .. 286 ns | per elem |
| encode (hash + cells) | binary-lambda.122-gls/m=5,n=3500,h2c=pornin-addend | gf2_122-gls-lambda | per-element | 154 ns | 154 ns .. 155 ns | per elem |
| encode (hash + cells) | binary-lambda.122-gls/m=5,n=3500,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_122-gls-lambda | per-element | 99.0 ns | 98.9 ns .. 99.2 ns | per elem |
| encode (hash + cells) | binary-u.122-gls/m=12150,n=3500,h2c=pornin-addend | gf2_122-gls-u | per-element | 378 ns | 377 ns .. 378 ns | per elem |
| encode (hash + cells) | binary-u.122-gls/m=12150,n=3500,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_122-gls-u | per-element | 325 ns | 324 ns .. 325 ns | per elem |
| encode (hash + cells) | binary-u.122-gls/m=1350,n=3500,h2c=pornin-addend | gf2_122-gls-u | per-element | 306 ns | 305 ns .. 307 ns | per elem |
| encode (hash + cells) | binary-u.122-gls/m=1350,n=3500,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_122-gls-u | per-element | 252 ns | 251 ns .. 252 ns | per elem |
| encode (hash + cells) | binary-u.122-gls/m=5,n=3500,h2c=pornin-addend | gf2_122-gls-u | per-element | 150 ns | 150 ns .. 151 ns | per elem |
| encode (hash + cells) | binary-u.122-gls/m=5,n=3500,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_122-gls-u | per-element | 94.5 ns | 94.4 ns .. 94.7 ns | per elem |
| encode (hash + cells) | binary-w.122-gls/m=12150,n=3500,h2c=pornin-addend | gf2_122-gls-w | per-element | 417 ns | 416 ns .. 417 ns | per elem |
| encode (hash + cells) | binary-w.122-gls/m=12150,n=3500,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_122-gls-w | per-element | 360 ns | 359 ns .. 361 ns | per elem |
| encode (hash + cells) | binary-w.122-gls/m=1350,n=3500,h2c=pornin-addend | gf2_122-gls-w | per-element | 340 ns | 340 ns .. 341 ns | per elem |
| encode (hash + cells) | binary-w.122-gls/m=1350,n=3500,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_122-gls-w | per-element | 281 ns | 280 ns .. 283 ns | per elem |
| encode (hash + cells) | binary-w.122-gls/m=5,n=3500,h2c=pornin-addend | gf2_122-gls-w | per-element | 154 ns | 154 ns .. 154 ns | per elem |
| encode (hash + cells) | binary-w.122-gls/m=5,n=3500,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_122-gls-w | per-element | 98.7 ns | 98.5 ns .. 98.9 ns | per elem |
| encode (hash + cells) | binary-lambda.122/m=12150,n=3500,h2c=pornin-addend | gf2_122-lambda | per-element | 417 ns | 417 ns .. 418 ns | per elem |
| encode (hash + cells) | binary-lambda.122/m=12150,n=3500,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_122-lambda | per-element | 358 ns | 357 ns .. 359 ns | per elem |
| encode (hash + cells) | binary-lambda.122/m=1350,n=3500,h2c=pornin-addend | gf2_122-lambda | per-element | 341 ns | 340 ns .. 342 ns | per elem |
| encode (hash + cells) | binary-lambda.122/m=1350,n=3500,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_122-lambda | per-element | 284 ns | 283 ns .. 285 ns | per elem |
| encode (hash + cells) | binary-lambda.122/m=5,n=3500,h2c=pornin-addend | gf2_122-lambda | per-element | 154 ns | 154 ns .. 154 ns | per elem |
| encode (hash + cells) | binary-lambda.122/m=5,n=3500,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_122-lambda | per-element | 99.3 ns | 99.1 ns .. 99.4 ns | per elem |
| encode (hash + cells) | binary-u.122/m=12150,n=3500,h2c=pornin-addend | gf2_122-u | per-element | 378 ns | 376 ns .. 381 ns | per elem |
| encode (hash + cells) | binary-u.122/m=12150,n=3500,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_122-u | per-element | 325 ns | 325 ns .. 326 ns | per elem |
| encode (hash + cells) | binary-u.122/m=1350,n=3500,h2c=pornin-addend | gf2_122-u | per-element | 308 ns | 308 ns .. 309 ns | per elem |
| encode (hash + cells) | binary-u.122/m=1350,n=3500,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_122-u | per-element | 253 ns | 252 ns .. 253 ns | per elem |
| encode (hash + cells) | binary-u.122/m=5,n=3500,h2c=pornin-addend | gf2_122-u | per-element | 152 ns | 151 ns .. 152 ns | per elem |
| encode (hash + cells) | binary-u.122/m=5,n=3500,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_122-u | per-element | 94.3 ns | 93.8 ns .. 94.7 ns | per elem |
| encode (hash + cells) | binary-w.122/m=12150,n=3500,h2c=pornin-addend | gf2_122-w | per-element | 417 ns | 417 ns .. 418 ns | per elem |
| encode (hash + cells) | binary-w.122/m=12150,n=3500,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_122-w | per-element | 361 ns | 360 ns .. 362 ns | per elem |
| encode (hash + cells) | binary-w.122/m=1350,n=3500,h2c=pornin-addend | gf2_122-w | per-element | 341 ns | 340 ns .. 342 ns | per elem |
| encode (hash + cells) | binary-w.122/m=1350,n=3500,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_122-w | per-element | 285 ns | 285 ns .. 286 ns | per elem |
| encode (hash + cells) | binary-w.122/m=5,n=3500,h2c=pornin-addend | gf2_122-w | per-element | 154 ns | 154 ns .. 154 ns | per elem |
| encode (hash + cells) | binary-w.122/m=5,n=3500,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_122-w | per-element | 99.4 ns | 99.2 ns .. 99.5 ns | per elem |
| encode (hash + cells) | binary.127/m=12150,n=3500,h2c=pornin | gf2_127 | per-element | 411 ns | 410 ns .. 412 ns | per elem |
| encode (hash + cells) | binary.127/m=12150,n=3500,h2c=pornin,map=mcg64 | gf2_127 | per-element | 411 ns | 411 ns .. 412 ns | per elem |
| encode (hash + cells) | binary.127/m=12150,n=3500,h2c=pornin,proj=gf2_127,mapproj=gf2_127 | gf2_127 | per-element | 352 ns | 352 ns .. 353 ns | per elem |
| encode (hash + cells) | binary.127/m=1350,n=3500,h2c=pornin | gf2_127 | per-element | 329 ns | 327 ns .. 331 ns | per elem |
| encode (hash + cells) | binary.127/m=1350,n=3500,h2c=pornin,map=mcg64 | gf2_127 | per-element | 330 ns | 329 ns .. 331 ns | per elem |
| encode (hash + cells) | binary.127/m=1350,n=3500,h2c=pornin,proj=gf2_127,mapproj=gf2_127 | gf2_127 | per-element | 273 ns | 272 ns .. 273 ns | per elem |
| encode (hash + cells) | binary.127/m=150,n=3500,h2c=pornin,map=mcg64 | gf2_127 | per-element | 259 ns | 259 ns .. 260 ns | per elem |
| encode (hash + cells) | binary.127/m=20,n=3500,h2c=pornin,map=mcg64 | gf2_127 | per-element | 197 ns | 197 ns .. 198 ns | per elem |
| encode (hash + cells) | binary.127/m=5,n=3500,h2c=pornin | gf2_127 | per-element | 161 ns | 160 ns .. 162 ns | per elem |
| encode (hash + cells) | binary.127/m=5,n=3500,h2c=pornin,map=mcg64 | gf2_127 | per-element | 158 ns | 158 ns .. 159 ns | per elem |
| encode (hash + cells) | binary.127/m=5,n=3500,h2c=pornin,proj=gf2_127,mapproj=gf2_127 | gf2_127 | per-element | 102 ns | 102 ns .. 102 ns | per elem |
| encode (hash + cells) | binary-lambda.127/m=12150,n=3500,h2c=pornin-addend | gf2_127-lambda | per-element | 399 ns | 399 ns .. 400 ns | per elem |
| encode (hash + cells) | binary-lambda.127/m=12150,n=3500,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_127-lambda | per-element | 341 ns | 341 ns .. 342 ns | per elem |
| encode (hash + cells) | binary-lambda.127/m=1350,n=3500,h2c=pornin-addend | gf2_127-lambda | per-element | 326 ns | 325 ns .. 326 ns | per elem |
| encode (hash + cells) | binary-lambda.127/m=1350,n=3500,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_127-lambda | per-element | 268 ns | 267 ns .. 268 ns | per elem |
| encode (hash + cells) | binary-lambda.127/m=5,n=3500,h2c=pornin-addend | gf2_127-lambda | per-element | 151 ns | 151 ns .. 151 ns | per elem |
| encode (hash + cells) | binary-lambda.127/m=5,n=3500,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_127-lambda | per-element | 96.4 ns | 96.3 ns .. 96.6 ns | per elem |
| encode (hash + cells) | binary-u.127/m=12150,n=3500,h2c=pornin-addend | gf2_127-u | per-element | 351 ns | 349 ns .. 352 ns | per elem |
| encode (hash + cells) | binary-u.127/m=12150,n=3500,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_127-u | per-element | 294 ns | 293 ns .. 295 ns | per elem |
| encode (hash + cells) | binary-u.127/m=1350,n=3500,h2c=pornin-addend | gf2_127-u | per-element | 288 ns | 287 ns .. 288 ns | per elem |
| encode (hash + cells) | binary-u.127/m=1350,n=3500,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_127-u | per-element | 227 ns | 227 ns .. 228 ns | per elem |
| encode (hash + cells) | binary-u.127/m=150,n=3500,h2c=pornin-addend | gf2_127-u | per-element | 231 ns | 231 ns .. 232 ns | per elem |
| encode (hash + cells) | binary-u.127/m=20,n=3500,h2c=pornin-addend | gf2_127-u | per-element | 183 ns | 183 ns .. 184 ns | per elem |
| encode (hash + cells) | binary-u.127/m=5,n=3500,h2c=pornin-addend | gf2_127-u | per-element | 152 ns | 151 ns .. 152 ns | per elem |
| encode (hash + cells) | binary-u.127/m=5,n=3500,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_127-u | per-element | 90.5 ns | 90.4 ns .. 90.7 ns | per elem |
| encode (hash + cells) | binary-w.127/m=12150,n=3500,h2c=pornin-addend | gf2_127-w | per-element | 398 ns | 397 ns .. 399 ns | per elem |
| encode (hash + cells) | binary-w.127/m=12150,n=3500,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_127-w | per-element | 341 ns | 340 ns .. 341 ns | per elem |
| encode (hash + cells) | binary-w.127/m=1350,n=3500,h2c=pornin-addend | gf2_127-w | per-element | 325 ns | 325 ns .. 326 ns | per elem |
| encode (hash + cells) | binary-w.127/m=1350,n=3500,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_127-w | per-element | 268 ns | 268 ns .. 268 ns | per elem |
| encode (hash + cells) | binary-w.127/m=5,n=3500,h2c=pornin-addend | gf2_127-w | per-element | 151 ns | 151 ns .. 151 ns | per elem |
| encode (hash + cells) | binary-w.127/m=5,n=3500,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_127-w | per-element | 95.9 ns | 95.6 ns .. 96.1 ns | per elem |
| encode (hash + cells) | edwards.107/m=1350,n=3500,h2c=ti | edwards107 | per-element | 1.09 µs | 1.08 µs .. 1.09 µs | per elem |
| encode (hash + cells) | edwards.127/m=1350,n=3500,h2c=ti | edwards127 | per-element | 1.44 µs | 1.43 µs .. 1.44 µs | per elem |
| encode (hash + cells) | edwards.61x2/m=1350,n=3500,h2c=ti | edwards61x2 | per-element | 940 ns | 938 ns .. 942 ns | per elem |
| encode (hash + cells) | twisted.goldilocks2/m=1350,n=3500,h2c=ti | twisted-goldilocks2 | per-element | 2.18 µs | 2.17 µs .. 2.18 µs | per elem |
| encode (hash + cells) | twisted.128/m=1350,n=3500,h2c=ti | twisted128 | per-element | 2.37 µs | 2.36 µs .. 2.38 µs | per elem |
| encode (hash + cells) | twisted.61x2/m=1350,n=3500,h2c=ti | twisted61x2 | per-element | 900 ns | 898 ns .. 902 ns | per elem |
| encode (hash + cells) | twisted.64x2/m=1350,n=3500,h2c=ti | twisted64x2 | per-element | 1.45 µs | 1.45 µs .. 1.45 µs | per elem |
| encode (hash + cells) | weier.107/m=1350,n=3500,h2c=ti | weier107 | per-element | 1.24 µs | 1.24 µs .. 1.25 µs | per elem |
| encode (hash + cells) | weier-jacobian.107/m=1350,n=3500,h2c=ti | weier107-jacobian | per-element | 1.21 µs | 1.21 µs .. 1.21 µs | per elem |
| encode (hash + cells) | weier.127/m=1350,n=3500,h2c=ti | weier127 | per-element | 1.74 µs | 1.74 µs .. 1.74 µs | per elem |
| encode (hash + cells) | weier-jacobian.127/m=1350,n=3500,h2c=ti | weier127-jacobian | per-element | 1.59 µs | 1.59 µs .. 1.59 µs | per elem |
| encode (hash + cells) | weier.61x2/m=1350,n=3500,h2c=ti | weier61x2 | per-element | 1.08 µs | 1.08 µs .. 1.09 µs | per elem |
| encode (hash + cells) | weier-jacobian.61x2/m=1350,n=3500,h2c=ti | weier61x2-jacobian | per-element | 1.11 µs | 1.10 µs .. 1.11 µs | per elem |
| encode (hash + cells) | ristretto255/m=12150,n=3500 | ristretto255 | per-element | 6.16 µs | 6.14 µs .. 6.17 µs | per elem |
| encode (hash + cells) | ristretto255/m=12150,n=3500,map=mcg64 | ristretto255 | per-element | 6.35 µs | 6.33 µs .. 6.38 µs | per elem |
| encode (hash + cells) | ristretto255/m=1350,n=3500 | ristretto255 | per-element | 5.84 µs | 5.83 µs .. 5.85 µs | per elem |
| encode (hash + cells) | ristretto255/m=1350,n=3500,map=mcg64 | ristretto255 | per-element | 5.96 µs | 5.92 µs .. 5.99 µs | per elem |
| encode (hash + cells) | ristretto255/m=150,n=3500 | ristretto255 | per-element | 5.53 µs | 5.52 µs .. 5.53 µs | per elem |
| encode (hash + cells) | ristretto255/m=150,n=3500,map=mcg64 | ristretto255 | per-element | 5.49 µs | 5.48 µs .. 5.50 µs | per elem |
| encode (hash + cells) | ristretto255/m=20,n=3500 | ristretto255 | per-element | 5.25 µs | 5.23 µs .. 5.26 µs | per elem |
| encode (hash + cells) | ristretto255/m=20,n=3500,map=mcg64 | ristretto255 | per-element | 5.26 µs | 5.24 µs .. 5.27 µs | per elem |
| encode (hash + cells) | ristretto255/m=5,n=3500 | ristretto255 | per-element | 5.11 µs | 5.10 µs .. 5.11 µs | per elem |
| encode (hash + cells) | ristretto255/m=5,n=3500,map=mcg64 | ristretto255 | per-element | 5.08 µs | 5.08 µs .. 5.09 µs | per elem |
| cell updates | xor-sha256.64/m=1350,n=3500 | xor | per-element | 141 ns | 140 ns .. 141 ns | per elem |
| cell updates | xor-siphash.64/m=1350,n=3500 | xor-siphash | per-element | 141 ns | 140 ns .. 141 ns | per elem |
| cell updates | binary.109/m=12150,n=3500 | gf2_109 | per-element | 321 ns | 320 ns .. 321 ns | per elem |
| cell updates | binary.109/m=1350,n=3500 | gf2_109 | per-element | 248 ns | 247 ns .. 248 ns | per elem |
| cell updates | binary.109/m=5,n=3500 | gf2_109 | per-element | 93.7 ns | 93.5 ns .. 93.8 ns | per elem |
| cell updates | binary-lambda.109/m=12150,n=3500 | gf2_109-lambda | per-element | 295 ns | 294 ns .. 296 ns | per elem |
| cell updates | binary-lambda.109/m=1350,n=3500 | gf2_109-lambda | per-element | 237 ns | 236 ns .. 237 ns | per elem |
| cell updates | binary-lambda.109/m=150,n=3500 | gf2_109-lambda | per-element | 179 ns | 178 ns .. 179 ns | per elem |
| cell updates | binary-lambda.109/m=20,n=3500 | gf2_109-lambda | per-element | 122 ns | 122 ns .. 123 ns | per elem |
| cell updates | binary-lambda.109/m=5,n=3500 | gf2_109-lambda | per-element | 92.4 ns | 92.2 ns .. 92.6 ns | per elem |
| cell updates | binary-u.109/m=12150,n=3500 | gf2_109-u | per-element | 273 ns | 272 ns .. 273 ns | per elem |
| cell updates | binary-u.109/m=1350,n=3500 | gf2_109-u | per-element | 212 ns | 212 ns .. 212 ns | per elem |
| cell updates | binary-u.109/m=150,n=3500 | gf2_109-u | per-element | 161 ns | 160 ns .. 161 ns | per elem |
| cell updates | binary-u.109/m=20,n=3500 | gf2_109-u | per-element | 116 ns | 116 ns .. 116 ns | per elem |
| cell updates | binary-u.109/m=5,n=3500 | gf2_109-u | per-element | 87.6 ns | 87.4 ns .. 87.8 ns | per elem |
| cell updates | binary-w.109/m=12150,n=3500 | gf2_109-w | per-element | 292 ns | 290 ns .. 293 ns | per elem |
| cell updates | binary-w.109/m=1350,n=3500 | gf2_109-w | per-element | 237 ns | 236 ns .. 237 ns | per elem |
| cell updates | binary-w.109/m=150,n=3500 | gf2_109-w | per-element | 178 ns | 177 ns .. 178 ns | per elem |
| cell updates | binary-w.109/m=20,n=3500 | gf2_109-w | per-element | 126 ns | 125 ns .. 126 ns | per elem |
| cell updates | binary-w.109/m=5,n=3500 | gf2_109-w | per-element | 92.7 ns | 92.5 ns .. 92.8 ns | per elem |
| cell updates | binary.122/m=12150,n=3500 | gf2_122 | per-element | 391 ns | 390 ns .. 392 ns | per elem |
| cell updates | binary.122/m=1350,n=3500 | gf2_122 | per-element | 302 ns | 302 ns .. 303 ns | per elem |
| cell updates | binary.122/m=5,n=3500 | gf2_122 | per-element | 101 ns | 101 ns .. 101 ns | per elem |
| cell updates | binary.122-gls/m=12150,n=3500 | gf2_122-gls | per-element | 371 ns | 369 ns .. 373 ns | per elem |
| cell updates | binary.122-gls/m=1350,n=3500 | gf2_122-gls | per-element | 291 ns | 290 ns .. 291 ns | per elem |
| cell updates | binary.122-gls/m=5,n=3500 | gf2_122-gls | per-element | 99.3 ns | 99.0 ns .. 99.6 ns | per elem |
| cell updates | binary-lambda.122-gls/m=12150,n=3500 | gf2_122-gls-lambda | per-element | 359 ns | 359 ns .. 360 ns | per elem |
| cell updates | binary-lambda.122-gls/m=1350,n=3500 | gf2_122-gls-lambda | per-element | 284 ns | 284 ns .. 285 ns | per elem |
| cell updates | binary-lambda.122-gls/m=5,n=3500 | gf2_122-gls-lambda | per-element | 97.3 ns | 97.1 ns .. 97.5 ns | per elem |
| cell updates | binary-u.122-gls/m=12150,n=3500 | gf2_122-gls-u | per-element | 317 ns | 317 ns .. 318 ns | per elem |
| cell updates | binary-u.122-gls/m=1350,n=3500 | gf2_122-gls-u | per-element | 246 ns | 245 ns .. 246 ns | per elem |
| cell updates | binary-u.122-gls/m=5,n=3500 | gf2_122-gls-u | per-element | 89.4 ns | 89.2 ns .. 89.5 ns | per elem |
| cell updates | binary-w.122-gls/m=12150,n=3500 | gf2_122-gls-w | per-element | 359 ns | 358 ns .. 360 ns | per elem |
| cell updates | binary-w.122-gls/m=1350,n=3500 | gf2_122-gls-w | per-element | 284 ns | 283 ns .. 284 ns | per elem |
| cell updates | binary-w.122-gls/m=5,n=3500 | gf2_122-gls-w | per-element | 97.4 ns | 97.2 ns .. 97.6 ns | per elem |
| cell updates | binary-lambda.122/m=12150,n=3500 | gf2_122-lambda | per-element | 360 ns | 359 ns .. 360 ns | per elem |
| cell updates | binary-lambda.122/m=1350,n=3500 | gf2_122-lambda | per-element | 284 ns | 283 ns .. 284 ns | per elem |
| cell updates | binary-lambda.122/m=5,n=3500 | gf2_122-lambda | per-element | 96.6 ns | 96.4 ns .. 96.8 ns | per elem |
| cell updates | binary-u.122/m=12150,n=3500 | gf2_122-u | per-element | 317 ns | 315 ns .. 318 ns | per elem |
| cell updates | binary-u.122/m=1350,n=3500 | gf2_122-u | per-element | 246 ns | 245 ns .. 246 ns | per elem |
| cell updates | binary-u.122/m=5,n=3500 | gf2_122-u | per-element | 89.4 ns | 89.2 ns .. 89.5 ns | per elem |
| cell updates | binary-w.122/m=12150,n=3500 | gf2_122-w | per-element | 359 ns | 358 ns .. 359 ns | per elem |
| cell updates | binary-w.122/m=1350,n=3500 | gf2_122-w | per-element | 284 ns | 283 ns .. 285 ns | per elem |
| cell updates | binary-w.122/m=5,n=3500 | gf2_122-w | per-element | 96.5 ns | 96.3 ns .. 96.7 ns | per elem |
| cell updates | binary.127/m=12150,n=3500 | gf2_127 | per-element | 341 ns | 341 ns .. 342 ns | per elem |
| cell updates | binary.127/m=1350,n=3500 | gf2_127 | per-element | 261 ns | 260 ns .. 262 ns | per elem |
| cell updates | binary.127/m=5,n=3500 | gf2_127 | per-element | 94.5 ns | 94.3 ns .. 94.8 ns | per elem |
| cell updates | binary-lambda.127/m=12150,n=3500 | gf2_127-lambda | per-element | 341 ns | 341 ns .. 342 ns | per elem |
| cell updates | binary-lambda.127/m=1350,n=3500 | gf2_127-lambda | per-element | 267 ns | 267 ns .. 267 ns | per elem |
| cell updates | binary-lambda.127/m=5,n=3500 | gf2_127-lambda | per-element | 92.5 ns | 92.3 ns .. 92.7 ns | per elem |
| cell updates | binary-u.127/m=12150,n=3500 | gf2_127-u | per-element | 286 ns | 285 ns .. 287 ns | per elem |
| cell updates | binary-u.127/m=1350,n=3500 | gf2_127-u | per-element | 222 ns | 222 ns .. 222 ns | per elem |
| cell updates | binary-u.127/m=150,n=3500 | gf2_127-u | per-element | 167 ns | 167 ns .. 168 ns | per elem |
| cell updates | binary-u.127/m=20,n=3500 | gf2_127-u | per-element | 120 ns | 119 ns .. 120 ns | per elem |
| cell updates | binary-u.127/m=5,n=3500 | gf2_127-u | per-element | 86.4 ns | 86.3 ns .. 86.6 ns | per elem |
| cell updates | binary-w.127/m=12150,n=3500 | gf2_127-w | per-element | 341 ns | 341 ns .. 342 ns | per elem |
| cell updates | binary-w.127/m=1350,n=3500 | gf2_127-w | per-element | 267 ns | 267 ns .. 267 ns | per elem |
| cell updates | binary-w.127/m=5,n=3500 | gf2_127-w | per-element | 92.4 ns | 92.1 ns .. 92.6 ns | per elem |
| cell updates | edwards.107/m=1350,n=3500 | edwards107 | per-element | 286 ns | 285 ns .. 287 ns | per elem |
| cell updates | edwards.127/m=1350,n=3500 | edwards127 | per-element | 338 ns | 337 ns .. 339 ns | per elem |
| cell updates | edwards.61x2/m=1350,n=3500 | edwards61x2 | per-element | 270 ns | 270 ns .. 271 ns | per elem |
| cell updates | twisted.goldilocks2/m=1350,n=3500 | twisted-goldilocks2 | per-element | 325 ns | 324 ns .. 326 ns | per elem |
| cell updates | twisted.128/m=1350,n=3500 | twisted128 | per-element | 427 ns | 425 ns .. 429 ns | per elem |
| cell updates | twisted.61x2/m=1350,n=3500 | twisted61x2 | per-element | 250 ns | 250 ns .. 251 ns | per elem |
| cell updates | twisted.64x2/m=1350,n=3500 | twisted64x2 | per-element | 331 ns | 330 ns .. 331 ns | per elem |
| cell updates | weier.107/m=1350,n=3500 | weier107 | per-element | 474 ns | 472 ns .. 475 ns | per elem |
| cell updates | weier-jacobian.107/m=1350,n=3500 | weier107-jacobian | per-element | 439 ns | 439 ns .. 440 ns | per elem |
| cell updates | weier.127/m=1350,n=3500 | weier127 | per-element | 674 ns | 673 ns .. 675 ns | per elem |
| cell updates | weier-jacobian.127/m=1350,n=3500 | weier127-jacobian | per-element | 541 ns | 540 ns .. 543 ns | per elem |
| cell updates | weier.61x2/m=1350,n=3500 | weier61x2 | per-element | 432 ns | 432 ns .. 433 ns | per elem |
| cell updates | weier-jacobian.61x2/m=1350,n=3500 | weier61x2-jacobian | per-element | 487 ns | 485 ns .. 488 ns | per elem |
| cell updates | ristretto255/m=1350,n=3500 | ristretto255 | per-element | 1.02 µs | 1.02 µs .. 1.02 µs | per elem |
| peel, per difference | xor-sha256.64/d=1350,m=2700,prefilter=true,batch=true | xor | batch | 643 ns | 642 ns .. 645 ns | per elem |
| peel, per difference | xor-siphash.64/d=1350,m=2700,prefilter=true,batch=true | xor-siphash | batch | 648 ns | 647 ns .. 650 ns | per elem |
| peel, per difference | binary.109/d=10000,m=20000,prefilter=true,batch=true,h2c=pornin | gf2_109 | batch | 1.14 µs | 1.13 µs .. 1.14 µs | per elem |
| peel, per difference | binary.109/d=10000,m=20000,prefilter=true,batch=true,h2c=pornin,proj=gf2_127,mapproj=gf2_127 | gf2_109 | batch | 952 ns | 950 ns .. 953 ns | per elem |
| peel, per difference | binary.109/d=1350,m=2700,prefilter=true,batch=true,h2c=pornin | gf2_109 | batch | 838 ns | 836 ns .. 841 ns | per elem |
| peel, per difference | binary.109/d=1350,m=2700,prefilter=true,batch=true,h2c=pornin,proj=gf2_127,mapproj=gf2_127 | gf2_109 | batch | 614 ns | 612 ns .. 615 ns | per elem |
| peel, per difference | binary.109/d=4,m=10,prefilter=true,batch=true,h2c=pornin,proj=gf2_127,mapproj=gf2_127 | gf2_109 | batch | 735 ns | 734 ns .. 737 ns | per elem |
| peel, per difference | binary.109/d=4,m=8,prefilter=true,batch=true,h2c=pornin | gf2_109 | batch | 613 ns | 612 ns .. 615 ns | per elem |
| peel, per difference | binary-lambda.109/d=10000,m=20000,prefilter=false,batch=false,h2c=pornin-addend | gf2_109-lambda | per-element | 1.73 µs | 1.72 µs .. 1.73 µs | per elem |
| peel, per difference | binary-lambda.109/d=10000,m=20000,prefilter=false,batch=true,h2c=pornin-addend | gf2_109-lambda | batch | 897 ns | 896 ns .. 899 ns | per elem |
| peel, per difference | binary-lambda.109/d=10000,m=20000,prefilter=true,batch=false,h2c=pornin-addend | gf2_109-lambda | per-element | 1.60 µs | 1.59 µs .. 1.60 µs | per elem |
| peel, per difference | binary-lambda.109/d=10000,m=20000,prefilter=true,batch=true,h2c=pornin-addend | gf2_109-lambda | batch | 1.12 µs | 1.12 µs .. 1.13 µs | per elem |
| peel, per difference | binary-lambda.109/d=10000,m=20000,prefilter=true,batch=true,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_109-lambda | batch | 957 ns | 955 ns .. 958 ns | per elem |
| peel, per difference | binary-lambda.109/d=1350,m=2700,prefilter=false,batch=false,h2c=pornin-addend | gf2_109-lambda | per-element | 1.59 µs | 1.58 µs .. 1.60 µs | per elem |
| peel, per difference | binary-lambda.109/d=1350,m=2700,prefilter=false,batch=true,h2c=pornin-addend | gf2_109-lambda | batch | 683 ns | 680 ns .. 685 ns | per elem |
| peel, per difference | binary-lambda.109/d=1350,m=2700,prefilter=true,batch=false,h2c=pornin-addend | gf2_109-lambda | per-element | 1.37 µs | 1.36 µs .. 1.38 µs | per elem |
| peel, per difference | binary-lambda.109/d=1350,m=2700,prefilter=true,batch=true,h2c=pornin-addend | gf2_109-lambda | batch | 829 ns | 826 ns .. 832 ns | per elem |
| peel, per difference | binary-lambda.109/d=1350,m=2700,prefilter=true,batch=true,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_109-lambda | batch | 585 ns | 584 ns .. 587 ns | per elem |
| peel, per difference | binary-lambda.109/d=150,m=300,prefilter=false,batch=false,h2c=pornin-addend | gf2_109-lambda | per-element | 1.40 µs | 1.40 µs .. 1.41 µs | per elem |
| peel, per difference | binary-lambda.109/d=150,m=300,prefilter=false,batch=true,h2c=pornin-addend | gf2_109-lambda | batch | 556 ns | 555 ns .. 557 ns | per elem |
| peel, per difference | binary-lambda.109/d=150,m=300,prefilter=true,batch=false,h2c=pornin-addend | gf2_109-lambda | per-element | 1.14 µs | 1.13 µs .. 1.14 µs | per elem |
| peel, per difference | binary-lambda.109/d=150,m=300,prefilter=true,batch=true,h2c=pornin-addend | gf2_109-lambda | batch | 650 ns | 649 ns .. 651 ns | per elem |
| peel, per difference | binary-lambda.109/d=20,m=40,prefilter=false,batch=false,h2c=pornin-addend | gf2_109-lambda | per-element | 1.15 µs | 1.15 µs .. 1.16 µs | per elem |
| peel, per difference | binary-lambda.109/d=20,m=40,prefilter=false,batch=true,h2c=pornin-addend | gf2_109-lambda | batch | 519 ns | 518 ns .. 520 ns | per elem |
| peel, per difference | binary-lambda.109/d=20,m=40,prefilter=true,batch=false,h2c=pornin-addend | gf2_109-lambda | per-element | 985 ns | 982 ns .. 988 ns | per elem |
| peel, per difference | binary-lambda.109/d=20,m=40,prefilter=true,batch=true,h2c=pornin-addend | gf2_109-lambda | batch | 589 ns | 588 ns .. 590 ns | per elem |
| peel, per difference | binary-lambda.109/d=4,m=10,prefilter=true,batch=true,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_109-lambda | batch | 698 ns | 697 ns .. 700 ns | per elem |
| peel, per difference | binary-lambda.109/d=4,m=8,prefilter=false,batch=false,h2c=pornin-addend | gf2_109-lambda | per-element | 744 ns | 742 ns .. 746 ns | per elem |
| peel, per difference | binary-lambda.109/d=4,m=8,prefilter=false,batch=true,h2c=pornin-addend | gf2_109-lambda | batch | 536 ns | 535 ns .. 538 ns | per elem |
| peel, per difference | binary-lambda.109/d=4,m=8,prefilter=true,batch=false,h2c=pornin-addend | gf2_109-lambda | per-element | 794 ns | 792 ns .. 796 ns | per elem |
| peel, per difference | binary-lambda.109/d=4,m=8,prefilter=true,batch=true,h2c=pornin-addend | gf2_109-lambda | batch | 586 ns | 585 ns .. 588 ns | per elem |
| peel, per difference | binary-u.109/d=10000,m=20000,prefilter=false,batch=false,h2c=pornin-addend | gf2_109-u | per-element | 1.66 µs | 1.66 µs .. 1.67 µs | per elem |
| peel, per difference | binary-u.109/d=10000,m=20000,prefilter=false,batch=true,h2c=pornin-addend | gf2_109-u | batch | 840 ns | 839 ns .. 841 ns | per elem |
| peel, per difference | binary-u.109/d=10000,m=20000,prefilter=true,batch=false,h2c=pornin-addend | gf2_109-u | per-element | 1.54 µs | 1.54 µs .. 1.54 µs | per elem |
| peel, per difference | binary-u.109/d=10000,m=20000,prefilter=true,batch=true,h2c=pornin-addend | gf2_109-u | batch | 1.05 µs | 1.05 µs .. 1.06 µs | per elem |
| peel, per difference | binary-u.109/d=10000,m=20000,prefilter=true,batch=true,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_109-u | batch | 883 ns | 882 ns .. 885 ns | per elem |
| peel, per difference | binary-u.109/d=1350,m=2700,prefilter=false,batch=false,h2c=pornin-addend | gf2_109-u | per-element | 1.49 µs | 1.49 µs .. 1.49 µs | per elem |
| peel, per difference | binary-u.109/d=1350,m=2700,prefilter=false,batch=true,h2c=pornin-addend | gf2_109-u | batch | 640 ns | 639 ns .. 641 ns | per elem |
| peel, per difference | binary-u.109/d=1350,m=2700,prefilter=true,batch=false,h2c=pornin-addend | gf2_109-u | per-element | 1.27 µs | 1.27 µs .. 1.28 µs | per elem |
| peel, per difference | binary-u.109/d=1350,m=2700,prefilter=true,batch=true,h2c=pornin-addend | gf2_109-u | batch | 786 ns | 784 ns .. 788 ns | per elem |
| peel, per difference | binary-u.109/d=1350,m=2700,prefilter=true,batch=true,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_109-u | batch | 563 ns | 562 ns .. 564 ns | per elem |
| peel, per difference | binary-u.109/d=150,m=300,prefilter=false,batch=false,h2c=pornin-addend | gf2_109-u | per-element | 1.39 µs | 1.39 µs .. 1.39 µs | per elem |
| peel, per difference | binary-u.109/d=150,m=300,prefilter=false,batch=true,h2c=pornin-addend | gf2_109-u | batch | 550 ns | 550 ns .. 551 ns | per elem |
| peel, per difference | binary-u.109/d=150,m=300,prefilter=true,batch=false,h2c=pornin-addend | gf2_109-u | per-element | 1.12 µs | 1.12 µs .. 1.13 µs | per elem |
| peel, per difference | binary-u.109/d=150,m=300,prefilter=true,batch=true,h2c=pornin-addend | gf2_109-u | batch | 643 ns | 642 ns .. 644 ns | per elem |
| peel, per difference | binary-u.109/d=20,m=40,prefilter=false,batch=false,h2c=pornin-addend | gf2_109-u | per-element | 1.15 µs | 1.14 µs .. 1.15 µs | per elem |
| peel, per difference | binary-u.109/d=20,m=40,prefilter=false,batch=true,h2c=pornin-addend | gf2_109-u | batch | 519 ns | 518 ns .. 521 ns | per elem |
| peel, per difference | binary-u.109/d=20,m=40,prefilter=true,batch=false,h2c=pornin-addend | gf2_109-u | per-element | 986 ns | 984 ns .. 989 ns | per elem |
| peel, per difference | binary-u.109/d=20,m=40,prefilter=true,batch=true,h2c=pornin-addend | gf2_109-u | batch | 590 ns | 589 ns .. 591 ns | per elem |
| peel, per difference | binary-u.109/d=4,m=10,prefilter=true,batch=true,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_109-u | batch | 714 ns | 712 ns .. 715 ns | per elem |
| peel, per difference | binary-u.109/d=4,m=8,prefilter=false,batch=false,h2c=pornin-addend | gf2_109-u | per-element | 750 ns | 747 ns .. 753 ns | per elem |
| peel, per difference | binary-u.109/d=4,m=8,prefilter=false,batch=true,h2c=pornin-addend | gf2_109-u | batch | 547 ns | 546 ns .. 549 ns | per elem |
| peel, per difference | binary-u.109/d=4,m=8,prefilter=true,batch=false,h2c=pornin-addend | gf2_109-u | per-element | 802 ns | 800 ns .. 805 ns | per elem |
| peel, per difference | binary-u.109/d=4,m=8,prefilter=true,batch=true,h2c=pornin-addend | gf2_109-u | batch | 595 ns | 593 ns .. 596 ns | per elem |
| peel, per difference | binary-w.109/d=10000,m=20000,prefilter=false,batch=false,h2c=pornin-addend | gf2_109-w | per-element | 1.72 µs | 1.72 µs .. 1.73 µs | per elem |
| peel, per difference | binary-w.109/d=10000,m=20000,prefilter=false,batch=true,h2c=pornin-addend | gf2_109-w | batch | 897 ns | 895 ns .. 899 ns | per elem |
| peel, per difference | binary-w.109/d=10000,m=20000,prefilter=true,batch=false,h2c=pornin-addend | gf2_109-w | per-element | 1.60 µs | 1.60 µs .. 1.60 µs | per elem |
| peel, per difference | binary-w.109/d=10000,m=20000,prefilter=true,batch=true,h2c=pornin-addend | gf2_109-w | batch | 1.13 µs | 1.13 µs .. 1.13 µs | per elem |
| peel, per difference | binary-w.109/d=10000,m=20000,prefilter=true,batch=true,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_109-w | batch | 957 ns | 955 ns .. 958 ns | per elem |
| peel, per difference | binary-w.109/d=1350,m=2700,prefilter=false,batch=false,h2c=pornin-addend | gf2_109-w | per-element | 1.52 µs | 1.51 µs .. 1.52 µs | per elem |
| peel, per difference | binary-w.109/d=1350,m=2700,prefilter=false,batch=true,h2c=pornin-addend | gf2_109-w | batch | 666 ns | 665 ns .. 667 ns | per elem |
| peel, per difference | binary-w.109/d=1350,m=2700,prefilter=true,batch=false,h2c=pornin-addend | gf2_109-w | per-element | 1.31 µs | 1.31 µs .. 1.32 µs | per elem |
| peel, per difference | binary-w.109/d=1350,m=2700,prefilter=true,batch=true,h2c=pornin-addend | gf2_109-w | batch | 823 ns | 821 ns .. 825 ns | per elem |
| peel, per difference | binary-w.109/d=1350,m=2700,prefilter=true,batch=true,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_109-w | batch | 580 ns | 579 ns .. 582 ns | per elem |
| peel, per difference | binary-w.109/d=150,m=300,prefilter=false,batch=false,h2c=pornin-addend | gf2_109-w | per-element | 1.40 µs | 1.39 µs .. 1.40 µs | per elem |
| peel, per difference | binary-w.109/d=150,m=300,prefilter=false,batch=true,h2c=pornin-addend | gf2_109-w | batch | 554 ns | 553 ns .. 555 ns | per elem |
| peel, per difference | binary-w.109/d=150,m=300,prefilter=true,batch=false,h2c=pornin-addend | gf2_109-w | per-element | 1.14 µs | 1.13 µs .. 1.14 µs | per elem |
| peel, per difference | binary-w.109/d=150,m=300,prefilter=true,batch=true,h2c=pornin-addend | gf2_109-w | batch | 649 ns | 648 ns .. 651 ns | per elem |
| peel, per difference | binary-w.109/d=20,m=40,prefilter=false,batch=false,h2c=pornin-addend | gf2_109-w | per-element | 1.15 µs | 1.15 µs .. 1.15 µs | per elem |
| peel, per difference | binary-w.109/d=20,m=40,prefilter=false,batch=true,h2c=pornin-addend | gf2_109-w | batch | 518 ns | 517 ns .. 519 ns | per elem |
| peel, per difference | binary-w.109/d=20,m=40,prefilter=true,batch=false,h2c=pornin-addend | gf2_109-w | per-element | 986 ns | 982 ns .. 989 ns | per elem |
| peel, per difference | binary-w.109/d=20,m=40,prefilter=true,batch=true,h2c=pornin-addend | gf2_109-w | batch | 589 ns | 588 ns .. 590 ns | per elem |
| peel, per difference | binary-w.109/d=4,m=10,prefilter=true,batch=true,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_109-w | batch | 694 ns | 693 ns .. 696 ns | per elem |
| peel, per difference | binary-w.109/d=4,m=8,prefilter=false,batch=false,h2c=pornin-addend | gf2_109-w | per-element | 744 ns | 742 ns .. 747 ns | per elem |
| peel, per difference | binary-w.109/d=4,m=8,prefilter=false,batch=true,h2c=pornin-addend | gf2_109-w | batch | 537 ns | 536 ns .. 538 ns | per elem |
| peel, per difference | binary-w.109/d=4,m=8,prefilter=true,batch=false,h2c=pornin-addend | gf2_109-w | per-element | 796 ns | 794 ns .. 798 ns | per elem |
| peel, per difference | binary-w.109/d=4,m=8,prefilter=true,batch=true,h2c=pornin-addend | gf2_109-w | batch | 588 ns | 587 ns .. 590 ns | per elem |
| peel, per difference | binary.122/d=10000,m=20000,prefilter=true,batch=true,h2c=pornin | gf2_122 | batch | 1.20 µs | 1.20 µs .. 1.20 µs | per elem |
| peel, per difference | binary.122/d=1350,m=2700,prefilter=true,batch=true,h2c=pornin | gf2_122 | batch | 891 ns | 889 ns .. 893 ns | per elem |
| peel, per difference | binary.122/d=4,m=8,prefilter=true,batch=true,h2c=pornin | gf2_122 | batch | 527 ns | 526 ns .. 528 ns | per elem |
| peel, per difference | binary.122-gls/d=10000,m=20000,prefilter=true,batch=true,h2c=pornin | gf2_122-gls | batch | 1.18 µs | 1.18 µs .. 1.18 µs | per elem |
| peel, per difference | binary.122-gls/d=1350,m=2700,prefilter=true,batch=true,h2c=pornin | gf2_122-gls | batch | 888 ns | 886 ns .. 889 ns | per elem |
| peel, per difference | binary.122-gls/d=4,m=8,prefilter=true,batch=true,h2c=pornin | gf2_122-gls | batch | 521 ns | 519 ns .. 522 ns | per elem |
| peel, per difference | binary-lambda.122-gls/d=10000,m=20000,prefilter=true,batch=true,h2c=pornin-addend | gf2_122-gls-lambda | batch | 1.21 µs | 1.21 µs .. 1.21 µs | per elem |
| peel, per difference | binary-lambda.122-gls/d=10000,m=20000,prefilter=true,batch=true,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_122-gls-lambda | batch | 1.02 µs | 1.01 µs .. 1.02 µs | per elem |
| peel, per difference | binary-lambda.122-gls/d=1350,m=2700,prefilter=true,batch=true,h2c=pornin-addend | gf2_122-gls-lambda | batch | 888 ns | 885 ns .. 891 ns | per elem |
| peel, per difference | binary-lambda.122-gls/d=1350,m=2700,prefilter=true,batch=true,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_122-gls-lambda | batch | 651 ns | 648 ns .. 654 ns | per elem |
| peel, per difference | binary-lambda.122-gls/d=4,m=10,prefilter=true,batch=true,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_122-gls-lambda | batch | 560 ns | 558 ns .. 562 ns | per elem |
| peel, per difference | binary-lambda.122-gls/d=4,m=8,prefilter=true,batch=true,h2c=pornin-addend | gf2_122-gls-lambda | batch | 487 ns | 486 ns .. 488 ns | per elem |
| peel, per difference | binary-u.122-gls/d=10000,m=20000,prefilter=true,batch=true,h2c=pornin-addend | gf2_122-gls-u | batch | 1.12 µs | 1.11 µs .. 1.12 µs | per elem |
| peel, per difference | binary-u.122-gls/d=10000,m=20000,prefilter=true,batch=true,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_122-gls-u | batch | 926 ns | 924 ns .. 927 ns | per elem |
| peel, per difference | binary-u.122-gls/d=1350,m=2700,prefilter=true,batch=true,h2c=pornin-addend | gf2_122-gls-u | batch | 825 ns | 823 ns .. 826 ns | per elem |
| peel, per difference | binary-u.122-gls/d=1350,m=2700,prefilter=true,batch=true,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_122-gls-u | batch | 597 ns | 596 ns .. 598 ns | per elem |
| peel, per difference | binary-u.122-gls/d=4,m=10,prefilter=true,batch=true,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_122-gls-u | batch | 580 ns | 578 ns .. 581 ns | per elem |
| peel, per difference | binary-u.122-gls/d=4,m=8,prefilter=true,batch=true,h2c=pornin-addend | gf2_122-gls-u | batch | 502 ns | 500 ns .. 503 ns | per elem |
| peel, per difference | binary-w.122-gls/d=10000,m=20000,prefilter=true,batch=true,h2c=pornin-addend | gf2_122-gls-w | batch | 1.22 µs | 1.22 µs .. 1.22 µs | per elem |
| peel, per difference | binary-w.122-gls/d=10000,m=20000,prefilter=true,batch=true,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_122-gls-w | batch | 1.02 µs | 1.01 µs .. 1.03 µs | per elem |
| peel, per difference | binary-w.122-gls/d=1350,m=2700,prefilter=true,batch=true,h2c=pornin-addend | gf2_122-gls-w | batch | 892 ns | 889 ns .. 895 ns | per elem |
| peel, per difference | binary-w.122-gls/d=1350,m=2700,prefilter=true,batch=true,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_122-gls-w | batch | 645 ns | 643 ns .. 647 ns | per elem |
| peel, per difference | binary-w.122-gls/d=4,m=10,prefilter=true,batch=true,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_122-gls-w | batch | 560 ns | 558 ns .. 561 ns | per elem |
| peel, per difference | binary-w.122-gls/d=4,m=8,prefilter=true,batch=true,h2c=pornin-addend | gf2_122-gls-w | batch | 488 ns | 486 ns .. 489 ns | per elem |
| peel, per difference | binary-lambda.122/d=10000,m=20000,prefilter=true,batch=true,h2c=pornin-addend | gf2_122-lambda | batch | 1.21 µs | 1.21 µs .. 1.21 µs | per elem |
| peel, per difference | binary-lambda.122/d=10000,m=20000,prefilter=true,batch=true,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_122-lambda | batch | 1.02 µs | 1.02 µs .. 1.02 µs | per elem |
| peel, per difference | binary-lambda.122/d=1350,m=2700,prefilter=true,batch=true,h2c=pornin-addend | gf2_122-lambda | batch | 879 ns | 877 ns .. 882 ns | per elem |
| peel, per difference | binary-lambda.122/d=1350,m=2700,prefilter=true,batch=true,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_122-lambda | batch | 646 ns | 643 ns .. 649 ns | per elem |
| peel, per difference | binary-lambda.122/d=4,m=10,prefilter=true,batch=true,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_122-lambda | batch | 568 ns | 567 ns .. 569 ns | per elem |
| peel, per difference | binary-lambda.122/d=4,m=8,prefilter=true,batch=true,h2c=pornin-addend | gf2_122-lambda | batch | 492 ns | 491 ns .. 493 ns | per elem |
| peel, per difference | binary-u.122/d=10000,m=20000,prefilter=true,batch=true,h2c=pornin-addend | gf2_122-u | batch | 1.11 µs | 1.11 µs .. 1.11 µs | per elem |
| peel, per difference | binary-u.122/d=10000,m=20000,prefilter=true,batch=true,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_122-u | batch | 923 ns | 922 ns .. 925 ns | per elem |
| peel, per difference | binary-u.122/d=1350,m=2700,prefilter=true,batch=true,h2c=pornin-addend | gf2_122-u | batch | 821 ns | 819 ns .. 824 ns | per elem |
| peel, per difference | binary-u.122/d=1350,m=2700,prefilter=true,batch=true,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_122-u | batch | 597 ns | 595 ns .. 598 ns | per elem |
| peel, per difference | binary-u.122/d=4,m=10,prefilter=true,batch=true,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_122-u | batch | 584 ns | 583 ns .. 586 ns | per elem |
| peel, per difference | binary-u.122/d=4,m=8,prefilter=true,batch=true,h2c=pornin-addend | gf2_122-u | batch | 504 ns | 503 ns .. 505 ns | per elem |
| peel, per difference | binary-w.122/d=10000,m=20000,prefilter=true,batch=true,h2c=pornin-addend | gf2_122-w | batch | 1.22 µs | 1.21 µs .. 1.22 µs | per elem |
| peel, per difference | binary-w.122/d=10000,m=20000,prefilter=true,batch=true,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_122-w | batch | 1.03 µs | 1.02 µs .. 1.03 µs | per elem |
| peel, per difference | binary-w.122/d=1350,m=2700,prefilter=true,batch=true,h2c=pornin-addend | gf2_122-w | batch | 887 ns | 883 ns .. 891 ns | per elem |
| peel, per difference | binary-w.122/d=1350,m=2700,prefilter=true,batch=true,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_122-w | batch | 639 ns | 634 ns .. 643 ns | per elem |
| peel, per difference | binary-w.122/d=4,m=10,prefilter=true,batch=true,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_122-w | batch | 563 ns | 561 ns .. 565 ns | per elem |
| peel, per difference | binary-w.122/d=4,m=8,prefilter=true,batch=true,h2c=pornin-addend | gf2_122-w | batch | 492 ns | 490 ns .. 493 ns | per elem |
| peel, per difference | binary.127/d=10000,m=20000,prefilter=true,batch=true,h2c=pornin | gf2_127 | batch | 1.13 µs | 1.13 µs .. 1.14 µs | per elem |
| peel, per difference | binary.127/d=10000,m=20000,prefilter=true,batch=true,h2c=pornin,proj=gf2_127,mapproj=gf2_127 | gf2_127 | batch | 971 ns | 969 ns .. 973 ns | per elem |
| peel, per difference | binary.127/d=1350,m=2700,prefilter=true,batch=true,h2c=pornin | gf2_127 | batch | 844 ns | 841 ns .. 846 ns | per elem |
| peel, per difference | binary.127/d=1350,m=2700,prefilter=true,batch=true,h2c=pornin,proj=gf2_127,mapproj=gf2_127 | gf2_127 | batch | 624 ns | 623 ns .. 626 ns | per elem |
| peel, per difference | binary.127/d=4,m=10,prefilter=true,batch=true,h2c=pornin,proj=gf2_127,mapproj=gf2_127 | gf2_127 | batch | 713 ns | 711 ns .. 715 ns | per elem |
| peel, per difference | binary.127/d=4,m=8,prefilter=true,batch=true,h2c=pornin | gf2_127 | batch | 601 ns | 599 ns .. 603 ns | per elem |
| peel, per difference | binary-lambda.127/d=10000,m=20000,prefilter=true,batch=true,h2c=pornin-addend | gf2_127-lambda | batch | 1.19 µs | 1.19 µs .. 1.20 µs | per elem |
| peel, per difference | binary-lambda.127/d=10000,m=20000,prefilter=true,batch=true,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_127-lambda | batch | 999 ns | 997 ns .. 1.00 µs | per elem |
| peel, per difference | binary-lambda.127/d=1350,m=2700,prefilter=true,batch=true,h2c=pornin-addend | gf2_127-lambda | batch | 878 ns | 874 ns .. 881 ns | per elem |
| peel, per difference | binary-lambda.127/d=1350,m=2700,prefilter=true,batch=true,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_127-lambda | batch | 629 ns | 628 ns .. 631 ns | per elem |
| peel, per difference | binary-lambda.127/d=4,m=10,prefilter=true,batch=true,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_127-lambda | batch | 685 ns | 683 ns .. 686 ns | per elem |
| peel, per difference | binary-lambda.127/d=4,m=8,prefilter=true,batch=true,h2c=pornin-addend | gf2_127-lambda | batch | 574 ns | 572 ns .. 575 ns | per elem |
| peel, per difference | binary-u.127/d=10000,m=20000,prefilter=false,batch=false,h2c=pornin-addend | gf2_127-u | per-element | 1.65 µs | 1.65 µs .. 1.65 µs | per elem |
| peel, per difference | binary-u.127/d=10000,m=20000,prefilter=false,batch=true,h2c=pornin-addend | gf2_127-u | batch | 858 ns | 856 ns .. 859 ns | per elem |
| peel, per difference | binary-u.127/d=10000,m=20000,prefilter=true,batch=false,h2c=pornin-addend | gf2_127-u | per-element | 1.54 µs | 1.54 µs .. 1.54 µs | per elem |
| peel, per difference | binary-u.127/d=10000,m=20000,prefilter=true,batch=true,h2c=pornin-addend | gf2_127-u | batch | 1.08 µs | 1.08 µs .. 1.08 µs | per elem |
| peel, per difference | binary-u.127/d=10000,m=20000,prefilter=true,batch=true,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_127-u | batch | 894 ns | 893 ns .. 896 ns | per elem |
| peel, per difference | binary-u.127/d=1350,m=2700,prefilter=false,batch=false,h2c=pornin-addend | gf2_127-u | per-element | 1.45 µs | 1.45 µs .. 1.46 µs | per elem |
| peel, per difference | binary-u.127/d=1350,m=2700,prefilter=false,batch=true,h2c=pornin-addend | gf2_127-u | batch | 636 ns | 633 ns .. 638 ns | per elem |
| peel, per difference | binary-u.127/d=1350,m=2700,prefilter=true,batch=false,h2c=pornin-addend | gf2_127-u | per-element | 1.26 µs | 1.26 µs .. 1.27 µs | per elem |
| peel, per difference | binary-u.127/d=1350,m=2700,prefilter=true,batch=true,h2c=pornin-addend | gf2_127-u | batch | 796 ns | 793 ns .. 798 ns | per elem |
| peel, per difference | binary-u.127/d=1350,m=2700,prefilter=true,batch=true,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_127-u | batch | 573 ns | 572 ns .. 574 ns | per elem |
| peel, per difference | binary-u.127/d=150,m=300,prefilter=false,batch=false,h2c=pornin-addend | gf2_127-u | per-element | 1.36 µs | 1.36 µs .. 1.37 µs | per elem |
| peel, per difference | binary-u.127/d=150,m=300,prefilter=false,batch=true,h2c=pornin-addend | gf2_127-u | batch | 546 ns | 544 ns .. 547 ns | per elem |
| peel, per difference | binary-u.127/d=150,m=300,prefilter=true,batch=false,h2c=pornin-addend | gf2_127-u | per-element | 1.11 µs | 1.10 µs .. 1.11 µs | per elem |
| peel, per difference | binary-u.127/d=150,m=300,prefilter=true,batch=true,h2c=pornin-addend | gf2_127-u | batch | 639 ns | 637 ns .. 640 ns | per elem |
| peel, per difference | binary-u.127/d=20,m=40,prefilter=false,batch=false,h2c=pornin-addend | gf2_127-u | per-element | 1.10 µs | 1.09 µs .. 1.10 µs | per elem |
| peel, per difference | binary-u.127/d=20,m=40,prefilter=false,batch=true,h2c=pornin-addend | gf2_127-u | batch | 514 ns | 513 ns .. 516 ns | per elem |
| peel, per difference | binary-u.127/d=20,m=40,prefilter=true,batch=false,h2c=pornin-addend | gf2_127-u | per-element | 966 ns | 962 ns .. 970 ns | per elem |
| peel, per difference | binary-u.127/d=20,m=40,prefilter=true,batch=true,h2c=pornin-addend | gf2_127-u | batch | 576 ns | 574 ns .. 577 ns | per elem |
| peel, per difference | binary-u.127/d=4,m=10,prefilter=true,batch=true,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_127-u | batch | 698 ns | 695 ns .. 700 ns | per elem |
| peel, per difference | binary-u.127/d=4,m=8,prefilter=false,batch=false,h2c=pornin-addend | gf2_127-u | per-element | 720 ns | 718 ns .. 722 ns | per elem |
| peel, per difference | binary-u.127/d=4,m=8,prefilter=false,batch=true,h2c=pornin-addend | gf2_127-u | batch | 529 ns | 527 ns .. 530 ns | per elem |
| peel, per difference | binary-u.127/d=4,m=8,prefilter=true,batch=false,h2c=pornin-addend | gf2_127-u | per-element | 769 ns | 767 ns .. 771 ns | per elem |
| peel, per difference | binary-u.127/d=4,m=8,prefilter=true,batch=true,h2c=pornin-addend | gf2_127-u | batch | 576 ns | 575 ns .. 578 ns | per elem |
| peel, per difference | binary-w.127/d=10000,m=20000,prefilter=true,batch=true,h2c=pornin-addend | gf2_127-w | batch | 1.20 µs | 1.20 µs .. 1.20 µs | per elem |
| peel, per difference | binary-w.127/d=10000,m=20000,prefilter=true,batch=true,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_127-w | batch | 999 ns | 997 ns .. 1.00 µs | per elem |
| peel, per difference | binary-w.127/d=1350,m=2700,prefilter=true,batch=true,h2c=pornin-addend | gf2_127-w | batch | 879 ns | 876 ns .. 881 ns | per elem |
| peel, per difference | binary-w.127/d=1350,m=2700,prefilter=true,batch=true,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_127-w | batch | 636 ns | 634 ns .. 638 ns | per elem |
| peel, per difference | binary-w.127/d=4,m=10,prefilter=true,batch=true,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_127-w | batch | 684 ns | 682 ns .. 685 ns | per elem |
| peel, per difference | binary-w.127/d=4,m=8,prefilter=true,batch=true,h2c=pornin-addend | gf2_127-w | batch | 568 ns | 566 ns .. 569 ns | per elem |
| peel, per difference | edwards.107/d=1350,m=2700,prefilter=true,batch=true,h2c=ti | edwards107 | batch | 1.66 µs | 1.65 µs .. 1.66 µs | per elem |
| peel, per difference | edwards.127/d=1350,m=2700,prefilter=true,batch=true,h2c=ti | edwards127 | batch | 1.99 µs | 1.99 µs .. 2.00 µs | per elem |
| peel, per difference | edwards.61x2/d=1350,m=2700,prefilter=true,batch=true,h2c=ti | edwards61x2 | batch | 1.45 µs | 1.45 µs .. 1.46 µs | per elem |
| peel, per difference | twisted.goldilocks2/d=1350,m=2700,prefilter=true,batch=true,h2c=ti | twisted-goldilocks2 | batch | 2.81 µs | 2.80 µs .. 2.82 µs | per elem |
| peel, per difference | twisted.128/d=1350,m=2700,prefilter=true,batch=true,h2c=ti | twisted128 | batch | 3.06 µs | 3.05 µs .. 3.07 µs | per elem |
| peel, per difference | twisted.61x2/d=1350,m=2700,prefilter=true,batch=true,h2c=ti | twisted61x2 | batch | 1.45 µs | 1.45 µs .. 1.45 µs | per elem |
| peel, per difference | twisted.64x2/d=1350,m=2700,prefilter=true,batch=true,h2c=ti | twisted64x2 | batch | 2.00 µs | 2.00 µs .. 2.01 µs | per elem |
| peel, per difference | weier.107/d=1350,m=2700,prefilter=true,batch=true,h2c=ti | weier107 | batch | 1.83 µs | 1.83 µs .. 1.84 µs | per elem |
| peel, per difference | weier-jacobian.107/d=1350,m=2700,prefilter=true,batch=true,h2c=ti | weier107-jacobian | batch | 1.81 µs | 1.81 µs .. 1.82 µs | per elem |
| peel, per difference | weier.127/d=1350,m=2700,prefilter=true,batch=true,h2c=ti | weier127 | batch | 2.29 µs | 2.29 µs .. 2.30 µs | per elem |
| peel, per difference | weier-jacobian.127/d=1350,m=2700,prefilter=true,batch=true,h2c=ti | weier127-jacobian | batch | 2.15 µs | 2.14 µs .. 2.15 µs | per elem |
| peel, per difference | weier.61x2/d=1350,m=2700,prefilter=true,batch=true,h2c=ti | weier61x2 | batch | 1.64 µs | 1.64 µs .. 1.64 µs | per elem |
| peel, per difference | weier-jacobian.61x2/d=1350,m=2700,prefilter=true,batch=true,h2c=ti | weier61x2-jacobian | batch | 1.69 µs | 1.69 µs .. 1.69 µs | per elem |
| peel, per difference | ristretto255/d=1350,m=2700,prefilter=true,batch=true | ristretto255 | batch | 6.84 µs | 6.82 µs .. 6.85 µs | per elem |
| rateless encode and decode, per difference | xor-sha256.64/d=10 | xor | per-element | 572 ns | 570 ns .. 574 ns | per elem |
| rateless encode and decode, per difference | xor-sha256.64/d=100 | xor | per-element | 1.01 µs | 1.00 µs .. 1.01 µs | per elem |
| rateless encode and decode, per difference | xor-sha256.64/d=1000 | xor | per-element | 1.74 µs | 1.74 µs .. 1.74 µs | per elem |
| rateless encode and decode, per difference | xor-sha256.64/d=10000 | xor | per-element | 3.10 µs | 3.08 µs .. 3.13 µs | per elem |
| rateless encode and decode, per difference | xor-sha256.64/d=100000 | xor | per-element | 6.38 µs | 6.35 µs .. 6.42 µs | per elem |
| rateless encode and decode, per difference | xor-sha256.64/d=20 | xor | per-element | 673 ns | 673 ns .. 674 ns | per elem |
| rateless encode and decode, per difference | xor-sha256.64/d=40 | xor | per-element | 785 ns | 784 ns .. 787 ns | per elem |
| rateless encode and decode, per difference | xor-sha256.64/d=50000 | xor | per-element | 4.70 µs | 4.68 µs .. 4.72 µs | per elem |
| rateless encode and decode, per difference | xor-siphash.64/d=10 | xor-siphash | per-element | 514 ns | 512 ns .. 516 ns | per elem |
| rateless encode and decode, per difference | xor-siphash.64/d=10,map=mcg64 | xor-siphash | per-element | 498 ns | 498 ns .. 499 ns | per elem |
| rateless encode and decode, per difference | xor-siphash.64/d=100 | xor-siphash | per-element | 925 ns | 918 ns .. 930 ns | per elem |
| rateless encode and decode, per difference | xor-siphash.64/d=100,map=mcg64 | xor-siphash | per-element | 913 ns | 913 ns .. 914 ns | per elem |
| rateless encode and decode, per difference | xor-siphash.64/d=1000 | xor-siphash | per-element | 1.66 µs | 1.65 µs .. 1.66 µs | per elem |
| rateless encode and decode, per difference | xor-siphash.64/d=1000,map=mcg64 | xor-siphash | per-element | 1.65 µs | 1.65 µs .. 1.66 µs | per elem |
| rateless encode and decode, per difference | xor-siphash.64/d=10000 | xor-siphash | per-element | 3.01 µs | 2.98 µs .. 3.04 µs | per elem |
| rateless encode and decode, per difference | xor-siphash.64/d=10000,map=chacha8 | xor-siphash | per-element | 3.78 µs | 3.75 µs .. 3.81 µs | per elem |
| rateless encode and decode, per difference | xor-siphash.64/d=10000,map=mcg64 | xor-siphash | per-element | 2.97 µs | 2.94 µs .. 2.99 µs | per elem |
| rateless encode and decode, per difference | xor-siphash.64/d=100000 | xor-siphash | per-element | 6.29 µs | 6.25 µs .. 6.34 µs | per elem |
| rateless encode and decode, per difference | xor-siphash.64/d=100000,map=chacha8 | xor-siphash | per-element | 12.8 µs | 12.8 µs .. 12.9 µs | per elem |
| rateless encode and decode, per difference | xor-siphash.64/d=100000,map=mcg64 | xor-siphash | per-element | 5.55 µs | 5.49 µs .. 5.60 µs | per elem |
| rateless encode and decode, per difference | xor-siphash.64/d=20 | xor-siphash | per-element | 604 ns | 602 ns .. 605 ns | per elem |
| rateless encode and decode, per difference | xor-siphash.64/d=20,map=mcg64 | xor-siphash | per-element | 592 ns | 591 ns .. 592 ns | per elem |
| rateless encode and decode, per difference | xor-siphash.64/d=40 | xor-siphash | per-element | 709 ns | 708 ns .. 711 ns | per elem |
| rateless encode and decode, per difference | xor-siphash.64/d=40,map=mcg64 | xor-siphash | per-element | 687 ns | 683 ns .. 690 ns | per elem |
| rateless encode and decode, per difference | xor-siphash.64/d=50000 | xor-siphash | per-element | 4.65 µs | 4.63 µs .. 4.66 µs | per elem |
| rateless encode and decode, per difference | xor-siphash.64/d=50000,map=mcg64 | xor-siphash | per-element | 4.52 µs | 4.50 µs .. 4.54 µs | per elem |
| rateless encode and decode, per difference | binary.109/d=10,h2c=pornin | gf2_109 | per-element | 2.12 µs | 2.11 µs .. 2.12 µs | per elem |
| rateless encode and decode, per difference | binary.109/d=1000,h2c=pornin | gf2_109 | per-element | 3.97 µs | 3.95 µs .. 3.99 µs | per elem |
| rateless encode and decode, per difference | binary.109/d=100000,h2c=pornin | gf2_109 | per-element | 9.42 µs | 9.37 µs .. 9.47 µs | per elem |
| rateless encode and decode, per difference | binary-lambda.109/d=10,h2c=pornin-addend | gf2_109-lambda | per-element | 2.09 µs | 2.09 µs .. 2.10 µs | per elem |
| rateless encode and decode, per difference | binary-lambda.109/d=100,h2c=pornin-addend | gf2_109-lambda | per-element | 2.98 µs | 2.97 µs .. 2.99 µs | per elem |
| rateless encode and decode, per difference | binary-lambda.109/d=1000,h2c=pornin-addend | gf2_109-lambda | per-element | 3.92 µs | 3.90 µs .. 3.93 µs | per elem |
| rateless encode and decode, per difference | binary-lambda.109/d=10000,h2c=pornin-addend | gf2_109-lambda | per-element | 5.41 µs | 5.37 µs .. 5.44 µs | per elem |
| rateless encode and decode, per difference | binary-lambda.109/d=100000,h2c=pornin-addend | gf2_109-lambda | per-element | 9.36 µs | 9.30 µs .. 9.41 µs | per elem |
| rateless encode and decode, per difference | binary-lambda.109/d=20,h2c=pornin-addend | gf2_109-lambda | per-element | 2.40 µs | 2.39 µs .. 2.41 µs | per elem |
| rateless encode and decode, per difference | binary-lambda.109/d=40,h2c=pornin-addend | gf2_109-lambda | per-element | 2.64 µs | 2.64 µs .. 2.65 µs | per elem |
| rateless encode and decode, per difference | binary-lambda.109/d=50000,h2c=pornin-addend | gf2_109-lambda | per-element | 7.48 µs | 7.44 µs .. 7.52 µs | per elem |
| rateless encode and decode, per difference | binary-u.109/d=10,h2c=pornin-addend | gf2_109-u | per-element | 2.05 µs | 2.05 µs .. 2.06 µs | per elem |
| rateless encode and decode, per difference | binary-u.109/d=100,h2c=pornin-addend | gf2_109-u | per-element | 2.91 µs | 2.90 µs .. 2.92 µs | per elem |
| rateless encode and decode, per difference | binary-u.109/d=1000,h2c=pornin-addend | gf2_109-u | per-element | 3.85 µs | 3.84 µs .. 3.85 µs | per elem |
| rateless encode and decode, per difference | binary-u.109/d=10000,h2c=pornin-addend | gf2_109-u | per-element | 5.35 µs | 5.32 µs .. 5.38 µs | per elem |
| rateless encode and decode, per difference | binary-u.109/d=100000,h2c=pornin-addend | gf2_109-u | per-element | 8.96 µs | 8.88 µs .. 9.05 µs | per elem |
| rateless encode and decode, per difference | binary-u.109/d=20,h2c=pornin-addend | gf2_109-u | per-element | 2.34 µs | 2.33 µs .. 2.34 µs | per elem |
| rateless encode and decode, per difference | binary-u.109/d=40,h2c=pornin-addend | gf2_109-u | per-element | 2.56 µs | 2.55 µs .. 2.56 µs | per elem |
| rateless encode and decode, per difference | binary-u.109/d=50000,h2c=pornin-addend | gf2_109-u | per-element | 7.33 µs | 7.29 µs .. 7.37 µs | per elem |
| rateless encode and decode, per difference | binary-w.109/d=10,h2c=pornin-addend | gf2_109-w | per-element | 2.09 µs | 2.09 µs .. 2.10 µs | per elem |
| rateless encode and decode, per difference | binary-w.109/d=100,h2c=pornin-addend | gf2_109-w | per-element | 2.98 µs | 2.97 µs .. 2.99 µs | per elem |
| rateless encode and decode, per difference | binary-w.109/d=1000,h2c=pornin-addend | gf2_109-w | per-element | 3.92 µs | 3.91 µs .. 3.93 µs | per elem |
| rateless encode and decode, per difference | binary-w.109/d=10000,h2c=pornin-addend | gf2_109-w | per-element | 5.41 µs | 5.38 µs .. 5.44 µs | per elem |
| rateless encode and decode, per difference | binary-w.109/d=100000,h2c=pornin-addend | gf2_109-w | per-element | 9.36 µs | 9.32 µs .. 9.39 µs | per elem |
| rateless encode and decode, per difference | binary-w.109/d=20,h2c=pornin-addend | gf2_109-w | per-element | 2.40 µs | 2.40 µs .. 2.41 µs | per elem |
| rateless encode and decode, per difference | binary-w.109/d=40,h2c=pornin-addend | gf2_109-w | per-element | 2.64 µs | 2.63 µs .. 2.65 µs | per elem |
| rateless encode and decode, per difference | binary-w.109/d=50000,h2c=pornin-addend | gf2_109-w | per-element | 7.48 µs | 7.45 µs .. 7.51 µs | per elem |
| rateless encode and decode, per difference | binary.122/d=10,h2c=pornin | gf2_122 | per-element | 1.70 µs | 1.70 µs .. 1.71 µs | per elem |
| rateless encode and decode, per difference | binary.122/d=1000,h2c=pornin | gf2_122 | per-element | 3.56 µs | 3.55 µs .. 3.57 µs | per elem |
| rateless encode and decode, per difference | binary.122/d=100000,h2c=pornin | gf2_122 | per-element | 9.61 µs | 9.59 µs .. 9.63 µs | per elem |
| rateless encode and decode, per difference | binary.122-gls/d=10,h2c=pornin | gf2_122-gls | per-element | 1.68 µs | 1.67 µs .. 1.68 µs | per elem |
| rateless encode and decode, per difference | binary.122-gls/d=1000,h2c=pornin | gf2_122-gls | per-element | 3.49 µs | 3.48 µs .. 3.51 µs | per elem |
| rateless encode and decode, per difference | binary.122-gls/d=100000,h2c=pornin | gf2_122-gls | per-element | 9.09 µs | 9.07 µs .. 9.11 µs | per elem |
| rateless encode and decode, per difference | binary-lambda.122-gls/d=10,h2c=pornin-addend | gf2_122-gls-lambda | per-element | 1.63 µs | 1.63 µs .. 1.64 µs | per elem |
| rateless encode and decode, per difference | binary-lambda.122-gls/d=1000,h2c=pornin-addend | gf2_122-gls-lambda | per-element | 3.44 µs | 3.43 µs .. 3.44 µs | per elem |
| rateless encode and decode, per difference | binary-lambda.122-gls/d=100000,h2c=pornin-addend | gf2_122-gls-lambda | per-element | 8.99 µs | 8.96 µs .. 9.02 µs | per elem |
| rateless encode and decode, per difference | binary-u.122-gls/d=10,h2c=pornin-addend | gf2_122-gls-u | per-element | 1.59 µs | 1.58 µs .. 1.59 µs | per elem |
| rateless encode and decode, per difference | binary-u.122-gls/d=1000,h2c=pornin-addend | gf2_122-gls-u | per-element | 3.35 µs | 3.34 µs .. 3.37 µs | per elem |
| rateless encode and decode, per difference | binary-u.122-gls/d=100000,h2c=pornin-addend | gf2_122-gls-u | per-element | 8.69 µs | 8.62 µs .. 8.76 µs | per elem |
| rateless encode and decode, per difference | binary-w.122-gls/d=10,h2c=pornin-addend | gf2_122-gls-w | per-element | 1.63 µs | 1.63 µs .. 1.64 µs | per elem |
| rateless encode and decode, per difference | binary-w.122-gls/d=1000,h2c=pornin-addend | gf2_122-gls-w | per-element | 3.43 µs | 3.43 µs .. 3.44 µs | per elem |
| rateless encode and decode, per difference | binary-w.122-gls/d=100000,h2c=pornin-addend | gf2_122-gls-w | per-element | 8.97 µs | 8.94 µs .. 9.00 µs | per elem |
| rateless encode and decode, per difference | binary-lambda.122/d=10,h2c=pornin-addend | gf2_122-lambda | per-element | 1.64 µs | 1.64 µs .. 1.65 µs | per elem |
| rateless encode and decode, per difference | binary-lambda.122/d=1000,h2c=pornin-addend | gf2_122-lambda | per-element | 3.44 µs | 3.43 µs .. 3.45 µs | per elem |
| rateless encode and decode, per difference | binary-lambda.122/d=100000,h2c=pornin-addend | gf2_122-lambda | per-element | 9.02 µs | 8.97 µs .. 9.08 µs | per elem |
| rateless encode and decode, per difference | binary-u.122/d=10,h2c=pornin-addend | gf2_122-u | per-element | 1.59 µs | 1.58 µs .. 1.59 µs | per elem |
| rateless encode and decode, per difference | binary-u.122/d=1000,h2c=pornin-addend | gf2_122-u | per-element | 3.35 µs | 3.35 µs .. 3.36 µs | per elem |
| rateless encode and decode, per difference | binary-u.122/d=100000,h2c=pornin-addend | gf2_122-u | per-element | 8.72 µs | 8.68 µs .. 8.78 µs | per elem |
| rateless encode and decode, per difference | binary-w.122/d=10,h2c=pornin-addend | gf2_122-w | per-element | 1.64 µs | 1.63 µs .. 1.64 µs | per elem |
| rateless encode and decode, per difference | binary-w.122/d=1000,h2c=pornin-addend | gf2_122-w | per-element | 3.43 µs | 3.42 µs .. 3.44 µs | per elem |
| rateless encode and decode, per difference | binary-w.122/d=100000,h2c=pornin-addend | gf2_122-w | per-element | 8.97 µs | 8.93 µs .. 9.02 µs | per elem |
| rateless encode and decode, per difference | binary.127/d=10,h2c=pornin | gf2_127 | per-element | 2.00 µs | 1.99 µs .. 2.01 µs | per elem |
| rateless encode and decode, per difference | binary.127/d=10,h2c=pornin,map=mcg64 | gf2_127 | per-element | 2.01 µs | 2.00 µs .. 2.01 µs | per elem |
| rateless encode and decode, per difference | binary.127/d=100,h2c=pornin,map=mcg64 | gf2_127 | per-element | 2.90 µs | 2.90 µs .. 2.90 µs | per elem |
| rateless encode and decode, per difference | binary.127/d=1000,h2c=pornin | gf2_127 | per-element | 3.89 µs | 3.87 µs .. 3.91 µs | per elem |
| rateless encode and decode, per difference | binary.127/d=1000,h2c=pornin,map=mcg64 | gf2_127 | per-element | 3.86 µs | 3.85 µs .. 3.88 µs | per elem |
| rateless encode and decode, per difference | binary.127/d=10000,h2c=pornin,map=chacha8 | gf2_127 | per-element | 6.30 µs | 6.27 µs .. 6.32 µs | per elem |
| rateless encode and decode, per difference | binary.127/d=10000,h2c=pornin,map=mcg64 | gf2_127 | per-element | 5.41 µs | 5.38 µs .. 5.43 µs | per elem |
| rateless encode and decode, per difference | binary.127/d=100000,h2c=pornin | gf2_127 | per-element | 9.37 µs | 9.34 µs .. 9.41 µs | per elem |
| rateless encode and decode, per difference | binary.127/d=100000,h2c=pornin,map=chacha8 | gf2_127 | per-element | 15.8 µs | 15.7 µs .. 15.8 µs | per elem |
| rateless encode and decode, per difference | binary.127/d=100000,h2c=pornin,map=mcg64 | gf2_127 | per-element | 8.69 µs | 8.64 µs .. 8.75 µs | per elem |
| rateless encode and decode, per difference | binary.127/d=20,h2c=pornin,map=mcg64 | gf2_127 | per-element | 2.30 µs | 2.29 µs .. 2.30 µs | per elem |
| rateless encode and decode, per difference | binary.127/d=40,h2c=pornin,map=mcg64 | gf2_127 | per-element | 2.55 µs | 2.53 µs .. 2.57 µs | per elem |
| rateless encode and decode, per difference | binary.127/d=50000,h2c=pornin,map=mcg64 | gf2_127 | per-element | 7.47 µs | 7.42 µs .. 7.51 µs | per elem |
| rateless encode and decode, per difference | binary-lambda.127/d=10,h2c=pornin-addend | gf2_127-lambda | per-element | 1.97 µs | 1.97 µs .. 1.98 µs | per elem |
| rateless encode and decode, per difference | binary-lambda.127/d=1000,h2c=pornin-addend | gf2_127-lambda | per-element | 3.90 µs | 3.89 µs .. 3.91 µs | per elem |
| rateless encode and decode, per difference | binary-lambda.127/d=100000,h2c=pornin-addend | gf2_127-lambda | per-element | 9.40 µs | 9.35 µs .. 9.46 µs | per elem |
| rateless encode and decode, per difference | binary-u.127/d=10,h2c=pornin-addend | gf2_127-u | per-element | 1.95 µs | 1.95 µs .. 1.96 µs | per elem |
| rateless encode and decode, per difference | binary-u.127/d=100,h2c=pornin-addend | gf2_127-u | per-element | 2.84 µs | 2.83 µs .. 2.85 µs | per elem |
| rateless encode and decode, per difference | binary-u.127/d=1000,h2c=pornin-addend | gf2_127-u | per-element | 3.81 µs | 3.80 µs .. 3.82 µs | per elem |
| rateless encode and decode, per difference | binary-u.127/d=10000,h2c=pornin-addend | gf2_127-u | per-element | 5.31 µs | 5.27 µs .. 5.34 µs | per elem |
| rateless encode and decode, per difference | binary-u.127/d=100000,h2c=pornin-addend | gf2_127-u | per-element | 9.00 µs | 8.91 µs .. 9.08 µs | per elem |
| rateless encode and decode, per difference | binary-u.127/d=20,h2c=pornin-addend | gf2_127-u | per-element | 2.24 µs | 2.23 µs .. 2.24 µs | per elem |
| rateless encode and decode, per difference | binary-u.127/d=40,h2c=pornin-addend | gf2_127-u | per-element | 2.47 µs | 2.46 µs .. 2.48 µs | per elem |
| rateless encode and decode, per difference | binary-u.127/d=50000,h2c=pornin-addend | gf2_127-u | per-element | 7.31 µs | 7.28 µs .. 7.35 µs | per elem |
| rateless encode and decode, per difference | binary-w.127/d=10,h2c=pornin-addend | gf2_127-w | per-element | 1.97 µs | 1.97 µs .. 1.98 µs | per elem |
| rateless encode and decode, per difference | binary-w.127/d=1000,h2c=pornin-addend | gf2_127-w | per-element | 3.90 µs | 3.89 µs .. 3.92 µs | per elem |
| rateless encode and decode, per difference | binary-w.127/d=100000,h2c=pornin-addend | gf2_127-w | per-element | 9.38 µs | 9.33 µs .. 9.42 µs | per elem |
| rateless encode and decode, per difference | edwards.107/d=1000,h2c=ti | edwards107 | per-element | 7.08 µs | 7.06 µs .. 7.10 µs | per elem |
| rateless encode and decode, per difference | edwards.127/d=1000,h2c=ti | edwards127 | per-element | 8.34 µs | 8.29 µs .. 8.39 µs | per elem |
| rateless encode and decode, per difference | edwards.61x2/d=1000,h2c=ti | edwards61x2 | per-element | 5.46 µs | 5.45 µs .. 5.48 µs | per elem |
| rateless encode and decode, per difference | twisted.goldilocks2/d=1000,h2c=ti | twisted-goldilocks2 | per-element | 9.02 µs | 8.98 µs .. 9.06 µs | per elem |
| rateless encode and decode, per difference | twisted.128/d=1000,h2c=ti | twisted128 | per-element | 9.97 µs | 9.93 µs .. 10.0 µs | per elem |
| rateless encode and decode, per difference | twisted.61x2/d=1000,h2c=ti | twisted61x2 | per-element | 4.70 µs | 4.69 µs .. 4.72 µs | per elem |
| rateless encode and decode, per difference | twisted.64x2/d=1000,h2c=ti | twisted64x2 | per-element | 6.53 µs | 6.51 µs .. 6.56 µs | per elem |
| rateless encode and decode, per difference | weier.107/d=1000,h2c=ti | weier107 | per-element | 5.99 µs | 5.98 µs .. 6.01 µs | per elem |
| rateless encode and decode, per difference | weier-jacobian.107/d=1000,h2c=ti | weier107-jacobian | per-element | 5.80 µs | 5.77 µs .. 5.83 µs | per elem |
| rateless encode and decode, per difference | weier.127/d=1000,h2c=ti | weier127 | per-element | 7.70 µs | 7.68 µs .. 7.73 µs | per elem |
| rateless encode and decode, per difference | weier-jacobian.127/d=1000,h2c=ti | weier127-jacobian | per-element | 7.12 µs | 7.08 µs .. 7.15 µs | per elem |
| rateless encode and decode, per difference | weier.61x2/d=1000,h2c=ti | weier61x2 | per-element | 5.32 µs | 5.26 µs .. 5.37 µs | per elem |
| rateless encode and decode, per difference | weier-jacobian.61x2/d=1000,h2c=ti | weier61x2-jacobian | per-element | 5.52 µs | 5.50 µs .. 5.54 µs | per elem |
| rateless encode and decode, per difference | ristretto255/d=10 | ristretto255 | per-element | 14.1 µs | 14.0 µs .. 14.2 µs | per elem |
| rateless encode and decode, per difference | ristretto255/d=10,map=mcg64 | ristretto255 | per-element | 14.2 µs | 14.1 µs .. 14.4 µs | per elem |
| rateless encode and decode, per difference | ristretto255/d=100 | ristretto255 | per-element | 18.8 µs | 18.8 µs .. 18.9 µs | per elem |
| rateless encode and decode, per difference | ristretto255/d=100,map=mcg64 | ristretto255 | per-element | 18.6 µs | 18.5 µs .. 18.7 µs | per elem |
| rateless encode and decode, per difference | ristretto255/d=1000 | ristretto255 | per-element | 21.7 µs | 21.5 µs .. 21.8 µs | per elem |
| rateless encode and decode, per difference | ristretto255/d=1000,map=mcg64 | ristretto255 | per-element | 21.7 µs | 21.6 µs .. 21.7 µs | per elem |
| rateless encode and decode, per difference | ristretto255/d=10000 | ristretto255 | per-element | 25.2 µs | 25.1 µs .. 25.3 µs | per elem |
| rateless encode and decode, per difference | ristretto255/d=10000,map=chacha8 | ristretto255 | per-element | 26.3 µs | 26.3 µs .. 26.4 µs | per elem |
| rateless encode and decode, per difference | ristretto255/d=10000,map=mcg64 | ristretto255 | per-element | 25.0 µs | 24.8 µs .. 25.1 µs | per elem |
| rateless encode and decode, per difference | ristretto255/d=100000 | ristretto255 | per-element | 34.9 µs | 34.8 µs .. 35.0 µs | per elem |
| rateless encode and decode, per difference | ristretto255/d=100000,map=chacha8 | ristretto255 | per-element | 42.1 µs | 41.9 µs .. 42.3 µs | per elem |
| rateless encode and decode, per difference | ristretto255/d=100000,map=mcg64 | ristretto255 | per-element | 33.5 µs | 33.4 µs .. 33.6 µs | per elem |
| rateless encode and decode, per difference | ristretto255/d=20 | ristretto255 | per-element | 15.7 µs | 15.6 µs .. 15.9 µs | per elem |
| rateless encode and decode, per difference | ristretto255/d=20,map=mcg64 | ristretto255 | per-element | 15.8 µs | 15.7 µs .. 15.9 µs | per elem |
| rateless encode and decode, per difference | ristretto255/d=40 | ristretto255 | per-element | 17.3 µs | 17.3 µs .. 17.4 µs | per elem |
| rateless encode and decode, per difference | ristretto255/d=40,map=mcg64 | ristretto255 | per-element | 17.3 µs | 17.2 µs .. 17.3 µs | per elem |
| rateless encode and decode, per difference | ristretto255/d=50000 | ristretto255 | per-element | 31.1 µs | 31.0 µs .. 31.2 µs | per elem |
| rateless encode and decode, per difference | ristretto255/d=50000,map=mcg64 | ristretto255 | per-element | 30.2 µs | 30.1 µs .. 30.3 µs | per elem |
| mapping, per index | chacha8/next | mapping | per-element | 10.5 ns | 10.4 ns .. 10.5 ns | per elem |
| mapping, per index | mcg64/next | mapping | per-element | 5.68 ns | 5.66 ns .. 5.69 ns | per elem |
| mapping, per index | sha256-ctr/next | mapping | per-element | 8.47 ns | 8.45 ns .. 8.49 ns | per elem |
| mapping, per index | xoshiro256pp/next | mapping | per-element | 5.66 ns | 5.65 ns .. 5.67 ns | per elem |
| mapping, per item | chacha8/item,m=12150 | mapping | per-element | 289 ns | 288 ns .. 290 ns | per elem |
| mapping, per item | chacha8/item,m=1350 | mapping | per-element | 252 ns | 252 ns .. 253 ns | per elem |
| mapping, per item | chacha8/item,m=150 | mapping | per-element | 216 ns | 216 ns .. 217 ns | per elem |
| mapping, per item | chacha8/item,m=20 | mapping | per-element | 184 ns | 183 ns .. 184 ns | per elem |
| mapping, per item | chacha8/item,m=5 | mapping | per-element | 162 ns | 161 ns .. 162 ns | per elem |
| mapping, per item | mcg64/item,m=12150 | mapping | per-element | 43.5 ns | 43.3 ns .. 43.8 ns | per elem |
| mapping, per item | mcg64/item,m=1350 | mapping | per-element | 25.0 ns | 24.8 ns .. 25.1 ns | per elem |
| mapping, per item | mcg64/item,m=150 | mapping | per-element | 13.5 ns | 13.4 ns .. 13.6 ns | per elem |
| mapping, per item | mcg64/item,m=20 | mapping | per-element | 6.91 ns | 6.89 ns .. 6.93 ns | per elem |
| mapping, per item | mcg64/item,m=5 | mapping | per-element | 3.57 ns | 3.56 ns .. 3.58 ns | per elem |
| mapping, per item | sha256-ctr/item,m=12150 | mapping | per-element | 198 ns | 198 ns .. 199 ns | per elem |
| mapping, per item | sha256-ctr/item,m=1350 | mapping | per-element | 157 ns | 156 ns .. 158 ns | per elem |
| mapping, per item | sha256-ctr/item,m=150 | mapping | per-element | 119 ns | 119 ns .. 120 ns | per elem |
| mapping, per item | sha256-ctr/item,m=20 | mapping | per-element | 66.4 ns | 66.2 ns .. 66.6 ns | per elem |
| mapping, per item | sha256-ctr/item,m=5 | mapping | per-element | 34.9 ns | 34.8 ns .. 35.0 ns | per elem |
| mapping, per item | xoshiro256pp/item,m=12150 | mapping | per-element | 55.5 ns | 55.2 ns .. 55.7 ns | per elem |
| mapping, per item | xoshiro256pp/item,m=1350 | mapping | per-element | 34.2 ns | 34.0 ns .. 34.4 ns | per elem |
| mapping, per item | xoshiro256pp/item,m=150 | mapping | per-element | 19.8 ns | 19.8 ns .. 19.9 ns | per elem |
| mapping, per item | xoshiro256pp/item,m=20 | mapping | per-element | 10.0 ns | 9.96 ns .. 10.1 ns | per elem |
| mapping, per item | xoshiro256pp/item,m=5 | mapping | per-element | 4.85 ns | 4.82 ns .. 4.88 ns | per elem |
| map digest of an ID | projection-fp127/digest of id | mapping | per-element | 9.61 ns | 9.59 ns .. 9.62 ns | per elem |
| map digest of an ID | projection-fp130/digest of id | mapping | per-element | 16.5 ns | 16.3 ns .. 16.7 ns | per elem |
| map digest of an ID | projection-gf2_127/digest of id | mapping | per-element | 5.11 ns | 5.10 ns .. 5.12 ns | per elem |
| map digest of an ID | salted-sha256/digest of id | mapping | per-element | 33.0 ns | 32.9 ns .. 33.2 ns | per elem |
| per-salt keys | projection-fp127/keys | mapping | per-element | 266 ns | 266 ns .. 267 ns | per elem |
| per-salt keys | projection-fp130/keys | mapping | per-element | 321 ns | 320 ns .. 321 ns | per elem |
| per-salt keys | projection-gf2_127/keys | mapping | per-element | 257 ns | 257 ns .. 258 ns | per elem |
| per-salt keys | salted-sha256/keys | mapping | per-element | 74.7 ns | 74.4 ns .. 75.0 ns | per elem |
| item ID | sha256/id | xor | per-element | 33.1 ns | 33.0 ns .. 33.1 ns | per elem |
| map digest | salted-sha256/digest | mapping | per-element | 34.6 ns | 33.8 ns .. 35.3 ns | per elem |
digest
Figure
11 benchmarks
| operation | benchmark | family | mode | time | 95% CI | unit |
|---|---|---|---|---|---|---|
| digest | xor-sha256 | xor | per-element | 25.7 ns | 25.6 ns .. 25.9 ns | per elem |
| digest | gf2_109/batch | gf2_109 | batch | 93.0 ns | 92.9 ns .. 93.1 ns | per elem |
| digest | gf2_122/batch | gf2_122 | batch | 90.8 ns | 88.8 ns .. 93.0 ns | per elem |
| digest | gf2_122-gls/batch | gf2_122-gls | batch | 90.3 ns | 90.3 ns .. 90.4 ns | per elem |
| digest | gf2_127/batch | gf2_127 | batch | 88.5 ns | 88.5 ns .. 88.6 ns | per elem |
| digest | edwards107/batch | edwards107 | batch | 785 ns | 784 ns .. 786 ns | per elem |
| digest | edwards127/batch | edwards127 | batch | 1.08 µs | 1.08 µs .. 1.08 µs | per elem |
| digest | weier107/batch | weier107 | batch | 775 ns | 775 ns .. 776 ns | per elem |
| digest | weier127/batch | weier127 | batch | 1.05 µs | 1.04 µs .. 1.05 µs | per elem |
| digest | ristretto255/streaming | ristretto255 | streaming | 4.81 µs | 4.81 µs .. 4.82 µs | per elem |
| digest | secp256k1/try-and-increment + combine_keys | secp256k1 | batch | 4.59 µs | 4.59 µs .. 4.60 µs | per elem |
curve generation
Figure
85 benchmarks
| operation | benchmark | family | mode | time | 95% CI | unit |
|---|---|---|---|---|---|---|
| accept certificate | gf2_109/0 | gf2_109 | total | 55.2 µs | 54.7 µs .. 55.4 µs | per iter |
| accept certificate | gf2_122/0 | gf2_122 | total | 55.2 µs | 54.8 µs .. 55.4 µs | per iter |
| accept certificate | gf2_122-gls/0 | gf2_122-gls | total | 58.6 µs | 58.1 µs .. 58.9 µs | per iter |
| accept certificate | gf2_127/0 | gf2_127 | total | 56.1 µs | 55.9 µs .. 56.2 µs | per iter |
| accept certificate | edwards107/0 | edwards107 | total | 57.6 µs | 57.2 µs .. 58.0 µs | per iter |
| accept certificate | edwards127/0 | edwards127 | total | 61.0 µs | 60.7 µs .. 61.2 µs | per iter |
| accept certificate | edwards61x2/0 | edwards61x2 | total | 61.2 µs | 60.7 µs .. 61.5 µs | per iter |
| accept certificate | twisted-goldilocks2/0 | twisted-goldilocks2 | total | 59.9 µs | 59.4 µs .. 60.4 µs | per iter |
| accept certificate | twisted128/0 | twisted128 | total | 63.9 µs | 63.6 µs .. 64.0 µs | per iter |
| accept certificate | twisted61x2/0 | twisted61x2 | total | 60.3 µs | 59.9 µs .. 60.5 µs | per iter |
| accept certificate | twisted64x2/0 | twisted64x2 | total | 64.3 µs | 63.7 µs .. 64.7 µs | per iter |
| accept certificate | weier107/0 | weier107 | total | 59.7 µs | 59.4 µs .. 59.8 µs | per iter |
| accept certificate | weier127/0 | weier127 | total | 67.6 µs | 67.2 µs .. 67.9 µs | per iter |
| accept certificate | weier61x2/0 | weier61x2 | total | 63.1 µs | 62.6 µs .. 63.7 µs | per iter |
| verify certificate | gf2_109/198 rejections/0 | gf2_109 | total | 190 µs | 188 µs .. 192 µs | per iter |
| verify certificate | gf2_122/4 rejections/0 | gf2_122 | total | 57.1 µs | 56.8 µs .. 57.5 µs | per iter |
| verify certificate | gf2_122-gls/60 rejections/0 | gf2_122-gls | total | 114 µs | 113 µs .. 115 µs | per iter |
| verify certificate | gf2_127/30 rejections/0 | gf2_127 | total | 75.3 µs | 74.9 µs .. 75.8 µs | per iter |
| verify certificate | edwards107/28 rejections/0 | edwards107 | total | 142 µs | 142 µs .. 143 µs | per iter |
| verify certificate | edwards127/56 rejections/0 | edwards127 | total | 256 µs | 254 µs .. 258 µs | per iter |
| verify certificate | edwards61x2/118 rejections/0 | edwards61x2 | total | 318 µs | 316 µs .. 320 µs | per iter |
| verify certificate | twisted-goldilocks2/32 rejections/0 | twisted-goldilocks2 | total | 144 µs | 143 µs .. 144 µs | per iter |
| verify certificate | twisted128/4 rejections/0 | twisted128 | total | 73.6 µs | 73.4 µs .. 73.9 µs | per iter |
| verify certificate | twisted61x2/344 rejections/0 | twisted61x2 | total | 589 µs | 584 µs .. 593 µs | per iter |
| verify certificate | twisted64x2/36 rejections/0 | twisted64x2 | total | 160 µs | 159 µs .. 161 µs | per iter |
| verify certificate | weier107/519 rejections/0 | weier107 | total | 384 µs | 382 µs .. 385 µs | per iter |
| verify certificate | weier127/125 rejections/0 | weier127 | total | 159 µs | 158 µs .. 160 µs | per iter |
| verify certificate | weier61x2/123 rejections/0 | weier61x2 | total | 146 µs | 145 µs .. 147 µs | per iter |
| embedding-degree bound | gf2_109/0 | gf2_109 | total | 30.3 µs | 30.2 µs .. 30.4 µs | per iter |
| embedding-degree bound | gf2_122/0 | gf2_122 | total | 30.3 µs | 30.1 µs .. 30.5 µs | per iter |
| embedding-degree bound | gf2_122-gls/0 | gf2_122-gls | total | 30.7 µs | 30.7 µs .. 30.8 µs | per iter |
| embedding-degree bound | gf2_127/0 | gf2_127 | total | 30.5 µs | 30.4 µs .. 30.6 µs | per iter |
| embedding-degree bound | edwards107/0 | edwards107 | total | 30.3 µs | 30.2 µs .. 30.4 µs | per iter |
| embedding-degree bound | edwards127/0 | edwards127 | total | 30.6 µs | 30.5 µs .. 30.7 µs | per iter |
| embedding-degree bound | edwards61x2/0 | edwards61x2 | total | 30.1 µs | 29.8 µs .. 30.5 µs | per iter |
| embedding-degree bound | twisted-goldilocks2/0 | twisted-goldilocks2 | total | 30.1 µs | 30.0 µs .. 30.2 µs | per iter |
| embedding-degree bound | twisted128/0 | twisted128 | total | 30.4 µs | 30.2 µs .. 30.6 µs | per iter |
| embedding-degree bound | twisted61x2/0 | twisted61x2 | total | 29.6 µs | 29.5 µs .. 29.7 µs | per iter |
| embedding-degree bound | twisted64x2/0 | twisted64x2 | total | 30.4 µs | 30.3 µs .. 30.4 µs | per iter |
| embedding-degree bound | weier107/0 | weier107 | total | 30.6 µs | 30.4 µs .. 30.7 µs | per iter |
| embedding-degree bound | weier127/0 | weier127 | total | 30.3 µs | 30.2 µs .. 30.4 µs | per iter |
| embedding-degree bound | weier61x2/0 | weier61x2 | total | 30.5 µs | 30.3 µs .. 30.7 µs | per iter |
| find (Rust: AGM + sieve) | gf2_127 agm+sieve/index 114/1 | gf2_127 | total | 23.6 ms | 23.5 ms .. 23.7 ms | per iter |
| find (Rust: AGM + sieve) | gf2_127 agm+sieve/index 14/3 | gf2_127 | total | 2.38 ms | 2.37 ms .. 2.39 ms | per iter |
| find (Rust: AGM + sieve) | gf2_127 agm+sieve/index 30/0 | gf2_127 | total | 4.71 ms | 4.68 ms .. 4.75 ms | per iter |
| find (Rust: AGM + sieve) | gf2_127 agm+sieve/index 54/2 | gf2_127 | total | 11.7 ms | 11.6 ms .. 11.7 ms | per iter |
| certify (Rust: AGM + sieve + order witnesses) | gf2_127 agm+sieve/index 114/1 | gf2_127 | total | 23.8 ms | 23.6 ms .. 23.9 ms | per iter |
| certify (Rust: AGM + sieve + order witnesses) | gf2_127 agm+sieve/index 14/3 | gf2_127 | total | 2.45 ms | 2.44 ms .. 2.46 ms | per iter |
| certify (Rust: AGM + sieve + order witnesses) | gf2_127 agm+sieve/index 30/0 | gf2_127 | total | 4.77 ms | 4.74 ms .. 4.81 ms | per iter |
| certify (Rust: AGM + sieve + order witnesses) | gf2_127 agm+sieve/index 54/2 | gf2_127 | total | 11.7 ms | 11.7 ms .. 11.8 ms | per iter |
| point count (PARI) | gf2_127 | gf2_127 | total | 2.10 ms | 2.08 ms .. 2.11 ms | per iter |
| point count (PARI) | edwards127 | edwards127 | total | 53.8 ms | 53.7 ms .. 53.9 ms | per iter |
| point count (PARI) | edwards61x2 | edwards61x2 | total | 40.3 ms | 40.1 ms .. 40.5 ms | per iter |
| point count (PARI) | twisted-goldilocks2 | twisted-goldilocks2 | total | 49.3 ms | 49.1 ms .. 49.4 ms | per iter |
| point count (PARI) | twisted61x2 | twisted61x2 | total | 44.7 ms | 44.6 ms .. 44.8 ms | per iter |
| point count (PARI) | twisted64x2 | twisted64x2 | total | 51.3 ms | 51.2 ms .. 51.4 ms | per iter |
| point count (PARI) | weier127 | weier127 | total | 62.0 ms | 61.8 ms .. 62.2 ms | per iter |
| point count (PARI) | weier61x2 | weier61x2 | total | 39.5 ms | 39.3 ms .. 39.6 ms | per iter |
| point count (Rust AGM) | order | gf2_127 | total | 446 µs | 445 µs .. 447 µs | per iter |
| AGM steps | tables | gf2_127 | total | 1.63 ms | 1.63 ms .. 1.64 ms | per iter |
| AGM steps | trace | gf2_127 | total | 425 µs | 424 µs .. 425 µs | per iter |
| Z_q ring op | mul | gf2_127 | total | 2.25 µs | 2.24 µs .. 2.25 µs | per iter |
| Z_q ring op | sigma | gf2_127 | total | 2.58 µs | 2.56 µs .. 2.61 µs | per iter |
| Z_q ring op | sigma_inv | gf2_127 | total | 2.60 µs | 2.58 µs .. 2.62 µs | per iter |
| Z_q ring op | square | gf2_127 | total | 1.36 µs | 1.35 µs .. 1.36 µs | per iter |
| sieve, one l | gf2_127/11 | gf2_127 | total | 272 µs | 271 µs .. 273 µs | per iter |
| sieve, one l | gf2_127/13 | gf2_127 | total | 519 µs | 518 µs .. 520 µs | per iter |
| sieve, one l | gf2_127/3 | gf2_127 | total | 4.11 µs | 4.10 µs .. 4.12 µs | per iter |
| sieve, one l | gf2_127/5 | gf2_127 | total | 14.5 µs | 14.5 µs .. 14.5 µs | per iter |
| sieve, one l | gf2_127/7 | gf2_127 | total | 47.4 µs | 47.3 µs .. 47.6 µs | per iter |
| sieve, one l | edwards127/11 | edwards127 | total | 1.84 ms | 1.83 ms .. 1.84 ms | per iter |
| sieve, one l | edwards127/13 | edwards127 | total | 3.58 ms | 3.57 ms .. 3.58 ms | per iter |
| sieve, one l | edwards127/3 | edwards127 | total | 12.7 µs | 12.7 µs .. 12.7 µs | per iter |
| sieve, one l | edwards127/5 | edwards127 | total | 83.9 µs | 83.7 µs .. 84.1 µs | per iter |
| sieve, one l | edwards127/7 | edwards127 | total | 310 µs | 309 µs .. 310 µs | per iter |
| sieve, one l | edwards127/8 | edwards127 | total | 1.03 µs | 1.03 µs .. 1.03 µs | per iter |
| sieve, one l | weier127/11 | weier127 | total | 1.84 ms | 1.83 ms .. 1.84 ms | per iter |
| sieve, one l | weier127/13 | weier127 | total | 3.57 ms | 3.56 ms .. 3.57 ms | per iter |
| sieve, one l | weier127/2 | weier127 | total | 8.40 µs | 8.39 µs .. 8.42 µs | per iter |
| sieve, one l | weier127/3 | weier127 | total | 12.6 µs | 12.6 µs .. 12.6 µs | per iter |
| sieve, one l | weier127/5 | weier127 | total | 83.9 µs | 83.7 µs .. 84.0 µs | per iter |
| sieve, one l | weier127/7 | weier127 | total | 310 µs | 309 µs .. 310 µs | per iter |
| sieve, per candidate | gf2_127/7 | gf2_127 | per-element | 38.7 µs | 38.6 µs .. 38.7 µs | per elem |
| sieve, per candidate | edwards127/13 | edwards127 | per-element | 1.26 ms | 1.26 ms .. 1.27 ms | per elem |
| sieve, per candidate | weier127/13 | weier127 | per-element | 786 µs | 784 µs .. 787 µs | per elem |
Lower bound, every family
One hash plus an addition to each of the cells an item maps to in a sketch of cells (: ; : ; : ; : ; : ), from each family’s fastest hash and addition in any representation, without conversions; the only estimate for families without group-trait benchmarks.
| family | hashing | hash | hash time | add | add time | m=5 | m=20 | m=150 | m=1350 | m=12150 |
|---|---|---|---|---|---|---|---|---|---|---|
| xor | one at a time | sha256 (XOR baseline) | 24.2 ns | xor-sha256/xor 32B, 1 accumulator | 0.38 ns | 25.3 ns | 26.2 ns | 27.6 ns | 29.3 ns | 30.9 ns |
| gf2_109 | one at a time | gf2_109/pornin map x1 | 560 ns | binary.109/mode=throughput | 12.8 ns | 598 ns | 628 ns | 678 ns | 735 ns | 791 ns |
| gf2_109 | batched | gf2_109/pornin map x1, batched | 63.7 ns | binary.109/mode=throughput | 12.8 ns | 101 ns | 132 ns | 182 ns | 238 ns | 295 ns |
| gf2_109-lambda | one at a time | gf2_109-lambda/pornin map x1 to (x, λ) | 550 ns | binary-lambda.109/mode=throughput | 12.0 ns | 585 ns | 614 ns | 660 ns | 713 ns | 765 ns |
| gf2_109-lambda | batched | gf2_109-lambda/pornin map x1 to (x, λ), batched | 55.2 ns | binary-lambda.109/mode=throughput | 12.0 ns | 90.0 ns | 119 ns | 165 ns | 218 ns | 271 ns |
| gf2_109-u | one at a time | gf2_109-u/pornin map x1 to (u, v) | 533 ns | binary-u.109/mode=throughput | 9.76 ns | 561 ns | 584 ns | 622 ns | 665 ns | 708 ns |
| gf2_109-u | batched | gf2_109-u/pornin map x1 to (u, v), batched | 60.7 ns | binary-u.109/mode=throughput | 9.76 ns | 89.0 ns | 112 ns | 150 ns | 193 ns | 236 ns |
| gf2_109-w | one at a time | gf2_109-w/pornin map x1 to (x, λ) | 535 ns | binary-w.109/mode=throughput | 12.0 ns | 569 ns | 598 ns | 645 ns | 697 ns | 750 ns |
| gf2_109-w | batched | gf2_109-w/pornin map x1 to (x, λ), batched | 54.5 ns | binary-w.109/mode=throughput | 12.0 ns | 89.2 ns | 118 ns | 165 ns | 217 ns | 270 ns |
| gf2_122 | one at a time | gf2_122/pornin map x1 | 373 ns | binary.122/mode=throughput | 17.8 ns | 425 ns | 467 ns | 537 ns | 615 ns | 693 ns |
| gf2_122 | batched | gf2_122/pornin map x1, batched | 62.8 ns | binary.122/mode=throughput | 17.8 ns | 115 ns | 157 ns | 227 ns | 305 ns | 383 ns |
| gf2_122-gls | one at a time | gf2_122-gls/pornin map x1 | 369 ns | binary.122-gls/mode=throughput | 16.8 ns | 417 ns | 457 ns | 523 ns | 596 ns | 670 ns |
| gf2_122-gls | batched | gf2_122-gls/pornin map x1, batched | 62.0 ns | binary.122-gls/mode=throughput | 16.8 ns | 111 ns | 151 ns | 216 ns | 290 ns | 363 ns |
| gf2_122-gls-lambda | one at a time | gf2_122-gls-lambda/pornin map x1 to (x, λ) | 315 ns | binary-lambda.122-gls/mode=throughput | 16.6 ns | 363 ns | 403 ns | 467 ns | 540 ns | 612 ns |
| gf2_122-gls-lambda | batched | gf2_122-gls-lambda/pornin map x1 to (x, λ), batched | 55.4 ns | binary-lambda.122-gls/mode=throughput | 16.6 ns | 103 ns | 143 ns | 208 ns | 280 ns | 353 ns |
| gf2_122-gls-u | one at a time | gf2_122-gls-u/pornin map x1 to (u, v) | 319 ns | binary-u.122-gls/mode=throughput | 13.1 ns | 357 ns | 388 ns | 439 ns | 497 ns | 554 ns |
| gf2_122-gls-u | batched | gf2_122-gls-u/pornin map x1 to (u, v), batched | 55.7 ns | binary-u.122-gls/mode=throughput | 13.1 ns | 93.7 ns | 125 ns | 176 ns | 233 ns | 291 ns |
| gf2_122-gls-w | one at a time | gf2_122-gls-w/pornin map x1 to (x, λ) | 316 ns | binary-w.122-gls/mode=throughput | 16.6 ns | 364 ns | 403 ns | 468 ns | 540 ns | 613 ns |
| gf2_122-gls-w | batched | gf2_122-gls-w/pornin map x1 to (x, λ), batched | 55.4 ns | binary-w.122-gls/mode=throughput | 16.6 ns | 103 ns | 143 ns | 208 ns | 280 ns | 353 ns |
| gf2_122-lambda | one at a time | gf2_122-lambda/pornin map x1 to (x, λ) | 326 ns | binary-lambda.122/mode=throughput | 16.6 ns | 374 ns | 414 ns | 479 ns | 551 ns | 624 ns |
| gf2_122-lambda | batched | gf2_122-lambda/pornin map x1 to (x, λ), batched | 53.9 ns | binary-lambda.122/mode=throughput | 16.6 ns | 102 ns | 142 ns | 206 ns | 279 ns | 351 ns |
| gf2_122-u | one at a time | gf2_122-u/pornin map x1 to (u, v) | 326 ns | binary-u.122/mode=throughput | 13.1 ns | 364 ns | 395 ns | 446 ns | 503 ns | 561 ns |
| gf2_122-u | batched | gf2_122-u/pornin map x1 to (u, v), batched | 57.1 ns | binary-u.122/mode=throughput | 13.1 ns | 95.0 ns | 126 ns | 177 ns | 234 ns | 292 ns |
| gf2_122-w | one at a time | gf2_122-w/pornin map x1 to (x, λ) | 326 ns | binary-w.122/mode=throughput | 16.6 ns | 374 ns | 414 ns | 479 ns | 551 ns | 624 ns |
| gf2_122-w | batched | gf2_122-w/pornin map x1 to (x, λ), batched | 54.0 ns | binary-w.122/mode=throughput | 16.6 ns | 102 ns | 142 ns | 206 ns | 279 ns | 352 ns |
| gf2_127 | one at a time | gf2_127/pornin map x1 | 485 ns | binary.127/mode=throughput | 14.1 ns | 526 ns | 560 ns | 615 ns | 676 ns | 738 ns |
| gf2_127 | batched | gf2_127/pornin map x1, batched | 61.5 ns | binary.127/mode=throughput | 14.1 ns | 102 ns | 136 ns | 191 ns | 252 ns | 314 ns |
| gf2_127-lambda | one at a time | gf2_127-lambda/pornin map x1 to (x, λ) | 456 ns | binary-lambda.127/mode=throughput | 14.9 ns | 499 ns | 535 ns | 593 ns | 658 ns | 724 ns |
| gf2_127-lambda | batched | gf2_127-lambda/pornin map x1 to (x, λ), batched | 53.5 ns | binary-lambda.127/mode=throughput | 14.9 ns | 96.8 ns | 132 ns | 191 ns | 256 ns | 322 ns |
| gf2_127-u | one at a time | gf2_127-u/pornin map x1 to (u, v) | 461 ns | binary-u.127/mode=throughput | 10.7 ns | 491 ns | 517 ns | 559 ns | 605 ns | 652 ns |
| gf2_127-u | batched | gf2_127-u/pornin map x1 to (u, v), batched | 57.2 ns | binary-u.127/mode=throughput | 10.7 ns | 88.1 ns | 114 ns | 155 ns | 202 ns | 249 ns |
| gf2_127-w | one at a time | gf2_127-w/pornin map x1 to (x, λ) | 455 ns | binary-w.127/mode=throughput | 14.9 ns | 498 ns | 534 ns | 592 ns | 657 ns | 722 ns |
| gf2_127-w | batched | gf2_127-w/pornin map x1 to (x, λ), batched | 53.5 ns | binary-w.127/mode=throughput | 14.9 ns | 96.7 ns | 132 ns | 190 ns | 256 ns | 321 ns |
| edwards107 | one at a time | edwards.107/mode=indep | 806 ns | edwards.107/mode=throughput | 15.5 ns | 851 ns | 888 ns | 948 ns | 1.02 µs | 1.08 µs |
| edwards107 | batched | edwards.107/mode=batch,n=1024 | 805 ns | edwards.107/mode=throughput | 15.5 ns | 850 ns | 887 ns | 947 ns | 1.02 µs | 1.08 µs |
| edwards127 | one at a time | edwards.127/mode=indep | 1.07 µs | edwards.127/mode=throughput | 20.1 ns | 1.13 µs | 1.17 µs | 1.25 µs | 1.34 µs | 1.43 µs |
| edwards127 | batched | edwards.127/mode=batch,n=1024 | 1.07 µs | edwards.127/mode=throughput | 20.1 ns | 1.13 µs | 1.18 µs | 1.25 µs | 1.34 µs | 1.43 µs |
| edwards61x2 | one at a time | edwards.61x2/mode=indep | 624 ns | edwards.61x2/mode=throughput | 13.3 ns | 663 ns | 695 ns | 747 ns | 805 ns | 864 ns |
| edwards61x2 | batched | edwards.61x2/mode=batch,n=1024 | 620 ns | edwards.61x2/mode=throughput | 13.3 ns | 659 ns | 691 ns | 743 ns | 801 ns | 860 ns |
| twisted-goldilocks2 | one at a time | twisted.goldilocks2/mode=indep | 1.73 µs | twisted.goldilocks2/mode=throughput | 15.0 ns | 1.77 µs | 1.81 µs | 1.87 µs | 1.93 µs | 2.00 µs |
| twisted-goldilocks2 | batched | twisted.goldilocks2/mode=batch,n=1024 | 1.75 µs | twisted.goldilocks2/mode=throughput | 15.0 ns | 1.79 µs | 1.83 µs | 1.89 µs | 1.95 µs | 2.02 µs |
| twisted128 | one at a time | twisted.128/mode=indep | 1.92 µs | twisted.128/mode=throughput | 23.9 ns | 1.99 µs | 2.05 µs | 2.14 µs | 2.25 µs | 2.35 µs |
| twisted128 | batched | twisted.128/mode=batch,n=1024 | 1.92 µs | twisted.128/mode=throughput | 23.9 ns | 1.99 µs | 2.05 µs | 2.14 µs | 2.25 µs | 2.35 µs |
| twisted61x2 | one at a time | twisted.61x2/mode=indep | 630 ns | twisted.61x2/mode=throughput | 12.5 ns | 666 ns | 696 ns | 745 ns | 799 ns | 854 ns |
| twisted61x2 | batched | twisted.61x2/mode=batch,n=1024 | 632 ns | twisted.61x2/mode=throughput | 12.5 ns | 668 ns | 698 ns | 747 ns | 801 ns | 856 ns |
| twisted64x2 | one at a time | twisted.64x2/mode=indep | 1.10 µs | twisted.64x2/mode=throughput | 17.2 ns | 1.15 µs | 1.19 µs | 1.26 µs | 1.33 µs | 1.41 µs |
| twisted64x2 | batched | twisted.64x2/mode=batch,n=1024 | 1.10 µs | twisted.64x2/mode=throughput | 17.2 ns | 1.15 µs | 1.19 µs | 1.26 µs | 1.33 µs | 1.41 µs |
| weier107 | one at a time | weier.107/mode=indep | 746 ns | weier.107/mode=throughput | 30.5 ns | 834 ns | 907 ns | 1.03 µs | 1.16 µs | 1.29 µs |
| weier107 | batched | weier.107/mode=batch,n=1024 | 748 ns | weier.107/mode=throughput | 30.5 ns | 837 ns | 909 ns | 1.03 µs | 1.16 µs | 1.30 µs |
| weier107-jacobian | one at a time | weier-jacobian.107/mode=indep | 742 ns | weier-jacobian.107/mode=throughput | 28.7 ns | 826 ns | 894 ns | 1.01 µs | 1.13 µs | 1.26 µs |
| weier107-jacobian | batched | weier-jacobian.107/mode=batch,n=1024 | 745 ns | weier-jacobian.107/mode=throughput | 28.7 ns | 828 ns | 897 ns | 1.01 µs | 1.13 µs | 1.26 µs |
| weier127 | one at a time | weier.127/mode=indep | 1.03 µs | weier.127/mode=throughput | 45.4 ns | 1.16 µs | 1.27 µs | 1.44 µs | 1.64 µs | 1.84 µs |
| weier127 | batched | weier.127/mode=batch,n=1024 | 1.04 µs | weier.127/mode=throughput | 45.4 ns | 1.17 µs | 1.28 µs | 1.45 µs | 1.65 µs | 1.85 µs |
| weier127-jacobian | one at a time | weier-jacobian.127/mode=indep | 1.03 µs | weier-jacobian.127/mode=throughput | 37.5 ns | 1.14 µs | 1.23 µs | 1.38 µs | 1.54 µs | 1.71 µs |
| weier127-jacobian | batched | weier-jacobian.127/mode=batch,n=1024 | 1.04 µs | weier-jacobian.127/mode=throughput | 37.5 ns | 1.15 µs | 1.24 µs | 1.38 µs | 1.55 µs | 1.71 µs |
| weier61x2 | one at a time | weier.61x2/mode=indep | 637 ns | weier.61x2/mode=throughput | 26.8 ns | 715 ns | 779 ns | 883 ns | 1.00 µs | 1.12 µs |
| weier61x2 | batched | weier.61x2/mode=batch,n=1024 | 637 ns | weier.61x2/mode=throughput | 26.8 ns | 714 ns | 778 ns | 883 ns | 1000 ns | 1.12 µs |
| weier61x2-jacobian | one at a time | weier-jacobian.61x2/mode=indep | 638 ns | weier-jacobian.61x2/mode=throughput | 31.6 ns | 730 ns | 806 ns | 929 ns | 1.07 µs | 1.21 µs |
| weier61x2-jacobian | batched | weier-jacobian.61x2/mode=batch,n=1024 | 638 ns | weier-jacobian.61x2/mode=throughput | 31.6 ns | 729 ns | 805 ns | 929 ns | 1.07 µs | 1.21 µs |
| ristretto255 | one at a time | ristretto255/hash_from_bytes<Sha512> | 4.72 µs | ristretto255/+=, 1 accumulator | 63.8 ns | 4.90 µs | 5.05 µs | 5.30 µs | 5.58 µs | 5.86 µs |
Apple M4 · rustc 1.98.1 · RUSTFLAGS=-C target-cpu=apple-m4 · ef9e82d39fbf · full profile · 2026-10-08