Benchmark run Intel(R) Xeon(R) W-1390P @ 3.50GHz · x86-64-v3 · full · ef9e82d3
Run Intel(R) Xeon(R) W-1390P @ 3.50GHz · x86-64-v3 · full · ef9e82d3 started 2026-10-08T18:42:23Z on Intel(R) Xeon(R) W-1390P @ 3.50GHz (?, x86_64) and timed commit ef9e82d39fbf06c605e1740360370f0003dc4ca4, built by rustc 1.98.1 (48a229cea 2026-09-01) with RUSTFLAGS -C target-cpu=x86-64-v3 -C target-feature=+pclmulqdq, in the full profile.
1623 benchmarks from run Intel(R) Xeon(R) W-1390P @ 3.50GHz · x86-64-v3 · 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 89 to 99% 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 | 19.5 ns (1.48× the best) | 22.7 ns (1.81× the best) | 25.7 ns (1.23× the best) | 103 ns (1.11× the best) | 368 ns (1.33× the best) | 26.7 ms (1.48× the best) | 16.0 ms | 170 µs | agm+sieve | Rust (AGM), PARI | gf2_127-lambda, gf2_127-w |
| gf2_127-lambdaincompleteλ-projective (X:L:Z) accumulators; Pornin x1: hash to addend; output already an addend | 62.8 | 17.6 ns (1.34× the best) | 17.5 ns (1.39× the best) | 24.0 ns (1.15× the best) | 92.7 ns (tied for the best, within noise) | 332 ns (1.20× the best) | 24.1 ms (1.33× the best) | 16.0 ms | 170 µ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 | 17.7 ns (1.34× the best) | 17.0 ns (1.35× the best) | 22.6 ns (1.08× the best) | 92.8 ns (tied for the best, within noise, 1.00×) | 333 ns (1.20× the best) | 24.2 ms (1.34× the best) | 16.0 ms | 170 µ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 | 13.2 ns (best) | 12.6 ns (best) | 27.5 ns (1.32× the best) | 98.0 ns (1.06× the best) | 277 ns (best) | 18.1 ms (best) | 16.0 ms | 170 µ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 | 19.9 ns (1.51× the best) | 22.1 ns (1.76× the best) | 24.0 ns (1.15× the best) | 103 ns (1.11× the best) | 373 ns (1.35× the best) | 27.2 ms (1.51× the best) | 18.1 ms | 126 µs | agm | Rust (AGM), PARI | gf2_127-w |
| gf2_122-lambdaincompleteλ-projective; Pornin x1: hash to addend; output already an addend | 60.3 | 20.2 ns (1.53× the best) | 17.3 ns (1.37× the best) | 24.1 ns (1.15× the best) | 95.0 ns (1.02× the best) | 370 ns (1.33× the best) | 27.6 ms (1.53× the best) | 18.1 ms | 126 µs | agm | Rust (AGM), PARI | gf2_127-w |
| gf2_122-wincompleteλ-projective, w codec; Pornin x1: hash to addend; output already an addend | 60.3 | 20.5 ns (1.55× the best) | 21.2 ns (1.69× the best) | 21.6 ns (1.03× the best) | 95.2 ns (1.03× the best) | 374 ns (1.35× the best) | 28.0 ms (1.55× the best) | 18.1 ms | 126 µs | agm | Rust (AGM), PARI | none |
| gf2_122-uunscaled (X:S:Z), w codec; Pornin x1: hash to addend; output already an addend | 60.3 | 14.3 ns (1.08× the best) | 18.4 ns (1.47× the best) | 26.0 ns (1.24× the best) | 99.3 ns (1.07× the best) | 294 ns (1.06× the best) | 19.6 ms (1.08× the best) | 18.1 ms | 126 µ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 | 19.3 ns (1.46× the best) | 21.1 ns (1.68× the best) | 22.7 ns (1.08× the best) | 101 ns (1.09× the best) | 363 ns (1.31× the best) | 26.4 ms (1.46× the best) | 5.75 ms | 152 µs | agm | Rust (AGM), PARI | none |
| gf2_122-gls-lambdaincompleteλ-projective; Pornin x1: hash to addend; output already an addend | 59.8 | 20.3 ns (1.53× the best) | 17.9 ns (1.42× the best) | 22.6 ns (1.08× the best) | 95.0 ns (1.03× the best) | 370 ns (1.33× the best) | 27.6 ms (1.53× the best) | 5.75 ms | 152 µs | agm | Rust (AGM), PARI | none |
| gf2_122-gls-wincompleteλ-projective, w codec; Pornin x1: hash to addend; output already an addend | 59.8 | 20.3 ns (1.54× the best) | 20.4 ns (1.62× the best) | 20.9 ns (best) | 94.6 ns (1.02× the best) | 370 ns (1.34× the best) | 27.7 ms (1.53× the best) | 5.75 ms | 152 µs | agm | Rust (AGM), PARI | none |
| gf2_122-gls-uunscaled (X:S:Z), w codec; Pornin x1: hash to addend; output already an addend | 59.8 | 13.7 ns (1.04× the best) | 18.0 ns (1.44× the best) | 24.7 ns (1.18× the best) | 97.6 ns (1.05× the best) | 284 ns (1.02× the best) | 18.8 ms (1.04× the best) | 5.75 ms | 152 µ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 | 20.4 ns (1.54× the best) | 18.2 ns (1.45× the best) | 26.7 ns (1.28× the best) | 114 ns (1.23× the best) | 390 ns (1.41× the best) | 27.8 ms (1.54× the best) | 20.7 ms | 135 µs | agm+factor | Rust (AGM), PARI | gf2_109-lambda, gf2_122-gls-lambda, gf2_122-lambda, gf2_127-lambda, gf2_127-w |
| gf2_109-lambdaincompleteλ-projective; Pornin x1: hash to addend; output already an addend | 53.8 | 18.9 ns (1.43× the best) | 14.1 ns (1.12× the best) | 26.5 ns (1.27× the best) | 105 ns (1.13× the best) | 361 ns (1.30× the best) | 25.8 ms (1.43× the best) | 20.7 ms | 135 µs | agm+factor | Rust (AGM), PARI | none |
| gf2_109-wincompleteλ-projective, w codec; Pornin x1: hash to addend; output already an addend | 53.8 | 18.9 ns (1.43× the best) | 21.6 ns (1.72× the best) | 24.4 ns (1.17× the best) | 104 ns (1.12× the best) | 361 ns (1.30× the best) | 25.9 ms (1.43× the best) | 20.7 ms | 135 µs | agm+factor | Rust (AGM), PARI | gf2_127-lambda, gf2_127-w |
| gf2_109-uunscaled (X:S:Z), w codec; Pornin x1: hash to addend; output already an addend | 53.8 | 13.5 ns (1.02× the best) | 21.9 ns (1.74× the best) | 27.7 ns (1.33× the best) | 110 ns (1.18× the best) | 293 ns (1.06× the best) | 18.5 ms (1.02× the best) | 20.7 ms | 135 µs | agm+factor | Rust (AGM), PARI | gf2_127-u |
| F_p, p = 2^127 − 1, 16 bytes | ||||||||||||
| edwards127a = 1 Edwards, extended += cached | 62.3 | 27.5 ns (2.08× the best) | 31.9 ns (2.54× the best) | 541 ns (25.90× the best) | 1.28 µs (13.78× the best) | 1.65 µs (5.95× the best) | 39.4 ms (2.18× the best) | 1.08 s | 504 µs | pari+sieve | PARI | gf2_127, gf2_127-lambda, gf2_127-u, gf2_127-w |
| weier127short Weierstrass, projective += affine | 63.3 | 58.7 ns (4.45× the best) | 16.7 ns (1.33× the best) | 539 ns (25.81× the best) | 1.17 µs (12.59× the best) | 1.96 µs (7.08× the best) | 81.6 ms (4.51× the best) | 1.27 s | 278 µs | pari+sieve | PARI | none |
| weier127-jacobianincompleteshort Weierstrass, Jacobian += affine | 63.3 | 48.1 ns (3.64× the best) | 23.6 ns (1.88× the best) | 542 ns (25.93× the best) | 1.16 µs (12.50× the best) | 1.81 µs (6.54× the best) | 67.2 ms (3.72× the best) | 1.27 s | 278 µs | pari+sieve | PARI | none |
| F_p, p = 2^107 − 1, 14 bytes | ||||||||||||
| edwards107a = 1 Edwards, extended += cached | 52.3 | 27.6 ns (2.09× the best) | 35.1 ns (2.80× the best) | 426 ns (20.37× the best) | 954 ns (10.30× the best) | 1.33 µs (4.79× the best) | 39.0 ms (2.16× the best) | Sage | gf2_109, gf2_109-lambda, gf2_109-u, gf2_109-w, gf2_122, 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 | |||
| weier107short Weierstrass, projective += affine | 53.3 | 48.6 ns (3.68× the best) | 19.4 ns (1.54× the best) | 422 ns (20.19× the best) | 902 ns (9.73× the best) | 1.56 µs (5.63× the best) | 67.4 ms (3.73× the best) | Sage | gf2_109, gf2_109-lambda, gf2_122-gls-lambda, gf2_122-gls-u, gf2_122-lambda, gf2_122-u, gf2_127-lambda, gf2_127-u, gf2_127-w | |||
| weier107-jacobianincompleteshort Weierstrass, Jacobian += affine | 53.3 | 44.1 ns (3.34× the best) | 25.5 ns (2.03× the best) | 421 ns (20.13× the best) | 894 ns (9.64× the best) | 1.49 µs (5.39× the best) | 61.4 ms (3.40× the best) | Sage | gf2_109, gf2_109-lambda, gf2_109-u, gf2_109-w, gf2_122, 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 | 31.1 ns (2.35× the best) | 22.7 ns (1.81× the best) | 962 ns (46.04× the best) | 1.97 µs (21.28× the best) | 2.39 µs (8.64× the best) | 45.5 ms (2.52× the best) | Sage | gf2_127-lambda, gf2_127-u, gf2_127-w | |||
| F_{p²}, p = 2^61 − 1, 16 bytes | ||||||||||||
| edwards61x2a = 1 Edwards, signed-x codec, extended += cached | 59.8 | 25.8 ns (1.95× the best) | 35.0 ns (2.79× the best) | 441 ns (21.08× the best) | 741 ns (7.99× the best) | 1.09 µs (3.94× the best) | 36.4 ms (2.01× the best) | 577 ms | 257 µs | pari+sieve | PARI | gf2_122, 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 |
| weier61x2short Weierstrass, signed-x codec, projective += affine | 60.8 | 50.6 ns (3.83× the best) | 15.3 ns (1.22× the best) | 448 ns (21.43× the best) | 698 ns (7.53× the best) | 1.38 µs (5.00× the best) | 70.0 ms (3.87× the best) | 639 ms | 188 µs | pari+sieve | PARI | gf2_127-u |
| weier61x2-jacobianincompleteshort Weierstrass, signed-x codec, Jacobian += affine | 60.8 | 50.2 ns (3.80× the best) | 24.8 ns (1.97× the best) | 445 ns (21.28× the best) | 699 ns (7.54× the best) | 1.38 µs (4.98× the best) | 69.4 ms (3.84× the best) | 639 ms | 188 µs | pari+sieve | PARI | gf2_127, gf2_127-lambda, gf2_127-u, gf2_127-w |
| twisted61x2a = −1 Edwards modulo 2-torsion, extended += cached | 59.8 | 24.9 ns (1.89× the best) | 14.9 ns (1.19× the best) | 450 ns (21.55× the best) | 719 ns (7.75× the best) | 1.06 µs (3.81× the best) | 35.2 ms (1.95× the best) | 1.28 s | 318 µs | pari+sieve | PARI | gf2_127-u |
| F_{p²}, p = 2^64 − 59, 16 bytes | ||||||||||||
| twisted64x2a = −1 Edwards modulo 2-torsion, extended += cached | 62.8 | 33.3 ns (2.52× the best) | 22.6 ns (1.80× the best) | 647 ns (30.96× the best) | 1.01 µs (10.92× the best) | 1.46 µs (5.28× the best) | 47.1 ms (2.60× the best) | 2.20 s | 552 µs | pari+sieve | PARI | gf2_127-lambda, gf2_127-u, gf2_127-w |
| F_{p²}, p = 2^64 − 2^32 + 1, 16 bytes | ||||||||||||
| twisted-goldilocks2a = −1 Edwards modulo 2-torsion, extended += cached | 62.8 | 28.7 ns (2.18× the best) | 22.9 ns (1.83× the best) | 1.92 µs (92.00× the best) | 2.25 µs (24.24× the best) | 2.64 µs (9.51× the best) | 43.9 ms (2.43× the best) | 2.02 s | 767 µ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
| Intel(R) Xeon(R) W-1390P @ 3.50GHz · x86-64-v3 · full · ef9e82d3 | |
|---|---|
| CPU | Intel(R) Xeon(R) W-1390P @ 3.50GHz, 16 cores, 126 GiB |
| OS | ? (Linux 6.18.48, x86_64) |
| rustc | rustc 1.98.1 (48a229cea 2026-09-01) |
| RUSTFLAGS | -C target-cpu=x86-64-v3 -C target-feature=+pclmulqdq |
| field backend features | avx2, pclmulqdq, sse4.1 |
| 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-08T18:42:23Z .. 2026-10-08T23:22:43Z |
Load averages by phase while the run timed (Measurement methodology).
| phase | seconds | 1-minute average, mean | runnable, mean | runnable, most |
|---|---|---|---|---|
| idle before | 25 | 1.32 | 0.00 | 0.0 |
| compare | 660 | 1.30 | 1.26 | 3.0 |
| compare107 | 260 | 1.39 | 1.27 | 3.0 |
| compare109 | 260 | 1.45 | 1.13 | 3.0 |
| compare122 | 400 | 1.12 | 1.12 | 2.0 |
| compare_fp2 | 570 | 1.08 | 1.10 | 2.0 |
| group | 3730 | 1.25 | 1.22 | 20.0 |
| group wide | 3055 | 1.25 | 1.17 | 18.0 |
| riblt mapping | 345 | 1.15 | 1.07 | 3.0 |
| riblt plan | 25 | 1.03 | 1.20 | 2.0 |
| riblt | 6660 | 1.16 | 1.13 | 16.0 |
| agm | 85 | 1.16 | 1.06 | 2.0 |
| sieve | 240 | 1.09 | 1.52 | 16.0 |
| curvegen | 90 | 1.04 | 1.11 | 2.0 |
| curvegen searches | 365 | 1.08 | 1.15 | 3.0 |
| idle after | 30 | 0.83 | 0.00 | 0.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.127 | lead |
| binary-u.122-gls | lead |
| binary-u.109 | lead |
| binary-u.122 | lead |
| binary-lambda.127 | lead |
| binary-w.127 | lead |
| binary-lambda.109 | lead |
| binary-w.109 | lead |
| binary.122-gls | lead |
| binary.127 | lead |
| binary-lambda.122 | lead |
| binary-lambda.122-gls | lead |
| binary-w.122-gls | lead |
| binary.122 | lead |
| binary-w.122 | lead |
| binary.109 | 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 | buffer | 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 | full | gf2_127 | gf2_127 |
| binary-u.109 | pornin-addend | full | gf2_127 | gf2_127 |
| binary-u.122 | pornin-addend | full | gf2_127 | gf2_127 |
| binary-u.122-gls | pornin-addend | full | gf2_127 | gf2_127 |
| binary-u.127 | pornin-addend | full | gf2_127 | gf2_127 |
| binary-w.109 | pornin-addend | buffer | 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 | full | gf2_127 | gf2_127 |
| binary.109 | pornin | buffer | gf2_127 | gf2_127 |
| binary.122 | pornin | buffer | gf2_127 | gf2_127 |
| binary.122-gls | pornin | buffer | gf2_127 | gf2_127 |
| 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): 78.2 ns at , 101 ns at , 138 ns at , 175 ns at , 211 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 | 113 ns (1.22× the best) | 6.36 ns (13.70× the best) | 19.5 ns (1.48× the best) | 254 ns (1.18× the best) | 323 ns (1.20× the best) | 437 ns (1.22× the best) | 560 ns (1.24× the best) | 681 ns (1.25× the best) |
| gf2_127compare suitePornin x1: hash to addend; output already an addend | 103 ns (1.11× the best) | in the hash | 19.5 ns (1.48× the best) | 237 ns (1.11× the best) | 307 ns (1.14× the best) | 420 ns (1.18× the best) | 543 ns (1.20× the best) | 664 ns (1.22× the best) |
| gf2_127-lambdaincompleteλ-projective (X:L:Z) accumulators | 114 ns (1.23× the best) | 8.18 ns (17.62× the best) | 17.6 ns (1.34× the best) | 252 ns (1.17× the best) | 316 ns (1.18× the best) | 422 ns (1.18× the best) | 537 ns (1.19× the best) | 650 ns (1.19× the best) |
| gf2_127-lambdaincompletecompare suitehashed straight to : no prepare | 111 ns (1.20× the best) | in the hash | 17.6 ns (1.34× the best) | 241 ns (1.12× the best) | 305 ns (1.14× the best) | 411 ns (1.15× the best) | 526 ns (1.16× the best) | 639 ns (1.17× the best) |
| gf2_127-lambdaincompletecompare suitePornin x1: hash to addend; output already an addend | 92.7 ns (tied for the best, within noise) | in the hash | 17.6 ns (1.34× the best) | 222 ns (1.04× the best) | 287 ns (1.07× the best) | 393 ns (1.10× the best) | 507 ns (1.12× the best) | 620 ns (1.14× the best) |
| gf2_127-wincompleteλ-projective, w codec: hashes and decodes to λ-affine | 119 ns (1.29× the best) | 0.47 ns (1.01× the best) | 17.7 ns (1.34× the best) | 249 ns (1.16× the best) | 314 ns (1.17× the best) | 420 ns (1.18× the best) | 535 ns (1.18× the best) | 648 ns (1.19× the best) |
| gf2_127-wincompletecompare suitePornin x1: hash to addend; output already an addend | 92.8 ns (tied for the best, within noise, 1.00×) | in the hash | 17.7 ns (1.34× the best) | 222 ns (1.04× the best) | 287 ns (1.07× the best) | 393 ns (1.10× the best) | 508 ns (1.12× the best) | 621 ns (1.14× the best) |
| gf2_127-uunscaled (X:S:Z), w codec, direct addend hashes | 125 ns (1.35× the best) | 0.47 ns (1.02× the best) | 13.2 ns (tied for the best, within noise) | 242 ns (1.13× the best) | 296 ns (1.10× the best) | 384 ns (1.08× the best) | 480 ns (1.06× the best) | 573 ns (1.05× the best) |
| gf2_127-ucompare suitePornin x1: hash to addend; output already an addend | 98.0 ns (1.06× the best) | in the hash | 13.2 ns (tied for the best, within noise) | 214 ns (best) | 269 ns (best) | 357 ns (best) | 453 ns (best) | 546 ns (best) |
| GF(2^122) = GF(2^61)[u], dense constant, 16 bytes | ||||||||
| gf2_122(X:S:Z:T) extended | 114 ns (1.23× the best) | 5.01 ns (10.80× the best) | 19.9 ns (1.51× the best) | 255 ns (1.19× the best) | 325 ns (1.21× the best) | 440 ns (1.23× the best) | 565 ns (1.25× the best) | 687 ns (1.26× the best) |
| gf2_122compare suitePornin x1: hash to addend; output already an addend | 103 ns (1.11× the best) | in the hash | 19.9 ns (1.51× the best) | 239 ns (1.11× the best) | 309 ns (1.15× the best) | 424 ns (1.19× the best) | 549 ns (1.21× the best) | 671 ns (1.23× the best) |
| gf2_122-lambdaincompleteλ-projective | 115 ns (1.25× the best) | 8.18 ns (17.61× the best) | 20.2 ns (1.53× the best) | 261 ns (1.21× the best) | 332 ns (1.23× the best) | 448 ns (1.25× the best) | 574 ns (1.27× the best) | 698 ns (1.28× the best) |
| gf2_122-lambdaincompletecompare suitehashed straight to : no prepare | 119 ns (1.29× the best) | in the hash | 20.2 ns (1.53× the best) | 256 ns (1.19× the best) | 327 ns (1.22× the best) | 443 ns (1.24× the best) | 570 ns (1.26× the best) | 694 ns (1.27× the best) |
| gf2_122-lambdaincompletecompare suitePornin x1: hash to addend; output already an addend | 95.0 ns (1.02× the best) | in the hash | 20.2 ns (1.53× the best) | 232 ns (1.08× the best) | 303 ns (1.13× the best) | 419 ns (1.17× the best) | 545 ns (1.20× the best) | 669 ns (1.23× the best) |
| gf2_122-wincompleteλ-projective, w codec | 116 ns (1.25× the best) | 0.47 ns (tied for the best, within noise, 1.00×) | 20.5 ns (1.55× the best) | 254 ns (1.19× the best) | 326 ns (1.21× the best) | 443 ns (1.24× the best) | 570 ns (1.26× the best) | 696 ns (1.27× the best) |
| gf2_122-wincompletecompare suitePornin x1: hash to addend; output already an addend | 95.2 ns (1.03× the best) | in the hash | 20.5 ns (1.55× the best) | 233 ns (1.09× the best) | 305 ns (1.13× the best) | 422 ns (1.18× the best) | 549 ns (1.21× the best) | 674 ns (1.24× the best) |
| gf2_122-uunscaled (X:S:Z), w codec | 127 ns (1.37× the best) | 0.49 ns (1.06× the best) | 14.3 ns (1.08× the best) | 247 ns (1.15× the best) | 304 ns (1.13× the best) | 397 ns (1.11× the best) | 497 ns (1.10× the best) | 595 ns (1.09× the best) |
| gf2_122-ucompare suitePornin x1: hash to addend; output already an addend | 99.3 ns (1.07× the best) | in the hash | 14.3 ns (1.08× the best) | 219 ns (1.02× the best) | 276 ns (1.03× the best) | 369 ns (1.03× the best) | 469 ns (1.04× the best) | 567 ns (1.04× the best) |
| GF(2^122), constant in GF(2^61) (GLS-shaped), 16 bytes | ||||||||
| gf2_122-gls(X:S:Z:T) extended | 116 ns (1.25× the best) | 4.27 ns (9.20× the best) | 19.3 ns (1.46× the best) | 255 ns (1.19× the best) | 324 ns (1.20× the best) | 436 ns (1.22× the best) | 558 ns (1.23× the best) | 678 ns (1.24× the best) |
| gf2_122-glscompare suitePornin x1: hash to addend; output already an addend | 101 ns (1.09× the best) | in the hash | 19.3 ns (1.46× the best) | 236 ns (1.10× the best) | 304 ns (1.13× the best) | 417 ns (1.17× the best) | 539 ns (1.19× the best) | 659 ns (1.21× the best) |
| gf2_122-gls-lambdaincompleteλ-projective | 116 ns (1.25× the best) | 8.11 ns (17.46× the best) | 20.3 ns (1.53× the best) | 261 ns (1.22× the best) | 332 ns (1.23× the best) | 448 ns (1.25× the best) | 574 ns (1.27× the best) | 698 ns (1.28× the best) |
| gf2_122-gls-lambdaincompletecompare suitehashed straight to : no prepare | 121 ns (1.30× the best) | in the hash | 20.3 ns (1.53× the best) | 258 ns (1.20× the best) | 329 ns (1.22× the best) | 445 ns (1.25× the best) | 571 ns (1.26× the best) | 695 ns (1.27× the best) |
| gf2_122-gls-lambdaincompletecompare suitePornin x1: hash to addend; output already an addend | 95.0 ns (1.03× the best) | in the hash | 20.3 ns (1.53× the best) | 232 ns (1.08× the best) | 303 ns (1.13× the best) | 419 ns (1.17× the best) | 545 ns (1.21× the best) | 669 ns (1.23× the best) |
| gf2_122-gls-wincompleteλ-projective, w codec | 116 ns (1.25× the best) | 0.68 ns (1.47× the best) | 20.3 ns (1.54× the best) | 253 ns (1.18× the best) | 325 ns (1.21× the best) | 441 ns (1.23× the best) | 567 ns (1.25× the best) | 692 ns (1.27× the best) |
| gf2_122-gls-wincompletecompare suitePornin x1: hash to addend; output already an addend | 94.6 ns (1.02× the best) | in the hash | 20.3 ns (1.54× the best) | 232 ns (1.08× the best) | 303 ns (1.13× the best) | 419 ns (1.17× the best) | 546 ns (1.21× the best) | 670 ns (1.23× the best) |
| gf2_122-gls-uunscaled (X:S:Z), w codec | 121 ns (1.30× the best) | 0.68 ns (1.46× the best) | 13.7 ns (1.04× the best) | 240 ns (1.12× the best) | 295 ns (1.10× the best) | 386 ns (1.08× the best) | 483 ns (1.07× the best) | 579 ns (1.06× the best) |
| gf2_122-gls-ucompare suitePornin x1: hash to addend; output already an addend | 97.6 ns (1.05× the best) | in the hash | 13.7 ns (1.04× the best) | 216 ns (1.01× the best) | 271 ns (1.01× the best) | 362 ns (1.01× the best) | 459 ns (1.02× the best) | 555 ns (1.02× the best) |
| GF(2^109), 14 bytes | ||||||||
| gf2_109(X:S:Z:T) extended | 126 ns (1.36× the best) | 4.25 ns (9.16× the best) | 20.4 ns (1.54× the best) | 268 ns (1.25× the best) | 339 ns (1.26× the best) | 455 ns (1.28× the best) | 582 ns (1.29× the best) | 707 ns (1.30× the best) |
| gf2_109compare suitePornin x1: hash to addend; output already an addend | 114 ns (1.23× the best) | in the hash | 20.4 ns (1.54× the best) | 251 ns (1.17× the best) | 322 ns (1.20× the best) | 439 ns (1.23× the best) | 566 ns (1.25× the best) | 690 ns (1.27× the best) |
| gf2_109-lambdaincompleteλ-projective | 124 ns (1.34× the best) | 8.13 ns (17.51× the best) | 18.9 ns (1.43× the best) | 266 ns (1.24× the best) | 333 ns (1.24× the best) | 444 ns (1.24× the best) | 564 ns (1.25× the best) | 683 ns (1.25× the best) |
| gf2_109-lambdaincompletecompare suitehashed straight to : no prepare | 131 ns (1.41× the best) | in the hash | 18.9 ns (1.43× the best) | 264 ns (1.23× the best) | 331 ns (1.23× the best) | 442 ns (1.24× the best) | 563 ns (1.24× the best) | 681 ns (1.25× the best) |
| gf2_109-lambdaincompletecompare suitePornin x1: hash to addend; output already an addend | 105 ns (1.13× the best) | in the hash | 18.9 ns (1.43× the best) | 238 ns (1.11× the best) | 305 ns (1.14× the best) | 416 ns (1.17× the best) | 536 ns (1.19× the best) | 655 ns (1.20× the best) |
| gf2_109-wincompleteλ-projective, w codec | 120 ns (1.29× the best) | 0.47 ns (tied for the best, within noise, 1.01×) | 18.9 ns (1.43× the best) | 254 ns (1.18× the best) | 321 ns (1.20× the best) | 432 ns (1.21× the best) | 553 ns (1.22× the best) | 671 ns (1.23× the best) |
| gf2_109-wincompletecompare suitePornin x1: hash to addend; output already an addend | 104 ns (1.12× the best) | in the hash | 18.9 ns (1.43× the best) | 237 ns (1.11× the best) | 305 ns (1.14× the best) | 416 ns (1.16× the best) | 537 ns (1.19× the best) | 655 ns (1.20× the best) |
| gf2_109-uunscaled (X:S:Z), w codec | 125 ns (1.35× the best) | 0.46 ns (tied for the best, within noise) | 13.5 ns (1.02× the best) | 243 ns (1.13× the best) | 298 ns (1.11× the best) | 387 ns (1.08× the best) | 484 ns (1.07× the best) | 578 ns (1.06× the best) |
| gf2_109-ucompare suitePornin x1: hash to addend; output already an addend | 110 ns (1.18× the best) | in the hash | 13.5 ns (1.02× the best) | 227 ns (1.06× the best) | 282 ns (1.05× the best) | 372 ns (1.04× the best) | 468 ns (1.03× the best) | 563 ns (1.03× the best) |
| F_p, p = 2^127 − 1, 16 bytes | ||||||||
| edwards127a = 1 Edwards, extended += cached | 1.24 µs (13.35× the best) | 39.9 ns (86.04× the best) | 27.5 ns (2.08× the best) | 1.44 µs (6.69× the best) | 1.52 µs (5.67× the best) | 1.67 µs (4.67× the best) | 1.83 µs (4.03× the best) | 1.98 µs (3.63× the best) |
| weier127short Weierstrass, projective += affine | 1.17 µs (12.58× the best) | 1.00 ns (2.15× the best) | 58.7 ns (4.45× the best) | 1.42 µs (6.60× the best) | 1.58 µs (5.87× the best) | 1.84 µs (5.16× the best) | 2.14 µs (4.73× the best) | 2.43 µs (4.46× the best) |
| weier127-jacobianincompleteshort Weierstrass, Jacobian += affine | 1.16 µs (12.49× the best) | 0.99 ns (2.13× the best) | 48.1 ns (3.64× the best) | 1.38 µs (6.42× the best) | 1.51 µs (5.64× the best) | 1.74 µs (4.87× the best) | 1.99 µs (4.39× the best) | 2.23 µs (4.09× the best) |
| F_p, p = 2^107 − 1, 14 bytes | ||||||||
| edwards107a = 1 Edwards, extended += cached | 916 ns (9.89× the best) | 37.9 ns (81.74× the best) | 27.6 ns (2.09× the best) | 1.11 µs (5.19× the best) | 1.20 µs (4.47× the best) | 1.35 µs (3.77× the best) | 1.50 µs (3.32× the best) | 1.66 µs (3.04× the best) |
| weier107short Weierstrass, projective += affine | 901 ns (9.72× the best) | 0.63 ns (1.35× the best) | 48.6 ns (3.68× the best) | 1.12 µs (5.23× the best) | 1.26 µs (4.69× the best) | 1.49 µs (4.16× the best) | 1.74 µs (3.84× the best) | 1.98 µs (3.64× the best) |
| weier107-jacobianincompleteshort Weierstrass, Jacobian += affine | 893 ns (9.63× the best) | 0.63 ns (1.35× the best) | 44.1 ns (3.34× the best) | 1.10 µs (5.13× the best) | 1.23 µs (4.57× the best) | 1.44 µs (4.02× the best) | 1.67 µs (3.69× the best) | 1.90 µs (3.48× the best) |
| F_p, p = 2^128 − 275, 16 bytes | ||||||||
| twisted128a = −1 twisted Edwards modulo 2-torsion, extended += cached | 1.96 µs (21.15× the best) | 12.7 ns (27.29× the best) | 31.1 ns (2.35× the best) | 2.14 µs (9.98× the best) | 2.24 µs (8.33× the best) | 2.40 µs (6.71× the best) | 2.57 µs (5.68× the best) | 2.74 µs (5.02× the best) |
| F_{p²}, p = 2^61 − 1, 16 bytes | ||||||||
| edwards61x2a = 1 Edwards, signed-x codec, extended += cached | 706 ns (7.62× the best) | 34.9 ns (75.23× the best) | 25.8 ns (1.95× the best) | 894 ns (4.17× the best) | 978 ns (3.64× the best) | 1.12 µs (3.12× the best) | 1.27 µs (2.80× the best) | 1.41 µs (2.59× the best) |
| weier61x2short Weierstrass, signed-x codec, projective += affine | 698 ns (7.53× the best) | 0.52 ns (1.13× the best) | 50.6 ns (3.83× the best) | 923 ns (4.30× the best) | 1.07 µs (3.97× the best) | 1.30 µs (3.64× the best) | 1.56 µs (3.45× the best) | 1.82 µs (3.33× the best) |
| weier61x2-jacobianincompleteshort Weierstrass, signed-x codec, Jacobian += affine | 698 ns (7.53× the best) | 0.52 ns (1.12× the best) | 50.2 ns (3.80× the best) | 922 ns (4.30× the best) | 1.06 µs (3.96× the best) | 1.30 µs (3.63× the best) | 1.55 µs (3.44× the best) | 1.81 µs (3.32× the best) |
| twisted61x2a = −1 Edwards modulo 2-torsion, extended += cached | 711 ns (7.67× the best) | 7.93 ns (17.07× the best) | 24.9 ns (1.89× the best) | 869 ns (4.05× the best) | 951 ns (3.54× the best) | 1.09 µs (3.04× the best) | 1.23 µs (2.72× the best) | 1.38 µs (2.52× the best) |
| F_{p²}, p = 2^64 − 59, 16 bytes | ||||||||
| twisted64x2a = −1 Edwards modulo 2-torsion, extended += cached | 1.00 µs (10.83× the best) | 8.79 ns (18.94× the best) | 33.3 ns (2.52× the best) | 1.19 µs (5.53× the best) | 1.29 µs (4.80× the best) | 1.46 µs (4.08× the best) | 1.64 µs (3.62× the best) | 1.82 µs (3.34× the best) |
| F_{p²}, p = 2^64 − 2^32 + 1, 16 bytes | ||||||||
| twisted-goldilocks2a = −1 Edwards modulo 2-torsion, extended += cached | 2.24 µs (24.14× the best) | 9.54 ns (20.55× the best) | 28.7 ns (2.18× the best) | 2.41 µs (11.23× the best) | 2.50 µs (9.30× the best) | 2.65 µs (7.42× the best) | 2.81 µs (6.21× the best) | 2.97 µs (5.45× 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 | 53.4 ns | in the hash | 0.45 ns | 133 ns | 157 ns | 195 ns | 235 ns | 272 ns |
| GF(2^127), 16 bytes | ||||||||
| gf2_127(X:S:Z:T) extended accumulators, Pornin's formulas | 366 ns (1.50× the best) | 6.38 ns (14.85× the best) | 19.5 ns (1.48× the best) | 508 ns (1.39× the best) | 577 ns (1.37× the best) | 690 ns (1.36× the best) | 813 ns (1.35× the best) | 934 ns (1.34× the best) |
| gf2_127compare suitePornin x2: hash to addend; output already an addend | 452 ns (1.85× the best) | in the hash | 19.5 ns (1.48× the best) | 587 ns (1.61× the best) | 656 ns (1.56× the best) | 770 ns (1.51× the best) | 893 ns (1.48× the best) | 1.01 µs (1.45× the best) |
| gf2_127compare suitePornin x1: hash to addend; output already an addend | 256 ns (1.05× the best) | in the hash | 19.5 ns (1.48× the best) | 391 ns (1.07× the best) | 460 ns (1.10× the best) | 574 ns (1.13× the best) | 697 ns (1.15× the best) | 818 ns (1.17× the best) |
| gf2_127-lambdaincompleteλ-projective (X:L:Z) accumulators | 394 ns (1.62× the best) | 129 ns (299.16× the best) | 17.6 ns (1.34× the best) | 652 ns (1.78× the best) | 717 ns (1.71× the best) | 823 ns (1.62× the best) | 938 ns (1.55× the best) | 1.05 µs (1.51× the best) |
| gf2_127-lambdaincompletecompare suitehashed straight to : no prepare | 369 ns (1.52× the best) | in the hash | 17.6 ns (1.34× the best) | 499 ns (1.36× the best) | 563 ns (1.34× the best) | 669 ns (1.32× the best) | 784 ns (1.30× the best) | 897 ns (1.29× the best) |
| gf2_127-lambdaincompletecompare suitePornin x1: hash to addend; output already an addend | 245 ns (tied for the best, within noise, 1.00×) | in the hash | 17.6 ns (1.34× the best) | 374 ns (1.02× the best) | 439 ns (1.05× the best) | 545 ns (1.07× the best) | 660 ns (1.09× the best) | 772 ns (1.11× the best) |
| gf2_127-wincompleteλ-projective, w codec: hashes and decodes to λ-affine | 392 ns (1.61× the best) | 0.45 ns (tied for the best, within noise, 1.06×) | 17.7 ns (1.34× the best) | 522 ns (1.43× the best) | 587 ns (1.40× the best) | 693 ns (1.36× the best) | 808 ns (1.34× the best) | 921 ns (1.32× the best) |
| gf2_127-wincompletecompare suitePornin x1: hash to addend; output already an addend | 244 ns (tied for the best, within noise) | in the hash | 17.7 ns (1.34× the best) | 373 ns (1.02× the best) | 438 ns (1.04× the best) | 544 ns (1.07× the best) | 659 ns (1.09× the best) | 772 ns (1.11× the best) |
| gf2_127-uunscaled (X:S:Z), w codec, direct addend hashes | 401 ns (1.65× the best) | 0.48 ns (1.13× the best) | 13.2 ns (tied for the best, within noise) | 518 ns (1.42× the best) | 573 ns (1.36× the best) | 661 ns (1.30× the best) | 756 ns (1.25× the best) | 850 ns (1.22× the best) |
| gf2_127-ucompare suitePornin x1: hash to addend; output already an addend | 249 ns (1.02× the best) | in the hash | 13.2 ns (tied for the best, within noise) | 366 ns (best) | 420 ns (best) | 508 ns (best) | 604 ns (best) | 697 ns (best) |
| GF(2^122) = GF(2^61)[u], dense constant, 16 bytes | ||||||||
| gf2_122(X:S:Z:T) extended | 670 ns (2.75× the best) | 4.91 ns (11.42× the best) | 19.9 ns (1.51× the best) | 811 ns (2.22× the best) | 881 ns (2.10× the best) | 996 ns (1.96× the best) | 1.12 µs (1.86× the best) | 1.24 µs (1.78× the best) |
| gf2_122compare suitePornin x1: hash to addend; output already an addend | 392 ns (1.61× the best) | in the hash | 19.9 ns (1.51× the best) | 528 ns (1.44× the best) | 598 ns (1.42× the best) | 713 ns (1.40× the best) | 837 ns (1.39× the best) | 960 ns (1.38× the best) |
| gf2_122-lambdaincompleteλ-projective | 679 ns (2.78× the best) | 251 ns (583.32× the best) | 20.2 ns (1.53× the best) | 1.07 µs (2.92× the best) | 1.14 µs (2.71× the best) | 1.25 µs (2.47× the best) | 1.38 µs (2.29× the best) | 1.50 µs (2.16× the best) |
| gf2_122-lambdaincompletecompare suitehashed straight to : no prepare | 672 ns (2.76× the best) | in the hash | 20.2 ns (1.53× the best) | 809 ns (2.21× the best) | 880 ns (2.10× the best) | 996 ns (1.96× the best) | 1.12 µs (1.86× the best) | 1.25 µs (1.79× the best) |
| gf2_122-lambdaincompletecompare suitePornin x1: hash to addend; output already an addend | 381 ns (1.56× the best) | in the hash | 20.2 ns (1.53× the best) | 518 ns (1.42× the best) | 589 ns (1.40× the best) | 705 ns (1.39× the best) | 831 ns (1.38× the best) | 956 ns (1.37× the best) |
| gf2_122-wincompleteλ-projective, w codec | 654 ns (2.69× the best) | 0.44 ns (tied for the best, within noise, 1.02×) | 20.5 ns (1.55× the best) | 793 ns (2.17× the best) | 864 ns (2.06× the best) | 981 ns (1.93× the best) | 1.11 µs (1.84× the best) | 1.23 µs (1.77× the best) |
| gf2_122-wincompletecompare suitePornin x1: hash to addend; output already an addend | 381 ns (1.56× the best) | in the hash | 20.5 ns (1.55× the best) | 519 ns (1.42× the best) | 590 ns (1.41× the best) | 707 ns (1.39× the best) | 835 ns (1.38× the best) | 960 ns (1.38× the best) |
| gf2_122-uunscaled (X:S:Z), w codec | 674 ns (2.77× the best) | 0.50 ns (1.15× the best) | 14.3 ns (1.08× the best) | 794 ns (2.17× the best) | 851 ns (2.03× the best) | 944 ns (1.86× the best) | 1.04 µs (1.73× the best) | 1.14 µs (1.64× the best) |
| gf2_122-ucompare suitePornin x1: hash to addend; output already an addend | 391 ns (1.60× the best) | in the hash | 14.3 ns (1.08× the best) | 511 ns (1.40× the best) | 567 ns (1.35× the best) | 660 ns (1.30× the best) | 761 ns (1.26× the best) | 859 ns (1.23× the best) |
| GF(2^122), constant in GF(2^61) (GLS-shaped), 16 bytes | ||||||||
| gf2_122-gls(X:S:Z:T) extended | 697 ns (2.86× the best) | 4.22 ns (9.82× the best) | 19.3 ns (1.46× the best) | 835 ns (2.28× the best) | 904 ns (2.15× the best) | 1.02 µs (2.00× the best) | 1.14 µs (1.89× the best) | 1.26 µs (1.81× the best) |
| gf2_122-glscompare suitePornin x1: hash to addend; output already an addend | 394 ns (1.62× the best) | in the hash | 19.3 ns (1.46× the best) | 529 ns (1.45× the best) | 597 ns (1.42× the best) | 710 ns (1.40× the best) | 832 ns (1.38× the best) | 952 ns (1.37× the best) |
| gf2_122-gls-lambdaincompleteλ-projective | 692 ns (2.84× the best) | 249 ns (579.08× the best) | 20.3 ns (1.53× the best) | 1.08 µs (2.95× the best) | 1.15 µs (2.74× the best) | 1.26 µs (2.49× the best) | 1.39 µs (2.30× the best) | 1.52 µs (2.17× the best) |
| gf2_122-gls-lambdaincompletecompare suitehashed straight to : no prepare | 679 ns (2.79× the best) | in the hash | 20.3 ns (1.53× the best) | 816 ns (2.23× the best) | 887 ns (2.11× the best) | 1.00 µs (1.97× the best) | 1.13 µs (1.87× the best) | 1.25 µs (1.80× the best) |
| gf2_122-gls-lambdaincompletecompare suitePornin x1: hash to addend; output already an addend | 385 ns (1.58× the best) | in the hash | 20.3 ns (1.53× the best) | 522 ns (1.43× the best) | 593 ns (1.41× the best) | 709 ns (1.39× the best) | 835 ns (1.38× the best) | 959 ns (1.38× the best) |
| gf2_122-gls-wincompleteλ-projective, w codec | 659 ns (2.70× the best) | 0.43 ns (tied for the best, within noise) | 20.3 ns (1.54× the best) | 796 ns (2.18× the best) | 867 ns (2.07× the best) | 984 ns (1.94× the best) | 1.11 µs (1.84× the best) | 1.23 µs (1.77× the best) |
| gf2_122-gls-wincompletecompare suitePornin x1: hash to addend; output already an addend | 385 ns (1.58× the best) | in the hash | 20.3 ns (1.54× the best) | 522 ns (1.43× the best) | 593 ns (1.41× the best) | 709 ns (1.40× the best) | 836 ns (1.38× the best) | 960 ns (1.38× the best) |
| gf2_122-gls-uunscaled (X:S:Z), w codec | 678 ns (2.78× the best) | 0.44 ns (tied for the best, within noise, 1.01×) | 13.7 ns (1.04× the best) | 796 ns (2.18× the best) | 852 ns (2.03× the best) | 942 ns (1.85× the best) | 1.04 µs (1.72× the best) | 1.14 µs (1.63× the best) |
| gf2_122-gls-ucompare suitePornin x1: hash to addend; output already an addend | 390 ns (1.60× the best) | in the hash | 13.7 ns (1.04× the best) | 508 ns (1.39× the best) | 563 ns (1.34× the best) | 654 ns (1.29× the best) | 751 ns (1.24× the best) | 847 ns (1.22× the best) |
| GF(2^109), 14 bytes | ||||||||
| gf2_109(X:S:Z:T) extended | 1.16 µs (4.77× the best) | 4.23 ns (9.85× the best) | 20.4 ns (1.54× the best) | 1.31 µs (3.57× the best) | 1.38 µs (3.28× the best) | 1.49 µs (2.94× the best) | 1.62 µs (2.68× the best) | 1.74 µs (2.50× the best) |
| gf2_109compare suitePornin x1: hash to addend; output already an addend | 675 ns (2.77× the best) | in the hash | 20.4 ns (1.54× the best) | 812 ns (2.22× the best) | 883 ns (2.10× the best) | 1000 ns (1.97× the best) | 1.13 µs (1.87× the best) | 1.25 µs (1.80× the best) |
| gf2_109-lambdaincompleteλ-projective | 1.16 µs (4.76× the best) | 503 ns (1170.41× the best) | 18.9 ns (1.43× the best) | 1.80 µs (4.91× the best) | 1.86 µs (4.44× the best) | 1.97 µs (3.89× the best) | 2.10 µs (3.47× the best) | 2.21 µs (3.18× the best) |
| gf2_109-lambdaincompletecompare suitehashed straight to : no prepare | 1.17 µs (4.78× the best) | in the hash | 18.9 ns (1.43× the best) | 1.30 µs (3.55× the best) | 1.37 µs (3.26× the best) | 1.48 µs (2.91× the best) | 1.60 µs (2.65× the best) | 1.72 µs (2.46× the best) |
| gf2_109-lambdaincompletecompare suitePornin x1: hash to addend; output already an addend | 655 ns (2.69× the best) | in the hash | 18.9 ns (1.43× the best) | 788 ns (2.16× the best) | 856 ns (2.04× the best) | 967 ns (1.90× the best) | 1.09 µs (1.80× the best) | 1.21 µs (1.73× the best) |
| gf2_109-wincompleteλ-projective, w codec | 1.14 µs (4.66× the best) | 0.44 ns (tied for the best, within noise, 1.02×) | 18.9 ns (1.43× the best) | 1.27 µs (3.47× the best) | 1.34 µs (3.19× the best) | 1.45 µs (2.85× the best) | 1.57 µs (2.60× the best) | 1.69 µs (2.42× the best) |
| gf2_109-wincompletecompare suitePornin x1: hash to addend; output already an addend | 652 ns (2.67× the best) | in the hash | 18.9 ns (1.43× the best) | 785 ns (2.15× the best) | 853 ns (2.03× the best) | 964 ns (1.90× the best) | 1.08 µs (1.80× the best) | 1.20 µs (1.73× the best) |
| gf2_109-uunscaled (X:S:Z), w codec | 1.15 µs (4.73× the best) | 0.48 ns (1.12× the best) | 13.5 ns (1.02× the best) | 1.27 µs (3.48× the best) | 1.33 µs (3.16× the best) | 1.42 µs (2.79× the best) | 1.51 µs (2.51× the best) | 1.61 µs (2.31× the best) |
| gf2_109-ucompare suitePornin x1: hash to addend; output already an addend | 657 ns (2.70× the best) | in the hash | 13.5 ns (1.02× the best) | 775 ns (2.12× the best) | 830 ns (1.98× the best) | 919 ns (1.81× the best) | 1.02 µs (1.68× the best) | 1.11 µs (1.59× the best) |
| F_p, p = 2^127 − 1, 16 bytes | ||||||||
| edwards127a = 1 Edwards, extended += cached | 1.22 µs (5.02× the best) | 663 ns (1543.72× the best) | 27.5 ns (2.08× the best) | 2.04 µs (5.59× the best) | 2.13 µs (5.08× the best) | 2.28 µs (4.48× the best) | 2.44 µs (4.03× the best) | 2.59 µs (3.72× the best) |
| edwards127compare suiteElligator 2 x1: hash + prepare | 1.51 µs (6.18× the best) | 663 ns (1543.72× the best) | 27.5 ns (2.08× the best) | 2.33 µs (6.37× the best) | 2.42 µs (5.76× the best) | 2.56 µs (5.04× the best) | 2.72 µs (4.50× the best) | 2.88 µs (4.13× the best) |
| weier127short Weierstrass, projective += affine | 1.16 µs (4.76× the best) | 0.81 ns (1.89× the best) | 58.7 ns (4.45× the best) | 1.41 µs (3.86× the best) | 1.57 µs (3.75× the best) | 1.84 µs (3.62× the best) | 2.13 µs (3.53× the best) | 2.43 µs (3.48× the best) |
| weier127compare suiteSSWU x1: hash + prepare | 1.29 µs (5.29× the best) | 0.81 ns (1.89× the best) | 58.7 ns (4.45× the best) | 1.54 µs (4.21× the best) | 1.70 µs (4.05× the best) | 1.97 µs (3.87× the best) | 2.26 µs (3.75× the best) | 2.56 µs (3.67× the best) |
| weier127-jacobianincompleteshort Weierstrass, Jacobian += affine | 1.15 µs (4.74× the best) | 0.81 ns (1.88× the best) | 48.1 ns (3.64× the best) | 1.37 µs (3.76× the best) | 1.51 µs (3.60× the best) | 1.74 µs (3.41× the best) | 1.98 µs (3.29× the best) | 2.23 µs (3.20× the best) |
| F_p, p = 2^107 − 1, 14 bytes | ||||||||
| edwards107a = 1 Edwards, extended += cached | 919 ns (3.77× the best) | 632 ns (1471.60× the best) | 27.6 ns (2.09× the best) | 1.71 µs (4.68× the best) | 1.80 µs (4.28× the best) | 1.94 µs (3.82× the best) | 2.10 µs (3.48× the best) | 2.26 µs (3.24× the best) |
| edwards107compare suiteElligator 2 x1: hash + prepare | 1.28 µs (5.25× the best) | 632 ns (1471.60× the best) | 27.6 ns (2.09× the best) | 2.07 µs (5.66× the best) | 2.16 µs (5.14× the best) | 2.30 µs (4.53× the best) | 2.46 µs (4.08× the best) | 2.62 µs (3.76× the best) |
| weier107short Weierstrass, projective += affine | 892 ns (3.66× the best) | 0.82 ns (1.90× the best) | 48.6 ns (3.68× the best) | 1.11 µs (3.04× the best) | 1.25 µs (2.98× the best) | 1.48 µs (2.91× the best) | 1.73 µs (2.86× the best) | 1.98 µs (2.84× the best) |
| weier107compare suiteSSWU x1: hash + prepare | 1.26 µs (5.16× the best) | 0.82 ns (1.90× the best) | 48.6 ns (3.68× the best) | 1.48 µs (4.04× the best) | 1.62 µs (3.85× the best) | 1.84 µs (3.63× the best) | 2.09 µs (3.47× the best) | 2.34 µs (3.36× the best) |
| weier107-jacobianincompleteshort Weierstrass, Jacobian += affine | 886 ns (3.63× the best) | 0.81 ns (1.88× the best) | 44.1 ns (3.34× the best) | 1.09 µs (2.99× the best) | 1.22 µs (2.91× the best) | 1.43 µs (2.81× the best) | 1.66 µs (2.75× the best) | 1.89 µs (2.71× the best) |
| F_p, p = 2^128 − 275, 16 bytes | ||||||||
| twisted128a = −1 twisted Edwards modulo 2-torsion, extended += cached | 1.97 µs (8.07× the best) | 12.5 ns (29.04× the best) | 31.1 ns (2.35× the best) | 2.15 µs (5.87× the best) | 2.24 µs (5.35× the best) | 2.40 µs (4.73× the best) | 2.58 µs (4.27× the best) | 2.75 µs (3.94× the best) |
| twisted128compare suiteElligator 2 x1: hash + prepare | 3.32 µs (13.64× the best) | 12.5 ns (29.04× the best) | 31.1 ns (2.35× the best) | 3.51 µs (9.59× the best) | 3.60 µs (8.58× the best) | 3.76 µs (7.40× the best) | 3.93 µs (6.52× the best) | 4.11 µs (5.89× the best) |
| F_{p²}, p = 2^61 − 1, 16 bytes | ||||||||
| edwards61x2a = 1 Edwards, signed-x codec, extended += cached | 707 ns (2.90× the best) | 236 ns (548.53× the best) | 25.8 ns (1.95× the best) | 1.10 µs (3.00× the best) | 1.18 µs (2.81× the best) | 1.32 µs (2.59× the best) | 1.47 µs (2.43× the best) | 1.62 µs (2.32× the best) |
| edwards61x2compare suiteElligator 2 x1: hash + prepare | 792 ns (3.25× the best) | 236 ns (548.53× the best) | 25.8 ns (1.95× the best) | 1.18 µs (3.23× the best) | 1.26 µs (3.01× the best) | 1.40 µs (2.76× the best) | 1.55 µs (2.57× the best) | 1.70 µs (2.44× the best) |
| weier61x2short Weierstrass, signed-x codec, projective += affine | 696 ns (2.85× the best) | 0.44 ns (tied for the best, within noise, 1.03×) | 50.6 ns (3.83× the best) | 921 ns (2.52× the best) | 1.06 µs (2.54× the best) | 1.30 µs (2.56× the best) | 1.56 µs (2.58× the best) | 1.82 µs (2.60× the best) |
| weier61x2compare suiteSSWU x1: hash + prepare | 812 ns (3.33× the best) | 0.44 ns (tied for the best, within noise, 1.03×) | 50.6 ns (3.83× the best) | 1.04 µs (2.84× the best) | 1.18 µs (2.81× the best) | 1.42 µs (2.78× the best) | 1.67 µs (2.77× the best) | 1.93 µs (2.77× the best) |
| weier61x2-jacobianincompleteshort Weierstrass, signed-x codec, Jacobian += affine | 702 ns (2.88× the best) | 0.44 ns (tied for the best, within noise, 1.02×) | 50.2 ns (3.80× the best) | 926 ns (2.53× the best) | 1.07 µs (2.55× the best) | 1.30 µs (2.56× the best) | 1.56 µs (2.58× the best) | 1.81 µs (2.60× the best) |
| twisted61x2a = −1 Edwards modulo 2-torsion, extended += cached | 706 ns (2.90× the best) | 8.07 ns (18.77× the best) | 24.9 ns (1.89× the best) | 865 ns (2.37× the best) | 947 ns (2.26× the best) | 1.08 µs (2.13× the best) | 1.23 µs (2.03× the best) | 1.37 µs (1.97× the best) |
| twisted61x2compare suiteElligator 2 x1: hash + prepare | 981 ns (4.03× the best) | 8.07 ns (18.77× the best) | 24.9 ns (1.89× the best) | 1.14 µs (3.12× the best) | 1.22 µs (2.91× the best) | 1.36 µs (2.67× the best) | 1.50 µs (2.49× the best) | 1.65 µs (2.36× the best) |
| F_{p²}, p = 2^64 − 59, 16 bytes | ||||||||
| twisted64x2a = −1 Edwards modulo 2-torsion, extended += cached | 1.00 µs (4.11× the best) | 8.75 ns (20.37× the best) | 33.3 ns (2.52× the best) | 1.19 µs (3.24× the best) | 1.29 µs (3.07× the best) | 1.45 µs (2.86× the best) | 1.64 µs (2.71× the best) | 1.82 µs (2.61× the best) |
| twisted64x2compare suiteElligator 2 x1: hash + prepare | 1.38 µs (5.67× the best) | 8.75 ns (20.37× the best) | 33.3 ns (2.52× the best) | 1.56 µs (4.28× the best) | 1.67 µs (3.97× the best) | 1.83 µs (3.61× the best) | 2.02 µs (3.34× the best) | 2.20 µs (3.15× the best) |
| F_{p²}, p = 2^64 − 2^32 + 1, 16 bytes | ||||||||
| twisted-goldilocks2a = −1 Edwards modulo 2-torsion, extended += cached | 2.21 µs (9.09× the best) | 9.45 ns (22.00× the best) | 28.7 ns (2.18× the best) | 2.39 µs (6.53× the best) | 2.48 µs (5.90× the best) | 2.63 µs (5.17× the best) | 2.79 µs (4.62× the best) | 2.95 µs (4.23× the best) |
| twisted-goldilocks2compare suiteElligator 2 x1: hash + prepare | 2.75 µs (11.30× the best) | 9.45 ns (22.00× the best) | 28.7 ns (2.18× the best) | 2.92 µs (8.00× the best) | 3.02 µs (7.18× the best) | 3.16 µs (6.23× the best) | 3.33 µs (5.51× the best) | 3.49 µs (5.01× the best) |
| references, 32 and 33 bytes | ||||||||
| ristretto255compare suitehash output added as is: no prepare | 6.03 µs (24.75× the best) | in the hash | 116 ns (8.76× the best) | 6.45 µs (17.63× the best) | 6.75 µs (16.07× the best) | 7.23 µs (14.23× the best) | 7.78 µs (12.89× the best) | 8.32 µs (11.94× 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 | 366 ns | 113 ns (best) | 3.2× | 2.2 | 6.38 ns | 6.36 ns (13.70× the best) | 1.0× | 0 | 151 ns | 22.7 ns (1.81× the best) | 6.6× | 1.1 | 164 ns | 25.7 ns (1.23× the best) | 6.4× | 1.2 |
| gf2_127-lambdaincompleteλ-projective (X:L:Z) accumulators | 394 ns | 114 ns (1.01× the best) | 3.5× | 2.4 | 129 ns | 8.18 ns (17.62× the best) | 15.7× | 1 | 140 ns | 17.5 ns (1.39× the best) | 8.0× | 1 | 155 ns | 24.0 ns (1.15× the best) | 6.4× | 1.1 |
| gf2_127-wincompleteλ-projective, w codec: hashes and decodes to λ-affine | 392 ns | 119 ns (1.06× the best) | 3.3× | 2.3 | 0.45 ns | 0.47 ns (1.01× the best) | 1.0× | 0 | 139 ns | 17.0 ns (1.35× the best) | 8.2× | 1 | 155 ns | 22.6 ns (1.08× the best) | 6.9× | 1.1 |
| gf2_127-uunscaled (X:S:Z), w codec, direct addend hashes | 401 ns | 125 ns (1.11× the best) | 3.2× | 2.3 | 0.48 ns | 0.47 ns (1.02× the best) | 1.0× | 0 | 137 ns | 12.6 ns (best) | 10.9× | 1.1 | 162 ns | 27.5 ns (1.32× the best) | 5.9× | 1.1 |
| GF(2^122) = GF(2^61)[u], dense constant, 16 bytes | ||||||||||||||||
| gf2_122(X:S:Z:T) extended | 670 ns | 114 ns (1.01× the best) | 5.9× | 2.4 | 4.91 ns | 5.01 ns (10.80× the best) | 1.0× | 0 | 294 ns | 22.1 ns (1.76× the best) | 13.3× | 1.2 | 313 ns | 24.0 ns (1.15× the best) | 13.0× | 1.2 |
| gf2_122-lambdaincompleteλ-projective | 679 ns | 115 ns (1.02× the best) | 5.9× | 2.4 | 251 ns | 8.18 ns (17.61× the best) | 30.7× | 1 | 287 ns | 17.3 ns (1.37× the best) | 16.6× | 1.2 | 314 ns | 24.1 ns (1.15× the best) | 13.0× | 1.2 |
| gf2_122-wincompleteλ-projective, w codec | 654 ns | 116 ns (1.03× the best) | 5.6× | 2.3 | 0.44 ns | 0.47 ns (1.00× the best) | 0.9× | 0 | 302 ns | 21.2 ns (1.69× the best) | 14.2× | 1.2 | 307 ns | 21.6 ns (1.03× the best) | 14.2× | 1.2 |
| gf2_122-uunscaled (X:S:Z), w codec | 674 ns | 127 ns (1.12× the best) | 5.3× | 2.4 | 0.50 ns | 0.49 ns (1.06× the best) | 1.0× | 0 | 305 ns | 18.4 ns (1.47× the best) | 16.5× | 1.2 | 317 ns | 26.0 ns (1.24× the best) | 12.2× | 1.3 |
| GF(2^122), constant in GF(2^61) (GLS-shaped), 16 bytes | ||||||||||||||||
| gf2_122-gls(X:S:Z:T) extended | 697 ns | 116 ns (1.03× the best) | 6.0× | 2.5 | 4.22 ns | 4.27 ns (9.20× the best) | 1.0× | 0 | 293 ns | 21.1 ns (1.68× the best) | 13.9× | 1.2 | 313 ns | 22.7 ns (1.08× the best) | 13.8× | 1.2 |
| gf2_122-gls-lambdaincompleteλ-projective | 692 ns | 116 ns (1.03× the best) | 6.0× | 2.5 | 249 ns | 8.11 ns (17.46× the best) | 30.7× | 1 | 297 ns | 17.9 ns (1.42× the best) | 16.6× | 1.2 | 311 ns | 22.6 ns (1.08× the best) | 13.8× | 1.2 |
| gf2_122-gls-wincompleteλ-projective, w codec | 659 ns | 116 ns (1.03× the best) | 5.7× | 2.3 | 0.43 ns | 0.68 ns (1.47× the best) | 0.6× | 0 | 297 ns | 20.4 ns (1.62× the best) | 14.6× | 1.2 | 305 ns | 20.9 ns (best) | 14.6× | 1.2 |
| gf2_122-gls-uunscaled (X:S:Z), w codec | 678 ns | 121 ns (1.07× the best) | 5.6× | 2.4 | 0.44 ns | 0.68 ns (1.46× the best) | 0.6× | 0 | 297 ns | 18.0 ns (1.44× the best) | 16.5× | 1.2 | 313 ns | 24.7 ns (1.18× the best) | 12.6× | 1.2 |
| GF(2^109), 14 bytes | ||||||||||||||||
| gf2_109(X:S:Z:T) extended | 1.16 µs | 126 ns (1.12× the best) | 9.2× | 2.1 | 4.23 ns | 4.25 ns (9.16× the best) | 1.0× | 0 | 538 ns | 18.2 ns (1.45× the best) | 29.6× | 1.1 | 554 ns | 26.7 ns (1.28× the best) | 20.7× | 1.1 |
| gf2_109-lambdaincompleteλ-projective | 1.16 µs | 124 ns (1.10× the best) | 9.3× | 2.1 | 503 ns | 8.13 ns (17.51× the best) | 61.9× | 1 | 530 ns | 14.1 ns (1.12× the best) | 37.5× | 1.1 | 549 ns | 26.5 ns (1.27× the best) | 20.8× | 1.1 |
| gf2_109-wincompleteλ-projective, w codec | 1.14 µs | 120 ns (1.06× the best) | 9.5× | 2.1 | 0.44 ns | 0.47 ns (1.01× the best) | 0.9× | 0 | 540 ns | 21.6 ns (1.72× the best) | 24.9× | 1.1 | 555 ns | 24.4 ns (1.17× the best) | 22.8× | 1.1 |
| gf2_109-uunscaled (X:S:Z), w codec | 1.15 µs | 125 ns (1.11× the best) | 9.2× | 2.1 | 0.48 ns | 0.46 ns (best) | 1.0× | 0 | 546 ns | 21.9 ns (1.74× the best) | 24.9× | 1.1 | 555 ns | 27.7 ns (1.33× the best) | 20.0× | 1.1 |
| F_p, p = 2^127 − 1, 16 bytes | ||||||||||||||||
| edwards127a = 1 Edwards, extended += cached | 1.22 µs | 1.24 µs (10.98× the best) | 1.0× | 0 | 663 ns | 39.9 ns (86.04× the best) | 16.6× | 1.1 | 610 ns | 31.9 ns (2.54× the best) | 19.1× | 1 | 540 ns | 541 ns (25.90× the best) | 1.0× | 0 |
| weier127short Weierstrass, projective += affine | 1.16 µs | 1.17 µs (10.34× the best) | 1.0× | 0 | 0.81 ns | 1.00 ns (2.15× the best) | 0.8× | 0 | 593 ns | 16.7 ns (1.33× the best) | 35.4× | 1 | 541 ns | 539 ns (25.81× the best) | 1.0× | 0 |
| weier127-jacobianincompleteshort Weierstrass, Jacobian += affine | 1.15 µs | 1.16 µs (10.27× the best) | 1.0× | 0 | 0.81 ns | 0.99 ns (2.13× the best) | 0.8× | 0 | 605 ns | 23.6 ns (1.88× the best) | 25.6× | 1 | 543 ns | 542 ns (25.93× the best) | 1.0× | 0 |
| F_p, p = 2^107 − 1, 14 bytes | ||||||||||||||||
| edwards107a = 1 Edwards, extended += cached | 919 ns | 916 ns (8.13× the best) | 1.0× | 0 | 632 ns | 37.9 ns (81.74× the best) | 16.7× | 1.1 | 600 ns | 35.1 ns (2.80× the best) | 17.1× | 1 | 424 ns | 426 ns (20.37× the best) | 1.0× | 0 |
| weier107short Weierstrass, projective += affine | 892 ns | 901 ns (8.00× the best) | 1.0× | 0 | 0.82 ns | 0.63 ns (1.35× the best) | 1.3× | 0 | 582 ns | 19.4 ns (1.54× the best) | 30.0× | 1 | 421 ns | 422 ns (20.19× the best) | 1.0× | 0 |
| weier107-jacobianincompleteshort Weierstrass, Jacobian += affine | 886 ns | 893 ns (7.92× the best) | 1.0× | 0 | 0.81 ns | 0.63 ns (1.35× the best) | 1.3× | 0 | 580 ns | 25.5 ns (2.03× the best) | 22.7× | 1 | 419 ns | 421 ns (20.13× the best) | 1.0× | 0 |
| F_p, p = 2^128 − 275, 16 bytes | ||||||||||||||||
| twisted128a = −1 twisted Edwards modulo 2-torsion, extended += cached | 1.97 µs | 1.96 µs (17.39× the best) | 1.0× | 12.5 ns | 12.7 ns (27.29× the best) | 1.0× | 943 ns | 22.7 ns (1.81× the best) | 41.6× | 960 ns | 962 ns (46.04× the best) | 1.0× | ||||
| F_{p²}, p = 2^61 − 1, 16 bytes | ||||||||||||||||
| edwards61x2a = 1 Edwards, signed-x codec, extended += cached | 707 ns | 706 ns (6.26× the best) | 1.0× | 0 | 236 ns | 34.9 ns (75.23× the best) | 6.7× | 1.2 | 203 ns | 35.0 ns (2.79× the best) | 5.8× | 1 | 437 ns | 441 ns (21.08× the best) | 1.0× | 0 |
| weier61x2short Weierstrass, signed-x codec, projective += affine | 696 ns | 698 ns (6.19× the best) | 1.0× | 0 | 0.44 ns | 0.52 ns (1.13× the best) | 0.8× | 0 | 190 ns | 15.3 ns (1.22× the best) | 12.4× | 1 | 441 ns | 448 ns (21.43× the best) | 1.0× | 0 |
| weier61x2-jacobianincompleteshort Weierstrass, signed-x codec, Jacobian += affine | 702 ns | 698 ns (6.19× the best) | 1.0× | 0 | 0.44 ns | 0.52 ns (1.12× the best) | 0.8× | 0 | 198 ns | 24.8 ns (1.97× the best) | 8.0× | 1 | 440 ns | 445 ns (21.28× the best) | 1.0× | 0 |
| twisted61x2a = −1 Edwards modulo 2-torsion, extended += cached | 706 ns | 711 ns (6.31× the best) | 1.0× | 0 | 8.07 ns | 7.93 ns (17.07× the best) | 1.0× | 0 | 189 ns | 14.9 ns (1.19× the best) | 12.7× | 1 | 448 ns | 450 ns (21.55× the best) | 1.0× | 0 |
| F_{p²}, p = 2^64 − 59, 16 bytes | ||||||||||||||||
| twisted64x2a = −1 Edwards modulo 2-torsion, extended += cached | 1.00 µs | 1.00 µs (8.91× the best) | 1.0× | 0 | 8.75 ns | 8.79 ns (18.94× the best) | 1.0× | 0 | 267 ns | 22.6 ns (1.80× the best) | 11.8× | 1.1 | 650 ns | 647 ns (30.96× the best) | 1.0× | 0 |
| F_{p²}, p = 2^64 − 2^32 + 1, 16 bytes | ||||||||||||||||
| twisted-goldilocks2a = −1 Edwards modulo 2-torsion, extended += cached | 2.21 µs | 2.24 µs (19.85× the best) | 1.0× | -0.1 | 9.45 ns | 9.54 ns (20.55× the best) | 1.0× | 0 | 316 ns | 22.9 ns (1.83× the best) | 13.8× | 1 | 1.91 µs | 1.92 µs (92.00× the best) | 1.0× | 0 |
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 | 366 ns (best) | 200 ns (best) | 137 ns (tied for the best, within noise) | 113 ns (best) | 6.38 ns (14.85× the best) | 6.72 ns (6.28× the best) | 6.55 ns (8.70× the best) | 6.36 ns (13.70× the best) | 151 ns (1.10× the best) | 46.0 ns (1.20× the best) | 25.6 ns (1.57× the best) | 22.7 ns (1.81× the best) | 164 ns (1.06× the best) | 54.2 ns (tied for the best, within noise) | 29.6 ns (1.03× the best) | 25.7 ns (1.23× the best) |
| gf2_127-lambdaincompleteλ-projective (X:L:Z) accumulators | 394 ns (1.08× the best) | 204 ns (1.02× the best) | 137 ns (tied for the best, within noise, 1.00×) | 114 ns (1.01× the best) | 129 ns (299.16× the best) | 32.8 ns (30.61× the best) | 12.7 ns (16.85× the best) | 8.18 ns (17.62× the best) | 140 ns (1.02× the best) | 42.0 ns (1.10× the best) | 21.8 ns (1.34× the best) | 17.5 ns (1.39× the best) | 155 ns (tied for the best, within noise, 1.00×) | 54.2 ns (tied for the best, within noise, 1.00×) | 29.7 ns (1.03× the best) | 24.0 ns (1.15× the best) |
| gf2_127-wincompleteλ-projective, w codec: hashes and decodes to λ-affine | 392 ns (1.07× the best) | 219 ns (1.09× the best) | 145 ns (1.06× the best) | 119 ns (1.06× the best) | 0.45 ns (tied for the best, within noise, 1.06×) | 1.10 ns (1.03× the best) | 0.79 ns (1.06× the best) | 0.47 ns (1.01× the best) | 139 ns (1.02× the best) | 42.1 ns (1.10× the best) | 21.8 ns (1.34× the best) | 17.0 ns (1.35× the best) | 155 ns (tied for the best, within noise) | 55.2 ns (1.02× the best) | 28.8 ns (best) | 22.6 ns (1.08× the best) |
| gf2_127-uunscaled (X:S:Z), w codec, direct addend hashes | 401 ns (1.10× the best) | 225 ns (1.13× the best) | 153 ns (1.11× the best) | 125 ns (1.11× the best) | 0.48 ns (1.13× the best) | 1.08 ns (1.01× the best) | 0.81 ns (1.07× the best) | 0.47 ns (1.02× the best) | 137 ns (best) | 38.2 ns (best) | 16.3 ns (best) | 12.6 ns (best) | 162 ns (1.04× the best) | 57.6 ns (1.06× the best) | 32.8 ns (1.14× the best) | 27.5 ns (1.32× the best) |
| GF(2^122) = GF(2^61)[u], dense constant, 16 bytes | ||||||||||||||||
| gf2_122(X:S:Z:T) extended | 670 ns (1.83× the best) | 293 ns (1.47× the best) | 155 ns (1.13× the best) | 114 ns (1.01× the best) | 4.91 ns (11.42× the best) | 5.62 ns (5.25× the best) | 5.44 ns (7.22× the best) | 5.01 ns (10.80× the best) | 294 ns (2.15× the best) | 66.6 ns (1.74× the best) | 28.9 ns (1.78× the best) | 22.1 ns (1.76× the best) | 313 ns (2.02× the best) | 73.5 ns (1.36× the best) | 32.4 ns (1.13× the best) | 24.0 ns (1.15× the best) |
| gf2_122-lambdaincompleteλ-projective | 679 ns (1.85× the best) | 294 ns (1.47× the best) | 156 ns (1.14× the best) | 115 ns (1.02× the best) | 251 ns (583.32× the best) | 53.6 ns (50.04× the best) | 15.2 ns (20.19× the best) | 8.18 ns (17.61× the best) | 287 ns (2.10× the best) | 61.7 ns (1.62× the best) | 24.1 ns (1.48× the best) | 17.3 ns (1.37× the best) | 314 ns (2.03× the best) | 73.1 ns (1.35× the best) | 32.2 ns (1.12× the best) | 24.1 ns (1.15× the best) |
| gf2_122-wincompleteλ-projective, w codec | 654 ns (1.79× the best) | 294 ns (1.47× the best) | 156 ns (1.14× the best) | 116 ns (1.03× the best) | 0.44 ns (tied for the best, within noise, 1.02×) | 1.09 ns (1.01× the best) | 0.75 ns (best) | 0.47 ns (tied for the best, within noise, 1.00×) | 302 ns (2.20× the best) | 64.3 ns (1.68× the best) | 27.0 ns (1.66× the best) | 21.2 ns (1.69× the best) | 307 ns (1.98× the best) | 70.9 ns (1.31× the best) | 29.8 ns (1.03× the best) | 21.6 ns (1.03× the best) |
| gf2_122-uunscaled (X:S:Z), w codec | 674 ns (1.84× the best) | 301 ns (1.51× the best) | 164 ns (1.20× the best) | 127 ns (1.12× the best) | 0.50 ns (1.15× the best) | 1.08 ns (1.01× the best) | 0.82 ns (1.08× the best) | 0.49 ns (1.06× the best) | 305 ns (2.23× the best) | 61.3 ns (1.61× the best) | 22.5 ns (1.38× the best) | 18.4 ns (1.47× the best) | 317 ns (2.05× the best) | 74.7 ns (1.38× the best) | 33.6 ns (1.17× the best) | 26.0 ns (1.24× the best) |
| GF(2^122), constant in GF(2^61) (GLS-shaped), 16 bytes | ||||||||||||||||
| gf2_122-gls(X:S:Z:T) extended | 697 ns (1.90× the best) | 308 ns (1.54× the best) | 161 ns (1.18× the best) | 116 ns (1.03× the best) | 4.22 ns (9.82× the best) | 4.83 ns (4.51× the best) | 4.54 ns (6.03× the best) | 4.27 ns (9.20× the best) | 293 ns (2.14× the best) | 65.6 ns (1.72× the best) | 27.9 ns (1.72× the best) | 21.1 ns (1.68× the best) | 313 ns (2.02× the best) | 71.5 ns (1.32× the best) | 31.0 ns (1.08× the best) | 22.7 ns (1.08× the best) |
| gf2_122-gls-lambdaincompleteλ-projective | 692 ns (1.89× the best) | 306 ns (1.53× the best) | 161 ns (1.18× the best) | 116 ns (1.03× the best) | 249 ns (579.08× the best) | 53.4 ns (49.89× the best) | 15.1 ns (20.10× the best) | 8.11 ns (17.46× the best) | 297 ns (2.17× the best) | 62.1 ns (1.62× the best) | 24.5 ns (1.51× the best) | 17.9 ns (1.42× the best) | 311 ns (2.01× the best) | 73.7 ns (1.36× the best) | 32.1 ns (1.11× the best) | 22.6 ns (1.08× the best) |
| gf2_122-gls-wincompleteλ-projective, w codec | 659 ns (1.80× the best) | 303 ns (1.52× the best) | 161 ns (1.17× the best) | 116 ns (1.03× the best) | 0.43 ns (tied for the best, within noise) | 1.08 ns (1.01× the best) | 0.83 ns (1.10× the best) | 0.68 ns (1.47× the best) | 297 ns (2.17× the best) | 64.9 ns (1.70× the best) | 27.2 ns (1.68× the best) | 20.4 ns (1.62× the best) | 305 ns (1.97× the best) | 70.1 ns (1.29× the best) | 29.1 ns (1.01× the best) | 20.9 ns (best) |
| gf2_122-gls-uunscaled (X:S:Z), w codec | 678 ns (1.85× the best) | 298 ns (1.49× the best) | 165 ns (1.21× the best) | 121 ns (1.07× the best) | 0.44 ns (tied for the best, within noise, 1.01×) | 1.07 ns (best) | 0.83 ns (1.10× the best) | 0.68 ns (1.46× the best) | 297 ns (2.17× the best) | 61.2 ns (1.60× the best) | 22.5 ns (1.38× the best) | 18.0 ns (1.44× the best) | 313 ns (2.02× the best) | 73.8 ns (1.36× the best) | 32.9 ns (1.14× the best) | 24.7 ns (1.18× the best) |
| GF(2^109), 14 bytes | ||||||||||||||||
| gf2_109(X:S:Z:T) extended | 1.16 µs (3.18× the best) | 431 ns (2.16× the best) | 195 ns (1.42× the best) | 126 ns (1.12× the best) | 4.23 ns (9.85× the best) | 4.88 ns (4.56× the best) | 4.65 ns (6.18× the best) | 4.25 ns (9.16× the best) | 538 ns (3.93× the best) | 94.4 ns (2.47× the best) | 28.6 ns (1.76× the best) | 18.2 ns (1.45× the best) | 554 ns (3.58× the best) | 108 ns (2.00× the best) | 38.7 ns (1.34× the best) | 26.7 ns (1.28× the best) |
| gf2_109-lambdaincompleteλ-projective | 1.16 µs (3.17× the best) | 431 ns (2.16× the best) | 195 ns (1.42× the best) | 124 ns (1.10× the best) | 503 ns (1170.41× the best) | 82.7 ns (77.22× the best) | 18.8 ns (24.92× the best) | 8.13 ns (17.51× the best) | 530 ns (3.87× the best) | 90.0 ns (2.36× the best) | 24.8 ns (1.53× the best) | 14.1 ns (1.12× the best) | 549 ns (3.55× the best) | 109 ns (2.00× the best) | 39.1 ns (1.36× the best) | 26.5 ns (1.27× the best) |
| gf2_109-wincompleteλ-projective, w codec | 1.14 µs (3.10× the best) | 413 ns (2.07× the best) | 183 ns (1.33× the best) | 120 ns (1.06× the best) | 0.44 ns (tied for the best, within noise, 1.02×) | 1.08 ns (1.01× the best) | 0.82 ns (1.08× the best) | 0.47 ns (tied for the best, within noise, 1.01×) | 540 ns (3.94× the best) | 96.0 ns (2.51× the best) | 32.5 ns (2.00× the best) | 21.6 ns (1.72× the best) | 555 ns (3.59× the best) | 105 ns (1.95× the best) | 36.8 ns (1.28× the best) | 24.4 ns (1.17× the best) |
| gf2_109-uunscaled (X:S:Z), w codec | 1.15 µs (3.15× the best) | 417 ns (2.09× the best) | 189 ns (1.38× the best) | 125 ns (1.11× the best) | 0.48 ns (1.12× the best) | 1.08 ns (1.01× the best) | 0.79 ns (1.05× the best) | 0.46 ns (tied for the best, within noise) | 546 ns (3.99× the best) | 97.1 ns (2.54× the best) | 31.7 ns (1.95× the best) | 21.9 ns (1.74× the best) | 555 ns (3.59× the best) | 109 ns (2.01× the best) | 40.3 ns (1.40× the best) | 27.7 ns (1.33× the best) |
| F_p, p = 2^127 − 1, 16 bytes | ||||||||||||||||
| edwards127a = 1 Edwards, extended += cached | 1.22 µs (3.34× the best) | 1.24 µs (10.98× the best) | 663 ns (1543.72× the best) | 39.9 ns (86.04× the best) | 610 ns (4.45× the best) | 31.9 ns (2.54× the best) | 540 ns (3.49× the best) | 541 ns (25.90× the best) | ||||||||
| weier127short Weierstrass, projective += affine | 1.16 µs (3.17× the best) | 1.17 µs (10.34× the best) | 0.81 ns (1.89× the best) | 1.00 ns (2.15× the best) | 593 ns (4.33× the best) | 16.7 ns (1.33× the best) | 541 ns (3.50× the best) | 539 ns (25.81× the best) | ||||||||
| weier127-jacobianincompleteshort Weierstrass, Jacobian += affine | 1.15 µs (3.15× the best) | 1.16 µs (10.27× the best) | 0.81 ns (1.88× the best) | 0.99 ns (2.13× the best) | 605 ns (4.42× the best) | 23.6 ns (1.88× the best) | 543 ns (3.51× the best) | 542 ns (25.93× the best) | ||||||||
| F_p, p = 2^107 − 1, 14 bytes | ||||||||||||||||
| edwards107a = 1 Edwards, extended += cached | 919 ns (2.51× the best) | 916 ns (8.13× the best) | 632 ns (1471.60× the best) | 37.9 ns (81.74× the best) | 600 ns (4.38× the best) | 35.1 ns (2.80× the best) | 424 ns (2.74× the best) | 426 ns (20.37× the best) | ||||||||
| weier107short Weierstrass, projective += affine | 892 ns (2.44× the best) | 901 ns (8.00× the best) | 0.82 ns (1.90× the best) | 0.63 ns (1.35× the best) | 582 ns (4.25× the best) | 19.4 ns (1.54× the best) | 421 ns (2.72× the best) | 422 ns (20.19× the best) | ||||||||
| weier107-jacobianincompleteshort Weierstrass, Jacobian += affine | 886 ns (2.42× the best) | 893 ns (7.92× the best) | 0.81 ns (1.88× the best) | 0.63 ns (1.35× the best) | 580 ns (4.23× the best) | 25.5 ns (2.03× the best) | 419 ns (2.71× the best) | 421 ns (20.13× the best) | ||||||||
| F_p, p = 2^128 − 275, 16 bytes | ||||||||||||||||
| twisted128a = −1 twisted Edwards modulo 2-torsion, extended += cached | 1.97 µs (5.37× the best) | 1.96 µs (17.39× the best) | 12.5 ns (29.04× the best) | 12.7 ns (27.29× the best) | 943 ns (6.89× the best) | 22.7 ns (1.81× the best) | 960 ns (6.21× the best) | 962 ns (46.04× the best) | ||||||||
| F_{p²}, p = 2^61 − 1, 16 bytes | ||||||||||||||||
| edwards61x2a = 1 Edwards, signed-x codec, extended += cached | 707 ns (1.93× the best) | 706 ns (6.26× the best) | 236 ns (548.53× the best) | 34.9 ns (75.23× the best) | 203 ns (1.48× the best) | 35.0 ns (2.79× the best) | 437 ns (2.83× the best) | 441 ns (21.08× the best) | ||||||||
| weier61x2short Weierstrass, signed-x codec, projective += affine | 696 ns (1.90× the best) | 698 ns (6.19× the best) | 0.44 ns (tied for the best, within noise, 1.03×) | 0.52 ns (1.13× the best) | 190 ns (1.39× the best) | 15.3 ns (1.22× the best) | 441 ns (2.85× the best) | 448 ns (21.43× the best) | ||||||||
| weier61x2-jacobianincompleteshort Weierstrass, signed-x codec, Jacobian += affine | 702 ns (1.92× the best) | 698 ns (6.19× the best) | 0.44 ns (tied for the best, within noise, 1.02×) | 0.52 ns (1.12× the best) | 198 ns (1.45× the best) | 24.8 ns (1.97× the best) | 440 ns (2.84× the best) | 445 ns (21.28× the best) | ||||||||
| twisted61x2a = −1 Edwards modulo 2-torsion, extended += cached | 706 ns (1.93× the best) | 703 ns (3.52× the best) | 703 ns (5.13× the best) | 711 ns (6.31× the best) | 8.07 ns (18.77× the best) | 8.59 ns (8.02× the best) | 8.39 ns (11.15× the best) | 7.93 ns (17.07× the best) | 189 ns (1.38× the best) | 49.3 ns (1.29× the best) | 21.1 ns (1.30× the best) | 14.9 ns (1.19× the best) | 448 ns (2.90× the best) | 448 ns (8.27× the best) | 447 ns (15.52× the best) | 450 ns (21.55× the best) |
| F_{p²}, p = 2^64 − 59, 16 bytes | ||||||||||||||||
| twisted64x2a = −1 Edwards modulo 2-torsion, extended += cached | 1.00 µs (2.74× the best) | 1.00 µs (8.91× the best) | 8.75 ns (20.37× the best) | 8.79 ns (18.94× the best) | 267 ns (1.95× the best) | 22.6 ns (1.80× the best) | 650 ns (4.20× the best) | 647 ns (30.96× the best) | ||||||||
| F_{p²}, p = 2^64 − 2^32 + 1, 16 bytes | ||||||||||||||||
| twisted-goldilocks2a = −1 Edwards modulo 2-torsion, extended += cached | 2.21 µs (6.05× the best) | 2.24 µs (19.85× the best) | 9.45 ns (22.00× the best) | 9.54 ns (20.55× the best) | 316 ns (2.31× the best) | 22.9 ns (1.83× the best) | 1.91 µs (12.36× the best) | 1.92 µs (92.00× 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 | 50.2 ns | 50.2 ns |
| per salt | accept the curve | 74.4 µs | 74.4 µs |
| per salt | checksum keys | 127 ns | 375 ns |
| per salt | mapping keys | 127 ns | 375 ns |
| per salt and item | hash to the addend | 113 ns | 63.8 ns |
| per salt and item | mapping seed | 51.4 ns | 9.67 ns |
| per salt and item | mapping walk below m = 1350 | 124 ns | 124 ns |
| per cell | add | 20.4 ns | 20.4 ns |
| per cell | encode | 18.2 ns | 18.2 ns |
| per cell | decode | 26.7 ns | 26.7 ns |
| measured | insertion per item, k = 13.57 cells | 513 ns | 418 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 | 50.2 ns | 50.2 ns |
| per salt | accept the curve | 74.4 µs | 74.4 µs |
| per salt | checksum keys | 127 ns | 375 ns |
| per salt | mapping keys | 127 ns | 375 ns |
| per salt and item | hash to the addend | 105 ns | 55.7 ns |
| per salt and item | mapping seed | 51.4 ns | 9.67 ns |
| per salt and item | mapping walk below m = 1350 | 124 ns | 124 ns |
| per cell | add | 18.9 ns | 18.9 ns |
| per cell | encode | 14.1 ns | 14.1 ns |
| per cell | decode | 26.5 ns | 26.5 ns |
| measured | insertion per item, k = 13.57 cells | 488 ns | 395 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 | 50.2 ns | 50.2 ns |
| per salt | accept the curve | 74.4 µs | 74.4 µs |
| per salt | checksum keys | 127 ns | 375 ns |
| per salt | mapping keys | 127 ns | 375 ns |
| per salt and item | hash to the addend | 110 ns | 60.6 ns |
| per salt and item | mapping seed | 51.4 ns | 9.67 ns |
| per salt and item | mapping walk below m = 1350 | 124 ns | 124 ns |
| per cell | add | 13.5 ns | 13.5 ns |
| per cell | encode | 21.9 ns | 21.9 ns |
| per cell | decode | 27.7 ns | 27.7 ns |
| measured | insertion per item, k = 13.57 cells | 422 ns | 331 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 | 50.2 ns | 50.2 ns |
| per salt | accept the curve | 74.4 µs | 74.4 µs |
| per salt | checksum keys | 127 ns | 375 ns |
| per salt | mapping keys | 127 ns | 375 ns |
| per salt and item | hash to the addend | 105 ns | 56.3 ns |
| per salt and item | mapping seed | 51.4 ns | 9.67 ns |
| per salt and item | mapping walk below m = 1350 | 124 ns | 124 ns |
| per cell | add | 18.9 ns | 18.9 ns |
| per cell | encode | 21.6 ns | 21.6 ns |
| per cell | decode | 24.4 ns | 24.4 ns |
| measured | insertion per item, k = 13.57 cells | 490 ns | 397 ns |
binary.122, pornin, checksum projected in , mapping in
| lifetime | term | salted SHA-256 | projection |
|---|---|---|---|
| per item | ID, the item’s SHA-256 | 50.2 ns | 50.2 ns |
| per salt | accept the curve | 70.1 µs | 70.1 µs |
| per salt | checksum keys | 127 ns | 375 ns |
| per salt | mapping keys | 127 ns | 375 ns |
| per salt and item | hash to the addend | 103 ns | 53.4 ns |
| per salt and item | mapping seed | 51.4 ns | 9.67 ns |
| per salt and item | mapping walk below m = 1350 | 124 ns | 124 ns |
| per cell | add | 19.9 ns | 19.9 ns |
| per cell | encode | 22.1 ns | 22.1 ns |
| per cell | decode | 24.0 ns | 24.0 ns |
| measured | insertion per item, k = 13.57 cells | 537 ns | 435 ns |
binary.122-gls, pornin, checksum projected in , mapping in
| lifetime | term | salted SHA-256 | projection |
|---|---|---|---|
| per item | ID, the item’s SHA-256 | 50.2 ns | 50.2 ns |
| per salt | accept the curve | 78.3 µs | 78.3 µs |
| per salt | checksum keys | 127 ns | 375 ns |
| per salt | mapping keys | 127 ns | 375 ns |
| per salt and item | hash to the addend | 100 ns | 51.7 ns |
| per salt and item | mapping seed | 51.4 ns | 9.67 ns |
| per salt and item | mapping walk below m = 1350 | 124 ns | 124 ns |
| per cell | add | 19.3 ns | 19.3 ns |
| per cell | encode | 21.1 ns | 21.1 ns |
| per cell | decode | 22.7 ns | 22.7 ns |
| measured | insertion per item, k = 13.57 cells | 509 ns | 408 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 | 50.2 ns | 50.2 ns |
| per salt | accept the curve | 78.3 µs | 78.3 µs |
| per salt | checksum keys | 127 ns | 375 ns |
| per salt | mapping keys | 127 ns | 375 ns |
| per salt and item | hash to the addend | 95.2 ns | 46.1 ns |
| per salt and item | mapping seed | 51.4 ns | 9.67 ns |
| per salt and item | mapping walk below m = 1350 | 124 ns | 124 ns |
| per cell | add | 20.3 ns | 20.3 ns |
| per cell | encode | 17.9 ns | 17.9 ns |
| per cell | decode | 22.6 ns | 22.6 ns |
| measured | insertion per item, k = 13.57 cells | 501 ns | 400 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 | 50.2 ns | 50.2 ns |
| per salt | accept the curve | 78.3 µs | 78.3 µs |
| per salt | checksum keys | 127 ns | 375 ns |
| per salt | mapping keys | 127 ns | 375 ns |
| per salt and item | hash to the addend | 99.5 ns | 50.1 ns |
| per salt and item | mapping seed | 51.4 ns | 9.67 ns |
| per salt and item | mapping walk below m = 1350 | 124 ns | 124 ns |
| per cell | add | 13.7 ns | 13.7 ns |
| per cell | encode | 18.0 ns | 18.0 ns |
| per cell | decode | 24.7 ns | 24.7 ns |
| measured | insertion per item, k = 13.57 cells | 432 ns | 333 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 | 50.2 ns | 50.2 ns |
| per salt | accept the curve | 78.3 µs | 78.3 µs |
| per salt | checksum keys | 127 ns | 375 ns |
| per salt | mapping keys | 127 ns | 375 ns |
| per salt and item | hash to the addend | 95.1 ns | 46.4 ns |
| per salt and item | mapping seed | 51.4 ns | 9.67 ns |
| per salt and item | mapping walk below m = 1350 | 124 ns | 124 ns |
| per cell | add | 20.3 ns | 20.3 ns |
| per cell | encode | 20.4 ns | 20.4 ns |
| per cell | decode | 20.9 ns | 20.9 ns |
| measured | insertion per item, k = 13.57 cells | 498 ns | 402 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 | 50.2 ns | 50.2 ns |
| per salt | accept the curve | 70.1 µs | 70.1 µs |
| per salt | checksum keys | 127 ns | 375 ns |
| per salt | mapping keys | 127 ns | 375 ns |
| per salt and item | hash to the addend | 95.8 ns | 46.4 ns |
| per salt and item | mapping seed | 51.4 ns | 9.67 ns |
| per salt and item | mapping walk below m = 1350 | 124 ns | 124 ns |
| per cell | add | 20.2 ns | 20.2 ns |
| per cell | encode | 17.3 ns | 17.3 ns |
| per cell | decode | 24.1 ns | 24.1 ns |
| measured | insertion per item, k = 13.57 cells | 505 ns | 403 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 | 50.2 ns | 50.2 ns |
| per salt | accept the curve | 70.1 µs | 70.1 µs |
| per salt | checksum keys | 127 ns | 375 ns |
| per salt | mapping keys | 127 ns | 375 ns |
| per salt and item | hash to the addend | 100 ns | 50.3 ns |
| per salt and item | mapping seed | 51.4 ns | 9.67 ns |
| per salt and item | mapping walk below m = 1350 | 124 ns | 124 ns |
| per cell | add | 14.3 ns | 14.3 ns |
| per cell | encode | 18.4 ns | 18.4 ns |
| per cell | decode | 26.0 ns | 26.0 ns |
| measured | insertion per item, k = 13.57 cells | 436 ns | 332 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 | 50.2 ns | 50.2 ns |
| per salt | accept the curve | 70.1 µs | 70.1 µs |
| per salt | checksum keys | 127 ns | 375 ns |
| per salt | mapping keys | 127 ns | 375 ns |
| per salt and item | hash to the addend | 95.3 ns | 46.6 ns |
| per salt and item | mapping seed | 51.4 ns | 9.67 ns |
| per salt and item | mapping walk below m = 1350 | 124 ns | 124 ns |
| per cell | add | 20.5 ns | 20.5 ns |
| per cell | encode | 21.2 ns | 21.2 ns |
| per cell | decode | 21.6 ns | 21.6 ns |
| measured | insertion per item, k = 13.57 cells | 504 ns | 409 ns |
binary.127, pornin, checksum projected in , mapping in
| lifetime | term | salted SHA-256 | projection |
|---|---|---|---|
| per item | ID, the item’s SHA-256 | 50.2 ns | 50.2 ns |
| per salt | accept the curve | 69.9 µs | 69.9 µs |
| per salt | checksum keys | 127 ns | 375 ns |
| per salt | mapping keys | 127 ns | 375 ns |
| per salt and item | hash to the addend | 101 ns | 51.6 ns |
| per salt and item | mapping seed | 51.4 ns | 9.67 ns |
| per salt and item | mapping walk below m = 1350 | 124 ns | 124 ns |
| per cell | add | 19.5 ns | 19.5 ns |
| per cell | encode | 22.7 ns | 22.7 ns |
| per cell | decode | 25.7 ns | 25.7 ns |
| measured | insertion per item, k = 13.57 cells | 503 ns | 412 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 | 50.2 ns | 50.2 ns |
| per salt | accept the curve | 69.9 µs | 69.9 µs |
| per salt | checksum keys | 127 ns | 375 ns |
| per salt | mapping keys | 127 ns | 375 ns |
| per salt and item | hash to the addend | 93.0 ns | 43.9 ns |
| per salt and item | mapping seed | 51.4 ns | 9.67 ns |
| per salt and item | mapping walk below m = 1350 | 124 ns | 124 ns |
| per cell | add | 17.6 ns | 17.6 ns |
| per cell | encode | 17.5 ns | 17.5 ns |
| per cell | decode | 24.0 ns | 24.0 ns |
| measured | insertion per item, k = 13.57 cells | 474 ns | 379 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 | 50.2 ns | 50.2 ns |
| per salt | accept the curve | 69.9 µs | 69.9 µs |
| per salt | checksum keys | 127 ns | 375 ns |
| per salt | mapping keys | 127 ns | 375 ns |
| per salt and item | hash to the addend | 98.7 ns | 49.2 ns |
| per salt and item | mapping seed | 51.4 ns | 9.67 ns |
| per salt and item | mapping walk below m = 1350 | 124 ns | 124 ns |
| per cell | add | 13.2 ns | 13.2 ns |
| per cell | encode | 12.6 ns | 12.6 ns |
| per cell | decode | 27.5 ns | 27.5 ns |
| measured | insertion per item, k = 13.57 cells | 414 ns | 320 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 | 50.2 ns | 50.2 ns |
| per salt | accept the curve | 69.9 µs | 69.9 µs |
| per salt | checksum keys | 127 ns | 375 ns |
| per salt | mapping keys | 127 ns | 375 ns |
| per salt and item | hash to the addend | 93.0 ns | 45.8 ns |
| per salt and item | mapping seed | 51.4 ns | 9.67 ns |
| per salt and item | mapping walk below m = 1350 | 124 ns | 124 ns |
| per cell | add | 17.7 ns | 17.7 ns |
| per cell | encode | 17.0 ns | 17.0 ns |
| per cell | decode | 22.6 ns | 22.6 ns |
| measured | insertion per item, k = 13.57 cells | 476 ns | 380 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 (69.9 µs to 91.2 µs, curvegen/verify_accept) includes the embedding-degree bound, a baby-step giant-step search for with , which alone takes 42.1 µs to 44.4 µs (curvegen/embedding), 49% to 62% 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 | 1.08 s | 1.49 s | 504 µs | 88% |
| edwards61x2 | pari+sieve | yes | 16 | 122.7 | 10.7 | 577 ms | 813 ms | 257 µs | 89% |
| gf2_109 | agm | 16 | 50.1 | 50.1 | 20.8 ms | 21.3 ms | 157 µs | 97% | |
| gf2_109 | agm+factor | yes | 16 | 50.1 | 50.1 | 20.7 ms | 30.8 ms | 135 µs | 68% |
| gf2_109 | pari | 16 | 50.1 | 50.1 | 101 ms | 109 ms | 141 µs | 91% | |
| gf2_122 | agm | yes | 16 | 39.5 | 39.5 | 18.1 ms | 17.7 ms | 126 µs | 96% |
| gf2_122 | pari | 16 | 39.5 | 39.5 | 115 ms | 116 ms | 130 µs | 99% | |
| gf2_122-gls | agm | yes | 16 | 47.2 | 47.2 | 5.75 ms | 6.31 ms | 152 µs | 87% |
| gf2_122-gls | pari | 16 | 47.2 | 47.2 | 136 ms | 137 ms | 150 µs | 99% | |
| gf2_127 | agm+sieve | yes | 16 | 83.6 | 25.1 | 16.0 ms | 15.7 ms | 170 µs | 75% |
| gf2_127 | pari | 16 | 83.6 | 83.6 | 295 ms | 335 ms | 135 µs | 88% | |
| twisted-goldilocks2 | pari+sieve | yes | 16 | 306.9 | 28.4 | 2.02 s | 2.78 s | 767 µs | 89% |
| twisted61x2 | pari+sieve | yes | 16 | 247.9 | 22.4 | 1.28 s | 1.71 s | 318 µs | 89% |
| twisted64x2 | pari+sieve | yes | 16 | 347.1 | 28.2 | 2.20 s | 2.92 s | 552 µs | 88% |
| weier127 | pari+sieve | yes | 16 | 179.0 | 19.6 | 1.27 s | 1.76 s | 278 µs | 88% |
| weier61x2 | pari+sieve | yes | 16 | 97.5 | 11.1 | 639 ms | 859 ms | 188 µs | 88% |
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 | 53.4 ns | 0.45 ns | 0.26 ns | ||||||||||||||
| GF(2^127), 16 bytes | |||||||||||||||||
| gf2_127(X:S:Z:T) extended accumulators, Pornin's formulas | 256 ns (best) | 103 ns (1.01× the best) | 6.38 ns (14.85× the best) | 6.36 ns (13.70× the best) | 19.5 ns (1.48× the best) | 19.9 ns (1.36× the best) | 18.6 ns (1.42× the best) | 0.56 ns (1.01× the best) | 1.02 ns (2.53× the best) | 3.97 ns (1.01× the best) | 4.25 ns (1.43× the best) | 151 ns (1.10× the best) | 22.7 ns (1.81× the best) | 164 ns (1.06× the best) | 25.7 ns (1.23× the best) | ||
| gf2_127-lambdaincompleteλ-projective (X:L:Z) accumulators | 394 ns (1.54× the best) | 114 ns (1.13× the best) | 245 ns (tied for the best, within noise, 1.00×) | 92.7 ns (tied for the best, within noise) | 129 ns (299.16× the best) | 8.18 ns (17.62× the best) | 17.6 ns (1.34× the best) | 24.4 ns (1.67× the best) | 17.6 ns (1.35× the best) | 0.56 ns (tied for the best, within noise, 1.01×) | 0.82 ns (2.05× the best) | 3.95 ns (tied for the best, within noise) | 4.05 ns (1.36× the best) | 140 ns (1.02× the best) | 17.5 ns (1.39× the best) | 155 ns (tied for the best, within noise, 1.00×) | 24.0 ns (1.15× the best) |
| gf2_127-wincompleteλ-projective, w codec: hashes and decodes to λ-affine | 392 ns (1.53× the best) | 119 ns (1.18× the best) | 244 ns (tied for the best, within noise) | 92.8 ns (tied for the best, within noise, 1.00×) | 0.45 ns (tied for the best, within noise, 1.06×) | 0.47 ns (1.01× the best) | 17.7 ns (1.34× the best) | 24.4 ns (1.67× the best) | 17.7 ns (1.35× the best) | 0.56 ns (tied for the best, within noise, 1.01×) | 0.82 ns (2.03× the best) | 4.04 ns (1.02× the best) | 4.05 ns (1.36× the best) | 139 ns (1.02× the best) | 17.0 ns (1.35× the best) | 155 ns (tied for the best, within noise) | 22.6 ns (1.08× the best) |
| gf2_127-uunscaled (X:S:Z), w codec, direct addend hashes | 401 ns (1.57× the best) | 125 ns (1.23× the best) | 249 ns (1.02× the best) | 98.0 ns (1.06× the best) | 0.48 ns (1.13× the best) | 0.47 ns (1.02× the best) | 13.2 ns (best) | 14.6 ns (best) | 13.1 ns (best) | 0.56 ns (tied for the best, within noise, 1.01×) | 0.83 ns (2.07× the best) | 6.31 ns (1.60× the best) | 6.44 ns (2.17× the best) | 137 ns (best) | 12.6 ns (best) | 162 ns (1.04× the best) | 27.5 ns (1.32× the best) |
| GF(2^122) = GF(2^61)[u], dense constant, 16 bytes | |||||||||||||||||
| gf2_122(X:S:Z:T) extended | 392 ns (1.53× the best) | 103 ns (1.01× the best) | 4.91 ns (11.42× the best) | 5.01 ns (10.80× the best) | 19.9 ns (1.51× the best) | 21.3 ns (1.46× the best) | 20.1 ns (1.54× the best) | 0.56 ns (tied for the best, within noise) | 0.87 ns (2.17× the best) | 4.07 ns (1.03× the best) | 4.05 ns (1.36× the best) | 294 ns (2.15× the best) | 22.1 ns (1.76× the best) | 313 ns (2.02× the best) | 24.0 ns (1.15× the best) | ||
| gf2_122-lambdaincompleteλ-projective | 679 ns (2.65× the best) | 115 ns (1.14× the best) | 381 ns (1.56× the best) | 95.0 ns (1.02× the best) | 251 ns (583.32× the best) | 8.18 ns (17.61× the best) | 20.2 ns (1.53× the best) | 28.0 ns (1.92× the best) | 20.5 ns (1.57× the best) | 0.56 ns (1.01× the best) | 0.81 ns (2.02× the best) | 4.21 ns (1.07× the best) | 4.23 ns (1.42× the best) | 287 ns (2.10× the best) | 17.3 ns (1.37× the best) | 314 ns (2.03× the best) | 24.1 ns (1.15× the best) |
| gf2_122-wincompleteλ-projective, w codec | 654 ns (2.56× the best) | 116 ns (1.15× the best) | 381 ns (1.56× the best) | 95.2 ns (1.03× the best) | 0.44 ns (tied for the best, within noise, 1.02×) | 0.47 ns (tied for the best, within noise, 1.00×) | 20.5 ns (1.55× the best) | 27.9 ns (1.91× the best) | 20.5 ns (1.57× the best) | 0.58 ns (1.04× the best) | 0.84 ns (2.09× the best) | 4.23 ns (1.07× the best) | 4.41 ns (1.49× the best) | 302 ns (2.20× the best) | 21.2 ns (1.69× the best) | 307 ns (1.98× the best) | 21.6 ns (1.03× the best) |
| gf2_122-uunscaled (X:S:Z), w codec | 674 ns (2.63× the best) | 127 ns (1.25× the best) | 391 ns (1.60× the best) | 99.3 ns (1.07× the best) | 0.50 ns (1.15× the best) | 0.49 ns (1.06× the best) | 14.3 ns (1.08× the best) | 16.7 ns (1.15× the best) | 13.9 ns (1.06× the best) | 0.58 ns (1.03× the best) | 0.85 ns (2.10× the best) | 5.59 ns (1.42× the best) | 5.97 ns (2.01× the best) | 305 ns (2.23× the best) | 18.4 ns (1.47× the best) | 317 ns (2.05× the best) | 26.0 ns (1.24× the best) |
| GF(2^122), constant in GF(2^61) (GLS-shaped), 16 bytes | |||||||||||||||||
| gf2_122-gls(X:S:Z:T) extended | 394 ns (1.54× the best) | 101 ns (best) | 4.22 ns (9.82× the best) | 4.27 ns (9.20× the best) | 19.3 ns (1.46× the best) | 20.6 ns (1.41× the best) | 19.5 ns (1.49× the best) | 1.17 ns (2.10× the best) | 0.87 ns (2.17× the best) | 4.06 ns (1.03× the best) | 4.08 ns (1.37× the best) | 293 ns (2.14× the best) | 21.1 ns (1.68× the best) | 313 ns (2.02× the best) | 22.7 ns (1.08× the best) | ||
| gf2_122-gls-lambdaincompleteλ-projective | 692 ns (2.70× the best) | 116 ns (1.14× the best) | 385 ns (1.58× the best) | 95.0 ns (1.03× the best) | 249 ns (579.08× the best) | 8.11 ns (17.46× the best) | 20.3 ns (1.53× the best) | 28.0 ns (1.92× the best) | 20.4 ns (1.56× the best) | 0.57 ns (1.03× the best) | 0.80 ns (2.00× the best) | 4.20 ns (1.06× the best) | 4.37 ns (1.47× the best) | 297 ns (2.17× the best) | 17.9 ns (1.42× the best) | 311 ns (2.01× the best) | 22.6 ns (1.08× the best) |
| gf2_122-gls-wincompleteλ-projective, w codec | 659 ns (2.57× the best) | 116 ns (1.14× the best) | 385 ns (1.58× the best) | 94.6 ns (1.02× the best) | 0.43 ns (tied for the best, within noise) | 0.68 ns (1.47× the best) | 20.3 ns (1.54× the best) | 28.1 ns (1.93× the best) | 20.5 ns (1.56× the best) | 0.56 ns (tied for the best, within noise, 1.01×) | 0.81 ns (2.01× the best) | 4.23 ns (1.07× the best) | 4.26 ns (1.43× the best) | 297 ns (2.17× the best) | 20.4 ns (1.62× the best) | 305 ns (1.97× the best) | 20.9 ns (best) |
| gf2_122-gls-uunscaled (X:S:Z), w codec | 678 ns (2.65× the best) | 121 ns (1.19× the best) | 390 ns (1.60× the best) | 97.6 ns (1.05× the best) | 0.44 ns (tied for the best, within noise, 1.01×) | 0.68 ns (1.46× the best) | 13.7 ns (1.04× the best) | 16.2 ns (1.11× the best) | 14.0 ns (1.07× the best) | 0.56 ns (tied for the best, within noise, 1.01×) | 0.80 ns (2.00× the best) | 5.60 ns (1.42× the best) | 5.64 ns (1.90× the best) | 297 ns (2.17× the best) | 18.0 ns (1.44× the best) | 313 ns (2.02× the best) | 24.7 ns (1.18× the best) |
| GF(2^109), 14 bytes | |||||||||||||||||
| gf2_109(X:S:Z:T) extended | 675 ns (2.63× the best) | 114 ns (1.12× the best) | 4.23 ns (9.85× the best) | 4.25 ns (9.16× the best) | 20.4 ns (1.54× the best) | 22.2 ns (1.52× the best) | 20.7 ns (1.58× the best) | 0.56 ns (tied for the best, within noise, 1.01×) | 0.94 ns (2.34× the best) | 4.05 ns (1.03× the best) | 4.07 ns (1.37× the best) | 538 ns (3.93× the best) | 18.2 ns (1.45× the best) | 554 ns (3.58× the best) | 26.7 ns (1.28× the best) | ||
| gf2_109-lambdaincompleteλ-projective | 1.16 µs (4.53× the best) | 124 ns (1.23× the best) | 655 ns (2.69× the best) | 105 ns (1.13× the best) | 503 ns (1170.41× the best) | 8.13 ns (17.51× the best) | 18.9 ns (1.43× the best) | 28.2 ns (1.94× the best) | 19.1 ns (1.46× the best) | 0.56 ns (tied for the best, within noise, 1.00×) | 0.80 ns (1.99× the best) | 3.96 ns (tied for the best, within noise, 1.00×) | 3.94 ns (1.33× the best) | 530 ns (3.87× the best) | 14.1 ns (1.12× the best) | 549 ns (3.55× the best) | 26.5 ns (1.27× the best) |
| gf2_109-wincompleteλ-projective, w codec | 1.14 µs (4.44× the best) | 120 ns (1.18× the best) | 652 ns (2.67× the best) | 104 ns (1.12× the best) | 0.44 ns (tied for the best, within noise, 1.02×) | 0.47 ns (tied for the best, within noise, 1.01×) | 18.9 ns (1.43× the best) | 28.3 ns (1.94× the best) | 19.2 ns (1.46× the best) | 0.57 ns (1.01× the best) | 0.80 ns (1.99× the best) | 4.16 ns (1.05× the best) | 4.13 ns (1.39× the best) | 540 ns (3.94× the best) | 21.6 ns (1.72× the best) | 555 ns (3.59× the best) | 24.4 ns (1.17× the best) |
| gf2_109-uunscaled (X:S:Z), w codec | 1.15 µs (4.51× the best) | 125 ns (1.23× the best) | 657 ns (2.70× the best) | 110 ns (1.18× the best) | 0.48 ns (1.12× the best) | 0.46 ns (tied for the best, within noise) | 13.5 ns (1.02× the best) | 15.7 ns (1.08× the best) | 13.6 ns (1.04× the best) | 0.56 ns (tied for the best, within noise, 1.01×) | 0.80 ns (1.99× the best) | 5.84 ns (1.48× the best) | 5.82 ns (1.96× the best) | 546 ns (3.99× the best) | 21.9 ns (1.74× the best) | 555 ns (3.59× the best) | 27.7 ns (1.33× the best) |
| F_p, p = 2^127 − 1, 16 bytes | |||||||||||||||||
| edwards127a = 1 Edwards, extended += cached | 1.22 µs (4.78× the best) | 1.24 µs (12.21× the best) | 663 ns (1543.72× the best) | 39.9 ns (86.04× the best) | 27.5 ns (2.08× the best) | 35.8 ns (2.46× the best) | 1.98 ns (3.55× the best) | 1.30 ns (3.24× the best) | 3.16 ns (1.06× the best) | 610 ns (4.45× the best) | 31.9 ns (2.54× the best) | 540 ns (3.49× the best) | 541 ns (25.90× the best) | ||||
| weier127short Weierstrass, projective += affine | 1.16 µs (4.53× the best) | 1.17 µs (11.50× the best) | 0.81 ns (1.89× the best) | 1.00 ns (2.15× the best) | 58.7 ns (4.45× the best) | 63.9 ns (4.38× the best) | 1.10 ns (1.97× the best) | 0.40 ns (tied for the best, within noise, 1.01×) | 3.53 ns (1.19× the best) | 593 ns (4.33× the best) | 16.7 ns (1.33× the best) | 541 ns (3.50× the best) | 539 ns (25.81× the best) | ||||
| weier127-jacobianincompleteshort Weierstrass, Jacobian += affine | 1.15 µs (4.51× the best) | 1.16 µs (11.42× the best) | 0.81 ns (1.88× the best) | 0.99 ns (2.13× the best) | 48.1 ns (3.64× the best) | 56.6 ns (3.89× the best) | 1.10 ns (1.97× the best) | 0.40 ns (1.01× the best) | 6.60 ns (2.22× the best) | 605 ns (4.42× the best) | 23.6 ns (1.88× the best) | 543 ns (3.51× the best) | 542 ns (25.93× the best) | ||||
| F_p, p = 2^107 − 1, 14 bytes | |||||||||||||||||
| edwards107a = 1 Edwards, extended += cached | 919 ns (3.59× the best) | 916 ns (9.04× the best) | 632 ns (1471.60× the best) | 37.9 ns (81.74× the best) | 27.6 ns (2.09× the best) | 32.6 ns (2.24× the best) | 1.40 ns (2.51× the best) | 1.18 ns (2.94× the best) | 4.93 ns (1.66× the best) | 600 ns (4.38× the best) | 35.1 ns (2.80× the best) | 424 ns (2.74× the best) | 426 ns (20.37× the best) | ||||
| weier107short Weierstrass, projective += affine | 892 ns (3.48× the best) | 901 ns (8.89× the best) | 0.82 ns (1.90× the best) | 0.63 ns (1.35× the best) | 48.6 ns (3.68× the best) | 53.9 ns (3.70× the best) | 0.82 ns (1.47× the best) | 0.91 ns (2.25× the best) | 5.81 ns (1.96× the best) | 582 ns (4.25× the best) | 19.4 ns (1.54× the best) | 421 ns (2.72× the best) | 422 ns (20.19× the best) | ||||
| weier107-jacobianincompleteshort Weierstrass, Jacobian += affine | 886 ns (3.46× the best) | 893 ns (8.81× the best) | 0.81 ns (1.88× the best) | 0.63 ns (1.35× the best) | 44.1 ns (3.34× the best) | 50.9 ns (3.49× the best) | 0.82 ns (1.48× the best) | 0.90 ns (2.24× the best) | 9.23 ns (3.11× the best) | 580 ns (4.23× the best) | 25.5 ns (2.03× the best) | 419 ns (2.71× the best) | 421 ns (20.13× the best) | ||||
| F_p, p = 2^128 − 275, 16 bytes | |||||||||||||||||
| twisted128a = −1 twisted Edwards modulo 2-torsion, extended += cached | 1.97 µs (7.68× the best) | 1.96 µs (19.34× the best) | 12.5 ns (29.04× the best) | 12.7 ns (27.29× the best) | 31.1 ns (2.35× the best) | 36.3 ns (2.49× the best) | 1.15 ns (2.06× the best) | 0.50 ns (1.25× the best) | 9.45 ns (3.18× the best) | 943 ns (6.89× the best) | 22.7 ns (1.81× the best) | 960 ns (6.21× the best) | 962 ns (46.04× the best) | ||||
| F_{p²}, p = 2^61 − 1, 16 bytes | |||||||||||||||||
| edwards61x2a = 1 Edwards, signed-x codec, extended += cached | 707 ns (2.76× the best) | 706 ns (6.97× the best) | 236 ns (548.53× the best) | 34.9 ns (75.23× the best) | 25.8 ns (1.95× the best) | 29.6 ns (2.03× the best) | 0.78 ns (1.39× the best) | 0.54 ns (1.34× the best) | 2.97 ns (best) | 203 ns (1.48× the best) | 35.0 ns (2.79× the best) | 437 ns (2.83× the best) | 441 ns (21.08× the best) | ||||
| weier61x2short Weierstrass, signed-x codec, projective += affine | 696 ns (2.72× the best) | 698 ns (6.89× the best) | 0.44 ns (tied for the best, within noise, 1.03×) | 0.52 ns (1.13× the best) | 50.6 ns (3.83× the best) | 57.1 ns (3.92× the best) | 0.57 ns (1.02× the best) | 0.41 ns (1.01× the best) | 3.33 ns (1.12× the best) | 190 ns (1.39× the best) | 15.3 ns (1.22× the best) | 441 ns (2.85× the best) | 448 ns (21.43× the best) | ||||
| weier61x2-jacobianincompleteshort Weierstrass, signed-x codec, Jacobian += affine | 702 ns (2.74× the best) | 698 ns (6.89× the best) | 0.44 ns (tied for the best, within noise, 1.02×) | 0.52 ns (1.12× the best) | 50.2 ns (3.80× the best) | 57.2 ns (3.92× the best) | 0.57 ns (1.02× the best) | 0.40 ns (tied for the best, within noise) | 7.98 ns (2.69× the best) | 198 ns (1.45× the best) | 24.8 ns (1.97× the best) | 440 ns (2.84× the best) | 445 ns (21.28× the best) | ||||
| twisted61x2a = −1 Edwards modulo 2-torsion, extended += cached | 706 ns (2.76× the best) | 711 ns (7.01× the best) | 8.07 ns (18.77× the best) | 7.93 ns (17.07× the best) | 24.9 ns (1.89× the best) | 28.4 ns (1.95× the best) | 25.2 ns (1.92× the best) | 0.73 ns (1.32× the best) | 0.50 ns (1.24× the best) | 8.55 ns (2.17× the best) | 8.85 ns (2.98× the best) | 189 ns (1.38× the best) | 14.9 ns (1.19× the best) | 448 ns (2.90× the best) | 450 ns (21.55× the best) | ||
| F_{p²}, p = 2^64 − 59, 16 bytes | |||||||||||||||||
| twisted64x2a = −1 Edwards modulo 2-torsion, extended += cached | 1.00 µs (3.91× the best) | 1.00 µs (9.90× the best) | 8.75 ns (20.37× the best) | 8.79 ns (18.94× the best) | 33.3 ns (2.52× the best) | 37.9 ns (2.60× the best) | 0.73 ns (1.32× the best) | 0.50 ns (1.25× the best) | 7.68 ns (2.59× the best) | 267 ns (1.95× the best) | 22.6 ns (1.80× the best) | 650 ns (4.20× the best) | 647 ns (30.96× the best) | ||||
| F_{p²}, p = 2^64 − 2^32 + 1, 16 bytes | |||||||||||||||||
| twisted-goldilocks2a = −1 Edwards modulo 2-torsion, extended += cached | 2.21 µs (8.65× the best) | 2.24 µs (22.07× the best) | 9.45 ns (22.00× the best) | 9.54 ns (20.55× the best) | 28.7 ns (2.18× the best) | 29.4 ns (2.02× the best) | 1.32 ns (2.36× the best) | 0.60 ns (1.48× the best) | 9.42 ns (3.17× the best) | 316 ns (2.31× the best) | 22.9 ns (1.83× the best) | 1.91 µs (12.36× the best) | 1.92 µs (92.00× the best) | ||||
| references, 32 and 33 bytes | |||||||||||||||||
| ristretto255curve25519-dalek | 6.03 µs (23.55× the best) | 116 ns (8.76× the best) | 117 ns (8.05× the best) | 113 ns (8.62× the best) | 6.47 ns (11.61× the best) | ||||||||||||
| secp256k1libsecp256k1 | 6.16 µs (24.04× the best) | 24.7 ns (44.31× 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.43 ns (1.04× the best) | 3.50 ns (1.07× the best) | 0.65 ns (best) | 2.18 ns (best) | xor | 1.70 ns (best) | 5.16 ns (1.34× the best) | 123 ns (best) | 5.41 ns (1.03× the best) | |||
| gf2_122GF(2^61)[u]/(u^2 + u + 1) | 1.38 ns (1.01× the best) | 4.56 ns (1.40× the best) | 1.17 ns (1.80× the best) | 4.33 ns (1.99× the best) | xor | 3.98 ns (2.34× the best) | 3.86 ns (best) | 238 ns (1.93× the best) | 5.23 ns (best) | |||
| gf2_109F_2[z]/(z^109 + z^5 + z^4 + z^2 + 1) | 1.37 ns (best) | 5.13 ns (1.57× the best) | 0.81 ns (1.24× the best) | 3.88 ns (1.78× the best) | xor | 6.93 ns (4.09× the best) | 4.02 ns (1.04× the best) | 491 ns (3.99× the best) | 5.36 ns (1.03× the best) | |||
| prime | ||||||||||||
| fp127p = 2^127 − 1 | 2.69 ns (1.96× the best) | 4.31 ns (1.32× the best) | 2.30 ns (3.52× the best) | 4.26 ns (1.96× the best) | 1.00 ns (1.67× the best) | 523 ns (308.39× the best) | 592 ns (2.01× the best) | 577 ns (4.68× the best) | 10.2 ns (1.95× the best) | 0.38 ns (1.06× the best) | 0.70 ns (tied for the best, within noise) | |
| fp107p = 2^107 − 1 | 2.55 ns (1.86× the best) | 3.97 ns (1.22× the best) | 2.13 ns (3.27× the best) | 3.60 ns (1.65× the best) | 0.62 ns (1.04× the best) | 422 ns (248.72× the best) | 597 ns (2.03× the best) | 571 ns (4.63× the best) | 10.1 ns (1.92× the best) | 0.82 ns (2.27× the best) | 0.73 ns (1.05× the best) | |
| fp128p = 2^128 − 275, for twisted128 | 3.82 ns (2.79× the best) | 6.73 ns (2.06× the best) | 3.64 ns (5.58× the best) | 6.54 ns (3.00× the best) | 0.72 ns (1.19× the best) | 891 ns (524.78× the best) | 937 ns (3.18× the best) | 918 ns (7.45× the best) | 0.36 ns (tied for the best, within noise) | 0.70 ns (tied for the best, within noise, 1.00×) | ||
| quadratic extensions of prime fields | ||||||||||||
| fp61x2GF(p^2) = F_p[i]/(i^2 + 1), p = 2^61 − 1 | 2.54 ns (1.85× the best) | 5.37 ns (1.65× the best) | 2.38 ns (3.64× the best) | 5.90 ns (2.71× the best) | 0.61 ns (1.02× the best) | 298 ns (175.83× the best) | 295 ns (best) | 176 ns (1.43× the best) | 8.60 ns (1.64× the best) | 0.50 ns (1.38× the best) | 0.99 ns (1.42× the best) | |
| fp64x2GF(p^2) = F_p[i]/(i^2 − 2), p = 2^64 − 59 | 3.82 ns (2.79× the best) | 4.99 ns (1.53× the best) | 3.70 ns (5.67× the best) | 4.76 ns (2.19× the best) | 0.60 ns (best) | 431 ns (254.15× the best) | 431 ns (1.46× the best) | 241 ns (1.96× the best) | 13.6 ns (2.59× the best) | 0.37 ns (tied for the best, within noise, 1.01×) | 0.70 ns (tied for the best, within noise) | |
| goldilocks2GF(p^2) = F_p[i]/(i^2 − 7), p = 2^64 − 2^32 + 1 | 2.67 ns (1.94× the best) | 3.26 ns (best) | 2.59 ns (3.96× the best) | 3.59 ns (1.65× the best) | 0.69 ns (1.15× the best) | 996 ns (586.74× the best) | 950 ns (3.23× the best) | 304 ns (2.47× the best) | 8.96 ns (1.71× the best) | 0.69 ns (1.92× the best) | 0.70 ns (tied for the best, within noise) | |
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.43 ns | 1.42 ns .. 1.43 ns |
| field mul, throughput | gf2_109 | field/gf2_109/mul throughput (8 chains) | 1.37 ns | 1.37 ns .. 1.38 ns |
| field mul, throughput | gf2_122 | field/gf2_122/mul throughput (8 chains) | 1.38 ns | 1.38 ns .. 1.38 ns |
| field mul, throughput | fp127 | field/fp127/mul throughput (8 chains) | 2.69 ns | 2.68 ns .. 2.70 ns |
| field mul, throughput | fp107 | field/fp107 schoolbook/mul throughput (8 chains) | 2.55 ns | 2.55 ns .. 2.56 ns |
| field mul, throughput | fp128 | field/fp128/mul throughput (8 chains) | 3.82 ns | 3.82 ns .. 3.83 ns |
| field mul, throughput | fp61x2 | field/fp61x2/mul throughput (8 chains) | 2.54 ns | 2.54 ns .. 2.55 ns |
| field mul, throughput | fp64x2 | field/fp64x2/mul throughput (8 chains) | 3.82 ns | 3.82 ns .. 3.83 ns |
| field mul, throughput | goldilocks2 | field/goldilocks2/mul throughput (8 chains) | 2.67 ns | 2.66 ns .. 2.68 ns |
| field mul, latency | gf2_127 | field/gf2_127/mul latency (dependent chain) | 3.50 ns | 3.49 ns .. 3.51 ns |
| field mul, latency | gf2_109 | field/gf2_109/mul latency (dependent chain) | 5.13 ns | 5.10 ns .. 5.16 ns |
| field mul, latency | gf2_122 | field/gf2_122/mul latency (dependent chain) | 4.56 ns | 4.54 ns .. 4.57 ns |
| field mul, latency | fp127 | field/fp127/mul latency (dependent chain) | 4.31 ns | 4.29 ns .. 4.32 ns |
| field mul, latency | fp107 | field/fp107/mul latency (dependent chain) | 3.97 ns | 3.96 ns .. 3.98 ns |
| field mul, latency | fp128 | field/fp128/mul latency (dependent chain) | 6.73 ns | 6.71 ns .. 6.74 ns |
| field mul, latency | fp61x2 | field/fp61x2/mul latency (dependent chain) | 5.37 ns | 5.36 ns .. 5.39 ns |
| field mul, latency | fp64x2 | field/fp64x2/mul latency (dependent chain) | 4.99 ns | 4.99 ns .. 5.01 ns |
| field mul, latency | goldilocks2 | field/goldilocks2/mul latency (dependent chain) | 3.26 ns | 3.25 ns .. 3.27 ns |
| field square, throughput | gf2_127 | field/gf2_127/square throughput (8 chains) | 0.65 ns | 0.65 ns .. 0.65 ns |
| field square, throughput | gf2_109 | field/gf2_109/square throughput (8 chains) | 0.81 ns | 0.81 ns .. 0.81 ns |
| field square, throughput | gf2_122 | field/gf2_122/square throughput (8 chains) | 1.17 ns | 1.17 ns .. 1.18 ns |
| field square, throughput | fp127 | field/fp127/square throughput (8 chains) | 2.30 ns | 2.29 ns .. 2.31 ns |
| field square, throughput | fp107 | field/fp107/square throughput (8 chains) | 2.13 ns | 2.13 ns .. 2.14 ns |
| field square, throughput | fp128 | field/fp128/square throughput (8 chains) | 3.64 ns | 3.63 ns .. 3.65 ns |
| field square, throughput | fp61x2 | field/fp61x2/square throughput (8 chains) | 2.38 ns | 2.37 ns .. 2.38 ns |
| field square, throughput | fp64x2 | field/fp64x2/square throughput (8 chains) | 3.70 ns | 3.69 ns .. 3.71 ns |
| field square, throughput | goldilocks2 | field/goldilocks2/square throughput (8 chains) | 2.59 ns | 2.58 ns .. 2.60 ns |
| field square, latency | gf2_127 | field/gf2_127/square latency (dependent chain) | 2.18 ns | 2.17 ns .. 2.19 ns |
| field square, latency | gf2_109 | field/gf2_109/square latency (dependent chain) | 3.88 ns | 3.87 ns .. 3.89 ns |
| field square, latency | gf2_122 | field/gf2_122/square latency (dependent chain) | 4.33 ns | 4.32 ns .. 4.34 ns |
| field square, latency | fp127 | field/fp127/square latency (dependent chain) | 4.26 ns | 4.25 ns .. 4.27 ns |
| field square, latency | fp107 | field/fp107/square latency (dependent chain) | 3.60 ns | 3.59 ns .. 3.60 ns |
| field square, latency | fp128 | field/fp128/square latency (dependent chain) | 6.54 ns | 6.52 ns .. 6.56 ns |
| field square, latency | fp61x2 | field/fp61x2/square latency (dependent chain) | 5.90 ns | 5.88 ns .. 5.92 ns |
| field square, latency | fp64x2 | field/fp64x2/square latency (dependent chain) | 4.76 ns | 4.75 ns .. 4.77 ns |
| field square, latency | goldilocks2 | field/goldilocks2/square latency (dependent chain) | 3.59 ns | 3.58 ns .. 3.60 ns |
| field add | fp127 | field/fp127/add | 1.00 ns | 0.99 ns .. 1.01 ns |
| field add | fp107 | field/fp107/add | 0.62 ns | 0.62 ns .. 0.63 ns |
| field add | fp128 | field/fp128/add | 0.72 ns | 0.71 ns .. 0.72 ns |
| field add | fp61x2 | field/fp61x2/add | 0.61 ns | 0.61 ns .. 0.61 ns |
| field add | fp64x2 | field/fp64x2/add | 0.60 ns | 0.60 ns .. 0.60 ns |
| field add | goldilocks2 | field/goldilocks2/add | 0.69 ns | 0.69 ns .. 0.70 ns |
| field sqrt | gf2_127 | field/gf2_127/sqrt | 1.70 ns | 1.69 ns .. 1.70 ns |
| field sqrt | gf2_109 | field/gf2_109/sqrt | 6.93 ns | 6.92 ns .. 6.95 ns |
| field sqrt | gf2_122 | field/gf2_122/sqrt | 3.98 ns | 3.97 ns .. 3.98 ns |
| field sqrt | fp127 | field/fp127/sqrt (x^(2^125)) | 523 ns | 523 ns .. 524 ns |
| field sqrt | fp107 | field/fp107/sqrt (x^(2^105)) | 422 ns | 420 ns .. 425 ns |
| field sqrt | fp128 | field/fp128/sqrt | 891 ns | 888 ns .. 893 ns |
| field sqrt | fp61x2 | field/fp61x2/sqrt | 298 ns | 298 ns .. 299 ns |
| field sqrt | fp64x2 | field/fp64x2/sqrt | 431 ns | 430 ns .. 432 ns |
| field sqrt | goldilocks2 | field/goldilocks2/sqrt | 996 ns | 993 ns .. 998 ns |
| field sqrt ratio | fp127 | field/fp127/sqrt_ratio | 592 ns | 590 ns .. 593 ns |
| field sqrt ratio | fp107 | field/fp107/sqrt_ratio | 597 ns | 593 ns .. 601 ns |
| field sqrt ratio | fp128 | field/fp128/sqrt_ratio | 937 ns | 936 ns .. 939 ns |
| field sqrt ratio | fp61x2 | field/fp61x2/sqrt_ratio | 295 ns | 294 ns .. 295 ns |
| field sqrt ratio | fp64x2 | field/fp64x2/sqrt_ratio | 431 ns | 430 ns .. 432 ns |
| field sqrt ratio | goldilocks2 | field/goldilocks2/sqrt_ratio | 950 ns | 948 ns .. 952 ns |
| field halftrace | gf2_127 | field/gf2_127/halftrace (byte tables) | 5.16 ns | 5.12 ns .. 5.23 ns |
| field halftrace | gf2_109 | field/gf2_109/halftrace (byte tables) | 4.02 ns | 4.01 ns .. 4.03 ns |
| field halftrace | gf2_122 | field/gf2_122/qsolve (z^2 + z = c, 2 base halftraces) | 3.86 ns | 3.84 ns .. 3.88 ns |
| field invert, one at a time | gf2_127 | field/gf2_127/invert | 123 ns | 123 ns .. 124 ns |
| field invert, one at a time | gf2_109 | field/gf2_109/invert | 491 ns | 490 ns .. 493 ns |
| field invert, one at a time | gf2_122 | field/gf2_122/invert | 238 ns | 238 ns .. 239 ns |
| field invert, one at a time | fp127 | field/fp127/invert | 577 ns | 576 ns .. 578 ns |
| field invert, one at a time | fp107 | field/fp107/invert | 571 ns | 566 ns .. 576 ns |
| field invert, one at a time | fp128 | field/fp128/invert | 918 ns | 916 ns .. 922 ns |
| field invert, one at a time | fp61x2 | field/fp61x2/invert | 176 ns | 176 ns .. 176 ns |
| field invert, one at a time | fp64x2 | field/fp64x2/invert | 241 ns | 241 ns .. 242 ns |
| field invert, one at a time | goldilocks2 | field/goldilocks2/invert | 304 ns | 303 ns .. 305 ns |
| field invert, batched | gf2_127 | field/gf2_127/batch invert (product tree) | 5.41 ns | 5.36 ns .. 5.45 ns |
| field invert, batched | gf2_109 | field/gf2_109/batch invert (product tree) | 5.36 ns | 5.34 ns .. 5.38 ns |
| field invert, batched | gf2_122 | field/gf2_122/batch invert (product tree) | 5.23 ns | 5.21 ns .. 5.25 ns |
| field invert, batched | fp127 | field/fp127/batch invert (product tree) | 10.2 ns | 10.1 ns .. 10.3 ns |
| field invert, batched | fp107 | field/fp107/batch invert (product tree) | 10.1 ns | 10.0 ns .. 10.1 ns |
| field invert, batched | fp61x2 | field/fp61x2/batch invert (product tree) | 8.60 ns | 8.58 ns .. 8.62 ns |
| field invert, batched | fp64x2 | field/fp64x2/batch invert (product tree) | 13.6 ns | 13.5 ns .. 13.6 ns |
| field invert, batched | goldilocks2 | field/goldilocks2/batch invert (product tree) | 8.96 ns | 8.93 ns .. 9.00 ns |
| field pack | fp127 | field/fp127/pack | 0.38 ns | 0.38 ns .. 0.39 ns |
| field pack | fp107 | field/fp107/pack | 0.82 ns | 0.82 ns .. 0.83 ns |
| field pack | fp128 | field/fp128/pack | 0.36 ns | 0.36 ns .. 0.37 ns |
| field pack | fp61x2 | field/fp61x2/pack | 0.50 ns | 0.50 ns .. 0.50 ns |
| field pack | fp64x2 | field/fp64x2/pack | 0.37 ns | 0.36 ns .. 0.37 ns |
| field pack | goldilocks2 | field/goldilocks2/pack | 0.69 ns | 0.69 ns .. 0.70 ns |
| field unpack | fp127 | field/fp127/unpack | 0.70 ns | 0.70 ns .. 0.70 ns |
| field unpack | fp107 | field/fp107/unpack | 0.73 ns | 0.73 ns .. 0.73 ns |
| field unpack | fp128 | field/fp128/unpack | 0.70 ns | 0.70 ns .. 0.70 ns |
| field unpack | fp61x2 | field/fp61x2/unpack | 0.99 ns | 0.99 ns .. 1.00 ns |
| field unpack | fp64x2 | field/fp64x2/unpack | 0.70 ns | 0.70 ns .. 0.70 ns |
| field unpack | goldilocks2 | field/goldilocks2/unpack | 0.70 ns | 0.70 ns .. 0.70 ns |
| point add, throughput | xor | add/xor-sha256/xor 32B, 8 accumulators | 0.45 ns | 0.43 ns .. 0.46 ns |
| point add, throughput | gf2_127 | group.add/binary.127/mode=throughput | 19.5 ns | 19.5 ns .. 19.6 ns |
| point add, throughput | gf2_127-lambda | group.add/binary-lambda.127/mode=throughput | 17.6 ns | 17.6 ns .. 17.7 ns |
| point add, throughput | gf2_127-w | group.add/binary-w.127/mode=throughput | 17.7 ns | 17.6 ns .. 17.7 ns |
| point add, throughput | gf2_127-u | group.add/binary-u.127/mode=throughput | 13.2 ns | 13.2 ns .. 13.2 ns |
| point add, throughput | gf2_109 | group.add/binary.109/mode=throughput | 20.4 ns | 20.3 ns .. 20.4 ns |
| point add, throughput | gf2_109-lambda | group.add/binary-lambda.109/mode=throughput | 18.9 ns | 18.9 ns .. 18.9 ns |
| point add, throughput | gf2_109-w | group.add/binary-w.109/mode=throughput | 18.9 ns | 18.9 ns .. 19.0 ns |
| point add, throughput | gf2_109-u | group.add/binary-u.109/mode=throughput | 13.5 ns | 13.5 ns .. 13.5 ns |
| point add, throughput | gf2_122 | group.add/binary.122/mode=throughput | 19.9 ns | 19.9 ns .. 20.0 ns |
| point add, throughput | gf2_122-lambda | group.add/binary-lambda.122/mode=throughput | 20.2 ns | 20.2 ns .. 20.3 ns |
| point add, throughput | gf2_122-w | group.add/binary-w.122/mode=throughput | 20.5 ns | 20.4 ns .. 20.6 ns |
| point add, throughput | gf2_122-u | group.add/binary-u.122/mode=throughput | 14.3 ns | 14.3 ns .. 14.4 ns |
| point add, throughput | gf2_122-gls | group.add/binary.122-gls/mode=throughput | 19.3 ns | 19.2 ns .. 19.4 ns |
| point add, throughput | gf2_122-gls-lambda | group.add/binary-lambda.122-gls/mode=throughput | 20.3 ns | 20.2 ns .. 20.3 ns |
| point add, throughput | gf2_122-gls-w | group.add/binary-w.122-gls/mode=throughput | 20.3 ns | 20.2 ns .. 20.4 ns |
| point add, throughput | gf2_122-gls-u | group.add/binary-u.122-gls/mode=throughput | 13.7 ns | 13.7 ns .. 13.8 ns |
| point add, throughput | edwards127 | group.add/edwards.127/mode=throughput | 27.5 ns | 27.4 ns .. 27.6 ns |
| point add, throughput | edwards107 | group.add/edwards.107/mode=throughput | 27.6 ns | 27.5 ns .. 27.7 ns |
| point add, throughput | twisted128 | group.add/twisted.128/mode=throughput | 31.1 ns | 31.0 ns .. 31.2 ns |
| point add, throughput | weier127 | group.add/weier.127/mode=throughput | 58.7 ns | 58.5 ns .. 58.9 ns |
| point add, throughput | weier127-jacobian | group.add/weier-jacobian.127/mode=throughput | 48.1 ns | 48.0 ns .. 48.2 ns |
| point add, throughput | weier107 | group.add/weier.107/mode=throughput | 48.6 ns | 48.4 ns .. 48.8 ns |
| point add, throughput | weier107-jacobian | group.add/weier-jacobian.107/mode=throughput | 44.1 ns | 44.0 ns .. 44.3 ns |
| point add, throughput | edwards61x2 | group.add/edwards.61x2/mode=throughput | 25.8 ns | 25.7 ns .. 25.9 ns |
| point add, throughput | weier61x2 | group.add/weier.61x2/mode=throughput | 50.6 ns | 50.4 ns .. 50.7 ns |
| point add, throughput | weier61x2-jacobian | group.add/weier-jacobian.61x2/mode=throughput | 50.2 ns | 50.1 ns .. 50.3 ns |
| point add, throughput | twisted61x2 | group.add/twisted.61x2/mode=throughput | 24.9 ns | 24.8 ns .. 25.0 ns |
| point add, throughput | twisted64x2 | group.add/twisted.64x2/mode=throughput | 33.3 ns | 33.2 ns .. 33.4 ns |
| point add, throughput | twisted-goldilocks2 | group.add/twisted.goldilocks2/mode=throughput | 28.7 ns | 28.7 ns .. 28.8 ns |
| point add, throughput | ristretto255 | add/ristretto255/+=, 8 accumulators | 116 ns | 115 ns .. 116 ns |
| point add, latency | xor | add/xor-sha256/xor 32B, 1 accumulator | 0.26 ns | 0.25 ns .. 0.26 ns |
| point add, latency | gf2_127 | group.add/binary.127/mode=latency | 19.9 ns | 19.8 ns .. 20.0 ns |
| point add, latency | gf2_127-lambda | group.add/binary-lambda.127/mode=latency | 24.4 ns | 24.3 ns .. 24.5 ns |
| point add, latency | gf2_127-w | group.add/binary-w.127/mode=latency | 24.4 ns | 24.3 ns .. 24.4 ns |
| point add, latency | gf2_127-u | group.add/binary-u.127/mode=latency | 14.6 ns | 14.5 ns .. 14.6 ns |
| point add, latency | gf2_109 | group.add/binary.109/mode=latency | 22.2 ns | 22.1 ns .. 22.2 ns |
| point add, latency | gf2_109-lambda | group.add/binary-lambda.109/mode=latency | 28.2 ns | 28.2 ns .. 28.3 ns |
| point add, latency | gf2_109-w | group.add/binary-w.109/mode=latency | 28.3 ns | 28.2 ns .. 28.4 ns |
| point add, latency | gf2_109-u | group.add/binary-u.109/mode=latency | 15.7 ns | 15.7 ns .. 15.7 ns |
| point add, latency | gf2_122 | group.add/binary.122/mode=latency | 21.3 ns | 21.2 ns .. 21.3 ns |
| point add, latency | gf2_122-lambda | group.add/binary-lambda.122/mode=latency | 28.0 ns | 27.9 ns .. 28.1 ns |
| point add, latency | gf2_122-w | group.add/binary-w.122/mode=latency | 27.9 ns | 27.8 ns .. 28.0 ns |
| point add, latency | gf2_122-u | group.add/binary-u.122/mode=latency | 16.7 ns | 16.6 ns .. 16.8 ns |
| point add, latency | gf2_122-gls | group.add/binary.122-gls/mode=latency | 20.6 ns | 20.5 ns .. 20.6 ns |
| point add, latency | gf2_122-gls-lambda | group.add/binary-lambda.122-gls/mode=latency | 28.0 ns | 27.9 ns .. 28.1 ns |
| point add, latency | gf2_122-gls-w | group.add/binary-w.122-gls/mode=latency | 28.1 ns | 28.0 ns .. 28.1 ns |
| point add, latency | gf2_122-gls-u | group.add/binary-u.122-gls/mode=latency | 16.2 ns | 16.1 ns .. 16.3 ns |
| point add, latency | edwards127 | group.add/edwards.127/mode=latency | 35.8 ns | 35.7 ns .. 35.9 ns |
| point add, latency | edwards107 | group.add/edwards.107/mode=latency | 32.6 ns | 32.5 ns .. 32.7 ns |
| point add, latency | twisted128 | group.add/twisted.128/mode=latency | 36.3 ns | 36.2 ns .. 36.4 ns |
| point add, latency | weier127 | group.add/weier.127/mode=latency | 63.9 ns | 63.7 ns .. 64.0 ns |
| point add, latency | weier127-jacobian | group.add/weier-jacobian.127/mode=latency | 56.6 ns | 56.4 ns .. 56.9 ns |
| point add, latency | weier107 | group.add/weier.107/mode=latency | 53.9 ns | 53.4 ns .. 54.2 ns |
| point add, latency | weier107-jacobian | group.add/weier-jacobian.107/mode=latency | 50.9 ns | 50.8 ns .. 51.1 ns |
| point add, latency | edwards61x2 | group.add/edwards.61x2/mode=latency | 29.6 ns | 29.5 ns .. 29.7 ns |
| point add, latency | weier61x2 | group.add/weier.61x2/mode=latency | 57.1 ns | 57.0 ns .. 57.2 ns |
| point add, latency | weier61x2-jacobian | group.add/weier-jacobian.61x2/mode=latency | 57.2 ns | 57.0 ns .. 57.3 ns |
| point add, latency | twisted61x2 | group.add/twisted.61x2/mode=latency | 28.4 ns | 28.3 ns .. 28.5 ns |
| point add, latency | twisted64x2 | group.add/twisted.64x2/mode=latency | 37.9 ns | 37.7 ns .. 38.0 ns |
| point add, latency | twisted-goldilocks2 | group.add/twisted.goldilocks2/mode=latency | 29.4 ns | 29.3 ns .. 29.4 ns |
| point add, latency | ristretto255 | add/ristretto255/+=, 1 accumulator | 117 ns | 117 ns .. 118 ns |
| point subtract | gf2_127 | group.sub/binary.127/mode=throughput | 18.6 ns | 18.6 ns .. 18.7 ns |
| point subtract | gf2_127-lambda | group.sub/binary-lambda.127/mode=throughput | 17.6 ns | 17.6 ns .. 17.7 ns |
| point subtract | gf2_127-w | group.sub/binary-w.127/mode=throughput | 17.7 ns | 17.6 ns .. 17.7 ns |
| point subtract | gf2_127-u | group.sub/binary-u.127/mode=throughput | 13.1 ns | 13.1 ns .. 13.1 ns |
| point subtract | gf2_109 | group.sub/binary.109/mode=throughput | 20.7 ns | 20.6 ns .. 20.7 ns |
| point subtract | gf2_109-lambda | group.sub/binary-lambda.109/mode=throughput | 19.1 ns | 19.0 ns .. 19.2 ns |
| point subtract | gf2_109-w | group.sub/binary-w.109/mode=throughput | 19.2 ns | 19.1 ns .. 19.2 ns |
| point subtract | gf2_109-u | group.sub/binary-u.109/mode=throughput | 13.6 ns | 13.6 ns .. 13.7 ns |
| point subtract | gf2_122 | group.sub/binary.122/mode=throughput | 20.1 ns | 20.1 ns .. 20.2 ns |
| point subtract | gf2_122-lambda | group.sub/binary-lambda.122/mode=throughput | 20.5 ns | 20.4 ns .. 20.6 ns |
| point subtract | gf2_122-w | group.sub/binary-w.122/mode=throughput | 20.5 ns | 20.5 ns .. 20.6 ns |
| point subtract | gf2_122-u | group.sub/binary-u.122/mode=throughput | 13.9 ns | 13.9 ns .. 13.9 ns |
| point subtract | gf2_122-gls | group.sub/binary.122-gls/mode=throughput | 19.5 ns | 19.5 ns .. 19.6 ns |
| point subtract | gf2_122-gls-lambda | group.sub/binary-lambda.122-gls/mode=throughput | 20.4 ns | 20.4 ns .. 20.5 ns |
| point subtract | gf2_122-gls-w | group.sub/binary-w.122-gls/mode=throughput | 20.5 ns | 20.5 ns .. 20.5 ns |
| point subtract | gf2_122-gls-u | group.sub/binary-u.122-gls/mode=throughput | 14.0 ns | 13.9 ns .. 14.0 ns |
| point subtract | twisted61x2 | group.sub/twisted.61x2/mode=throughput | 25.2 ns | 25.2 ns .. 25.2 ns |
| point subtract | ristretto255 | add/ristretto255/-=, 8 accumulators | 113 ns | 112 ns .. 113 ns |
| point negate | gf2_127 | negate/gf2_127/affine (y += x) | 0.56 ns | 0.56 ns .. 0.57 ns |
| point negate | gf2_127-lambda | group.neg/binary-lambda.127 | 0.56 ns | 0.56 ns .. 0.56 ns |
| point negate | gf2_127-w | group.neg/binary-w.127 | 0.56 ns | 0.56 ns .. 0.56 ns |
| point negate | gf2_127-u | group.neg/binary-u.127 | 0.56 ns | 0.56 ns .. 0.56 ns |
| point negate | gf2_109 | negate/gf2_109/affine (y += x) | 0.56 ns | 0.56 ns .. 0.56 ns |
| point negate | gf2_109-lambda | group.neg/binary-lambda.109 | 0.56 ns | 0.56 ns .. 0.56 ns |
| point negate | gf2_109-w | group.neg/binary-w.109 | 0.57 ns | 0.56 ns .. 0.57 ns |
| point negate | gf2_109-u | group.neg/binary-u.109 | 0.56 ns | 0.56 ns .. 0.57 ns |
| point negate | gf2_122 | negate/gf2_122/affine (y += x) | 0.56 ns | 0.55 ns .. 0.56 ns |
| point negate | gf2_122-lambda | group.neg/binary-lambda.122 | 0.56 ns | 0.56 ns .. 0.57 ns |
| point negate | gf2_122-w | group.neg/binary-w.122 | 0.58 ns | 0.57 ns .. 0.58 ns |
| point negate | gf2_122-u | group.neg/binary-u.122 | 0.58 ns | 0.57 ns .. 0.58 ns |
| point negate | gf2_122-gls | group.neg/binary.122-gls | 1.17 ns | 1.16 ns .. 1.17 ns |
| point negate | gf2_122-gls-lambda | group.neg/binary-lambda.122-gls | 0.57 ns | 0.57 ns .. 0.58 ns |
| point negate | gf2_122-gls-w | group.neg/binary-w.122-gls | 0.56 ns | 0.56 ns .. 0.56 ns |
| point negate | gf2_122-gls-u | group.neg/binary-u.122-gls | 0.56 ns | 0.56 ns .. 0.56 ns |
| point negate | edwards127 | group.neg/edwards.127 | 1.98 ns | 1.97 ns .. 1.98 ns |
| point negate | edwards107 | group.neg/edwards.107 | 1.40 ns | 1.39 ns .. 1.40 ns |
| point negate | twisted128 | group.neg/twisted.128 | 1.15 ns | 1.14 ns .. 1.15 ns |
| point negate | weier127 | group.neg/weier.127 | 1.10 ns | 1.09 ns .. 1.10 ns |
| point negate | weier127-jacobian | group.neg/weier-jacobian.127 | 1.10 ns | 1.10 ns .. 1.10 ns |
| point negate | weier107 | group.neg/weier.107 | 0.82 ns | 0.82 ns .. 0.82 ns |
| point negate | weier107-jacobian | group.neg/weier-jacobian.107 | 0.82 ns | 0.82 ns .. 0.83 ns |
| point negate | edwards61x2 | group.neg/edwards.61x2 | 0.78 ns | 0.77 ns .. 0.78 ns |
| point negate | weier61x2 | group.neg/weier.61x2 | 0.57 ns | 0.57 ns .. 0.57 ns |
| point negate | weier61x2-jacobian | group.neg/weier-jacobian.61x2 | 0.57 ns | 0.57 ns .. 0.57 ns |
| point negate | twisted61x2 | group.neg/twisted.61x2 | 0.73 ns | 0.71 ns .. 0.76 ns |
| point negate | twisted64x2 | group.neg/twisted.64x2 | 0.73 ns | 0.71 ns .. 0.76 ns |
| point negate | twisted-goldilocks2 | group.neg/twisted.goldilocks2 | 1.32 ns | 1.31 ns .. 1.32 ns |
| point negate | ristretto255 | negate/ristretto255/-P | 6.47 ns | 6.38 ns .. 6.56 ns |
| point negate | secp256k1 | negate/secp256k1/PublicKey::negate | 24.7 ns | 24.5 ns .. 24.8 ns |
| point prepare, one at a time | gf2_127 | group.prepare/binary.127/mode=indep | 6.38 ns | 6.33 ns .. 6.42 ns |
| point prepare, one at a time | gf2_127-lambda | group.prepare/binary-lambda.127/mode=indep | 129 ns | 128 ns .. 129 ns |
| point prepare, one at a time | gf2_127-w | group.prepare/binary-w.127/mode=indep | 0.45 ns | 0.44 ns .. 0.47 ns |
| point prepare, one at a time | gf2_127-u | group.prepare/binary-u.127/mode=indep | 0.48 ns | 0.46 ns .. 0.51 ns |
| point prepare, one at a time | gf2_109 | group.prepare/binary.109/mode=indep | 4.23 ns | 4.22 ns .. 4.24 ns |
| point prepare, one at a time | gf2_109-lambda | group.prepare/binary-lambda.109/mode=indep | 503 ns | 502 ns .. 504 ns |
| point prepare, one at a time | gf2_109-w | group.prepare/binary-w.109/mode=indep | 0.44 ns | 0.42 ns .. 0.46 ns |
| point prepare, one at a time | gf2_109-u | group.prepare/binary-u.109/mode=indep | 0.48 ns | 0.45 ns .. 0.51 ns |
| point prepare, one at a time | gf2_122 | group.prepare/binary.122/mode=indep | 4.91 ns | 4.90 ns .. 4.92 ns |
| point prepare, one at a time | gf2_122-lambda | group.prepare/binary-lambda.122/mode=indep | 251 ns | 250 ns .. 251 ns |
| point prepare, one at a time | gf2_122-w | group.prepare/binary-w.122/mode=indep | 0.44 ns | 0.42 ns .. 0.46 ns |
| point prepare, one at a time | gf2_122-u | group.prepare/binary-u.122/mode=indep | 0.50 ns | 0.47 ns .. 0.52 ns |
| point prepare, one at a time | gf2_122-gls | group.prepare/binary.122-gls/mode=indep | 4.22 ns | 4.20 ns .. 4.25 ns |
| point prepare, one at a time | gf2_122-gls-lambda | group.prepare/binary-lambda.122-gls/mode=indep | 249 ns | 248 ns .. 250 ns |
| point prepare, one at a time | gf2_122-gls-w | group.prepare/binary-w.122-gls/mode=indep | 0.43 ns | 0.42 ns .. 0.45 ns |
| point prepare, one at a time | gf2_122-gls-u | group.prepare/binary-u.122-gls/mode=indep | 0.44 ns | 0.42 ns .. 0.45 ns |
| point prepare, one at a time | edwards127 | group.prepare/edwards.127/mode=indep | 663 ns | 662 ns .. 664 ns |
| point prepare, one at a time | edwards107 | group.prepare/edwards.107/mode=indep | 632 ns | 630 ns .. 634 ns |
| point prepare, one at a time | twisted128 | group.prepare/twisted.128/mode=indep | 12.5 ns | 12.4 ns .. 12.5 ns |
| point prepare, one at a time | weier127 | group.prepare/weier.127/mode=indep | 0.81 ns | 0.81 ns .. 0.82 ns |
| point prepare, one at a time | weier127-jacobian | group.prepare/weier-jacobian.127/mode=indep | 0.81 ns | 0.81 ns .. 0.81 ns |
| point prepare, one at a time | weier107 | group.prepare/weier.107/mode=indep | 0.82 ns | 0.81 ns .. 0.82 ns |
| point prepare, one at a time | weier107-jacobian | group.prepare/weier-jacobian.107/mode=indep | 0.81 ns | 0.80 ns .. 0.81 ns |
| point prepare, one at a time | edwards61x2 | group.prepare/edwards.61x2/mode=indep | 236 ns | 235 ns .. 236 ns |
| point prepare, one at a time | weier61x2 | group.prepare/weier.61x2/mode=indep | 0.44 ns | 0.43 ns .. 0.46 ns |
| point prepare, one at a time | weier61x2-jacobian | group.prepare/weier-jacobian.61x2/mode=indep | 0.44 ns | 0.42 ns .. 0.46 ns |
| point prepare, one at a time | twisted61x2 | group.prepare/twisted.61x2/mode=indep | 8.07 ns | 8.02 ns .. 8.11 ns |
| point prepare, one at a time | twisted64x2 | group.prepare/twisted.64x2/mode=indep | 8.75 ns | 8.71 ns .. 8.79 ns |
| point prepare, one at a time | twisted-goldilocks2 | group.prepare/twisted.goldilocks2/mode=indep | 9.45 ns | 9.41 ns .. 9.50 ns |
| point prepare, batched | gf2_127 | group.prepare/binary.127/mode=batch,n=1024 | 6.36 ns | 6.31 ns .. 6.42 ns |
| point prepare, batched | gf2_127-lambda | group.prepare/binary-lambda.127/mode=batch,n=1024 | 8.18 ns | 8.16 ns .. 8.20 ns |
| point prepare, batched | gf2_127-w | group.prepare/binary-w.127/mode=batch,n=1024 | 0.47 ns | 0.47 ns .. 0.47 ns |
| point prepare, batched | gf2_127-u | group.prepare/binary-u.127/mode=batch,n=1024 | 0.47 ns | 0.47 ns .. 0.47 ns |
| point prepare, batched | gf2_109 | group.prepare/binary.109/mode=batch,n=1024 | 4.25 ns | 4.24 ns .. 4.27 ns |
| point prepare, batched | gf2_109-lambda | group.prepare/binary-lambda.109/mode=batch,n=1024 | 8.13 ns | 8.10 ns .. 8.16 ns |
| point prepare, batched | gf2_109-w | group.prepare/binary-w.109/mode=batch,n=1024 | 0.47 ns | 0.46 ns .. 0.47 ns |
| point prepare, batched | gf2_109-u | group.prepare/binary-u.109/mode=batch,n=1024 | 0.46 ns | 0.46 ns .. 0.47 ns |
| point prepare, batched | gf2_122 | group.prepare/binary.122/mode=batch,n=1024 | 5.01 ns | 5.00 ns .. 5.03 ns |
| point prepare, batched | gf2_122-lambda | group.prepare/binary-lambda.122/mode=batch,n=1024 | 8.18 ns | 8.16 ns .. 8.19 ns |
| point prepare, batched | gf2_122-w | group.prepare/binary-w.122/mode=batch,n=1024 | 0.47 ns | 0.46 ns .. 0.47 ns |
| point prepare, batched | gf2_122-u | group.prepare/binary-u.122/mode=batch,n=1024 | 0.49 ns | 0.49 ns .. 0.50 ns |
| point prepare, batched | gf2_122-gls | group.prepare/binary.122-gls/mode=batch,n=1024 | 4.27 ns | 4.26 ns .. 4.29 ns |
| point prepare, batched | gf2_122-gls-lambda | group.prepare/binary-lambda.122-gls/mode=batch,n=1024 | 8.11 ns | 8.08 ns .. 8.14 ns |
| point prepare, batched | gf2_122-gls-w | group.prepare/binary-w.122-gls/mode=batch,n=1024 | 0.68 ns | 0.68 ns .. 0.68 ns |
| point prepare, batched | gf2_122-gls-u | group.prepare/binary-u.122-gls/mode=batch,n=1024 | 0.68 ns | 0.68 ns .. 0.68 ns |
| point prepare, batched | edwards127 | group.prepare/edwards.127/mode=batch,n=1024 | 39.9 ns | 39.9 ns .. 40.0 ns |
| point prepare, batched | edwards107 | group.prepare/edwards.107/mode=batch,n=1024 | 37.9 ns | 37.8 ns .. 38.1 ns |
| point prepare, batched | twisted128 | group.prepare/twisted.128/mode=batch,n=1024 | 12.7 ns | 12.6 ns .. 12.7 ns |
| point prepare, batched | weier127 | group.prepare/weier.127/mode=batch,n=1024 | 1.00 ns | 0.99 ns .. 1.00 ns |
| point prepare, batched | weier127-jacobian | group.prepare/weier-jacobian.127/mode=batch,n=1024 | 0.99 ns | 0.98 ns .. 0.99 ns |
| point prepare, batched | weier107 | group.prepare/weier.107/mode=batch,n=1024 | 0.63 ns | 0.62 ns .. 0.63 ns |
| point prepare, batched | weier107-jacobian | group.prepare/weier-jacobian.107/mode=batch,n=1024 | 0.63 ns | 0.62 ns .. 0.63 ns |
| point prepare, batched | edwards61x2 | group.prepare/edwards.61x2/mode=batch,n=1024 | 34.9 ns | 34.8 ns .. 35.1 ns |
| point prepare, batched | weier61x2 | group.prepare/weier.61x2/mode=batch,n=1024 | 0.52 ns | 0.52 ns .. 0.53 ns |
| point prepare, batched | weier61x2-jacobian | group.prepare/weier-jacobian.61x2/mode=batch,n=1024 | 0.52 ns | 0.52 ns .. 0.52 ns |
| point prepare, batched | twisted61x2 | group.prepare/twisted.61x2/mode=batch,n=1024 | 7.93 ns | 7.89 ns .. 7.96 ns |
| point prepare, batched | twisted64x2 | group.prepare/twisted.64x2/mode=batch,n=1024 | 8.79 ns | 8.76 ns .. 8.82 ns |
| point prepare, batched | twisted-goldilocks2 | group.prepare/twisted.goldilocks2/mode=batch,n=1024 | 9.54 ns | 9.49 ns .. 9.59 ns |
| is identity | gf2_127 | group.is_identity/binary.127 | 1.02 ns | 1.01 ns .. 1.02 ns |
| is identity | gf2_127-lambda | group.is_identity/binary-lambda.127 | 0.82 ns | 0.82 ns .. 0.83 ns |
| is identity | gf2_127-w | group.is_identity/binary-w.127 | 0.82 ns | 0.81 ns .. 0.82 ns |
| is identity | gf2_127-u | group.is_identity/binary-u.127 | 0.83 ns | 0.83 ns .. 0.84 ns |
| is identity | gf2_109 | group.is_identity/binary.109 | 0.94 ns | 0.94 ns .. 0.94 ns |
| is identity | gf2_109-lambda | group.is_identity/binary-lambda.109 | 0.80 ns | 0.80 ns .. 0.80 ns |
| is identity | gf2_109-w | group.is_identity/binary-w.109 | 0.80 ns | 0.80 ns .. 0.80 ns |
| is identity | gf2_109-u | group.is_identity/binary-u.109 | 0.80 ns | 0.80 ns .. 0.80 ns |
| is identity | gf2_122 | group.is_identity/binary.122 | 0.87 ns | 0.87 ns .. 0.88 ns |
| is identity | gf2_122-lambda | group.is_identity/binary-lambda.122 | 0.81 ns | 0.81 ns .. 0.81 ns |
| is identity | gf2_122-w | group.is_identity/binary-w.122 | 0.84 ns | 0.83 ns .. 0.85 ns |
| is identity | gf2_122-u | group.is_identity/binary-u.122 | 0.85 ns | 0.84 ns .. 0.85 ns |
| is identity | gf2_122-gls | group.is_identity/binary.122-gls | 0.87 ns | 0.87 ns .. 0.88 ns |
| is identity | gf2_122-gls-lambda | group.is_identity/binary-lambda.122-gls | 0.80 ns | 0.80 ns .. 0.81 ns |
| is identity | gf2_122-gls-w | group.is_identity/binary-w.122-gls | 0.81 ns | 0.81 ns .. 0.81 ns |
| is identity | gf2_122-gls-u | group.is_identity/binary-u.122-gls | 0.80 ns | 0.80 ns .. 0.80 ns |
| is identity | edwards127 | group.is_identity/edwards.127 | 1.30 ns | 1.30 ns .. 1.31 ns |
| is identity | edwards107 | group.is_identity/edwards.107 | 1.18 ns | 1.18 ns .. 1.19 ns |
| is identity | twisted128 | group.is_identity/twisted.128 | 0.50 ns | 0.50 ns .. 0.50 ns |
| is identity | weier127 | group.is_identity/weier.127 | 0.40 ns | 0.40 ns .. 0.41 ns |
| is identity | weier127-jacobian | group.is_identity/weier-jacobian.127 | 0.40 ns | 0.40 ns .. 0.41 ns |
| is identity | weier107 | group.is_identity/weier.107 | 0.91 ns | 0.90 ns .. 0.91 ns |
| is identity | weier107-jacobian | group.is_identity/weier-jacobian.107 | 0.90 ns | 0.90 ns .. 0.90 ns |
| is identity | edwards61x2 | group.is_identity/edwards.61x2 | 0.54 ns | 0.53 ns .. 0.55 ns |
| is identity | weier61x2 | group.is_identity/weier.61x2 | 0.41 ns | 0.40 ns .. 0.41 ns |
| is identity | weier61x2-jacobian | group.is_identity/weier-jacobian.61x2 | 0.40 ns | 0.40 ns .. 0.40 ns |
| is identity | twisted61x2 | group.is_identity/twisted.61x2 | 0.50 ns | 0.50 ns .. 0.50 ns |
| is identity | twisted64x2 | group.is_identity/twisted.64x2 | 0.50 ns | 0.50 ns .. 0.51 ns |
| is identity | twisted-goldilocks2 | group.is_identity/twisted.goldilocks2 | 0.60 ns | 0.59 ns .. 0.60 ns |
| equals addend, match | gf2_127 | group.equals/binary.127/mode=match | 3.97 ns | 3.96 ns .. 3.98 ns |
| equals addend, match | gf2_127-lambda | group.equals/binary-lambda.127/mode=match | 3.95 ns | 3.94 ns .. 3.96 ns |
| equals addend, match | gf2_127-w | group.equals/binary-w.127/mode=match | 4.04 ns | 4.03 ns .. 4.04 ns |
| equals addend, match | gf2_127-u | group.equals/binary-u.127/mode=match | 6.31 ns | 6.29 ns .. 6.33 ns |
| equals addend, match | gf2_109 | group.equals/binary.109/mode=match | 4.05 ns | 4.04 ns .. 4.06 ns |
| equals addend, match | gf2_109-lambda | group.equals/binary-lambda.109/mode=match | 3.96 ns | 3.94 ns .. 3.97 ns |
| equals addend, match | gf2_109-w | group.equals/binary-w.109/mode=match | 4.16 ns | 4.15 ns .. 4.18 ns |
| equals addend, match | gf2_109-u | group.equals/binary-u.109/mode=match | 5.84 ns | 5.83 ns .. 5.86 ns |
| equals addend, match | gf2_122 | group.equals/binary.122/mode=match | 4.07 ns | 4.05 ns .. 4.08 ns |
| equals addend, match | gf2_122-lambda | group.equals/binary-lambda.122/mode=match | 4.21 ns | 4.20 ns .. 4.23 ns |
| equals addend, match | gf2_122-w | group.equals/binary-w.122/mode=match | 4.23 ns | 4.22 ns .. 4.24 ns |
| equals addend, match | gf2_122-u | group.equals/binary-u.122/mode=match | 5.59 ns | 5.58 ns .. 5.60 ns |
| equals addend, match | gf2_122-gls | group.equals/binary.122-gls/mode=match | 4.06 ns | 4.05 ns .. 4.07 ns |
| equals addend, match | gf2_122-gls-lambda | group.equals/binary-lambda.122-gls/mode=match | 4.20 ns | 4.19 ns .. 4.21 ns |
| equals addend, match | gf2_122-gls-w | group.equals/binary-w.122-gls/mode=match | 4.23 ns | 4.22 ns .. 4.25 ns |
| equals addend, match | gf2_122-gls-u | group.equals/binary-u.122-gls/mode=match | 5.60 ns | 5.58 ns .. 5.61 ns |
| equals addend, match | twisted61x2 | group.equals/twisted.61x2/mode=match | 8.55 ns | 8.54 ns .. 8.57 ns |
| equals addend, mismatch | gf2_127 | group.equals/binary.127/mode=mismatch | 4.25 ns | 4.21 ns .. 4.30 ns |
| equals addend, mismatch | gf2_127-lambda | group.equals/binary-lambda.127/mode=mismatch | 4.05 ns | 4.04 ns .. 4.06 ns |
| equals addend, mismatch | gf2_127-w | group.equals/binary-w.127/mode=mismatch | 4.05 ns | 4.04 ns .. 4.06 ns |
| equals addend, mismatch | gf2_127-u | group.equals/binary-u.127/mode=mismatch | 6.44 ns | 6.41 ns .. 6.46 ns |
| equals addend, mismatch | gf2_109 | group.equals/binary.109/mode=mismatch | 4.07 ns | 4.06 ns .. 4.08 ns |
| equals addend, mismatch | gf2_109-lambda | group.equals/binary-lambda.109/mode=mismatch | 3.94 ns | 3.93 ns .. 3.95 ns |
| equals addend, mismatch | gf2_109-w | group.equals/binary-w.109/mode=mismatch | 4.13 ns | 4.12 ns .. 4.14 ns |
| equals addend, mismatch | gf2_109-u | group.equals/binary-u.109/mode=mismatch | 5.82 ns | 5.81 ns .. 5.83 ns |
| equals addend, mismatch | gf2_122 | group.equals/binary.122/mode=mismatch | 4.05 ns | 4.04 ns .. 4.06 ns |
| equals addend, mismatch | gf2_122-lambda | group.equals/binary-lambda.122/mode=mismatch | 4.23 ns | 4.22 ns .. 4.24 ns |
| equals addend, mismatch | gf2_122-w | group.equals/binary-w.122/mode=mismatch | 4.41 ns | 4.38 ns .. 4.45 ns |
| equals addend, mismatch | gf2_122-u | group.equals/binary-u.122/mode=mismatch | 5.97 ns | 5.92 ns .. 6.03 ns |
| equals addend, mismatch | gf2_122-gls | group.equals/binary.122-gls/mode=mismatch | 4.08 ns | 4.06 ns .. 4.10 ns |
| equals addend, mismatch | gf2_122-gls-lambda | group.equals/binary-lambda.122-gls/mode=mismatch | 4.37 ns | 4.35 ns .. 4.39 ns |
| equals addend, mismatch | gf2_122-gls-w | group.equals/binary-w.122-gls/mode=mismatch | 4.26 ns | 4.24 ns .. 4.28 ns |
| equals addend, mismatch | gf2_122-gls-u | group.equals/binary-u.122-gls/mode=mismatch | 5.64 ns | 5.62 ns .. 5.65 ns |
| equals addend, mismatch | edwards127 | group.equals/edwards.127/mode=mismatch | 3.16 ns | 3.15 ns .. 3.17 ns |
| equals addend, mismatch | edwards107 | group.equals/edwards.107/mode=mismatch | 4.93 ns | 4.91 ns .. 4.95 ns |
| equals addend, mismatch | twisted128 | group.equals/twisted.128/mode=mismatch | 9.45 ns | 9.43 ns .. 9.47 ns |
| equals addend, mismatch | weier127 | group.equals/weier.127/mode=mismatch | 3.53 ns | 3.52 ns .. 3.54 ns |
| equals addend, mismatch | weier127-jacobian | group.equals/weier-jacobian.127/mode=mismatch | 6.60 ns | 6.58 ns .. 6.62 ns |
| equals addend, mismatch | weier107 | group.equals/weier.107/mode=mismatch | 5.81 ns | 5.80 ns .. 5.83 ns |
| equals addend, mismatch | weier107-jacobian | group.equals/weier-jacobian.107/mode=mismatch | 9.23 ns | 9.20 ns .. 9.26 ns |
| equals addend, mismatch | edwards61x2 | group.equals/edwards.61x2/mode=mismatch | 2.97 ns | 2.96 ns .. 2.98 ns |
| equals addend, mismatch | weier61x2 | group.equals/weier.61x2/mode=mismatch | 3.33 ns | 3.32 ns .. 3.34 ns |
| equals addend, mismatch | weier61x2-jacobian | group.equals/weier-jacobian.61x2/mode=mismatch | 7.98 ns | 7.93 ns .. 8.03 ns |
| equals addend, mismatch | twisted61x2 | group.equals/twisted.61x2/mode=mismatch | 8.85 ns | 8.79 ns .. 8.91 ns |
| equals addend, mismatch | twisted64x2 | group.equals/twisted.64x2/mode=mismatch | 7.68 ns | 7.65 ns .. 7.71 ns |
| equals addend, mismatch | twisted-goldilocks2 | group.equals/twisted.goldilocks2/mode=mismatch | 9.42 ns | 9.36 ns .. 9.50 ns |
| encode, one at a time | gf2_127 | group.encode/binary.127/mode=indep | 151 ns | 149 ns .. 152 ns |
| encode, one at a time | gf2_127-lambda | group.encode/binary-lambda.127/mode=indep | 140 ns | 140 ns .. 141 ns |
| encode, one at a time | gf2_127-w | group.encode/binary-w.127/mode=indep | 139 ns | 139 ns .. 140 ns |
| encode, one at a time | gf2_127-u | group.encode/binary-u.127/mode=indep | 137 ns | 137 ns .. 137 ns |
| encode, one at a time | gf2_109 | group.encode/binary.109/mode=indep | 538 ns | 537 ns .. 540 ns |
| encode, one at a time | gf2_109-lambda | group.encode/binary-lambda.109/mode=indep | 530 ns | 529 ns .. 532 ns |
| encode, one at a time | gf2_109-w | group.encode/binary-w.109/mode=indep | 540 ns | 539 ns .. 541 ns |
| encode, one at a time | gf2_109-u | group.encode/binary-u.109/mode=indep | 546 ns | 545 ns .. 548 ns |
| encode, one at a time | gf2_122 | group.encode/binary.122/mode=indep | 294 ns | 294 ns .. 295 ns |
| encode, one at a time | gf2_122-lambda | group.encode/binary-lambda.122/mode=indep | 287 ns | 286 ns .. 288 ns |
| encode, one at a time | gf2_122-w | group.encode/binary-w.122/mode=indep | 302 ns | 300 ns .. 303 ns |
| encode, one at a time | gf2_122-u | group.encode/binary-u.122/mode=indep | 305 ns | 304 ns .. 306 ns |
| encode, one at a time | gf2_122-gls | group.encode/binary.122-gls/mode=indep | 293 ns | 293 ns .. 294 ns |
| encode, one at a time | gf2_122-gls-lambda | group.encode/binary-lambda.122-gls/mode=indep | 297 ns | 296 ns .. 297 ns |
| encode, one at a time | gf2_122-gls-w | group.encode/binary-w.122-gls/mode=indep | 297 ns | 296 ns .. 297 ns |
| encode, one at a time | gf2_122-gls-u | group.encode/binary-u.122-gls/mode=indep | 297 ns | 296 ns .. 299 ns |
| encode, one at a time | edwards127 | group.encode/edwards.127/mode=indep | 610 ns | 608 ns .. 611 ns |
| encode, one at a time | edwards107 | group.encode/edwards.107/mode=indep | 600 ns | 599 ns .. 601 ns |
| encode, one at a time | twisted128 | group.encode/twisted.128/mode=indep | 943 ns | 942 ns .. 946 ns |
| encode, one at a time | weier127 | group.encode/weier.127/mode=indep | 593 ns | 591 ns .. 594 ns |
| encode, one at a time | weier127-jacobian | group.encode/weier-jacobian.127/mode=indep | 605 ns | 602 ns .. 609 ns |
| encode, one at a time | weier107 | group.encode/weier.107/mode=indep | 582 ns | 579 ns .. 584 ns |
| encode, one at a time | weier107-jacobian | group.encode/weier-jacobian.107/mode=indep | 580 ns | 578 ns .. 581 ns |
| encode, one at a time | edwards61x2 | group.encode/edwards.61x2/mode=indep | 203 ns | 202 ns .. 203 ns |
| encode, one at a time | weier61x2 | group.encode/weier.61x2/mode=indep | 190 ns | 190 ns .. 191 ns |
| encode, one at a time | weier61x2-jacobian | group.encode/weier-jacobian.61x2/mode=indep | 198 ns | 198 ns .. 199 ns |
| encode, one at a time | twisted61x2 | group.encode/twisted.61x2/mode=indep | 189 ns | 189 ns .. 190 ns |
| encode, one at a time | twisted64x2 | group.encode/twisted.64x2/mode=indep | 267 ns | 266 ns .. 268 ns |
| encode, one at a time | twisted-goldilocks2 | group.encode/twisted.goldilocks2/mode=indep | 316 ns | 316 ns .. 316 ns |
| encode, batched | gf2_127 | group.encode/binary.127/mode=batch,n=1024 | 22.7 ns | 22.5 ns .. 23.0 ns |
| encode, batched | gf2_127-lambda | group.encode/binary-lambda.127/mode=batch,n=1024 | 17.5 ns | 17.4 ns .. 17.5 ns |
| encode, batched | gf2_127-w | group.encode/binary-w.127/mode=batch,n=1024 | 17.0 ns | 17.0 ns .. 17.1 ns |
| encode, batched | gf2_127-u | group.encode/binary-u.127/mode=batch,n=1024 | 12.6 ns | 12.5 ns .. 12.6 ns |
| encode, batched | gf2_109 | group.encode/binary.109/mode=batch,n=1024 | 18.2 ns | 18.1 ns .. 18.3 ns |
| encode, batched | gf2_109-lambda | group.encode/binary-lambda.109/mode=batch,n=1024 | 14.1 ns | 14.1 ns .. 14.2 ns |
| encode, batched | gf2_109-w | group.encode/binary-w.109/mode=batch,n=1024 | 21.6 ns | 21.6 ns .. 21.7 ns |
| encode, batched | gf2_109-u | group.encode/binary-u.109/mode=batch,n=1024 | 21.9 ns | 21.9 ns .. 22.0 ns |
| encode, batched | gf2_122 | group.encode/binary.122/mode=batch,n=1024 | 22.1 ns | 22.0 ns .. 22.1 ns |
| encode, batched | gf2_122-lambda | group.encode/binary-lambda.122/mode=batch,n=1024 | 17.3 ns | 17.2 ns .. 17.3 ns |
| encode, batched | gf2_122-w | group.encode/binary-w.122/mode=batch,n=1024 | 21.2 ns | 21.0 ns .. 21.4 ns |
| encode, batched | gf2_122-u | group.encode/binary-u.122/mode=batch,n=1024 | 18.4 ns | 18.3 ns .. 18.5 ns |
| encode, batched | gf2_122-gls | group.encode/binary.122-gls/mode=batch,n=1024 | 21.1 ns | 21.0 ns .. 21.2 ns |
| encode, batched | gf2_122-gls-lambda | group.encode/binary-lambda.122-gls/mode=batch,n=1024 | 17.9 ns | 17.8 ns .. 17.9 ns |
| encode, batched | gf2_122-gls-w | group.encode/binary-w.122-gls/mode=batch,n=1024 | 20.4 ns | 20.3 ns .. 20.5 ns |
| encode, batched | gf2_122-gls-u | group.encode/binary-u.122-gls/mode=batch,n=1024 | 18.0 ns | 18.0 ns .. 18.1 ns |
| encode, batched | edwards127 | group.encode/edwards.127/mode=batch,n=1024 | 31.9 ns | 31.8 ns .. 32.0 ns |
| encode, batched | edwards107 | group.encode/edwards.107/mode=batch,n=1024 | 35.1 ns | 35.0 ns .. 35.4 ns |
| encode, batched | twisted128 | group.encode/twisted.128/mode=batch,n=1024 | 22.7 ns | 22.7 ns .. 22.8 ns |
| encode, batched | weier127 | group.encode/weier.127/mode=batch,n=1024 | 16.7 ns | 16.7 ns .. 16.8 ns |
| encode, batched | weier127-jacobian | group.encode/weier-jacobian.127/mode=batch,n=1024 | 23.6 ns | 23.5 ns .. 23.7 ns |
| encode, batched | weier107 | group.encode/weier.107/mode=batch,n=1024 | 19.4 ns | 19.3 ns .. 19.5 ns |
| encode, batched | weier107-jacobian | group.encode/weier-jacobian.107/mode=batch,n=1024 | 25.5 ns | 25.4 ns .. 25.6 ns |
| encode, batched | edwards61x2 | group.encode/edwards.61x2/mode=batch,n=1024 | 35.0 ns | 34.9 ns .. 35.1 ns |
| encode, batched | weier61x2 | group.encode/weier.61x2/mode=batch,n=1024 | 15.3 ns | 15.2 ns .. 15.3 ns |
| encode, batched | weier61x2-jacobian | group.encode/weier-jacobian.61x2/mode=batch,n=1024 | 24.8 ns | 24.7 ns .. 24.9 ns |
| encode, batched | twisted61x2 | group.encode/twisted.61x2/mode=batch,n=1024 | 14.9 ns | 14.9 ns .. 15.0 ns |
| encode, batched | twisted64x2 | group.encode/twisted.64x2/mode=batch,n=1024 | 22.6 ns | 22.5 ns .. 22.7 ns |
| encode, batched | twisted-goldilocks2 | group.encode/twisted.goldilocks2/mode=batch,n=1024 | 22.9 ns | 22.9 ns .. 23.0 ns |
| decode, one at a time | gf2_127 | group.decode/binary.127/mode=indep | 164 ns | 163 ns .. 164 ns |
| decode, one at a time | gf2_127-lambda | group.decode/binary-lambda.127/mode=indep | 155 ns | 154 ns .. 155 ns |
| decode, one at a time | gf2_127-w | group.decode/binary-w.127/mode=indep | 155 ns | 154 ns .. 155 ns |
| decode, one at a time | gf2_127-u | group.decode/binary-u.127/mode=indep | 162 ns | 161 ns .. 162 ns |
| decode, one at a time | gf2_109 | group.decode/binary.109/mode=indep | 554 ns | 553 ns .. 556 ns |
| decode, one at a time | gf2_109-lambda | group.decode/binary-lambda.109/mode=indep | 549 ns | 548 ns .. 551 ns |
| decode, one at a time | gf2_109-w | group.decode/binary-w.109/mode=indep | 555 ns | 553 ns .. 556 ns |
| decode, one at a time | gf2_109-u | group.decode/binary-u.109/mode=indep | 555 ns | 555 ns .. 556 ns |
| decode, one at a time | gf2_122 | group.decode/binary.122/mode=indep | 313 ns | 312 ns .. 313 ns |
| decode, one at a time | gf2_122-lambda | group.decode/binary-lambda.122/mode=indep | 314 ns | 313 ns .. 314 ns |
| decode, one at a time | gf2_122-w | group.decode/binary-w.122/mode=indep | 307 ns | 306 ns .. 308 ns |
| decode, one at a time | gf2_122-u | group.decode/binary-u.122/mode=indep | 317 ns | 315 ns .. 319 ns |
| decode, one at a time | gf2_122-gls | group.decode/binary.122-gls/mode=indep | 313 ns | 312 ns .. 313 ns |
| decode, one at a time | gf2_122-gls-lambda | group.decode/binary-lambda.122-gls/mode=indep | 311 ns | 310 ns .. 312 ns |
| decode, one at a time | gf2_122-gls-w | group.decode/binary-w.122-gls/mode=indep | 305 ns | 304 ns .. 306 ns |
| decode, one at a time | gf2_122-gls-u | group.decode/binary-u.122-gls/mode=indep | 313 ns | 311 ns .. 314 ns |
| decode, one at a time | edwards127 | group.decode/edwards.127/mode=indep | 540 ns | 539 ns .. 541 ns |
| decode, one at a time | edwards107 | group.decode/edwards.107/mode=indep | 424 ns | 423 ns .. 426 ns |
| decode, one at a time | twisted128 | group.decode/twisted.128/mode=indep | 960 ns | 959 ns .. 962 ns |
| decode, one at a time | weier127 | group.decode/weier.127/mode=indep | 541 ns | 540 ns .. 543 ns |
| decode, one at a time | weier127-jacobian | group.decode/weier-jacobian.127/mode=indep | 543 ns | 541 ns .. 545 ns |
| decode, one at a time | weier107 | group.decode/weier.107/mode=indep | 421 ns | 420 ns .. 422 ns |
| decode, one at a time | weier107-jacobian | group.decode/weier-jacobian.107/mode=indep | 419 ns | 418 ns .. 421 ns |
| decode, one at a time | edwards61x2 | group.decode/edwards.61x2/mode=indep | 437 ns | 436 ns .. 439 ns |
| decode, one at a time | weier61x2 | group.decode/weier.61x2/mode=indep | 441 ns | 440 ns .. 442 ns |
| decode, one at a time | weier61x2-jacobian | group.decode/weier-jacobian.61x2/mode=indep | 440 ns | 439 ns .. 441 ns |
| decode, one at a time | twisted61x2 | group.decode/twisted.61x2/mode=indep | 448 ns | 447 ns .. 449 ns |
| decode, one at a time | twisted64x2 | group.decode/twisted.64x2/mode=indep | 650 ns | 648 ns .. 652 ns |
| decode, one at a time | twisted-goldilocks2 | group.decode/twisted.goldilocks2/mode=indep | 1.91 µs | 1.91 µs .. 1.91 µs |
| decode, batched | gf2_127 | group.decode/binary.127/mode=batch,n=1024 | 25.7 ns | 25.6 ns .. 25.7 ns |
| decode, batched | gf2_127-lambda | group.decode/binary-lambda.127/mode=batch,n=1024 | 24.0 ns | 24.0 ns .. 24.1 ns |
| decode, batched | gf2_127-w | group.decode/binary-w.127/mode=batch,n=1024 | 22.6 ns | 22.5 ns .. 22.6 ns |
| decode, batched | gf2_127-u | group.decode/binary-u.127/mode=batch,n=1024 | 27.5 ns | 27.5 ns .. 27.6 ns |
| decode, batched | gf2_109 | group.decode/binary.109/mode=batch,n=1024 | 26.7 ns | 26.6 ns .. 26.8 ns |
| decode, batched | gf2_109-lambda | group.decode/binary-lambda.109/mode=batch,n=1024 | 26.5 ns | 26.4 ns .. 26.5 ns |
| decode, batched | gf2_109-w | group.decode/binary-w.109/mode=batch,n=1024 | 24.4 ns | 24.3 ns .. 24.4 ns |
| decode, batched | gf2_109-u | group.decode/binary-u.109/mode=batch,n=1024 | 27.7 ns | 27.7 ns .. 27.8 ns |
| decode, batched | gf2_122 | group.decode/binary.122/mode=batch,n=1024 | 24.0 ns | 23.9 ns .. 24.1 ns |
| decode, batched | gf2_122-lambda | group.decode/binary-lambda.122/mode=batch,n=1024 | 24.1 ns | 24.0 ns .. 24.1 ns |
| decode, batched | gf2_122-w | group.decode/binary-w.122/mode=batch,n=1024 | 21.6 ns | 21.5 ns .. 21.7 ns |
| decode, batched | gf2_122-u | group.decode/binary-u.122/mode=batch,n=1024 | 26.0 ns | 25.8 ns .. 26.2 ns |
| decode, batched | gf2_122-gls | group.decode/binary.122-gls/mode=batch,n=1024 | 22.7 ns | 22.6 ns .. 22.7 ns |
| decode, batched | gf2_122-gls-lambda | group.decode/binary-lambda.122-gls/mode=batch,n=1024 | 22.6 ns | 22.6 ns .. 22.7 ns |
| decode, batched | gf2_122-gls-w | group.decode/binary-w.122-gls/mode=batch,n=1024 | 20.9 ns | 20.8 ns .. 21.0 ns |
| decode, batched | gf2_122-gls-u | group.decode/binary-u.122-gls/mode=batch,n=1024 | 24.7 ns | 24.6 ns .. 24.8 ns |
| decode, batched | edwards127 | group.decode/edwards.127/mode=batch,n=1024 | 541 ns | 540 ns .. 543 ns |
| decode, batched | edwards107 | group.decode/edwards.107/mode=batch,n=1024 | 426 ns | 424 ns .. 427 ns |
| decode, batched | twisted128 | group.decode/twisted.128/mode=batch,n=1024 | 962 ns | 960 ns .. 965 ns |
| decode, batched | weier127 | group.decode/weier.127/mode=batch,n=1024 | 539 ns | 538 ns .. 541 ns |
| decode, batched | weier127-jacobian | group.decode/weier-jacobian.127/mode=batch,n=1024 | 542 ns | 541 ns .. 543 ns |
| decode, batched | weier107 | group.decode/weier.107/mode=batch,n=1024 | 422 ns | 421 ns .. 423 ns |
| decode, batched | weier107-jacobian | group.decode/weier-jacobian.107/mode=batch,n=1024 | 421 ns | 420 ns .. 422 ns |
| decode, batched | edwards61x2 | group.decode/edwards.61x2/mode=batch,n=1024 | 441 ns | 439 ns .. 442 ns |
| decode, batched | weier61x2 | group.decode/weier.61x2/mode=batch,n=1024 | 448 ns | 447 ns .. 449 ns |
| decode, batched | weier61x2-jacobian | group.decode/weier-jacobian.61x2/mode=batch,n=1024 | 445 ns | 444 ns .. 446 ns |
| decode, batched | twisted61x2 | group.decode/twisted.61x2/mode=batch,n=1024 | 450 ns | 449 ns .. 451 ns |
| decode, batched | twisted64x2 | group.decode/twisted.64x2/mode=batch,n=1024 | 647 ns | 646 ns .. 649 ns |
| decode, batched | twisted-goldilocks2 | group.decode/twisted.goldilocks2/mode=batch,n=1024 | 1.92 µs | 1.92 µs .. 1.93 µs |
| hash to curve, one at a time | xor | hash_to_curve/sha256 (XOR baseline) | 53.4 ns | 52.9 ns .. 53.9 ns |
| hash to curve, one at a time | gf2_127 | hash_to_curve/gf2_127/pornin map x1 | 256 ns | 254 ns .. 258 ns |
| hash to curve, one at a time | gf2_127-lambda | h2c/binary-lambda.127/mode=indep | 394 ns | 392 ns .. 396 ns |
| hash to curve, one at a time | gf2_127-w | h2c/binary-w.127/mode=indep | 392 ns | 391 ns .. 393 ns |
| hash to curve, one at a time | gf2_127-u | h2c/binary-u.127/mode=indep | 401 ns | 400 ns .. 403 ns |
| hash to curve, one at a time | gf2_109 | hash_to_curve/gf2_109/pornin map x1 | 675 ns | 673 ns .. 677 ns |
| hash to curve, one at a time | gf2_109-lambda | h2c/binary-lambda.109/mode=indep | 1.16 µs | 1.16 µs .. 1.16 µs |
| hash to curve, one at a time | gf2_109-w | h2c/binary-w.109/mode=indep | 1.14 µs | 1.13 µs .. 1.14 µs |
| hash to curve, one at a time | gf2_109-u | h2c/binary-u.109/mode=indep | 1.15 µs | 1.15 µs .. 1.16 µs |
| hash to curve, one at a time | gf2_122 | hash_to_curve/gf2_122/pornin map x1 | 392 ns | 391 ns .. 393 ns |
| hash to curve, one at a time | gf2_122-lambda | h2c/binary-lambda.122/mode=indep | 679 ns | 677 ns .. 680 ns |
| hash to curve, one at a time | gf2_122-w | h2c/binary-w.122/mode=indep | 654 ns | 653 ns .. 656 ns |
| hash to curve, one at a time | gf2_122-u | h2c/binary-u.122/mode=indep | 674 ns | 672 ns .. 676 ns |
| hash to curve, one at a time | gf2_122-gls | hash_to_curve/gf2_122-gls/pornin map x1 | 394 ns | 393 ns .. 395 ns |
| hash to curve, one at a time | gf2_122-gls-lambda | h2c/binary-lambda.122-gls/mode=indep | 692 ns | 688 ns .. 696 ns |
| hash to curve, one at a time | gf2_122-gls-w | h2c/binary-w.122-gls/mode=indep | 659 ns | 658 ns .. 660 ns |
| hash to curve, one at a time | gf2_122-gls-u | h2c/binary-u.122-gls/mode=indep | 678 ns | 676 ns .. 680 ns |
| hash to curve, one at a time | edwards127 | h2c/edwards.127/mode=indep | 1.22 µs | 1.22 µs .. 1.23 µs |
| hash to curve, one at a time | edwards107 | h2c/edwards.107/mode=indep | 919 ns | 916 ns .. 922 ns |
| hash to curve, one at a time | twisted128 | h2c/twisted.128/mode=indep | 1.97 µs | 1.96 µs .. 1.97 µs |
| hash to curve, one at a time | weier127 | h2c/weier.127/mode=indep | 1.16 µs | 1.16 µs .. 1.16 µs |
| hash to curve, one at a time | weier127-jacobian | h2c/weier-jacobian.127/mode=indep | 1.15 µs | 1.15 µs .. 1.16 µs |
| hash to curve, one at a time | weier107 | h2c/weier.107/mode=indep | 892 ns | 890 ns .. 895 ns |
| hash to curve, one at a time | weier107-jacobian | h2c/weier-jacobian.107/mode=indep | 886 ns | 884 ns .. 888 ns |
| hash to curve, one at a time | edwards61x2 | h2c/edwards.61x2/mode=indep | 707 ns | 705 ns .. 708 ns |
| hash to curve, one at a time | weier61x2 | h2c/weier.61x2/mode=indep | 696 ns | 694 ns .. 697 ns |
| hash to curve, one at a time | weier61x2-jacobian | h2c/weier-jacobian.61x2/mode=indep | 702 ns | 700 ns .. 704 ns |
| hash to curve, one at a time | twisted61x2 | h2c/twisted.61x2/mode=indep | 706 ns | 704 ns .. 708 ns |
| hash to curve, one at a time | twisted64x2 | h2c/twisted.64x2/mode=indep | 1.00 µs | 999 ns .. 1.01 µs |
| hash to curve, one at a time | twisted-goldilocks2 | h2c/twisted.goldilocks2/mode=indep | 2.21 µs | 2.21 µs .. 2.22 µs |
| hash to curve, one at a time | ristretto255 | hash_to_curve/ristretto255/hash_from_bytes<Sha512> | 6.03 µs | 6.02 µs .. 6.05 µs |
| hash to curve, one at a time | secp256k1 | hash_to_curve/secp256k1/ellswift decode | 6.16 µs | 6.14 µs .. 6.18 µs |
| hash to curve, batched | gf2_127 | hash_to_curve/gf2_127/pornin map x1, batched | 103 ns | 102 ns .. 103 ns |
| hash to curve, batched | gf2_127-lambda | h2c/binary-lambda.127/mode=batch,n=1024 | 114 ns | 114 ns .. 115 ns |
| hash to curve, batched | gf2_127-w | h2c/binary-w.127/mode=batch,n=1024 | 119 ns | 119 ns .. 120 ns |
| hash to curve, batched | gf2_127-u | h2c/binary-u.127/mode=batch,n=1024 | 125 ns | 124 ns .. 125 ns |
| hash to curve, batched | gf2_109 | hash_to_curve/gf2_109/pornin map x1, batched | 114 ns | 113 ns .. 114 ns |
| hash to curve, batched | gf2_109-lambda | h2c/binary-lambda.109/mode=batch,n=1024 | 124 ns | 124 ns .. 125 ns |
| hash to curve, batched | gf2_109-w | h2c/binary-w.109/mode=batch,n=1024 | 120 ns | 119 ns .. 121 ns |
| hash to curve, batched | gf2_109-u | h2c/binary-u.109/mode=batch,n=1024 | 125 ns | 125 ns .. 125 ns |
| hash to curve, batched | gf2_122 | hash_to_curve/gf2_122/pornin map x1, batched | 103 ns | 102 ns .. 103 ns |
| hash to curve, batched | gf2_122-lambda | h2c/binary-lambda.122/mode=batch,n=1024 | 115 ns | 115 ns .. 116 ns |
| hash to curve, batched | gf2_122-w | h2c/binary-w.122/mode=batch,n=1024 | 116 ns | 116 ns .. 117 ns |
| hash to curve, batched | gf2_122-u | h2c/binary-u.122/mode=batch,n=1024 | 127 ns | 125 ns .. 128 ns |
| hash to curve, batched | gf2_122-gls | hash_to_curve/gf2_122-gls/pornin map x1, batched | 101 ns | 101 ns .. 102 ns |
| hash to curve, batched | gf2_122-gls-lambda | h2c/binary-lambda.122-gls/mode=batch,n=1024 | 116 ns | 115 ns .. 116 ns |
| hash to curve, batched | gf2_122-gls-w | h2c/binary-w.122-gls/mode=batch,n=1024 | 116 ns | 115 ns .. 116 ns |
| hash to curve, batched | gf2_122-gls-u | h2c/binary-u.122-gls/mode=batch,n=1024 | 121 ns | 120 ns .. 121 ns |
| hash to curve, batched | edwards127 | h2c/edwards.127/mode=batch,n=1024 | 1.24 µs | 1.23 µs .. 1.24 µs |
| hash to curve, batched | edwards107 | h2c/edwards.107/mode=batch,n=1024 | 916 ns | 914 ns .. 919 ns |
| hash to curve, batched | twisted128 | h2c/twisted.128/mode=batch,n=1024 | 1.96 µs | 1.96 µs .. 1.96 µs |
| hash to curve, batched | weier127 | h2c/weier.127/mode=batch,n=1024 | 1.17 µs | 1.16 µs .. 1.17 µs |
| hash to curve, batched | weier127-jacobian | h2c/weier-jacobian.127/mode=batch,n=1024 | 1.16 µs | 1.16 µs .. 1.16 µs |
| hash to curve, batched | weier107 | h2c/weier.107/mode=batch,n=1024 | 901 ns | 899 ns .. 904 ns |
| hash to curve, batched | weier107-jacobian | h2c/weier-jacobian.107/mode=batch,n=1024 | 893 ns | 891 ns .. 895 ns |
| hash to curve, batched | edwards61x2 | h2c/edwards.61x2/mode=batch,n=1024 | 706 ns | 704 ns .. 708 ns |
| hash to curve, batched | weier61x2 | h2c/weier.61x2/mode=batch,n=1024 | 698 ns | 696 ns .. 700 ns |
| hash to curve, batched | weier61x2-jacobian | h2c/weier-jacobian.61x2/mode=batch,n=1024 | 698 ns | 696 ns .. 700 ns |
| hash to curve, batched | twisted61x2 | h2c/twisted.61x2/mode=batch,n=1024 | 711 ns | 708 ns .. 713 ns |
| hash to curve, batched | twisted64x2 | h2c/twisted.64x2/mode=batch,n=1024 | 1.00 µs | 1.00 µs .. 1.01 µs |
| hash to curve, batched | twisted-goldilocks2 | h2c/twisted.goldilocks2/mode=batch,n=1024 | 2.24 µs | 2.23 µs .. 2.24 µs |
| hash to addend, one at a time | gf2_127-lambda | hash_to_curve/gf2_127-lambda/pornin map x1 to (x, λ) | 245 ns | 244 ns .. 246 ns |
| hash to addend, one at a time | gf2_127-w | hash_to_curve/gf2_127-w/pornin map x1 to (x, λ) | 244 ns | 243 ns .. 245 ns |
| hash to addend, one at a time | gf2_127-u | hash_to_curve/gf2_127-u/pornin map x1 to (u, v) | 249 ns | 248 ns .. 250 ns |
| hash to addend, one at a time | gf2_109-lambda | hash_to_curve/gf2_109-lambda/pornin map x1 to (x, λ) | 655 ns | 653 ns .. 657 ns |
| hash to addend, one at a time | gf2_109-w | hash_to_curve/gf2_109-w/pornin map x1 to (x, λ) | 652 ns | 650 ns .. 653 ns |
| hash to addend, one at a time | gf2_109-u | hash_to_curve/gf2_109-u/pornin map x1 to (u, v) | 657 ns | 656 ns .. 659 ns |
| hash to addend, one at a time | gf2_122-lambda | hash_to_curve/gf2_122-lambda/pornin map x1 to (x, λ) | 381 ns | 380 ns .. 382 ns |
| hash to addend, one at a time | gf2_122-w | hash_to_curve/gf2_122-w/pornin map x1 to (x, λ) | 381 ns | 380 ns .. 382 ns |
| hash to addend, one at a time | gf2_122-u | hash_to_curve/gf2_122-u/pornin map x1 to (u, v) | 391 ns | 390 ns .. 392 ns |
| hash to addend, one at a time | gf2_122-gls-lambda | hash_to_curve/gf2_122-gls-lambda/pornin map x1 to (x, λ) | 385 ns | 384 ns .. 386 ns |
| hash to addend, one at a time | gf2_122-gls-w | hash_to_curve/gf2_122-gls-w/pornin map x1 to (x, λ) | 385 ns | 384 ns .. 386 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) | 390 ns | 389 ns .. 390 ns |
| hash to addend, batched | gf2_127-lambda | hash_to_curve/gf2_127-lambda/pornin map x1 to (x, λ), batched | 92.7 ns | 92.4 ns .. 93.0 ns |
| hash to addend, batched | gf2_127-w | hash_to_curve/gf2_127-w/pornin map x1 to (x, λ), batched | 92.8 ns | 92.4 ns .. 93.2 ns |
| hash to addend, batched | gf2_127-u | hash_to_curve/gf2_127-u/pornin map x1 to (u, v), batched | 98.0 ns | 97.4 ns .. 98.6 ns |
| hash to addend, batched | gf2_109-lambda | hash_to_curve/gf2_109-lambda/pornin map x1 to (x, λ), batched | 105 ns | 104 ns .. 105 ns |
| hash to addend, batched | gf2_109-w | hash_to_curve/gf2_109-w/pornin map x1 to (x, λ), batched | 104 ns | 104 ns .. 104 ns |
| hash to addend, batched | gf2_109-u | hash_to_curve/gf2_109-u/pornin map x1 to (u, v), batched | 110 ns | 109 ns .. 110 ns |
| hash to addend, batched | gf2_122-lambda | hash_to_curve/gf2_122-lambda/pornin map x1 to (x, λ), batched | 95.0 ns | 94.7 ns .. 95.2 ns |
| hash to addend, batched | gf2_122-w | hash_to_curve/gf2_122-w/pornin map x1 to (x, λ), batched | 95.2 ns | 95.0 ns .. 95.5 ns |
| hash to addend, batched | gf2_122-u | hash_to_curve/gf2_122-u/pornin map x1 to (u, v), batched | 99.3 ns | 99.0 ns .. 99.5 ns |
| hash to addend, batched | gf2_122-gls-lambda | hash_to_curve/gf2_122-gls-lambda/pornin map x1 to (x, λ), batched | 95.0 ns | 94.7 ns .. 95.4 ns |
| hash to addend, batched | gf2_122-gls-w | hash_to_curve/gf2_122-gls-w/pornin map x1 to (x, λ), batched | 94.6 ns | 94.4 ns .. 94.9 ns |
| hash to addend, batched | gf2_122-gls-u | hash_to_curve/gf2_122-gls-u/pornin map x1 to (u, v), batched | 97.6 ns | 97.4 ns .. 97.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 | 8 | 5 | 23 |
| gf2_127-wincompleteλ-projective, w codec: hashes and decodes to λ-affine | 4 | 4 | 2 | 1 | 1 | 1 | 2 | 4 | 4 | 8 | 5 | 23 |
| 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 | 4 | 4 | 3 | 1 | 2 | 1 | 2 | 4 | 4 | 6 | 3 | 6 |
| 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 | 8 | 5 | 23 |
| GF(2^122), constant in GF(2^61) (GLS-shaped), 16 bytes | ||||||||||||
| gf2_122-gls(X:S:Z:T) extended | 4 | 4 | 3 | 1 | 1 | 1 | 2 | 4 | 4 | 6 | 3 | 6 |
| 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 | 8 | 5 | 23 |
| 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 | 6 | 3 | 6 |
| gf2_109-wincompleteλ-projective, w codec | 4 | 4 | 2 | 1 | 1 | 1 | 2 | 4 | 4 | 6 | 3 | 6 |
| 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 | 5.36 ns | 5.34 ns .. 5.38 ns | per elem |
| batch invert | gf2_122/batch invert (product tree) | gf2_122 | batch | 5.23 ns | 5.21 ns .. 5.25 ns | per elem |
| batch invert | gf2_127/batch invert (product tree) | gf2_127 | batch | 5.41 ns | 5.36 ns .. 5.45 ns | per elem |
| batch invert | fp107/batch invert (product tree) | fp107 | batch | 10.1 ns | 10.0 ns .. 10.1 ns | per elem |
| batch invert | fp127/batch invert (product tree) | fp127 | batch | 10.2 ns | 10.1 ns .. 10.3 ns | per elem |
| batch invert | fp61x2/batch invert (product tree) | fp61x2 | batch | 8.60 ns | 8.58 ns .. 8.62 ns | per elem |
| batch invert | fp64x2/batch invert (product tree) | fp64x2 | batch | 13.6 ns | 13.5 ns .. 13.6 ns | per elem |
| batch invert | goldilocks2/batch invert (product tree) | goldilocks2 | batch | 8.96 ns | 8.93 ns .. 9.00 ns | per elem |
| halftrace | gf2_109/halftrace | gf2_109 | per-element | 43.9 ns | 43.7 ns .. 44.0 ns | per elem |
| halftrace | gf2_109/halftrace (byte tables) | gf2_109 | per-element | 4.02 ns | 4.01 ns .. 4.03 ns | per elem |
| halftrace | gf2_122/qsolve (z^2 + z = c, 2 base halftraces) | gf2_122 | per-element | 3.86 ns | 3.84 ns .. 3.88 ns | per elem |
| halftrace | gf2_127/halftrace | gf2_127 | per-element | 22.3 ns | 22.3 ns .. 22.4 ns | per elem |
| halftrace | gf2_127/halftrace (byte tables) | gf2_127 | per-element | 5.16 ns | 5.12 ns .. 5.23 ns | per elem |
| halftrace | gf2_127/halftrace (nibble tables) | gf2_127 | per-element | 24.7 ns | 24.7 ns .. 24.8 ns | per elem |
| mul_u2 | gf2_122/mul_u2 (by a^2 = 1 + a) latency (dependent chain) | gf2_122 | latency | 0.14 ns | 0.14 ns .. 0.14 ns | per elem |
| mul_u2 | gf2_122/mul_u2 (by a^2 = 1 + a) throughput (8 chains) | gf2_122 | throughput | 0.21 ns | 0.21 ns .. 0.21 ns | per elem |
| pack | fp107/pack | fp107 | per-element | 0.82 ns | 0.82 ns .. 0.83 ns | per elem |
| pack | fp127/pack | fp127 | per-element | 0.38 ns | 0.38 ns .. 0.39 ns | per elem |
| pack | fp128/pack | fp128 | per-element | 0.36 ns | 0.36 ns .. 0.37 ns | per elem |
| pack | fp61x2/pack | fp61x2 | per-element | 0.50 ns | 0.50 ns .. 0.50 ns | per elem |
| pack | fp64x2/pack | fp64x2 | per-element | 0.37 ns | 0.36 ns .. 0.37 ns | per elem |
| pack | goldilocks2/pack | goldilocks2 | per-element | 0.69 ns | 0.69 ns .. 0.70 ns | per elem |
| trace | gf2_109/trace | gf2_109 | per-element | 0.60 ns | 0.60 ns .. 0.60 ns | per elem |
| trace | gf2_122/trace | gf2_122 | per-element | 0.40 ns | 0.40 ns .. 0.40 ns | per elem |
| trace | gf2_127/trace | gf2_127 | per-element | 0.50 ns | 0.50 ns .. 0.50 ns | per elem |
| neg | fp107/neg | fp107 | per-element | 0.59 ns | 0.59 ns .. 0.59 ns | per elem |
| neg | fp127/neg | fp127 | per-element | 0.89 ns | 0.89 ns .. 0.90 ns | per elem |
| neg | fp128/neg | fp128 | per-element | 0.59 ns | 0.59 ns .. 0.60 ns | per elem |
| neg | fp61x2/neg | fp61x2 | per-element | 0.41 ns | 0.40 ns .. 0.41 ns | per elem |
| neg | fp64x2/neg | fp64x2 | per-element | 0.41 ns | 0.40 ns .. 0.41 ns | per elem |
| neg | goldilocks2/neg | goldilocks2 | per-element | 0.60 ns | 0.60 ns .. 0.61 ns | per elem |
| add | fp107/add | fp107 | per-element | 0.62 ns | 0.62 ns .. 0.63 ns | per elem |
| add | fp127/add | fp127 | per-element | 1.00 ns | 0.99 ns .. 1.01 ns | per elem |
| add | fp128/add | fp128 | per-element | 0.72 ns | 0.71 ns .. 0.72 ns | per elem |
| add | fp61x2/add | fp61x2 | per-element | 0.61 ns | 0.61 ns .. 0.61 ns | per elem |
| add | fp64x2/add | fp64x2 | per-element | 0.60 ns | 0.60 ns .. 0.60 ns | per elem |
| add | goldilocks2/add | goldilocks2 | per-element | 0.69 ns | 0.69 ns .. 0.70 ns | per elem |
| unpack | fp107/unpack | fp107 | per-element | 0.73 ns | 0.73 ns .. 0.73 ns | per elem |
| unpack | fp127/unpack | fp127 | per-element | 0.70 ns | 0.70 ns .. 0.70 ns | per elem |
| unpack | fp128/unpack | fp128 | per-element | 0.70 ns | 0.70 ns .. 0.70 ns | per elem |
| unpack | fp61x2/unpack | fp61x2 | per-element | 0.99 ns | 0.99 ns .. 1.00 ns | per elem |
| unpack | fp64x2/unpack | fp64x2 | per-element | 0.70 ns | 0.70 ns .. 0.70 ns | per elem |
| unpack | goldilocks2/unpack | goldilocks2 | per-element | 0.70 ns | 0.70 ns .. 0.70 ns | per elem |
| sub | fp128/sub | fp128 | per-element | 0.79 ns | 0.79 ns .. 0.79 ns | per elem |
| sub | fp61x2/sub | fp61x2 | per-element | 0.80 ns | 0.80 ns .. 0.80 ns | per elem |
| sub | fp64x2/sub | fp64x2 | per-element | 0.59 ns | 0.59 ns .. 0.60 ns | per elem |
| sub | goldilocks2/sub | goldilocks2 | per-element | 0.70 ns | 0.69 ns .. 0.70 ns | per elem |
| normalize | gf2_109/normalize (to_u128) | gf2_109 | per-element | 0.79 ns | 0.79 ns .. 0.80 ns | per elem |
| normalize | gf2_122/normalize (to_u128) | gf2_122 | per-element | 1.38 ns | 1.38 ns .. 1.39 ns | per elem |
| normalize | gf2_127/normalize (to_u128) | gf2_127 | per-element | 0.50 ns | 0.50 ns .. 0.50 ns | per elem |
| mul_base | gf2_122/mul_base (by a GF(2^61) constant) latency (dependent chain) | gf2_122 | latency | 3.72 ns | 3.71 ns .. 3.73 ns | per elem |
| mul_base | gf2_122/mul_base (by a GF(2^61) constant) throughput (8 chains) | gf2_122 | throughput | 1.17 ns | 1.17 ns .. 1.17 ns | per elem |
| square | gf2_109/square latency (dependent chain) | gf2_109 | latency | 3.88 ns | 3.87 ns .. 3.89 ns | per elem |
| square | gf2_109/square throughput (8 chains) | gf2_109 | throughput | 0.81 ns | 0.81 ns .. 0.81 ns | per elem |
| square | gf2_122/square latency (dependent chain) | gf2_122 | latency | 4.33 ns | 4.32 ns .. 4.34 ns | per elem |
| square | gf2_122/square throughput (8 chains) | gf2_122 | throughput | 1.17 ns | 1.17 ns .. 1.18 ns | per elem |
| square | gf2_127/square latency (dependent chain) | gf2_127 | latency | 2.18 ns | 2.17 ns .. 2.19 ns | per elem |
| square | gf2_127/square throughput (8 chains) | gf2_127 | throughput | 0.65 ns | 0.65 ns .. 0.65 ns | per elem |
| square | fp107/square latency (dependent chain) | fp107 | latency | 3.60 ns | 3.59 ns .. 3.60 ns | per elem |
| square | fp107/square throughput (8 chains) | fp107 | throughput | 2.13 ns | 2.13 ns .. 2.14 ns | per elem |
| square | fp127/square latency (dependent chain) | fp127 | latency | 4.26 ns | 4.25 ns .. 4.27 ns | per elem |
| square | fp127/square throughput (8 chains) | fp127 | throughput | 2.30 ns | 2.29 ns .. 2.31 ns | per elem |
| square | fp128/square latency (dependent chain) | fp128 | latency | 6.54 ns | 6.52 ns .. 6.56 ns | per elem |
| square | fp128/square throughput (8 chains) | fp128 | throughput | 3.64 ns | 3.63 ns .. 3.65 ns | per elem |
| square | fp61x2/square latency (dependent chain) | fp61x2 | latency | 5.90 ns | 5.88 ns .. 5.92 ns | per elem |
| square | fp61x2/square throughput (8 chains) | fp61x2 | throughput | 2.38 ns | 2.37 ns .. 2.38 ns | per elem |
| square | fp64x2/square latency (dependent chain) | fp64x2 | latency | 4.76 ns | 4.75 ns .. 4.77 ns | per elem |
| square | fp64x2/square throughput (8 chains) | fp64x2 | throughput | 3.70 ns | 3.69 ns .. 3.71 ns | per elem |
| square | goldilocks2/square latency (dependent chain) | goldilocks2 | latency | 3.59 ns | 3.58 ns .. 3.60 ns | per elem |
| square | goldilocks2/square throughput (8 chains) | goldilocks2 | throughput | 2.59 ns | 2.58 ns .. 2.60 ns | per elem |
| mul | gf2_109/mul latency (dependent chain) | gf2_109 | latency | 5.13 ns | 5.10 ns .. 5.16 ns | per elem |
| mul | gf2_109/mul throughput (8 chains) | gf2_109 | throughput | 1.37 ns | 1.37 ns .. 1.38 ns | per elem |
| mul | gf2_122/mul latency (dependent chain) | gf2_122 | latency | 4.56 ns | 4.54 ns .. 4.57 ns | per elem |
| mul | gf2_122/mul throughput (8 chains) | gf2_122 | throughput | 1.38 ns | 1.38 ns .. 1.38 ns | per elem |
| mul | gf2_127/mul latency (dependent chain) | gf2_127 | latency | 3.50 ns | 3.49 ns .. 3.51 ns | per elem |
| mul | gf2_127/mul throughput (8 chains) | gf2_127 | throughput | 1.43 ns | 1.42 ns .. 1.43 ns | per elem |
| mul | fp107 schoolbook/mul latency (dependent chain) | fp107 | latency | 3.98 ns | 3.98 ns .. 3.99 ns | per elem |
| mul | fp107 schoolbook/mul throughput (8 chains) | fp107 | throughput | 2.55 ns | 2.55 ns .. 2.56 ns | per elem |
| mul | fp107/mul latency (dependent chain) | fp107 | latency | 3.97 ns | 3.96 ns .. 3.98 ns | per elem |
| mul | fp107/mul throughput (8 chains) | fp107 | throughput | 2.64 ns | 2.61 ns .. 2.66 ns | per elem |
| mul | fp127/mul latency (dependent chain) | fp127 | latency | 4.31 ns | 4.29 ns .. 4.32 ns | per elem |
| mul | fp127/mul throughput (8 chains) | fp127 | throughput | 2.69 ns | 2.68 ns .. 2.70 ns | per elem |
| mul | fp128/mul latency (dependent chain) | fp128 | latency | 6.73 ns | 6.71 ns .. 6.74 ns | per elem |
| mul | fp128/mul throughput (8 chains) | fp128 | throughput | 3.82 ns | 3.82 ns .. 3.83 ns | per elem |
| mul | fp61x2/mul latency (dependent chain) | fp61x2 | latency | 5.37 ns | 5.36 ns .. 5.39 ns | per elem |
| mul | fp61x2/mul throughput (8 chains) | fp61x2 | throughput | 2.54 ns | 2.54 ns .. 2.55 ns | per elem |
| mul | fp64x2/mul latency (dependent chain) | fp64x2 | latency | 4.99 ns | 4.99 ns .. 5.01 ns | per elem |
| mul | fp64x2/mul throughput (8 chains) | fp64x2 | throughput | 3.82 ns | 3.82 ns .. 3.83 ns | per elem |
| mul | goldilocks2/mul latency (dependent chain) | goldilocks2 | latency | 3.26 ns | 3.25 ns .. 3.27 ns | per elem |
| mul | goldilocks2/mul throughput (8 chains) | goldilocks2 | throughput | 2.67 ns | 2.66 ns .. 2.68 ns | per elem |
| invert | gf2_109/invert | gf2_109 | per-element | 491 ns | 490 ns .. 493 ns | per elem |
| invert | gf2_122/invert | gf2_122 | per-element | 238 ns | 238 ns .. 239 ns | per elem |
| invert | gf2_127/invert | gf2_127 | per-element | 123 ns | 123 ns .. 124 ns | per elem |
| invert | fp107/invert | fp107 | per-element | 571 ns | 566 ns .. 576 ns | per elem |
| invert | fp127/invert | fp127 | per-element | 577 ns | 576 ns .. 578 ns | per elem |
| invert | fp128/invert | fp128 | per-element | 918 ns | 916 ns .. 922 ns | per elem |
| invert | fp61x2/invert | fp61x2 | per-element | 176 ns | 176 ns .. 176 ns | per elem |
| invert | fp64x2/invert | fp64x2 | per-element | 241 ns | 241 ns .. 242 ns | per elem |
| invert | goldilocks2/invert | goldilocks2 | per-element | 304 ns | 303 ns .. 305 ns | per elem |
| sqrt | gf2_109/sqrt | gf2_109 | per-element | 6.93 ns | 6.92 ns .. 6.95 ns | per elem |
| sqrt | gf2_122/sqrt | gf2_122 | per-element | 3.98 ns | 3.97 ns .. 3.98 ns | per elem |
| sqrt | gf2_127/sqrt | gf2_127 | per-element | 1.70 ns | 1.69 ns .. 1.70 ns | per elem |
| sqrt | fp107/sqrt (x^(2^105)) | fp107 | per-element | 422 ns | 420 ns .. 425 ns | per elem |
| sqrt | fp127/sqrt (x^(2^125)) | fp127 | per-element | 523 ns | 523 ns .. 524 ns | per elem |
| sqrt | fp128/sqrt | fp128 | per-element | 891 ns | 888 ns .. 893 ns | per elem |
| sqrt | fp61x2/sqrt | fp61x2 | per-element | 298 ns | 298 ns .. 299 ns | per elem |
| sqrt | fp64x2/sqrt | fp64x2 | per-element | 431 ns | 430 ns .. 432 ns | per elem |
| sqrt | goldilocks2/sqrt | goldilocks2 | per-element | 996 ns | 993 ns .. 998 ns | per elem |
| pow_p34 | fp107/pow_p34 (x^(2^105-1)) | fp107 | per-element | 570 ns | 569 ns .. 571 ns | per elem |
| pow_p34 | fp127/pow_p34 (x^(2^125-1)) | fp127 | per-element | 579 ns | 575 ns .. 582 ns | per elem |
| sqrt_ratio | fp107/sqrt_ratio | fp107 | per-element | 597 ns | 593 ns .. 601 ns | per elem |
| sqrt_ratio | fp127/sqrt_ratio | fp127 | per-element | 592 ns | 590 ns .. 593 ns | per elem |
| sqrt_ratio | fp128/sqrt_ratio | fp128 | per-element | 937 ns | 936 ns .. 939 ns | per elem |
| sqrt_ratio | fp61x2/sqrt_ratio | fp61x2 | per-element | 295 ns | 294 ns .. 295 ns | per elem |
| sqrt_ratio | fp64x2/sqrt_ratio | fp64x2 | per-element | 431 ns | 430 ns .. 432 ns | per elem |
| sqrt_ratio | goldilocks2/sqrt_ratio | goldilocks2 | per-element | 950 ns | 948 ns .. 952 ns | per elem |
group ops
486 benchmarks
| operation | benchmark | family | mode | time | 95% CI | unit |
|---|---|---|---|---|---|---|
| prepare | binary.109/mode=batch,n=1024 | gf2_109 | batch | 4.25 ns | 4.24 ns .. 4.27 ns | per elem |
| prepare | binary.109/mode=batch,n=64 | gf2_109 | batch | 4.65 ns | 4.64 ns .. 4.66 ns | per elem |
| prepare | binary.109/mode=batch,n=8 | gf2_109 | batch | 4.88 ns | 4.87 ns .. 4.89 ns | per elem |
| prepare | binary.109/mode=indep | gf2_109 | per-element | 4.23 ns | 4.22 ns .. 4.24 ns | per elem |
| prepare | binary-lambda.109/mode=batch,n=1024 | gf2_109-lambda | batch | 8.13 ns | 8.10 ns .. 8.16 ns | per elem |
| prepare | binary-lambda.109/mode=batch,n=64 | gf2_109-lambda | batch | 18.8 ns | 18.7 ns .. 18.8 ns | per elem |
| prepare | binary-lambda.109/mode=batch,n=8 | gf2_109-lambda | batch | 82.7 ns | 82.4 ns .. 83.0 ns | per elem |
| prepare | binary-lambda.109/mode=indep | gf2_109-lambda | per-element | 503 ns | 502 ns .. 504 ns | per elem |
| prepare | binary-u.109/mode=batch,n=1024 | gf2_109-u | batch | 0.46 ns | 0.46 ns .. 0.47 ns | per elem |
| prepare | binary-u.109/mode=batch,n=64 | gf2_109-u | batch | 0.79 ns | 0.79 ns .. 0.80 ns | per elem |
| prepare | binary-u.109/mode=batch,n=8 | gf2_109-u | batch | 1.08 ns | 1.08 ns .. 1.09 ns | per elem |
| prepare | binary-u.109/mode=indep | gf2_109-u | per-element | 0.48 ns | 0.45 ns .. 0.51 ns | per elem |
| prepare | binary-w.109/mode=batch,n=1024 | gf2_109-w | batch | 0.47 ns | 0.46 ns .. 0.47 ns | per elem |
| prepare | binary-w.109/mode=batch,n=64 | gf2_109-w | batch | 0.82 ns | 0.81 ns .. 0.82 ns | per elem |
| prepare | binary-w.109/mode=batch,n=8 | gf2_109-w | batch | 1.08 ns | 1.08 ns .. 1.09 ns | per elem |
| prepare | binary-w.109/mode=indep | gf2_109-w | per-element | 0.44 ns | 0.42 ns .. 0.46 ns | per elem |
| prepare | binary.122/mode=batch,n=1024 | gf2_122 | batch | 5.01 ns | 5.00 ns .. 5.03 ns | per elem |
| prepare | binary.122/mode=batch,n=64 | gf2_122 | batch | 5.44 ns | 5.42 ns .. 5.46 ns | per elem |
| prepare | binary.122/mode=batch,n=8 | gf2_122 | batch | 5.62 ns | 5.60 ns .. 5.63 ns | per elem |
| prepare | binary.122/mode=indep | gf2_122 | per-element | 4.91 ns | 4.90 ns .. 4.92 ns | per elem |
| prepare | binary.122-gls/mode=batch,n=1024 | gf2_122-gls | batch | 4.27 ns | 4.26 ns .. 4.29 ns | per elem |
| prepare | binary.122-gls/mode=batch,n=64 | gf2_122-gls | batch | 4.54 ns | 4.53 ns .. 4.55 ns | per elem |
| prepare | binary.122-gls/mode=batch,n=8 | gf2_122-gls | batch | 4.83 ns | 4.82 ns .. 4.84 ns | per elem |
| prepare | binary.122-gls/mode=indep | gf2_122-gls | per-element | 4.22 ns | 4.20 ns .. 4.25 ns | per elem |
| prepare | binary-lambda.122-gls/mode=batch,n=1024 | gf2_122-gls-lambda | batch | 8.11 ns | 8.08 ns .. 8.14 ns | per elem |
| prepare | binary-lambda.122-gls/mode=batch,n=64 | gf2_122-gls-lambda | batch | 15.1 ns | 15.1 ns .. 15.2 ns | per elem |
| prepare | binary-lambda.122-gls/mode=batch,n=8 | gf2_122-gls-lambda | batch | 53.4 ns | 53.3 ns .. 53.6 ns | per elem |
| prepare | binary-lambda.122-gls/mode=indep | gf2_122-gls-lambda | per-element | 249 ns | 248 ns .. 250 ns | per elem |
| prepare | binary-u.122-gls/mode=batch,n=1024 | gf2_122-gls-u | batch | 0.68 ns | 0.68 ns .. 0.68 ns | per elem |
| prepare | binary-u.122-gls/mode=batch,n=64 | gf2_122-gls-u | batch | 0.83 ns | 0.82 ns .. 0.83 ns | per elem |
| prepare | binary-u.122-gls/mode=batch,n=8 | gf2_122-gls-u | batch | 1.07 ns | 1.07 ns .. 1.07 ns | per elem |
| prepare | binary-u.122-gls/mode=indep | gf2_122-gls-u | per-element | 0.44 ns | 0.42 ns .. 0.45 ns | per elem |
| prepare | binary-w.122-gls/mode=batch,n=1024 | gf2_122-gls-w | batch | 0.68 ns | 0.68 ns .. 0.68 ns | per elem |
| prepare | binary-w.122-gls/mode=batch,n=64 | gf2_122-gls-w | batch | 0.83 ns | 0.82 ns .. 0.83 ns | per elem |
| prepare | binary-w.122-gls/mode=batch,n=8 | gf2_122-gls-w | batch | 1.08 ns | 1.08 ns .. 1.08 ns | per elem |
| prepare | binary-w.122-gls/mode=indep | gf2_122-gls-w | per-element | 0.43 ns | 0.42 ns .. 0.45 ns | per elem |
| prepare | binary-lambda.122/mode=batch,n=1024 | gf2_122-lambda | batch | 8.18 ns | 8.16 ns .. 8.19 ns | per elem |
| prepare | binary-lambda.122/mode=batch,n=64 | gf2_122-lambda | batch | 15.2 ns | 15.1 ns .. 15.3 ns | per elem |
| prepare | binary-lambda.122/mode=batch,n=8 | gf2_122-lambda | batch | 53.6 ns | 53.2 ns .. 54.0 ns | per elem |
| prepare | binary-lambda.122/mode=indep | gf2_122-lambda | per-element | 251 ns | 250 ns .. 251 ns | per elem |
| prepare | binary-u.122/mode=batch,n=1024 | gf2_122-u | batch | 0.49 ns | 0.49 ns .. 0.50 ns | per elem |
| prepare | binary-u.122/mode=batch,n=64 | gf2_122-u | batch | 0.82 ns | 0.82 ns .. 0.82 ns | per elem |
| prepare | binary-u.122/mode=batch,n=8 | gf2_122-u | batch | 1.08 ns | 1.08 ns .. 1.08 ns | per elem |
| prepare | binary-u.122/mode=indep | gf2_122-u | per-element | 0.50 ns | 0.47 ns .. 0.52 ns | per elem |
| prepare | binary-w.122/mode=batch,n=1024 | gf2_122-w | batch | 0.47 ns | 0.46 ns .. 0.47 ns | per elem |
| prepare | binary-w.122/mode=batch,n=64 | gf2_122-w | batch | 0.75 ns | 0.75 ns .. 0.76 ns | per elem |
| prepare | binary-w.122/mode=batch,n=8 | gf2_122-w | batch | 1.09 ns | 1.08 ns .. 1.09 ns | per elem |
| prepare | binary-w.122/mode=indep | gf2_122-w | per-element | 0.44 ns | 0.42 ns .. 0.46 ns | per elem |
| prepare | binary.127/mode=batch,n=1024 | gf2_127 | batch | 6.36 ns | 6.31 ns .. 6.42 ns | per elem |
| prepare | binary.127/mode=batch,n=64 | gf2_127 | batch | 6.55 ns | 6.52 ns .. 6.59 ns | per elem |
| prepare | binary.127/mode=batch,n=8 | gf2_127 | batch | 6.72 ns | 6.69 ns .. 6.76 ns | per elem |
| prepare | binary.127/mode=indep | gf2_127 | per-element | 6.38 ns | 6.33 ns .. 6.42 ns | per elem |
| prepare | binary-lambda.127/mode=batch,n=1024 | gf2_127-lambda | batch | 8.18 ns | 8.16 ns .. 8.20 ns | per elem |
| prepare | binary-lambda.127/mode=batch,n=64 | gf2_127-lambda | batch | 12.7 ns | 12.7 ns .. 12.7 ns | per elem |
| prepare | binary-lambda.127/mode=batch,n=8 | gf2_127-lambda | batch | 32.8 ns | 32.7 ns .. 32.8 ns | per elem |
| prepare | binary-lambda.127/mode=indep | gf2_127-lambda | per-element | 129 ns | 128 ns .. 129 ns | per elem |
| prepare | binary-u.127/mode=batch,n=1024 | gf2_127-u | batch | 0.47 ns | 0.47 ns .. 0.47 ns | per elem |
| prepare | binary-u.127/mode=batch,n=64 | gf2_127-u | batch | 0.81 ns | 0.81 ns .. 0.81 ns | per elem |
| prepare | binary-u.127/mode=batch,n=8 | gf2_127-u | batch | 1.08 ns | 1.08 ns .. 1.08 ns | per elem |
| prepare | binary-u.127/mode=indep | gf2_127-u | per-element | 0.48 ns | 0.46 ns .. 0.51 ns | per elem |
| prepare | binary-w.127/mode=batch,n=1024 | gf2_127-w | batch | 0.47 ns | 0.47 ns .. 0.47 ns | per elem |
| prepare | binary-w.127/mode=batch,n=64 | gf2_127-w | batch | 0.79 ns | 0.79 ns .. 0.80 ns | per elem |
| prepare | binary-w.127/mode=batch,n=8 | gf2_127-w | batch | 1.10 ns | 1.09 ns .. 1.11 ns | per elem |
| prepare | binary-w.127/mode=indep | gf2_127-w | per-element | 0.45 ns | 0.44 ns .. 0.47 ns | per elem |
| prepare | edwards.107/mode=batch,n=1024 | edwards107 | batch | 37.9 ns | 37.8 ns .. 38.1 ns | per elem |
| prepare | edwards.107/mode=indep | edwards107 | per-element | 632 ns | 630 ns .. 634 ns | per elem |
| prepare | edwards.127/mode=batch,n=1024 | edwards127 | batch | 39.9 ns | 39.9 ns .. 40.0 ns | per elem |
| prepare | edwards.127/mode=indep | edwards127 | per-element | 663 ns | 662 ns .. 664 ns | per elem |
| prepare | edwards.61x2/mode=batch,n=1024 | edwards61x2 | batch | 34.9 ns | 34.8 ns .. 35.1 ns | per elem |
| prepare | edwards.61x2/mode=indep | edwards61x2 | per-element | 236 ns | 235 ns .. 236 ns | per elem |
| prepare | twisted.goldilocks2/mode=batch,n=1024 | twisted-goldilocks2 | batch | 9.54 ns | 9.49 ns .. 9.59 ns | per elem |
| prepare | twisted.goldilocks2/mode=indep | twisted-goldilocks2 | per-element | 9.45 ns | 9.41 ns .. 9.50 ns | per elem |
| prepare | twisted.128/mode=batch,n=1024 | twisted128 | batch | 12.7 ns | 12.6 ns .. 12.7 ns | per elem |
| prepare | twisted.128/mode=indep | twisted128 | per-element | 12.5 ns | 12.4 ns .. 12.5 ns | per elem |
| prepare | twisted.61x2/mode=batch,n=1024 | twisted61x2 | batch | 7.93 ns | 7.89 ns .. 7.96 ns | per elem |
| prepare | twisted.61x2/mode=batch,n=64 | twisted61x2 | batch | 8.39 ns | 8.35 ns .. 8.43 ns | per elem |
| prepare | twisted.61x2/mode=batch,n=8 | twisted61x2 | batch | 8.59 ns | 8.56 ns .. 8.63 ns | per elem |
| prepare | twisted.61x2/mode=indep | twisted61x2 | per-element | 8.07 ns | 8.02 ns .. 8.11 ns | per elem |
| prepare | twisted.64x2/mode=batch,n=1024 | twisted64x2 | batch | 8.79 ns | 8.76 ns .. 8.82 ns | per elem |
| prepare | twisted.64x2/mode=indep | twisted64x2 | per-element | 8.75 ns | 8.71 ns .. 8.79 ns | per elem |
| prepare | weier.107/mode=batch,n=1024 | weier107 | batch | 0.63 ns | 0.62 ns .. 0.63 ns | per elem |
| prepare | weier.107/mode=indep | weier107 | per-element | 0.82 ns | 0.81 ns .. 0.82 ns | per elem |
| prepare | weier-jacobian.107/mode=batch,n=1024 | weier107-jacobian | batch | 0.63 ns | 0.62 ns .. 0.63 ns | per elem |
| prepare | weier-jacobian.107/mode=indep | weier107-jacobian | per-element | 0.81 ns | 0.80 ns .. 0.81 ns | per elem |
| prepare | weier.127/mode=batch,n=1024 | weier127 | batch | 1.00 ns | 0.99 ns .. 1.00 ns | per elem |
| prepare | weier.127/mode=indep | weier127 | per-element | 0.81 ns | 0.81 ns .. 0.82 ns | per elem |
| prepare | weier-jacobian.127/mode=batch,n=1024 | weier127-jacobian | batch | 0.99 ns | 0.98 ns .. 0.99 ns | per elem |
| prepare | weier-jacobian.127/mode=indep | weier127-jacobian | per-element | 0.81 ns | 0.81 ns .. 0.81 ns | per elem |
| prepare | weier.61x2/mode=batch,n=1024 | weier61x2 | batch | 0.52 ns | 0.52 ns .. 0.53 ns | per elem |
| prepare | weier.61x2/mode=indep | weier61x2 | per-element | 0.44 ns | 0.43 ns .. 0.46 ns | per elem |
| prepare | weier-jacobian.61x2/mode=batch,n=1024 | weier61x2-jacobian | batch | 0.52 ns | 0.52 ns .. 0.52 ns | per elem |
| prepare | weier-jacobian.61x2/mode=indep | weier61x2-jacobian | per-element | 0.44 ns | 0.42 ns .. 0.46 ns | per elem |
| add | xor-sha256/xor 32B, 1 accumulator | xor | latency | 0.26 ns | 0.25 ns .. 0.26 ns | per elem |
| add | xor-sha256/xor 32B, 8 accumulators | xor | throughput | 0.45 ns | 0.43 ns .. 0.46 ns | per elem |
| add | binary.109/mode=latency | gf2_109 | latency | 22.2 ns | 22.1 ns .. 22.2 ns | per elem |
| add | binary.109/mode=throughput | gf2_109 | throughput | 20.4 ns | 20.3 ns .. 20.4 ns | per elem |
| add | gf2_109/extended += affine, 8 accumulators | gf2_109 | throughput | 24.7 ns | 24.6 ns .. 24.7 ns | per elem |
| add | binary-lambda.109/mode=latency | gf2_109-lambda | latency | 28.2 ns | 28.2 ns .. 28.3 ns | per elem |
| add | binary-lambda.109/mode=throughput | gf2_109-lambda | throughput | 18.9 ns | 18.9 ns .. 18.9 ns | per elem |
| add | binary-u.109/mode=latency | gf2_109-u | latency | 15.7 ns | 15.7 ns .. 15.7 ns | per elem |
| add | binary-u.109/mode=throughput | gf2_109-u | throughput | 13.5 ns | 13.5 ns .. 13.5 ns | per elem |
| add | binary-w.109/mode=latency | gf2_109-w | latency | 28.3 ns | 28.2 ns .. 28.4 ns | per elem |
| add | binary-w.109/mode=throughput | gf2_109-w | throughput | 18.9 ns | 18.9 ns .. 19.0 ns | per elem |
| add | binary.122/mode=latency | gf2_122 | latency | 21.3 ns | 21.2 ns .. 21.3 ns | per elem |
| add | binary.122/mode=throughput | gf2_122 | throughput | 19.9 ns | 19.9 ns .. 20.0 ns | per elem |
| add | gf2_122/extended += affine, 8 accumulators | gf2_122 | throughput | 25.4 ns | 25.3 ns .. 25.5 ns | per elem |
| add | binary.122-gls/mode=latency | gf2_122-gls | latency | 20.6 ns | 20.5 ns .. 20.6 ns | per elem |
| add | binary.122-gls/mode=throughput | gf2_122-gls | throughput | 19.3 ns | 19.2 ns .. 19.4 ns | per elem |
| add | gf2_122-gls/extended += affine, 8 accumulators | gf2_122-gls | throughput | 23.3 ns | 23.2 ns .. 23.3 ns | per elem |
| add | binary-lambda.122-gls/mode=latency | gf2_122-gls-lambda | latency | 28.0 ns | 27.9 ns .. 28.1 ns | per elem |
| add | binary-lambda.122-gls/mode=throughput | gf2_122-gls-lambda | throughput | 20.3 ns | 20.2 ns .. 20.3 ns | per elem |
| add | binary-u.122-gls/mode=latency | gf2_122-gls-u | latency | 16.2 ns | 16.1 ns .. 16.3 ns | per elem |
| add | binary-u.122-gls/mode=throughput | gf2_122-gls-u | throughput | 13.7 ns | 13.7 ns .. 13.8 ns | per elem |
| add | binary-w.122-gls/mode=latency | gf2_122-gls-w | latency | 28.1 ns | 28.0 ns .. 28.1 ns | per elem |
| add | binary-w.122-gls/mode=throughput | gf2_122-gls-w | throughput | 20.3 ns | 20.2 ns .. 20.4 ns | per elem |
| add | binary-lambda.122/mode=latency | gf2_122-lambda | latency | 28.0 ns | 27.9 ns .. 28.1 ns | per elem |
| add | binary-lambda.122/mode=throughput | gf2_122-lambda | throughput | 20.2 ns | 20.2 ns .. 20.3 ns | per elem |
| add | binary-u.122/mode=latency | gf2_122-u | latency | 16.7 ns | 16.6 ns .. 16.8 ns | per elem |
| add | binary-u.122/mode=throughput | gf2_122-u | throughput | 14.3 ns | 14.3 ns .. 14.4 ns | per elem |
| add | binary-w.122/mode=latency | gf2_122-w | latency | 27.9 ns | 27.8 ns .. 28.0 ns | per elem |
| add | binary-w.122/mode=throughput | gf2_122-w | throughput | 20.5 ns | 20.4 ns .. 20.6 ns | per elem |
| add | binary.127/mode=latency | gf2_127 | latency | 19.9 ns | 19.8 ns .. 20.0 ns | per elem |
| add | binary.127/mode=throughput | gf2_127 | throughput | 19.5 ns | 19.5 ns .. 19.6 ns | per elem |
| add | gf2_127/extended += affine, 8 accumulators | gf2_127 | throughput | 23.1 ns | 23.0 ns .. 23.1 ns | per elem |
| add | binary-lambda.127/mode=latency | gf2_127-lambda | latency | 24.4 ns | 24.3 ns .. 24.5 ns | per elem |
| add | binary-lambda.127/mode=throughput | gf2_127-lambda | throughput | 17.6 ns | 17.6 ns .. 17.7 ns | per elem |
| add | binary-u.127/mode=latency | gf2_127-u | latency | 14.6 ns | 14.5 ns .. 14.6 ns | per elem |
| add | binary-u.127/mode=throughput | gf2_127-u | throughput | 13.2 ns | 13.2 ns .. 13.2 ns | per elem |
| add | binary-w.127/mode=latency | gf2_127-w | latency | 24.4 ns | 24.3 ns .. 24.4 ns | per elem |
| add | binary-w.127/mode=throughput | gf2_127-w | throughput | 17.7 ns | 17.6 ns .. 17.7 ns | per elem |
| add | edwards.107/mode=latency | edwards107 | latency | 32.6 ns | 32.5 ns .. 32.7 ns | per elem |
| add | edwards.107/mode=throughput | edwards107 | throughput | 27.6 ns | 27.5 ns .. 27.7 ns | per elem |
| add | edwards107/+= montgomery affine, 8 accumulators | edwards107 | throughput | 45.9 ns | 45.7 ns .. 46.2 ns | per elem |
| add | edwards.127/mode=latency | edwards127 | latency | 35.8 ns | 35.7 ns .. 35.9 ns | per elem |
| add | edwards.127/mode=throughput | edwards127 | throughput | 27.5 ns | 27.4 ns .. 27.6 ns | per elem |
| add | edwards127/+= montgomery affine, 8 accumulators | edwards127 | throughput | 48.1 ns | 48.0 ns .. 48.3 ns | per elem |
| add | edwards.61x2/mode=latency | edwards61x2 | latency | 29.6 ns | 29.5 ns .. 29.7 ns | per elem |
| add | edwards.61x2/mode=throughput | edwards61x2 | throughput | 25.8 ns | 25.7 ns .. 25.9 ns | per elem |
| add | twisted.goldilocks2/mode=latency | twisted-goldilocks2 | latency | 29.4 ns | 29.3 ns .. 29.4 ns | per elem |
| add | twisted.goldilocks2/mode=throughput | twisted-goldilocks2 | throughput | 28.7 ns | 28.7 ns .. 28.8 ns | per elem |
| add | twisted.128/mode=latency | twisted128 | latency | 36.3 ns | 36.2 ns .. 36.4 ns | per elem |
| add | twisted.128/mode=throughput | twisted128 | throughput | 31.1 ns | 31.0 ns .. 31.2 ns | per elem |
| add | twisted.61x2/mode=latency | twisted61x2 | latency | 28.4 ns | 28.3 ns .. 28.5 ns | per elem |
| add | twisted.61x2/mode=throughput | twisted61x2 | throughput | 24.9 ns | 24.8 ns .. 25.0 ns | per elem |
| add | twisted.64x2/mode=latency | twisted64x2 | latency | 37.9 ns | 37.7 ns .. 38.0 ns | per elem |
| add | twisted.64x2/mode=throughput | twisted64x2 | throughput | 33.3 ns | 33.2 ns .. 33.4 ns | per elem |
| add | weier.107/mode=latency | weier107 | latency | 53.9 ns | 53.4 ns .. 54.2 ns | per elem |
| add | weier.107/mode=throughput | weier107 | throughput | 48.6 ns | 48.4 ns .. 48.8 ns | per elem |
| add | weier-jacobian.107/mode=latency | weier107-jacobian | latency | 50.9 ns | 50.8 ns .. 51.1 ns | per elem |
| add | weier-jacobian.107/mode=throughput | weier107-jacobian | throughput | 44.1 ns | 44.0 ns .. 44.3 ns | per elem |
| add | weier.127/mode=latency | weier127 | latency | 63.9 ns | 63.7 ns .. 64.0 ns | per elem |
| add | weier.127/mode=throughput | weier127 | throughput | 58.7 ns | 58.5 ns .. 58.9 ns | per elem |
| add | weier-jacobian.127/mode=latency | weier127-jacobian | latency | 56.6 ns | 56.4 ns .. 56.9 ns | per elem |
| add | weier-jacobian.127/mode=throughput | weier127-jacobian | throughput | 48.1 ns | 48.0 ns .. 48.2 ns | per elem |
| add | weier.61x2/mode=latency | weier61x2 | latency | 57.1 ns | 57.0 ns .. 57.2 ns | per elem |
| add | weier.61x2/mode=throughput | weier61x2 | throughput | 50.6 ns | 50.4 ns .. 50.7 ns | per elem |
| add | weier-jacobian.61x2/mode=latency | weier61x2-jacobian | latency | 57.2 ns | 57.0 ns .. 57.3 ns | per elem |
| add | weier-jacobian.61x2/mode=throughput | weier61x2-jacobian | throughput | 50.2 ns | 50.1 ns .. 50.3 ns | per elem |
| add | ristretto255/+=, 1 accumulator | ristretto255 | latency | 117 ns | 117 ns .. 118 ns | per elem |
| add | ristretto255/+=, 8 accumulators | ristretto255 | throughput | 116 ns | 115 ns .. 116 ns | per elem |
| subtract | binary.109/mode=throughput | gf2_109 | throughput | 20.7 ns | 20.6 ns .. 20.7 ns | per elem |
| subtract | binary-lambda.109/mode=throughput | gf2_109-lambda | throughput | 19.1 ns | 19.0 ns .. 19.2 ns | per elem |
| subtract | binary-u.109/mode=throughput | gf2_109-u | throughput | 13.6 ns | 13.6 ns .. 13.7 ns | per elem |
| subtract | binary-w.109/mode=throughput | gf2_109-w | throughput | 19.2 ns | 19.1 ns .. 19.2 ns | per elem |
| subtract | binary.122/mode=throughput | gf2_122 | throughput | 20.1 ns | 20.1 ns .. 20.2 ns | per elem |
| subtract | binary.122-gls/mode=throughput | gf2_122-gls | throughput | 19.5 ns | 19.5 ns .. 19.6 ns | per elem |
| subtract | binary-lambda.122-gls/mode=throughput | gf2_122-gls-lambda | throughput | 20.4 ns | 20.4 ns .. 20.5 ns | per elem |
| subtract | binary-u.122-gls/mode=throughput | gf2_122-gls-u | throughput | 14.0 ns | 13.9 ns .. 14.0 ns | per elem |
| subtract | binary-w.122-gls/mode=throughput | gf2_122-gls-w | throughput | 20.5 ns | 20.5 ns .. 20.5 ns | per elem |
| subtract | binary-lambda.122/mode=throughput | gf2_122-lambda | throughput | 20.5 ns | 20.4 ns .. 20.6 ns | per elem |
| subtract | binary-u.122/mode=throughput | gf2_122-u | throughput | 13.9 ns | 13.9 ns .. 13.9 ns | per elem |
| subtract | binary-w.122/mode=throughput | gf2_122-w | throughput | 20.5 ns | 20.5 ns .. 20.6 ns | per elem |
| subtract | binary.127/mode=throughput | gf2_127 | throughput | 18.6 ns | 18.6 ns .. 18.7 ns | per elem |
| subtract | binary-lambda.127/mode=throughput | gf2_127-lambda | throughput | 17.6 ns | 17.6 ns .. 17.7 ns | per elem |
| subtract | binary-u.127/mode=throughput | gf2_127-u | throughput | 13.1 ns | 13.1 ns .. 13.1 ns | per elem |
| subtract | binary-w.127/mode=throughput | gf2_127-w | throughput | 17.7 ns | 17.6 ns .. 17.7 ns | per elem |
| subtract | twisted.61x2/mode=throughput | twisted61x2 | throughput | 25.2 ns | 25.2 ns .. 25.2 ns | per elem |
| subtract | ristretto255/-=, 8 accumulators | ristretto255 | throughput | 113 ns | 112 ns .. 113 ns | per elem |
| negate | binary.109 | gf2_109 | per-element | 1.17 ns | 1.17 ns .. 1.18 ns | per elem |
| negate | gf2_109/affine (y += x) | gf2_109 | per-element | 0.56 ns | 0.56 ns .. 0.56 ns | per elem |
| negate | binary-lambda.109 | gf2_109-lambda | per-element | 0.56 ns | 0.56 ns .. 0.56 ns | per elem |
| negate | binary-u.109 | gf2_109-u | per-element | 0.56 ns | 0.56 ns .. 0.57 ns | per elem |
| negate | binary-w.109 | gf2_109-w | per-element | 0.57 ns | 0.56 ns .. 0.57 ns | per elem |
| negate | binary.122 | gf2_122 | per-element | 1.18 ns | 1.17 ns .. 1.19 ns | per elem |
| negate | gf2_122/affine (y += x) | gf2_122 | per-element | 0.56 ns | 0.55 ns .. 0.56 ns | per elem |
| negate | binary.122-gls | gf2_122-gls | per-element | 1.17 ns | 1.16 ns .. 1.17 ns | per elem |
| negate | binary-lambda.122-gls | gf2_122-gls-lambda | per-element | 0.57 ns | 0.57 ns .. 0.58 ns | per elem |
| negate | binary-u.122-gls | gf2_122-gls-u | per-element | 0.56 ns | 0.56 ns .. 0.56 ns | per elem |
| negate | binary-w.122-gls | gf2_122-gls-w | per-element | 0.56 ns | 0.56 ns .. 0.56 ns | per elem |
| negate | binary-lambda.122 | gf2_122-lambda | per-element | 0.56 ns | 0.56 ns .. 0.57 ns | per elem |
| negate | binary-u.122 | gf2_122-u | per-element | 0.58 ns | 0.57 ns .. 0.58 ns | per elem |
| negate | binary-w.122 | gf2_122-w | per-element | 0.58 ns | 0.57 ns .. 0.58 ns | per elem |
| negate | binary.127 | gf2_127 | per-element | 1.20 ns | 1.19 ns .. 1.21 ns | per elem |
| negate | gf2_127/affine (y += x) | gf2_127 | per-element | 0.56 ns | 0.56 ns .. 0.57 ns | per elem |
| negate | binary-lambda.127 | gf2_127-lambda | per-element | 0.56 ns | 0.56 ns .. 0.56 ns | per elem |
| negate | binary-u.127 | gf2_127-u | per-element | 0.56 ns | 0.56 ns .. 0.56 ns | per elem |
| negate | binary-w.127 | gf2_127-w | per-element | 0.56 ns | 0.56 ns .. 0.56 ns | per elem |
| negate | edwards.107 | edwards107 | per-element | 1.40 ns | 1.39 ns .. 1.40 ns | per elem |
| negate | edwards107/extended (-X, -T) | edwards107 | per-element | 1.74 ns | 1.74 ns .. 1.75 ns | per elem |
| negate | edwards.127 | edwards127 | per-element | 1.98 ns | 1.97 ns .. 1.98 ns | per elem |
| negate | edwards127/extended (-X, -T) | edwards127 | per-element | 2.17 ns | 2.16 ns .. 2.18 ns | per elem |
| negate | edwards.61x2 | edwards61x2 | per-element | 0.78 ns | 0.77 ns .. 0.78 ns | per elem |
| negate | twisted.goldilocks2 | twisted-goldilocks2 | per-element | 1.32 ns | 1.31 ns .. 1.32 ns | per elem |
| negate | twisted.128 | twisted128 | per-element | 1.15 ns | 1.14 ns .. 1.15 ns | per elem |
| negate | twisted.61x2 | twisted61x2 | per-element | 0.73 ns | 0.71 ns .. 0.76 ns | per elem |
| negate | twisted.64x2 | twisted64x2 | per-element | 0.73 ns | 0.71 ns .. 0.76 ns | per elem |
| negate | weier.107 | weier107 | per-element | 0.82 ns | 0.82 ns .. 0.82 ns | per elem |
| negate | weier107/projective (-Y) | weier107 | per-element | 1.18 ns | 1.17 ns .. 1.19 ns | per elem |
| negate | weier-jacobian.107 | weier107-jacobian | per-element | 0.82 ns | 0.82 ns .. 0.83 ns | per elem |
| negate | weier.127 | weier127 | per-element | 1.10 ns | 1.09 ns .. 1.10 ns | per elem |
| negate | weier127/projective (-Y) | weier127 | per-element | 1.19 ns | 1.18 ns .. 1.19 ns | per elem |
| negate | weier-jacobian.127 | weier127-jacobian | per-element | 1.10 ns | 1.10 ns .. 1.10 ns | per elem |
| negate | weier.61x2 | weier61x2 | per-element | 0.57 ns | 0.57 ns .. 0.57 ns | per elem |
| negate | weier-jacobian.61x2 | weier61x2-jacobian | per-element | 0.57 ns | 0.57 ns .. 0.57 ns | per elem |
| negate | ristretto255/-P | ristretto255 | per-element | 6.47 ns | 6.38 ns .. 6.56 ns | per elem |
| negate | secp256k1/PublicKey::negate | secp256k1 | per-element | 24.7 ns | 24.5 ns .. 24.8 ns | per elem |
| is identity | binary.109 | gf2_109 | per-element | 0.94 ns | 0.94 ns .. 0.94 ns | per elem |
| is identity | binary-lambda.109 | gf2_109-lambda | per-element | 0.80 ns | 0.80 ns .. 0.80 ns | per elem |
| is identity | binary-u.109 | gf2_109-u | per-element | 0.80 ns | 0.80 ns .. 0.80 ns | per elem |
| is identity | binary-w.109 | gf2_109-w | per-element | 0.80 ns | 0.80 ns .. 0.80 ns | per elem |
| is identity | binary.122 | gf2_122 | per-element | 0.87 ns | 0.87 ns .. 0.88 ns | per elem |
| is identity | binary.122-gls | gf2_122-gls | per-element | 0.87 ns | 0.87 ns .. 0.88 ns | per elem |
| is identity | binary-lambda.122-gls | gf2_122-gls-lambda | per-element | 0.80 ns | 0.80 ns .. 0.81 ns | per elem |
| is identity | binary-u.122-gls | gf2_122-gls-u | per-element | 0.80 ns | 0.80 ns .. 0.80 ns | per elem |
| is identity | binary-w.122-gls | gf2_122-gls-w | per-element | 0.81 ns | 0.81 ns .. 0.81 ns | per elem |
| is identity | binary-lambda.122 | gf2_122-lambda | per-element | 0.81 ns | 0.81 ns .. 0.81 ns | per elem |
| is identity | binary-u.122 | gf2_122-u | per-element | 0.85 ns | 0.84 ns .. 0.85 ns | per elem |
| is identity | binary-w.122 | gf2_122-w | per-element | 0.84 ns | 0.83 ns .. 0.85 ns | per elem |
| is identity | binary.127 | gf2_127 | per-element | 1.02 ns | 1.01 ns .. 1.02 ns | per elem |
| is identity | binary-lambda.127 | gf2_127-lambda | per-element | 0.82 ns | 0.82 ns .. 0.83 ns | per elem |
| is identity | binary-u.127 | gf2_127-u | per-element | 0.83 ns | 0.83 ns .. 0.84 ns | per elem |
| is identity | binary-w.127 | gf2_127-w | per-element | 0.82 ns | 0.81 ns .. 0.82 ns | per elem |
| is identity | edwards.107 | edwards107 | per-element | 1.18 ns | 1.18 ns .. 1.19 ns | per elem |
| is identity | edwards.127 | edwards127 | per-element | 1.30 ns | 1.30 ns .. 1.31 ns | per elem |
| is identity | edwards.61x2 | edwards61x2 | per-element | 0.54 ns | 0.53 ns .. 0.55 ns | per elem |
| is identity | twisted.goldilocks2 | twisted-goldilocks2 | per-element | 0.60 ns | 0.59 ns .. 0.60 ns | per elem |
| is identity | twisted.128 | twisted128 | per-element | 0.50 ns | 0.50 ns .. 0.50 ns | per elem |
| is identity | twisted.61x2 | twisted61x2 | per-element | 0.50 ns | 0.50 ns .. 0.50 ns | per elem |
| is identity | twisted.64x2 | twisted64x2 | per-element | 0.50 ns | 0.50 ns .. 0.51 ns | per elem |
| is identity | weier.107 | weier107 | per-element | 0.91 ns | 0.90 ns .. 0.91 ns | per elem |
| is identity | weier-jacobian.107 | weier107-jacobian | per-element | 0.90 ns | 0.90 ns .. 0.90 ns | per elem |
| is identity | weier.127 | weier127 | per-element | 0.40 ns | 0.40 ns .. 0.41 ns | per elem |
| is identity | weier-jacobian.127 | weier127-jacobian | per-element | 0.40 ns | 0.40 ns .. 0.41 ns | per elem |
| is identity | weier.61x2 | weier61x2 | per-element | 0.41 ns | 0.40 ns .. 0.41 ns | per elem |
| is identity | weier-jacobian.61x2 | weier61x2-jacobian | per-element | 0.40 ns | 0.40 ns .. 0.40 ns | per elem |
| equals addend | binary.109/mode=match | gf2_109 | match | 4.05 ns | 4.04 ns .. 4.06 ns | per elem |
| equals addend | binary.109/mode=mismatch | gf2_109 | mismatch | 4.07 ns | 4.06 ns .. 4.08 ns | per elem |
| equals addend | binary-lambda.109/mode=match | gf2_109-lambda | match | 3.96 ns | 3.94 ns .. 3.97 ns | per elem |
| equals addend | binary-lambda.109/mode=mismatch | gf2_109-lambda | mismatch | 3.94 ns | 3.93 ns .. 3.95 ns | per elem |
| equals addend | binary-u.109/mode=match | gf2_109-u | match | 5.84 ns | 5.83 ns .. 5.86 ns | per elem |
| equals addend | binary-u.109/mode=mismatch | gf2_109-u | mismatch | 5.82 ns | 5.81 ns .. 5.83 ns | per elem |
| equals addend | binary-w.109/mode=match | gf2_109-w | match | 4.16 ns | 4.15 ns .. 4.18 ns | per elem |
| equals addend | binary-w.109/mode=mismatch | gf2_109-w | mismatch | 4.13 ns | 4.12 ns .. 4.14 ns | per elem |
| equals addend | binary.122/mode=match | gf2_122 | match | 4.07 ns | 4.05 ns .. 4.08 ns | per elem |
| equals addend | binary.122/mode=mismatch | gf2_122 | mismatch | 4.05 ns | 4.04 ns .. 4.06 ns | per elem |
| equals addend | binary.122-gls/mode=match | gf2_122-gls | match | 4.06 ns | 4.05 ns .. 4.07 ns | per elem |
| equals addend | binary.122-gls/mode=mismatch | gf2_122-gls | mismatch | 4.08 ns | 4.06 ns .. 4.10 ns | per elem |
| equals addend | binary-lambda.122-gls/mode=match | gf2_122-gls-lambda | match | 4.20 ns | 4.19 ns .. 4.21 ns | per elem |
| equals addend | binary-lambda.122-gls/mode=mismatch | gf2_122-gls-lambda | mismatch | 4.37 ns | 4.35 ns .. 4.39 ns | per elem |
| equals addend | binary-u.122-gls/mode=match | gf2_122-gls-u | match | 5.60 ns | 5.58 ns .. 5.61 ns | per elem |
| equals addend | binary-u.122-gls/mode=mismatch | gf2_122-gls-u | mismatch | 5.64 ns | 5.62 ns .. 5.65 ns | per elem |
| equals addend | binary-w.122-gls/mode=match | gf2_122-gls-w | match | 4.23 ns | 4.22 ns .. 4.25 ns | per elem |
| equals addend | binary-w.122-gls/mode=mismatch | gf2_122-gls-w | mismatch | 4.26 ns | 4.24 ns .. 4.28 ns | per elem |
| equals addend | binary-lambda.122/mode=match | gf2_122-lambda | match | 4.21 ns | 4.20 ns .. 4.23 ns | per elem |
| equals addend | binary-lambda.122/mode=mismatch | gf2_122-lambda | mismatch | 4.23 ns | 4.22 ns .. 4.24 ns | per elem |
| equals addend | binary-u.122/mode=match | gf2_122-u | match | 5.59 ns | 5.58 ns .. 5.60 ns | per elem |
| equals addend | binary-u.122/mode=mismatch | gf2_122-u | mismatch | 5.97 ns | 5.92 ns .. 6.03 ns | per elem |
| equals addend | binary-w.122/mode=match | gf2_122-w | match | 4.23 ns | 4.22 ns .. 4.24 ns | per elem |
| equals addend | binary-w.122/mode=mismatch | gf2_122-w | mismatch | 4.41 ns | 4.38 ns .. 4.45 ns | per elem |
| equals addend | binary.127/mode=match | gf2_127 | match | 3.97 ns | 3.96 ns .. 3.98 ns | per elem |
| equals addend | binary.127/mode=mismatch | gf2_127 | mismatch | 4.25 ns | 4.21 ns .. 4.30 ns | per elem |
| equals addend | binary-lambda.127/mode=match | gf2_127-lambda | match | 3.95 ns | 3.94 ns .. 3.96 ns | per elem |
| equals addend | binary-lambda.127/mode=mismatch | gf2_127-lambda | mismatch | 4.05 ns | 4.04 ns .. 4.06 ns | per elem |
| equals addend | binary-u.127/mode=match | gf2_127-u | match | 6.31 ns | 6.29 ns .. 6.33 ns | per elem |
| equals addend | binary-u.127/mode=mismatch | gf2_127-u | mismatch | 6.44 ns | 6.41 ns .. 6.46 ns | per elem |
| equals addend | binary-w.127/mode=match | gf2_127-w | match | 4.04 ns | 4.03 ns .. 4.04 ns | per elem |
| equals addend | binary-w.127/mode=mismatch | gf2_127-w | mismatch | 4.05 ns | 4.04 ns .. 4.06 ns | per elem |
| equals addend | edwards.107/mode=mismatch | edwards107 | mismatch | 4.93 ns | 4.91 ns .. 4.95 ns | per elem |
| equals addend | edwards.127/mode=mismatch | edwards127 | mismatch | 3.16 ns | 3.15 ns .. 3.17 ns | per elem |
| equals addend | edwards.61x2/mode=mismatch | edwards61x2 | mismatch | 2.97 ns | 2.96 ns .. 2.98 ns | per elem |
| equals addend | twisted.goldilocks2/mode=mismatch | twisted-goldilocks2 | mismatch | 9.42 ns | 9.36 ns .. 9.50 ns | per elem |
| equals addend | twisted.128/mode=mismatch | twisted128 | mismatch | 9.45 ns | 9.43 ns .. 9.47 ns | per elem |
| equals addend | twisted.61x2/mode=match | twisted61x2 | match | 8.55 ns | 8.54 ns .. 8.57 ns | per elem |
| equals addend | twisted.61x2/mode=mismatch | twisted61x2 | mismatch | 8.85 ns | 8.79 ns .. 8.91 ns | per elem |
| equals addend | twisted.64x2/mode=mismatch | twisted64x2 | mismatch | 7.68 ns | 7.65 ns .. 7.71 ns | per elem |
| equals addend | weier.107/mode=mismatch | weier107 | mismatch | 5.81 ns | 5.80 ns .. 5.83 ns | per elem |
| equals addend | weier-jacobian.107/mode=mismatch | weier107-jacobian | mismatch | 9.23 ns | 9.20 ns .. 9.26 ns | per elem |
| equals addend | weier.127/mode=mismatch | weier127 | mismatch | 3.53 ns | 3.52 ns .. 3.54 ns | per elem |
| equals addend | weier-jacobian.127/mode=mismatch | weier127-jacobian | mismatch | 6.60 ns | 6.58 ns .. 6.62 ns | per elem |
| equals addend | weier.61x2/mode=mismatch | weier61x2 | mismatch | 3.33 ns | 3.32 ns .. 3.34 ns | per elem |
| equals addend | weier-jacobian.61x2/mode=mismatch | weier61x2-jacobian | mismatch | 7.98 ns | 7.93 ns .. 8.03 ns | per elem |
| encode | binary.109/mode=batch,n=1024 | gf2_109 | batch | 18.2 ns | 18.1 ns .. 18.3 ns | per elem |
| encode | binary.109/mode=batch,n=64 | gf2_109 | batch | 28.6 ns | 28.6 ns .. 28.7 ns | per elem |
| encode | binary.109/mode=batch,n=8 | gf2_109 | batch | 94.4 ns | 93.7 ns .. 95.4 ns | per elem |
| encode | binary.109/mode=indep | gf2_109 | per-element | 538 ns | 537 ns .. 540 ns | per elem |
| encode | binary-lambda.109/mode=batch,n=1024 | gf2_109-lambda | batch | 14.1 ns | 14.1 ns .. 14.2 ns | per elem |
| encode | binary-lambda.109/mode=batch,n=64 | gf2_109-lambda | batch | 24.8 ns | 24.7 ns .. 24.9 ns | per elem |
| encode | binary-lambda.109/mode=batch,n=8 | gf2_109-lambda | batch | 90.0 ns | 89.7 ns .. 90.3 ns | per elem |
| encode | binary-lambda.109/mode=indep | gf2_109-lambda | per-element | 530 ns | 529 ns .. 532 ns | per elem |
| encode | binary-u.109/mode=batch,n=1024 | gf2_109-u | batch | 21.9 ns | 21.9 ns .. 22.0 ns | per elem |
| encode | binary-u.109/mode=batch,n=64 | gf2_109-u | batch | 31.7 ns | 31.6 ns .. 31.8 ns | per elem |
| encode | binary-u.109/mode=batch,n=8 | gf2_109-u | batch | 97.1 ns | 96.8 ns .. 97.4 ns | per elem |
| encode | binary-u.109/mode=indep | gf2_109-u | per-element | 546 ns | 545 ns .. 548 ns | per elem |
| encode | binary-w.109/mode=batch,n=1024 | gf2_109-w | batch | 21.6 ns | 21.6 ns .. 21.7 ns | per elem |
| encode | binary-w.109/mode=batch,n=64 | gf2_109-w | batch | 32.5 ns | 32.4 ns .. 32.6 ns | per elem |
| encode | binary-w.109/mode=batch,n=8 | gf2_109-w | batch | 96.0 ns | 95.7 ns .. 96.3 ns | per elem |
| encode | binary-w.109/mode=indep | gf2_109-w | per-element | 540 ns | 539 ns .. 541 ns | per elem |
| encode | binary.122/mode=batch,n=1024 | gf2_122 | batch | 22.1 ns | 22.0 ns .. 22.1 ns | per elem |
| encode | binary.122/mode=batch,n=64 | gf2_122 | batch | 28.9 ns | 28.8 ns .. 29.0 ns | per elem |
| encode | binary.122/mode=batch,n=8 | gf2_122 | batch | 66.6 ns | 66.4 ns .. 66.8 ns | per elem |
| encode | binary.122/mode=indep | gf2_122 | per-element | 294 ns | 294 ns .. 295 ns | per elem |
| encode | binary.122-gls/mode=batch,n=1024 | gf2_122-gls | batch | 21.1 ns | 21.0 ns .. 21.2 ns | per elem |
| encode | binary.122-gls/mode=batch,n=64 | gf2_122-gls | batch | 27.9 ns | 27.8 ns .. 28.0 ns | per elem |
| encode | binary.122-gls/mode=batch,n=8 | gf2_122-gls | batch | 65.6 ns | 65.5 ns .. 65.8 ns | per elem |
| encode | binary.122-gls/mode=indep | gf2_122-gls | per-element | 293 ns | 293 ns .. 294 ns | per elem |
| encode | binary-lambda.122-gls/mode=batch,n=1024 | gf2_122-gls-lambda | batch | 17.9 ns | 17.8 ns .. 17.9 ns | per elem |
| encode | binary-lambda.122-gls/mode=batch,n=64 | gf2_122-gls-lambda | batch | 24.5 ns | 24.4 ns .. 24.6 ns | per elem |
| encode | binary-lambda.122-gls/mode=batch,n=8 | gf2_122-gls-lambda | batch | 62.1 ns | 62.0 ns .. 62.2 ns | per elem |
| encode | binary-lambda.122-gls/mode=indep | gf2_122-gls-lambda | per-element | 297 ns | 296 ns .. 297 ns | per elem |
| encode | binary-u.122-gls/mode=batch,n=1024 | gf2_122-gls-u | batch | 18.0 ns | 18.0 ns .. 18.1 ns | per elem |
| encode | binary-u.122-gls/mode=batch,n=64 | gf2_122-gls-u | batch | 22.5 ns | 22.5 ns .. 22.5 ns | per elem |
| encode | binary-u.122-gls/mode=batch,n=8 | gf2_122-gls-u | batch | 61.2 ns | 61.0 ns .. 61.4 ns | per elem |
| encode | binary-u.122-gls/mode=indep | gf2_122-gls-u | per-element | 297 ns | 296 ns .. 299 ns | per elem |
| encode | binary-w.122-gls/mode=batch,n=1024 | gf2_122-gls-w | batch | 20.4 ns | 20.3 ns .. 20.5 ns | per elem |
| encode | binary-w.122-gls/mode=batch,n=64 | gf2_122-gls-w | batch | 27.2 ns | 27.2 ns .. 27.3 ns | per elem |
| encode | binary-w.122-gls/mode=batch,n=8 | gf2_122-gls-w | batch | 64.9 ns | 64.7 ns .. 65.0 ns | per elem |
| encode | binary-w.122-gls/mode=indep | gf2_122-gls-w | per-element | 297 ns | 296 ns .. 297 ns | per elem |
| encode | binary-lambda.122/mode=batch,n=1024 | gf2_122-lambda | batch | 17.3 ns | 17.2 ns .. 17.3 ns | per elem |
| encode | binary-lambda.122/mode=batch,n=64 | gf2_122-lambda | batch | 24.1 ns | 24.0 ns .. 24.1 ns | per elem |
| encode | binary-lambda.122/mode=batch,n=8 | gf2_122-lambda | batch | 61.7 ns | 61.6 ns .. 61.9 ns | per elem |
| encode | binary-lambda.122/mode=indep | gf2_122-lambda | per-element | 287 ns | 286 ns .. 288 ns | per elem |
| encode | binary-u.122/mode=batch,n=1024 | gf2_122-u | batch | 18.4 ns | 18.3 ns .. 18.5 ns | per elem |
| encode | binary-u.122/mode=batch,n=64 | gf2_122-u | batch | 22.5 ns | 22.4 ns .. 22.5 ns | per elem |
| encode | binary-u.122/mode=batch,n=8 | gf2_122-u | batch | 61.3 ns | 61.2 ns .. 61.5 ns | per elem |
| encode | binary-u.122/mode=indep | gf2_122-u | per-element | 305 ns | 304 ns .. 306 ns | per elem |
| encode | binary-w.122/mode=batch,n=1024 | gf2_122-w | batch | 21.2 ns | 21.0 ns .. 21.4 ns | per elem |
| encode | binary-w.122/mode=batch,n=64 | gf2_122-w | batch | 27.0 ns | 26.8 ns .. 27.1 ns | per elem |
| encode | binary-w.122/mode=batch,n=8 | gf2_122-w | batch | 64.3 ns | 64.1 ns .. 64.5 ns | per elem |
| encode | binary-w.122/mode=indep | gf2_122-w | per-element | 302 ns | 300 ns .. 303 ns | per elem |
| encode | binary.127/mode=batch,n=1024 | gf2_127 | batch | 22.7 ns | 22.5 ns .. 23.0 ns | per elem |
| encode | binary.127/mode=batch,n=64 | gf2_127 | batch | 25.6 ns | 25.5 ns .. 25.6 ns | per elem |
| encode | binary.127/mode=batch,n=8 | gf2_127 | batch | 46.0 ns | 45.9 ns .. 46.1 ns | per elem |
| encode | binary.127/mode=indep | gf2_127 | per-element | 151 ns | 149 ns .. 152 ns | per elem |
| encode | binary-lambda.127/mode=batch,n=1024 | gf2_127-lambda | batch | 17.5 ns | 17.4 ns .. 17.5 ns | per elem |
| encode | binary-lambda.127/mode=batch,n=64 | gf2_127-lambda | batch | 21.8 ns | 21.7 ns .. 21.8 ns | per elem |
| encode | binary-lambda.127/mode=batch,n=8 | gf2_127-lambda | batch | 42.0 ns | 41.9 ns .. 42.1 ns | per elem |
| encode | binary-lambda.127/mode=indep | gf2_127-lambda | per-element | 140 ns | 140 ns .. 141 ns | per elem |
| encode | binary-u.127/mode=batch,n=1024 | gf2_127-u | batch | 12.6 ns | 12.5 ns .. 12.6 ns | per elem |
| encode | binary-u.127/mode=batch,n=64 | gf2_127-u | batch | 16.3 ns | 16.2 ns .. 16.3 ns | per elem |
| encode | binary-u.127/mode=batch,n=8 | gf2_127-u | batch | 38.2 ns | 38.1 ns .. 38.3 ns | per elem |
| encode | binary-u.127/mode=indep | gf2_127-u | per-element | 137 ns | 137 ns .. 137 ns | per elem |
| encode | binary-w.127/mode=batch,n=1024 | gf2_127-w | batch | 17.0 ns | 17.0 ns .. 17.1 ns | per elem |
| encode | binary-w.127/mode=batch,n=64 | gf2_127-w | batch | 21.8 ns | 21.7 ns .. 21.9 ns | per elem |
| encode | binary-w.127/mode=batch,n=8 | gf2_127-w | batch | 42.1 ns | 41.9 ns .. 42.2 ns | per elem |
| encode | binary-w.127/mode=indep | gf2_127-w | per-element | 139 ns | 139 ns .. 140 ns | per elem |
| encode | edwards.107/mode=batch,n=1024 | edwards107 | batch | 35.1 ns | 35.0 ns .. 35.4 ns | per elem |
| encode | edwards.107/mode=indep | edwards107 | per-element | 600 ns | 599 ns .. 601 ns | per elem |
| encode | edwards.127/mode=batch,n=1024 | edwards127 | batch | 31.9 ns | 31.8 ns .. 32.0 ns | per elem |
| encode | edwards.127/mode=indep | edwards127 | per-element | 610 ns | 608 ns .. 611 ns | per elem |
| encode | edwards.61x2/mode=batch,n=1024 | edwards61x2 | batch | 35.0 ns | 34.9 ns .. 35.1 ns | per elem |
| encode | edwards.61x2/mode=indep | edwards61x2 | per-element | 203 ns | 202 ns .. 203 ns | per elem |
| encode | twisted.goldilocks2/mode=batch,n=1024 | twisted-goldilocks2 | batch | 22.9 ns | 22.9 ns .. 23.0 ns | per elem |
| encode | twisted.goldilocks2/mode=indep | twisted-goldilocks2 | per-element | 316 ns | 316 ns .. 316 ns | per elem |
| encode | twisted.128/mode=batch,n=1024 | twisted128 | batch | 22.7 ns | 22.7 ns .. 22.8 ns | per elem |
| encode | twisted.128/mode=indep | twisted128 | per-element | 943 ns | 942 ns .. 946 ns | per elem |
| encode | twisted.61x2/mode=batch,n=1024 | twisted61x2 | batch | 14.9 ns | 14.9 ns .. 15.0 ns | per elem |
| encode | twisted.61x2/mode=batch,n=64 | twisted61x2 | batch | 21.1 ns | 21.1 ns .. 21.2 ns | per elem |
| encode | twisted.61x2/mode=batch,n=8 | twisted61x2 | batch | 49.3 ns | 49.3 ns .. 49.4 ns | per elem |
| encode | twisted.61x2/mode=indep | twisted61x2 | per-element | 189 ns | 189 ns .. 190 ns | per elem |
| encode | twisted.64x2/mode=batch,n=1024 | twisted64x2 | batch | 22.6 ns | 22.5 ns .. 22.7 ns | per elem |
| encode | twisted.64x2/mode=indep | twisted64x2 | per-element | 267 ns | 266 ns .. 268 ns | per elem |
| encode | weier.107/mode=batch,n=1024 | weier107 | batch | 19.4 ns | 19.3 ns .. 19.5 ns | per elem |
| encode | weier.107/mode=indep | weier107 | per-element | 582 ns | 579 ns .. 584 ns | per elem |
| encode | weier-jacobian.107/mode=batch,n=1024 | weier107-jacobian | batch | 25.5 ns | 25.4 ns .. 25.6 ns | per elem |
| encode | weier-jacobian.107/mode=indep | weier107-jacobian | per-element | 580 ns | 578 ns .. 581 ns | per elem |
| encode | weier.127/mode=batch,n=1024 | weier127 | batch | 16.7 ns | 16.7 ns .. 16.8 ns | per elem |
| encode | weier.127/mode=indep | weier127 | per-element | 593 ns | 591 ns .. 594 ns | per elem |
| encode | weier-jacobian.127/mode=batch,n=1024 | weier127-jacobian | batch | 23.6 ns | 23.5 ns .. 23.7 ns | per elem |
| encode | weier-jacobian.127/mode=indep | weier127-jacobian | per-element | 605 ns | 602 ns .. 609 ns | per elem |
| encode | weier.61x2/mode=batch,n=1024 | weier61x2 | batch | 15.3 ns | 15.2 ns .. 15.3 ns | per elem |
| encode | weier.61x2/mode=indep | weier61x2 | per-element | 190 ns | 190 ns .. 191 ns | per elem |
| encode | weier-jacobian.61x2/mode=batch,n=1024 | weier61x2-jacobian | batch | 24.8 ns | 24.7 ns .. 24.9 ns | per elem |
| encode | weier-jacobian.61x2/mode=indep | weier61x2-jacobian | per-element | 198 ns | 198 ns .. 199 ns | per elem |
| decode | binary.109/mode=batch,n=1024 | gf2_109 | batch | 26.7 ns | 26.6 ns .. 26.8 ns | per elem |
| decode | binary.109/mode=batch,n=64 | gf2_109 | batch | 38.7 ns | 38.6 ns .. 38.8 ns | per elem |
| decode | binary.109/mode=batch,n=8 | gf2_109 | batch | 108 ns | 108 ns .. 108 ns | per elem |
| decode | binary.109/mode=indep | gf2_109 | per-element | 554 ns | 553 ns .. 556 ns | per elem |
| decode | binary-lambda.109/mode=batch,n=1024 | gf2_109-lambda | batch | 26.5 ns | 26.4 ns .. 26.5 ns | per elem |
| decode | binary-lambda.109/mode=batch,n=64 | gf2_109-lambda | batch | 39.1 ns | 38.9 ns .. 39.2 ns | per elem |
| decode | binary-lambda.109/mode=batch,n=8 | gf2_109-lambda | batch | 109 ns | 108 ns .. 109 ns | per elem |
| decode | binary-lambda.109/mode=indep | gf2_109-lambda | per-element | 549 ns | 548 ns .. 551 ns | per elem |
| decode | binary-u.109/mode=batch,n=1024 | gf2_109-u | batch | 27.7 ns | 27.7 ns .. 27.8 ns | per elem |
| decode | binary-u.109/mode=batch,n=64 | gf2_109-u | batch | 40.3 ns | 40.1 ns .. 40.4 ns | per elem |
| decode | binary-u.109/mode=batch,n=8 | gf2_109-u | batch | 109 ns | 108 ns .. 109 ns | per elem |
| decode | binary-u.109/mode=indep | gf2_109-u | per-element | 555 ns | 555 ns .. 556 ns | per elem |
| decode | binary-w.109/mode=batch,n=1024 | gf2_109-w | batch | 24.4 ns | 24.3 ns .. 24.4 ns | per elem |
| decode | binary-w.109/mode=batch,n=64 | gf2_109-w | batch | 36.8 ns | 36.7 ns .. 37.0 ns | per elem |
| decode | binary-w.109/mode=batch,n=8 | gf2_109-w | batch | 105 ns | 105 ns .. 106 ns | per elem |
| decode | binary-w.109/mode=indep | gf2_109-w | per-element | 555 ns | 553 ns .. 556 ns | per elem |
| decode | binary.122/mode=batch,n=1024 | gf2_122 | batch | 24.0 ns | 23.9 ns .. 24.1 ns | per elem |
| decode | binary.122/mode=batch,n=64 | gf2_122 | batch | 32.4 ns | 32.3 ns .. 32.5 ns | per elem |
| decode | binary.122/mode=batch,n=8 | gf2_122 | batch | 73.5 ns | 73.4 ns .. 73.7 ns | per elem |
| decode | binary.122/mode=indep | gf2_122 | per-element | 313 ns | 312 ns .. 313 ns | per elem |
| decode | binary.122-gls/mode=batch,n=1024 | gf2_122-gls | batch | 22.7 ns | 22.6 ns .. 22.7 ns | per elem |
| decode | binary.122-gls/mode=batch,n=64 | gf2_122-gls | batch | 31.0 ns | 30.9 ns .. 31.1 ns | per elem |
| decode | binary.122-gls/mode=batch,n=8 | gf2_122-gls | batch | 71.5 ns | 71.4 ns .. 71.7 ns | per elem |
| decode | binary.122-gls/mode=indep | gf2_122-gls | per-element | 313 ns | 312 ns .. 313 ns | per elem |
| decode | binary-lambda.122-gls/mode=batch,n=1024 | gf2_122-gls-lambda | batch | 22.6 ns | 22.6 ns .. 22.7 ns | per elem |
| decode | binary-lambda.122-gls/mode=batch,n=64 | gf2_122-gls-lambda | batch | 32.1 ns | 32.0 ns .. 32.2 ns | per elem |
| decode | binary-lambda.122-gls/mode=batch,n=8 | gf2_122-gls-lambda | batch | 73.7 ns | 73.6 ns .. 73.9 ns | per elem |
| decode | binary-lambda.122-gls/mode=indep | gf2_122-gls-lambda | per-element | 311 ns | 310 ns .. 312 ns | per elem |
| decode | binary-u.122-gls/mode=batch,n=1024 | gf2_122-gls-u | batch | 24.7 ns | 24.6 ns .. 24.8 ns | per elem |
| decode | binary-u.122-gls/mode=batch,n=64 | gf2_122-gls-u | batch | 32.9 ns | 32.8 ns .. 33.0 ns | per elem |
| decode | binary-u.122-gls/mode=batch,n=8 | gf2_122-gls-u | batch | 73.8 ns | 73.6 ns .. 73.9 ns | per elem |
| decode | binary-u.122-gls/mode=indep | gf2_122-gls-u | per-element | 313 ns | 311 ns .. 314 ns | per elem |
| decode | binary-w.122-gls/mode=batch,n=1024 | gf2_122-gls-w | batch | 20.9 ns | 20.8 ns .. 21.0 ns | per elem |
| decode | binary-w.122-gls/mode=batch,n=64 | gf2_122-gls-w | batch | 29.1 ns | 29.1 ns .. 29.2 ns | per elem |
| decode | binary-w.122-gls/mode=batch,n=8 | gf2_122-gls-w | batch | 70.1 ns | 69.9 ns .. 70.2 ns | per elem |
| decode | binary-w.122-gls/mode=indep | gf2_122-gls-w | per-element | 305 ns | 304 ns .. 306 ns | per elem |
| decode | binary-lambda.122/mode=batch,n=1024 | gf2_122-lambda | batch | 24.1 ns | 24.0 ns .. 24.1 ns | per elem |
| decode | binary-lambda.122/mode=batch,n=64 | gf2_122-lambda | batch | 32.2 ns | 32.2 ns .. 32.3 ns | per elem |
| decode | binary-lambda.122/mode=batch,n=8 | gf2_122-lambda | batch | 73.1 ns | 72.9 ns .. 73.2 ns | per elem |
| decode | binary-lambda.122/mode=indep | gf2_122-lambda | per-element | 314 ns | 313 ns .. 314 ns | per elem |
| decode | binary-u.122/mode=batch,n=1024 | gf2_122-u | batch | 26.0 ns | 25.8 ns .. 26.2 ns | per elem |
| decode | binary-u.122/mode=batch,n=64 | gf2_122-u | batch | 33.6 ns | 33.6 ns .. 33.7 ns | per elem |
| decode | binary-u.122/mode=batch,n=8 | gf2_122-u | batch | 74.7 ns | 74.6 ns .. 74.8 ns | per elem |
| decode | binary-u.122/mode=indep | gf2_122-u | per-element | 317 ns | 315 ns .. 319 ns | per elem |
| decode | binary-w.122/mode=batch,n=1024 | gf2_122-w | batch | 21.6 ns | 21.5 ns .. 21.7 ns | per elem |
| decode | binary-w.122/mode=batch,n=64 | gf2_122-w | batch | 29.8 ns | 29.7 ns .. 29.9 ns | per elem |
| decode | binary-w.122/mode=batch,n=8 | gf2_122-w | batch | 70.9 ns | 70.7 ns .. 71.1 ns | per elem |
| decode | binary-w.122/mode=indep | gf2_122-w | per-element | 307 ns | 306 ns .. 308 ns | per elem |
| decode | binary.127/mode=batch,n=1024 | gf2_127 | batch | 25.7 ns | 25.6 ns .. 25.7 ns | per elem |
| decode | binary.127/mode=batch,n=64 | gf2_127 | batch | 29.6 ns | 29.5 ns .. 29.6 ns | per elem |
| decode | binary.127/mode=batch,n=8 | gf2_127 | batch | 54.2 ns | 54.1 ns .. 54.3 ns | per elem |
| decode | binary.127/mode=indep | gf2_127 | per-element | 164 ns | 163 ns .. 164 ns | per elem |
| decode | binary-lambda.127/mode=batch,n=1024 | gf2_127-lambda | batch | 24.0 ns | 24.0 ns .. 24.1 ns | per elem |
| decode | binary-lambda.127/mode=batch,n=64 | gf2_127-lambda | batch | 29.7 ns | 29.7 ns .. 29.8 ns | per elem |
| decode | binary-lambda.127/mode=batch,n=8 | gf2_127-lambda | batch | 54.2 ns | 54.2 ns .. 54.3 ns | per elem |
| decode | binary-lambda.127/mode=indep | gf2_127-lambda | per-element | 155 ns | 154 ns .. 155 ns | per elem |
| decode | binary-u.127/mode=batch,n=1024 | gf2_127-u | batch | 27.5 ns | 27.5 ns .. 27.6 ns | per elem |
| decode | binary-u.127/mode=batch,n=64 | gf2_127-u | batch | 32.8 ns | 32.7 ns .. 32.9 ns | per elem |
| decode | binary-u.127/mode=batch,n=8 | gf2_127-u | batch | 57.6 ns | 57.4 ns .. 57.8 ns | per elem |
| decode | binary-u.127/mode=indep | gf2_127-u | per-element | 162 ns | 161 ns .. 162 ns | per elem |
| decode | binary-w.127/mode=batch,n=1024 | gf2_127-w | batch | 22.6 ns | 22.5 ns .. 22.6 ns | per elem |
| decode | binary-w.127/mode=batch,n=64 | gf2_127-w | batch | 28.8 ns | 28.7 ns .. 28.9 ns | per elem |
| decode | binary-w.127/mode=batch,n=8 | gf2_127-w | batch | 55.2 ns | 55.1 ns .. 55.4 ns | per elem |
| decode | binary-w.127/mode=indep | gf2_127-w | per-element | 155 ns | 154 ns .. 155 ns | per elem |
| decode | edwards.107/mode=batch,n=1024 | edwards107 | batch | 426 ns | 424 ns .. 427 ns | per elem |
| decode | edwards.107/mode=indep | edwards107 | per-element | 424 ns | 423 ns .. 426 ns | per elem |
| decode | edwards.127/mode=batch,n=1024 | edwards127 | batch | 541 ns | 540 ns .. 543 ns | per elem |
| decode | edwards.127/mode=indep | edwards127 | per-element | 540 ns | 539 ns .. 541 ns | per elem |
| decode | edwards.61x2/mode=batch,n=1024 | edwards61x2 | batch | 441 ns | 439 ns .. 442 ns | per elem |
| decode | edwards.61x2/mode=indep | edwards61x2 | per-element | 437 ns | 436 ns .. 439 ns | per elem |
| decode | twisted.goldilocks2/mode=batch,n=1024 | twisted-goldilocks2 | batch | 1.92 µs | 1.92 µs .. 1.93 µs | per elem |
| decode | twisted.goldilocks2/mode=indep | twisted-goldilocks2 | per-element | 1.91 µs | 1.91 µs .. 1.91 µs | per elem |
| decode | twisted.128/mode=batch,n=1024 | twisted128 | batch | 962 ns | 960 ns .. 965 ns | per elem |
| decode | twisted.128/mode=indep | twisted128 | per-element | 960 ns | 959 ns .. 962 ns | per elem |
| decode | twisted.61x2/mode=batch,n=1024 | twisted61x2 | batch | 450 ns | 449 ns .. 451 ns | per elem |
| decode | twisted.61x2/mode=batch,n=64 | twisted61x2 | batch | 447 ns | 446 ns .. 447 ns | per elem |
| decode | twisted.61x2/mode=batch,n=8 | twisted61x2 | batch | 448 ns | 447 ns .. 449 ns | per elem |
| decode | twisted.61x2/mode=indep | twisted61x2 | per-element | 448 ns | 447 ns .. 449 ns | per elem |
| decode | twisted.64x2/mode=batch,n=1024 | twisted64x2 | batch | 647 ns | 646 ns .. 649 ns | per elem |
| decode | twisted.64x2/mode=indep | twisted64x2 | per-element | 650 ns | 648 ns .. 652 ns | per elem |
| decode | weier.107/mode=batch,n=1024 | weier107 | batch | 422 ns | 421 ns .. 423 ns | per elem |
| decode | weier.107/mode=indep | weier107 | per-element | 421 ns | 420 ns .. 422 ns | per elem |
| decode | weier-jacobian.107/mode=batch,n=1024 | weier107-jacobian | batch | 421 ns | 420 ns .. 422 ns | per elem |
| decode | weier-jacobian.107/mode=indep | weier107-jacobian | per-element | 419 ns | 418 ns .. 421 ns | per elem |
| decode | weier.127/mode=batch,n=1024 | weier127 | batch | 539 ns | 538 ns .. 541 ns | per elem |
| decode | weier.127/mode=indep | weier127 | per-element | 541 ns | 540 ns .. 543 ns | per elem |
| decode | weier-jacobian.127/mode=batch,n=1024 | weier127-jacobian | batch | 542 ns | 541 ns .. 543 ns | per elem |
| decode | weier-jacobian.127/mode=indep | weier127-jacobian | per-element | 543 ns | 541 ns .. 545 ns | per elem |
| decode | weier.61x2/mode=batch,n=1024 | weier61x2 | batch | 448 ns | 447 ns .. 449 ns | per elem |
| decode | weier.61x2/mode=indep | weier61x2 | per-element | 441 ns | 440 ns .. 442 ns | per elem |
| decode | weier-jacobian.61x2/mode=batch,n=1024 | weier61x2-jacobian | batch | 445 ns | 444 ns .. 446 ns | per elem |
| decode | weier-jacobian.61x2/mode=indep | weier61x2-jacobian | per-element | 440 ns | 439 ns .. 441 ns | per elem |
| normalize | gf2_109/normalize, batched | gf2_109 | batch | 16.4 ns | 16.3 ns .. 16.4 ns | per elem |
| normalize | gf2_122/normalize, batched | gf2_122 | batch | 17.2 ns | 17.2 ns .. 17.3 ns | per elem |
| normalize | gf2_122-gls/normalize, batched | gf2_122-gls | batch | 16.3 ns | 16.2 ns .. 16.3 ns | per elem |
| batch sum | gf2_109/batch affine (tree sum) | gf2_109 | batch | 21.4 ns | 21.4 ns .. 21.5 ns | per elem |
| batch sum | gf2_122/batch affine (tree sum) | gf2_122 | batch | 18.7 ns | 18.7 ns .. 18.8 ns | per elem |
| batch sum | gf2_127/batch affine (tree sum) | gf2_127 | batch | 16.2 ns | 16.1 ns .. 16.2 ns | per elem |
| batch sum | edwards107/batch montgomery affine (tree sum) | edwards107 | batch | 36.7 ns | 36.5 ns .. 36.8 ns | per elem |
| batch sum | edwards127/batch montgomery affine (tree sum) | edwards127 | batch | 40.8 ns | 40.7 ns .. 40.9 ns | per elem |
| batch sum | weier107/batch affine (tree sum) | weier107 | batch | 35.9 ns | 35.8 ns .. 36.1 ns | per elem |
| batch sum | weier127/batch affine (tree sum) | weier127 | batch | 39.3 ns | 39.1 ns .. 39.4 ns | per elem |
| batch sum | secp256k1/combine_keys (jacobian += affine) | secp256k1 | batch | 162 ns | 162 ns .. 163 ns | per elem |
hash to curve
Figure
262 benchmarks
| operation | benchmark | family | mode | time | 95% CI | unit |
|---|---|---|---|---|---|---|
| hash to curve | sha256 (XOR baseline) | xor | per-element | 53.4 ns | 52.9 ns .. 53.9 ns | per elem |
| hash to curve | binary.109/mode=batch,n=1024 | gf2_109 | batch | 126 ns | 125 ns .. 127 ns | per elem |
| hash to curve | binary.109/mode=batch,n=64 | gf2_109 | batch | 195 ns | 194 ns .. 195 ns | per elem |
| hash to curve | binary.109/mode=batch,n=8 | gf2_109 | batch | 431 ns | 430 ns .. 432 ns | per elem |
| hash to curve | binary.109/mode=indep | gf2_109 | per-element | 1.16 µs | 1.16 µs .. 1.17 µs | per elem |
| hash to curve | binary-lambda.109/mode=batch,n=1024 | gf2_109-lambda | batch | 124 ns | 124 ns .. 125 ns | per elem |
| hash to curve | binary-lambda.109/mode=batch,n=64 | gf2_109-lambda | batch | 195 ns | 194 ns .. 195 ns | per elem |
| hash to curve | binary-lambda.109/mode=batch,n=8 | gf2_109-lambda | batch | 431 ns | 430 ns .. 433 ns | per elem |
| hash to curve | binary-lambda.109/mode=indep | gf2_109-lambda | per-element | 1.16 µs | 1.16 µs .. 1.16 µs | per elem |
| hash to curve | binary-u.109/mode=batch,n=1024 | gf2_109-u | batch | 125 ns | 125 ns .. 125 ns | per elem |
| hash to curve | binary-u.109/mode=batch,n=64 | gf2_109-u | batch | 189 ns | 189 ns .. 190 ns | per elem |
| hash to curve | binary-u.109/mode=batch,n=8 | gf2_109-u | batch | 417 ns | 416 ns .. 419 ns | per elem |
| hash to curve | binary-u.109/mode=indep | gf2_109-u | per-element | 1.15 µs | 1.15 µs .. 1.16 µs | per elem |
| hash to curve | binary-w.109/mode=batch,n=1024 | gf2_109-w | batch | 120 ns | 119 ns .. 121 ns | per elem |
| hash to curve | binary-w.109/mode=batch,n=64 | gf2_109-w | batch | 183 ns | 182 ns .. 183 ns | per elem |
| hash to curve | binary-w.109/mode=batch,n=8 | gf2_109-w | batch | 413 ns | 412 ns .. 415 ns | per elem |
| hash to curve | binary-w.109/mode=indep | gf2_109-w | per-element | 1.14 µs | 1.13 µs .. 1.14 µs | per elem |
| hash to curve | binary.122/mode=batch,n=1024 | gf2_122 | batch | 114 ns | 114 ns .. 114 ns | per elem |
| hash to curve | binary.122/mode=batch,n=64 | gf2_122 | batch | 155 ns | 155 ns .. 156 ns | per elem |
| hash to curve | binary.122/mode=batch,n=8 | gf2_122 | batch | 293 ns | 292 ns .. 294 ns | per elem |
| hash to curve | binary.122/mode=indep | gf2_122 | per-element | 670 ns | 669 ns .. 671 ns | per elem |
| hash to curve | binary.122-gls/mode=batch,n=1024 | gf2_122-gls | batch | 116 ns | 116 ns .. 117 ns | per elem |
| hash to curve | binary.122-gls/mode=batch,n=64 | gf2_122-gls | batch | 161 ns | 161 ns .. 162 ns | per elem |
| hash to curve | binary.122-gls/mode=batch,n=8 | gf2_122-gls | batch | 308 ns | 308 ns .. 309 ns | per elem |
| hash to curve | binary.122-gls/mode=indep | gf2_122-gls | per-element | 697 ns | 693 ns .. 702 ns | per elem |
| hash to curve | binary-lambda.122-gls/mode=batch,n=1024 | gf2_122-gls-lambda | batch | 116 ns | 115 ns .. 116 ns | per elem |
| hash to curve | binary-lambda.122-gls/mode=batch,n=64 | gf2_122-gls-lambda | batch | 161 ns | 161 ns .. 161 ns | per elem |
| hash to curve | binary-lambda.122-gls/mode=batch,n=8 | gf2_122-gls-lambda | batch | 306 ns | 306 ns .. 307 ns | per elem |
| hash to curve | binary-lambda.122-gls/mode=indep | gf2_122-gls-lambda | per-element | 692 ns | 688 ns .. 696 ns | per elem |
| hash to curve | binary-u.122-gls/mode=batch,n=1024 | gf2_122-gls-u | batch | 121 ns | 120 ns .. 121 ns | per elem |
| hash to curve | binary-u.122-gls/mode=batch,n=64 | gf2_122-gls-u | batch | 165 ns | 165 ns .. 166 ns | per elem |
| hash to curve | binary-u.122-gls/mode=batch,n=8 | gf2_122-gls-u | batch | 298 ns | 298 ns .. 299 ns | per elem |
| hash to curve | binary-u.122-gls/mode=indep | gf2_122-gls-u | per-element | 678 ns | 676 ns .. 680 ns | per elem |
| hash to curve | binary-w.122-gls/mode=batch,n=1024 | gf2_122-gls-w | batch | 116 ns | 115 ns .. 116 ns | per elem |
| hash to curve | binary-w.122-gls/mode=batch,n=64 | gf2_122-gls-w | batch | 161 ns | 160 ns .. 161 ns | per elem |
| hash to curve | binary-w.122-gls/mode=batch,n=8 | gf2_122-gls-w | batch | 303 ns | 303 ns .. 304 ns | per elem |
| hash to curve | binary-w.122-gls/mode=indep | gf2_122-gls-w | per-element | 659 ns | 658 ns .. 660 ns | per elem |
| hash to curve | binary-lambda.122/mode=batch,n=1024 | gf2_122-lambda | batch | 115 ns | 115 ns .. 116 ns | per elem |
| hash to curve | binary-lambda.122/mode=batch,n=64 | gf2_122-lambda | batch | 156 ns | 156 ns .. 157 ns | per elem |
| hash to curve | binary-lambda.122/mode=batch,n=8 | gf2_122-lambda | batch | 294 ns | 294 ns .. 295 ns | per elem |
| hash to curve | binary-lambda.122/mode=indep | gf2_122-lambda | per-element | 679 ns | 677 ns .. 680 ns | per elem |
| hash to curve | binary-u.122/mode=batch,n=1024 | gf2_122-u | batch | 127 ns | 125 ns .. 128 ns | per elem |
| hash to curve | binary-u.122/mode=batch,n=64 | gf2_122-u | batch | 164 ns | 164 ns .. 165 ns | per elem |
| hash to curve | binary-u.122/mode=batch,n=8 | gf2_122-u | batch | 301 ns | 301 ns .. 302 ns | per elem |
| hash to curve | binary-u.122/mode=indep | gf2_122-u | per-element | 674 ns | 672 ns .. 676 ns | per elem |
| hash to curve | binary-w.122/mode=batch,n=1024 | gf2_122-w | batch | 116 ns | 116 ns .. 117 ns | per elem |
| hash to curve | binary-w.122/mode=batch,n=64 | gf2_122-w | batch | 156 ns | 156 ns .. 156 ns | per elem |
| hash to curve | binary-w.122/mode=batch,n=8 | gf2_122-w | batch | 294 ns | 294 ns .. 295 ns | per elem |
| hash to curve | binary-w.122/mode=indep | gf2_122-w | per-element | 654 ns | 653 ns .. 656 ns | per elem |
| hash to curve | binary.127/mode=batch,n=1024 | gf2_127 | batch | 113 ns | 112 ns .. 113 ns | per elem |
| hash to curve | binary.127/mode=batch,n=64 | gf2_127 | batch | 137 ns | 136 ns .. 137 ns | per elem |
| hash to curve | binary.127/mode=batch,n=8 | gf2_127 | batch | 200 ns | 199 ns .. 200 ns | per elem |
| hash to curve | binary.127/mode=indep | gf2_127 | per-element | 366 ns | 365 ns .. 368 ns | per elem |
| hash to curve | binary-lambda.127/mode=batch,n=1024 | gf2_127-lambda | batch | 114 ns | 114 ns .. 115 ns | per elem |
| hash to curve | binary-lambda.127/mode=batch,n=64 | gf2_127-lambda | batch | 137 ns | 137 ns .. 137 ns | per elem |
| hash to curve | binary-lambda.127/mode=batch,n=8 | gf2_127-lambda | batch | 204 ns | 203 ns .. 204 ns | per elem |
| hash to curve | binary-lambda.127/mode=indep | gf2_127-lambda | per-element | 394 ns | 392 ns .. 396 ns | per elem |
| hash to curve | binary-u.127/mode=batch,n=1024 | gf2_127-u | batch | 125 ns | 124 ns .. 125 ns | per elem |
| hash to curve | binary-u.127/mode=batch,n=64 | gf2_127-u | batch | 153 ns | 152 ns .. 153 ns | per elem |
| hash to curve | binary-u.127/mode=batch,n=8 | gf2_127-u | batch | 225 ns | 225 ns .. 226 ns | per elem |
| hash to curve | binary-u.127/mode=indep | gf2_127-u | per-element | 401 ns | 400 ns .. 403 ns | per elem |
| hash to curve | binary-w.127/mode=batch,n=1024 | gf2_127-w | batch | 119 ns | 119 ns .. 120 ns | per elem |
| hash to curve | binary-w.127/mode=batch,n=64 | gf2_127-w | batch | 145 ns | 145 ns .. 145 ns | per elem |
| hash to curve | binary-w.127/mode=batch,n=8 | gf2_127-w | batch | 219 ns | 218 ns .. 219 ns | per elem |
| hash to curve | binary-w.127/mode=indep | gf2_127-w | per-element | 392 ns | 391 ns .. 393 ns | per elem |
| hash to curve | edwards.107/mode=batch,n=1024 | edwards107 | batch | 916 ns | 914 ns .. 919 ns | per elem |
| hash to curve | edwards.107/mode=indep | edwards107 | per-element | 919 ns | 916 ns .. 922 ns | per elem |
| hash to curve | edwards107/edwards-native try-and-increment | edwards107 | per-element | 1.31 µs | 1.31 µs .. 1.32 µs | per elem |
| hash to curve | edwards.127/mode=batch,n=1024 | edwards127 | batch | 1.24 µs | 1.23 µs .. 1.24 µs | per elem |
| hash to curve | edwards.127/mode=indep | edwards127 | per-element | 1.22 µs | 1.22 µs .. 1.23 µs | per elem |
| hash to curve | edwards127/edwards-native try-and-increment | edwards127 | per-element | 1.29 µs | 1.28 µs .. 1.29 µs | per elem |
| hash to curve | edwards.61x2/mode=batch,n=1024 | edwards61x2 | batch | 706 ns | 704 ns .. 708 ns | per elem |
| hash to curve | edwards.61x2/mode=indep | edwards61x2 | per-element | 707 ns | 705 ns .. 708 ns | per elem |
| hash to curve | twisted.goldilocks2/mode=batch,n=1024 | twisted-goldilocks2 | batch | 2.24 µs | 2.23 µs .. 2.24 µs | per elem |
| hash to curve | twisted.goldilocks2/mode=indep | twisted-goldilocks2 | per-element | 2.21 µs | 2.21 µs .. 2.22 µs | per elem |
| hash to curve | twisted.128/mode=batch,n=1024 | twisted128 | batch | 1.96 µs | 1.96 µs .. 1.96 µs | per elem |
| hash to curve | twisted.128/mode=indep | twisted128 | per-element | 1.97 µs | 1.96 µs .. 1.97 µs | per elem |
| hash to curve | twisted.61x2/mode=batch,n=1024 | twisted61x2 | batch | 711 ns | 708 ns .. 713 ns | per elem |
| hash to curve | twisted.61x2/mode=batch,n=64 | twisted61x2 | batch | 703 ns | 702 ns .. 704 ns | per elem |
| hash to curve | twisted.61x2/mode=batch,n=8 | twisted61x2 | batch | 703 ns | 701 ns .. 705 ns | per elem |
| hash to curve | twisted.61x2/mode=indep | twisted61x2 | per-element | 706 ns | 704 ns .. 708 ns | per elem |
| hash to curve | twisted.64x2/mode=batch,n=1024 | twisted64x2 | batch | 1.00 µs | 1.00 µs .. 1.01 µs | per elem |
| hash to curve | twisted.64x2/mode=indep | twisted64x2 | per-element | 1.00 µs | 999 ns .. 1.01 µs | per elem |
| hash to curve | weier.107/mode=batch,n=1024 | weier107 | batch | 901 ns | 899 ns .. 904 ns | per elem |
| hash to curve | weier.107/mode=indep | weier107 | per-element | 892 ns | 890 ns .. 895 ns | per elem |
| hash to curve | weier-jacobian.107/mode=batch,n=1024 | weier107-jacobian | batch | 893 ns | 891 ns .. 895 ns | per elem |
| hash to curve | weier-jacobian.107/mode=indep | weier107-jacobian | per-element | 886 ns | 884 ns .. 888 ns | per elem |
| hash to curve | weier.127/mode=batch,n=1024 | weier127 | batch | 1.17 µs | 1.16 µs .. 1.17 µs | per elem |
| hash to curve | weier.127/mode=indep | weier127 | per-element | 1.16 µs | 1.16 µs .. 1.16 µs | per elem |
| hash to curve | weier-jacobian.127/mode=batch,n=1024 | weier127-jacobian | batch | 1.16 µs | 1.16 µs .. 1.16 µs | per elem |
| hash to curve | weier-jacobian.127/mode=indep | weier127-jacobian | per-element | 1.15 µs | 1.15 µs .. 1.16 µs | per elem |
| hash to curve | weier.61x2/mode=batch,n=1024 | weier61x2 | batch | 698 ns | 696 ns .. 700 ns | per elem |
| hash to curve | weier.61x2/mode=indep | weier61x2 | per-element | 696 ns | 694 ns .. 697 ns | per elem |
| hash to curve | weier-jacobian.61x2/mode=batch,n=1024 | weier61x2-jacobian | batch | 698 ns | 696 ns .. 700 ns | per elem |
| hash to curve | weier-jacobian.61x2/mode=indep | weier61x2-jacobian | per-element | 702 ns | 700 ns .. 704 ns | per elem |
| hash to curve | ristretto255/hash_from_bytes<Sha512> | ristretto255 | per-element | 6.03 µs | 6.02 µs .. 6.05 µs | per elem |
| hash to curve | secp256k1/ellswift decode | secp256k1 | per-element | 6.16 µs | 6.14 µs .. 6.18 µs | per elem |
| hash to curve | secp256k1/try-and-increment (parse) | secp256k1 | per-element | 6.17 µs | 6.16 µs .. 6.19 µs | per elem |
| ID to addend | binary.109/proj=fp127,h2c=pornin,mode=batch,n=1024 | gf2_109 | batch | 66.9 ns | 66.8 ns .. 67.1 ns | per elem |
| ID to addend | binary.109/proj=fp127,h2c=ti,mode=batch,n=1024 | gf2_109 | batch | 71.9 ns | 71.7 ns .. 72.0 ns | per elem |
| ID to addend | binary.109/proj=fp130,h2c=pornin,mode=batch,n=1024 | gf2_109 | batch | 72.5 ns | 72.3 ns .. 72.8 ns | per elem |
| ID to addend | binary.109/proj=fp130,h2c=ti,mode=batch,n=1024 | gf2_109 | batch | 103 ns | 103 ns .. 104 ns | per elem |
| ID to addend | binary.109/proj=gf2_127,h2c=pornin,mode=batch,n=1024 | gf2_109 | batch | 63.8 ns | 63.6 ns .. 63.9 ns | per elem |
| ID to addend | binary.109/proj=gf2_127,h2c=ti,mode=batch,n=1024 | gf2_109 | batch | 71.6 ns | 71.4 ns .. 71.9 ns | per elem |
| ID to addend | binary.109/proj=none,h2c=pornin,mode=batch,n=1024 | gf2_109 | batch | 113 ns | 113 ns .. 114 ns | per elem |
| ID to addend | binary.109/proj=none,h2c=ti,mode=batch,n=1024 | gf2_109 | batch | 132 ns | 131 ns .. 132 ns | per elem |
| ID to addend | binary-lambda.109/proj=fp127,h2c=pornin-addend,mode=batch,n=1024 | gf2_109-lambda | batch | 59.1 ns | 58.9 ns .. 59.3 ns | per elem |
| ID to addend | binary-lambda.109/proj=fp127,h2c=ti,mode=batch,n=1024 | gf2_109-lambda | batch | 74.9 ns | 74.7 ns .. 75.1 ns | per elem |
| ID to addend | binary-lambda.109/proj=fp127,h2c=ti-addend,mode=batch,n=1024 | gf2_109-lambda | batch | 66.5 ns | 66.3 ns .. 66.8 ns | per elem |
| ID to addend | binary-lambda.109/proj=fp130,h2c=pornin-addend,mode=batch,n=1024 | gf2_109-lambda | batch | 65.0 ns | 64.7 ns .. 65.2 ns | per elem |
| ID to addend | binary-lambda.109/proj=fp130,h2c=ti,mode=batch,n=1024 | gf2_109-lambda | batch | 102 ns | 102 ns .. 103 ns | per elem |
| ID to addend | binary-lambda.109/proj=fp130,h2c=ti-addend,mode=batch,n=1024 | gf2_109-lambda | batch | 93.8 ns | 93.4 ns .. 94.2 ns | per elem |
| ID to addend | binary-lambda.109/proj=gf2_127,h2c=pornin-addend,mode=batch,n=1024 | gf2_109-lambda | batch | 55.7 ns | 55.5 ns .. 55.8 ns | per elem |
| ID to addend | binary-lambda.109/proj=gf2_127,h2c=ti,mode=batch,n=1024 | gf2_109-lambda | batch | 72.5 ns | 72.3 ns .. 72.7 ns | per elem |
| ID to addend | binary-lambda.109/proj=gf2_127,h2c=ti-addend,mode=batch,n=1024 | gf2_109-lambda | batch | 64.3 ns | 64.1 ns .. 64.4 ns | per elem |
| ID to addend | binary-lambda.109/proj=none,h2c=pornin-addend,mode=batch,n=1024 | gf2_109-lambda | batch | 105 ns | 105 ns .. 106 ns | per elem |
| ID to addend | binary-lambda.109/proj=none,h2c=ti,mode=batch,n=1024 | gf2_109-lambda | batch | 132 ns | 132 ns .. 133 ns | per elem |
| ID to addend | binary-lambda.109/proj=none,h2c=ti-addend,mode=batch,n=1024 | gf2_109-lambda | batch | 124 ns | 124 ns .. 125 ns | per elem |
| ID to addend | binary-u.109/proj=fp127,h2c=pornin-addend,mode=batch,n=1024 | gf2_109-u | batch | 64.2 ns | 64.0 ns .. 64.4 ns | per elem |
| ID to addend | binary-u.109/proj=fp127,h2c=ti,mode=batch,n=1024 | gf2_109-u | batch | 71.9 ns | 71.7 ns .. 72.2 ns | per elem |
| ID to addend | binary-u.109/proj=fp130,h2c=pornin-addend,mode=batch,n=1024 | gf2_109-u | batch | 69.8 ns | 69.6 ns .. 70.0 ns | per elem |
| ID to addend | binary-u.109/proj=fp130,h2c=ti,mode=batch,n=1024 | gf2_109-u | batch | 98.9 ns | 98.7 ns .. 99.2 ns | per elem |
| ID to addend | binary-u.109/proj=gf2_127,h2c=pornin-addend,mode=batch,n=1024 | gf2_109-u | batch | 60.6 ns | 60.3 ns .. 60.8 ns | per elem |
| ID to addend | binary-u.109/proj=gf2_127,h2c=ti,mode=batch,n=1024 | gf2_109-u | batch | 70.2 ns | 70.0 ns .. 70.4 ns | per elem |
| ID to addend | binary-u.109/proj=none,h2c=pornin-addend,mode=batch,n=1024 | gf2_109-u | batch | 110 ns | 110 ns .. 111 ns | per elem |
| ID to addend | binary-u.109/proj=none,h2c=ti,mode=batch,n=1024 | gf2_109-u | batch | 130 ns | 130 ns .. 130 ns | per elem |
| ID to addend | binary-w.109/proj=fp127,h2c=pornin-addend,mode=batch,n=1024 | gf2_109-w | batch | 58.5 ns | 58.4 ns .. 58.7 ns | per elem |
| ID to addend | binary-w.109/proj=fp127,h2c=ti,mode=batch,n=1024 | gf2_109-w | batch | 67.2 ns | 66.6 ns .. 68.0 ns | per elem |
| ID to addend | binary-w.109/proj=fp130,h2c=pornin-addend,mode=batch,n=1024 | gf2_109-w | batch | 65.0 ns | 64.8 ns .. 65.2 ns | per elem |
| ID to addend | binary-w.109/proj=fp130,h2c=ti,mode=batch,n=1024 | gf2_109-w | batch | 92.7 ns | 92.4 ns .. 93.0 ns | per elem |
| ID to addend | binary-w.109/proj=gf2_127,h2c=pornin-addend,mode=batch,n=1024 | gf2_109-w | batch | 56.3 ns | 56.1 ns .. 56.4 ns | per elem |
| ID to addend | binary-w.109/proj=gf2_127,h2c=ti,mode=batch,n=1024 | gf2_109-w | batch | 65.0 ns | 64.8 ns .. 65.2 ns | per elem |
| ID to addend | binary-w.109/proj=none,h2c=pornin-addend,mode=batch,n=1024 | gf2_109-w | batch | 105 ns | 105 ns .. 105 ns | per elem |
| ID to addend | binary-w.109/proj=none,h2c=ti,mode=batch,n=1024 | gf2_109-w | batch | 124 ns | 124 ns .. 125 ns | per elem |
| ID to addend | binary.122/proj=fp127,h2c=pornin,mode=batch,n=1024 | gf2_122 | batch | 56.1 ns | 55.9 ns .. 56.3 ns | per elem |
| ID to addend | binary.122/proj=fp127,h2c=ti,mode=batch,n=1024 | gf2_122 | batch | 69.9 ns | 69.7 ns .. 70.1 ns | per elem |
| ID to addend | binary.122/proj=fp130,h2c=pornin,mode=batch,n=1024 | gf2_122 | batch | 62.2 ns | 62.0 ns .. 62.4 ns | per elem |
| ID to addend | binary.122/proj=fp130,h2c=ti,mode=batch,n=1024 | gf2_122 | batch | 95.5 ns | 95.2 ns .. 95.8 ns | per elem |
| ID to addend | binary.122/proj=gf2_127,h2c=pornin,mode=batch,n=1024 | gf2_122 | batch | 53.4 ns | 53.2 ns .. 53.6 ns | per elem |
| ID to addend | binary.122/proj=gf2_127,h2c=ti,mode=batch,n=1024 | gf2_122 | batch | 63.4 ns | 63.2 ns .. 63.5 ns | per elem |
| ID to addend | binary.122/proj=none,h2c=pornin,mode=batch,n=1024 | gf2_122 | batch | 103 ns | 102 ns .. 103 ns | per elem |
| ID to addend | binary.122/proj=none,h2c=ti,mode=batch,n=1024 | gf2_122 | batch | 126 ns | 125 ns .. 127 ns | per elem |
| ID to addend | binary.122-gls/proj=fp127,h2c=pornin,mode=batch,n=1024 | gf2_122-gls | batch | 54.7 ns | 54.6 ns .. 54.8 ns | per elem |
| ID to addend | binary.122-gls/proj=fp127,h2c=ti,mode=batch,n=1024 | gf2_122-gls | batch | 67.3 ns | 67.2 ns .. 67.4 ns | per elem |
| ID to addend | binary.122-gls/proj=fp130,h2c=pornin,mode=batch,n=1024 | gf2_122-gls | batch | 60.7 ns | 60.5 ns .. 60.9 ns | per elem |
| ID to addend | binary.122-gls/proj=fp130,h2c=ti,mode=batch,n=1024 | gf2_122-gls | batch | 92.7 ns | 92.5 ns .. 92.8 ns | per elem |
| ID to addend | binary.122-gls/proj=gf2_127,h2c=pornin,mode=batch,n=1024 | gf2_122-gls | batch | 51.7 ns | 51.5 ns .. 51.9 ns | per elem |
| ID to addend | binary.122-gls/proj=gf2_127,h2c=ti,mode=batch,n=1024 | gf2_122-gls | batch | 62.7 ns | 62.6 ns .. 62.9 ns | per elem |
| ID to addend | binary.122-gls/proj=none,h2c=pornin,mode=batch,n=1024 | gf2_122-gls | batch | 100 ns | 100 ns .. 100 ns | per elem |
| ID to addend | binary.122-gls/proj=none,h2c=ti,mode=batch,n=1024 | gf2_122-gls | batch | 120 ns | 120 ns .. 121 ns | per elem |
| ID to addend | binary-lambda.122-gls/proj=fp127,h2c=pornin-addend,mode=batch,n=1024 | gf2_122-gls-lambda | batch | 48.8 ns | 48.6 ns .. 48.9 ns | per elem |
| ID to addend | binary-lambda.122-gls/proj=fp127,h2c=ti,mode=batch,n=1024 | gf2_122-gls-lambda | batch | 69.5 ns | 69.5 ns .. 69.6 ns | per elem |
| ID to addend | binary-lambda.122-gls/proj=fp127,h2c=ti-addend,mode=batch,n=1024 | gf2_122-gls-lambda | batch | 60.5 ns | 60.4 ns .. 60.6 ns | per elem |
| ID to addend | binary-lambda.122-gls/proj=fp130,h2c=pornin-addend,mode=batch,n=1024 | gf2_122-gls-lambda | batch | 55.4 ns | 55.2 ns .. 55.5 ns | per elem |
| ID to addend | binary-lambda.122-gls/proj=fp130,h2c=ti,mode=batch,n=1024 | gf2_122-gls-lambda | batch | 97.3 ns | 97.1 ns .. 97.5 ns | per elem |
| ID to addend | binary-lambda.122-gls/proj=fp130,h2c=ti-addend,mode=batch,n=1024 | gf2_122-gls-lambda | batch | 88.7 ns | 88.5 ns .. 89.0 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 | 46.1 ns | 46.0 ns .. 46.2 ns | per elem |
| ID to addend | binary-lambda.122-gls/proj=gf2_127,h2c=ti,mode=batch,n=1024 | gf2_122-gls-lambda | batch | 64.6 ns | 64.5 ns .. 64.7 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 | 55.5 ns | 55.4 ns .. 55.6 ns | per elem |
| ID to addend | binary-lambda.122-gls/proj=none,h2c=pornin-addend,mode=batch,n=1024 | gf2_122-gls-lambda | batch | 95.2 ns | 95.0 ns .. 95.4 ns | per elem |
| ID to addend | binary-lambda.122-gls/proj=none,h2c=ti,mode=batch,n=1024 | gf2_122-gls-lambda | batch | 124 ns | 123 ns .. 124 ns | per elem |
| ID to addend | binary-lambda.122-gls/proj=none,h2c=ti-addend,mode=batch,n=1024 | gf2_122-gls-lambda | batch | 114 ns | 114 ns .. 114 ns | per elem |
| ID to addend | binary-u.122-gls/proj=fp127,h2c=pornin-addend,mode=batch,n=1024 | gf2_122-gls-u | batch | 53.6 ns | 53.4 ns .. 53.8 ns | per elem |
| ID to addend | binary-u.122-gls/proj=fp127,h2c=ti,mode=batch,n=1024 | gf2_122-gls-u | batch | 65.6 ns | 65.4 ns .. 65.7 ns | per elem |
| ID to addend | binary-u.122-gls/proj=fp130,h2c=pornin-addend,mode=batch,n=1024 | gf2_122-gls-u | batch | 59.2 ns | 59.0 ns .. 59.3 ns | per elem |
| ID to addend | binary-u.122-gls/proj=fp130,h2c=ti,mode=batch,n=1024 | gf2_122-gls-u | batch | 94.3 ns | 94.1 ns .. 94.6 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 | 50.1 ns | 50.0 ns .. 50.2 ns | per elem |
| ID to addend | binary-u.122-gls/proj=gf2_127,h2c=ti,mode=batch,n=1024 | gf2_122-gls-u | batch | 61.9 ns | 61.8 ns .. 62.0 ns | per elem |
| ID to addend | binary-u.122-gls/proj=none,h2c=pornin-addend,mode=batch,n=1024 | gf2_122-gls-u | batch | 99.5 ns | 99.2 ns .. 99.8 ns | per elem |
| ID to addend | binary-u.122-gls/proj=none,h2c=ti,mode=batch,n=1024 | gf2_122-gls-u | batch | 123 ns | 123 ns .. 124 ns | per elem |
| ID to addend | binary-w.122-gls/proj=fp127,h2c=pornin-addend,mode=batch,n=1024 | gf2_122-gls-w | batch | 50.0 ns | 49.8 ns .. 50.1 ns | per elem |
| ID to addend | binary-w.122-gls/proj=fp127,h2c=ti,mode=batch,n=1024 | gf2_122-gls-w | batch | 61.4 ns | 61.2 ns .. 61.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 | 55.3 ns | 55.2 ns .. 55.4 ns | per elem |
| ID to addend | binary-w.122-gls/proj=fp130,h2c=ti,mode=batch,n=1024 | gf2_122-gls-w | batch | 87.5 ns | 87.3 ns .. 87.8 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 | 46.4 ns | 46.3 ns .. 46.5 ns | per elem |
| ID to addend | binary-w.122-gls/proj=gf2_127,h2c=ti,mode=batch,n=1024 | gf2_122-gls-w | batch | 58.1 ns | 57.9 ns .. 58.2 ns | per elem |
| ID to addend | binary-w.122-gls/proj=none,h2c=pornin-addend,mode=batch,n=1024 | gf2_122-gls-w | batch | 95.1 ns | 94.9 ns .. 95.3 ns | per elem |
| ID to addend | binary-w.122-gls/proj=none,h2c=ti,mode=batch,n=1024 | gf2_122-gls-w | batch | 116 ns | 116 ns .. 117 ns | per elem |
| ID to addend | binary-lambda.122/proj=fp127,h2c=pornin-addend,mode=batch,n=1024 | gf2_122-lambda | batch | 49.8 ns | 49.6 ns .. 50.0 ns | per elem |
| ID to addend | binary-lambda.122/proj=fp127,h2c=ti,mode=batch,n=1024 | gf2_122-lambda | batch | 72.1 ns | 71.9 ns .. 72.4 ns | per elem |
| ID to addend | binary-lambda.122/proj=fp127,h2c=ti-addend,mode=batch,n=1024 | gf2_122-lambda | batch | 63.0 ns | 62.8 ns .. 63.3 ns | per elem |
| ID to addend | binary-lambda.122/proj=fp130,h2c=pornin-addend,mode=batch,n=1024 | gf2_122-lambda | batch | 55.8 ns | 55.6 ns .. 55.9 ns | per elem |
| ID to addend | binary-lambda.122/proj=fp130,h2c=ti,mode=batch,n=1024 | gf2_122-lambda | batch | 97.5 ns | 97.2 ns .. 97.8 ns | per elem |
| ID to addend | binary-lambda.122/proj=fp130,h2c=ti-addend,mode=batch,n=1024 | gf2_122-lambda | batch | 88.0 ns | 87.7 ns .. 88.3 ns | per elem |
| ID to addend | binary-lambda.122/proj=gf2_127,h2c=pornin-addend,mode=batch,n=1024 | gf2_122-lambda | batch | 46.4 ns | 46.2 ns .. 46.5 ns | per elem |
| ID to addend | binary-lambda.122/proj=gf2_127,h2c=ti,mode=batch,n=1024 | gf2_122-lambda | batch | 64.5 ns | 64.3 ns .. 64.8 ns | per elem |
| ID to addend | binary-lambda.122/proj=gf2_127,h2c=ti-addend,mode=batch,n=1024 | gf2_122-lambda | batch | 55.1 ns | 55.0 ns .. 55.3 ns | per elem |
| ID to addend | binary-lambda.122/proj=none,h2c=pornin-addend,mode=batch,n=1024 | gf2_122-lambda | batch | 95.8 ns | 95.6 ns .. 96.1 ns | per elem |
| ID to addend | binary-lambda.122/proj=none,h2c=ti,mode=batch,n=1024 | gf2_122-lambda | batch | 126 ns | 126 ns .. 127 ns | per elem |
| ID to addend | binary-lambda.122/proj=none,h2c=ti-addend,mode=batch,n=1024 | gf2_122-lambda | batch | 118 ns | 117 ns .. 118 ns | per elem |
| ID to addend | binary-u.122/proj=fp127,h2c=pornin-addend,mode=batch,n=1024 | gf2_122-u | batch | 53.8 ns | 53.7 ns .. 54.0 ns | per elem |
| ID to addend | binary-u.122/proj=fp127,h2c=ti,mode=batch,n=1024 | gf2_122-u | batch | 68.6 ns | 68.5 ns .. 68.8 ns | per elem |
| ID to addend | binary-u.122/proj=fp130,h2c=pornin-addend,mode=batch,n=1024 | gf2_122-u | batch | 60.1 ns | 59.9 ns .. 60.3 ns | per elem |
| ID to addend | binary-u.122/proj=fp130,h2c=ti,mode=batch,n=1024 | gf2_122-u | batch | 97.8 ns | 97.5 ns .. 98.1 ns | per elem |
| ID to addend | binary-u.122/proj=gf2_127,h2c=pornin-addend,mode=batch,n=1024 | gf2_122-u | batch | 50.3 ns | 50.2 ns .. 50.4 ns | per elem |
| ID to addend | binary-u.122/proj=gf2_127,h2c=ti,mode=batch,n=1024 | gf2_122-u | batch | 63.9 ns | 63.7 ns .. 64.1 ns | per elem |
| ID to addend | binary-u.122/proj=none,h2c=pornin-addend,mode=batch,n=1024 | gf2_122-u | batch | 100 ns | 100.0 ns .. 101 ns | per elem |
| ID to addend | binary-u.122/proj=none,h2c=ti,mode=batch,n=1024 | gf2_122-u | batch | 123 ns | 123 ns .. 123 ns | per elem |
| ID to addend | binary-w.122/proj=fp127,h2c=pornin-addend,mode=batch,n=1024 | gf2_122-w | batch | 49.4 ns | 49.2 ns .. 49.5 ns | per elem |
| ID to addend | binary-w.122/proj=fp127,h2c=ti,mode=batch,n=1024 | gf2_122-w | batch | 63.1 ns | 63.0 ns .. 63.3 ns | per elem |
| ID to addend | binary-w.122/proj=fp130,h2c=pornin-addend,mode=batch,n=1024 | gf2_122-w | batch | 55.7 ns | 55.5 ns .. 55.8 ns | per elem |
| ID to addend | binary-w.122/proj=fp130,h2c=ti,mode=batch,n=1024 | gf2_122-w | batch | 90.8 ns | 90.6 ns .. 90.9 ns | per elem |
| ID to addend | binary-w.122/proj=gf2_127,h2c=pornin-addend,mode=batch,n=1024 | gf2_122-w | batch | 46.6 ns | 46.5 ns .. 46.8 ns | per elem |
| ID to addend | binary-w.122/proj=gf2_127,h2c=ti,mode=batch,n=1024 | gf2_122-w | batch | 58.5 ns | 58.3 ns .. 58.7 ns | per elem |
| ID to addend | binary-w.122/proj=none,h2c=pornin-addend,mode=batch,n=1024 | gf2_122-w | batch | 95.3 ns | 95.1 ns .. 95.5 ns | per elem |
| ID to addend | binary-w.122/proj=none,h2c=ti,mode=batch,n=1024 | gf2_122-w | batch | 116 ns | 116 ns .. 117 ns | per elem |
| ID to addend | binary.127/proj=fp127,h2c=pornin,mode=batch,n=1024 | gf2_127 | batch | 54.6 ns | 54.5 ns .. 54.7 ns | per elem |
| ID to addend | binary.127/proj=fp127,h2c=ti,mode=batch,n=1024 | gf2_127 | batch | 64.8 ns | 64.6 ns .. 64.9 ns | per elem |
| ID to addend | binary.127/proj=fp130,h2c=pornin,mode=batch,n=1024 | gf2_127 | batch | 60.7 ns | 60.6 ns .. 60.8 ns | per elem |
| ID to addend | binary.127/proj=fp130,h2c=ti,mode=batch,n=1024 | gf2_127 | batch | 92.5 ns | 92.3 ns .. 92.8 ns | per elem |
| ID to addend | binary.127/proj=gf2_127,h2c=pornin,mode=batch,n=1024 | gf2_127 | batch | 51.6 ns | 51.6 ns .. 51.7 ns | per elem |
| ID to addend | binary.127/proj=gf2_127,h2c=ti,mode=batch,n=1024 | gf2_127 | batch | 60.9 ns | 60.8 ns .. 61.1 ns | per elem |
| ID to addend | binary.127/proj=none,h2c=pornin,mode=batch,n=1024 | gf2_127 | batch | 101 ns | 101 ns .. 101 ns | per elem |
| ID to addend | binary.127/proj=none,h2c=ti,mode=batch,n=1024 | gf2_127 | batch | 118 ns | 118 ns .. 118 ns | per elem |
| ID to addend | binary-lambda.127/proj=fp127,h2c=pornin-addend,mode=batch,n=1024 | gf2_127-lambda | batch | 46.6 ns | 46.6 ns .. 46.7 ns | per elem |
| ID to addend | binary-lambda.127/proj=fp127,h2c=ti,mode=batch,n=1024 | gf2_127-lambda | batch | 67.2 ns | 66.9 ns .. 67.7 ns | per elem |
| ID to addend | binary-lambda.127/proj=fp127,h2c=ti-addend,mode=batch,n=1024 | gf2_127-lambda | batch | 59.0 ns | 58.9 ns .. 59.1 ns | per elem |
| ID to addend | binary-lambda.127/proj=fp130,h2c=pornin-addend,mode=batch,n=1024 | gf2_127-lambda | batch | 53.5 ns | 53.3 ns .. 53.6 ns | per elem |
| ID to addend | binary-lambda.127/proj=fp130,h2c=ti,mode=batch,n=1024 | gf2_127-lambda | batch | 96.9 ns | 96.7 ns .. 97.1 ns | per elem |
| ID to addend | binary-lambda.127/proj=fp130,h2c=ti-addend,mode=batch,n=1024 | gf2_127-lambda | batch | 88.3 ns | 88.1 ns .. 88.4 ns | per elem |
| ID to addend | binary-lambda.127/proj=gf2_127,h2c=pornin-addend,mode=batch,n=1024 | gf2_127-lambda | batch | 43.9 ns | 43.8 ns .. 43.9 ns | per elem |
| ID to addend | binary-lambda.127/proj=gf2_127,h2c=ti,mode=batch,n=1024 | gf2_127-lambda | batch | 63.2 ns | 63.0 ns .. 63.3 ns | per elem |
| ID to addend | binary-lambda.127/proj=gf2_127,h2c=ti-addend,mode=batch,n=1024 | gf2_127-lambda | batch | 55.2 ns | 55.0 ns .. 55.3 ns | per elem |
| ID to addend | binary-lambda.127/proj=none,h2c=pornin-addend,mode=batch,n=1024 | gf2_127-lambda | batch | 93.0 ns | 92.8 ns .. 93.3 ns | per elem |
| ID to addend | binary-lambda.127/proj=none,h2c=ti,mode=batch,n=1024 | gf2_127-lambda | batch | 120 ns | 119 ns .. 120 ns | per elem |
| ID to addend | binary-lambda.127/proj=none,h2c=ti-addend,mode=batch,n=1024 | gf2_127-lambda | batch | 111 ns | 111 ns .. 112 ns | per elem |
| ID to addend | binary-u.127/proj=fp127,h2c=pornin-addend,mode=batch,n=1024 | gf2_127-u | batch | 52.5 ns | 52.4 ns .. 52.7 ns | per elem |
| ID to addend | binary-u.127/proj=fp127,h2c=ti,mode=batch,n=1024 | gf2_127-u | batch | 63.9 ns | 63.7 ns .. 64.1 ns | per elem |
| ID to addend | binary-u.127/proj=fp130,h2c=pornin-addend,mode=batch,n=1024 | gf2_127-u | batch | 58.3 ns | 58.1 ns .. 58.5 ns | per elem |
| ID to addend | binary-u.127/proj=fp130,h2c=ti,mode=batch,n=1024 | gf2_127-u | batch | 91.1 ns | 90.8 ns .. 91.5 ns | per elem |
| ID to addend | binary-u.127/proj=gf2_127,h2c=pornin-addend,mode=batch,n=1024 | gf2_127-u | batch | 49.2 ns | 49.1 ns .. 49.3 ns | per elem |
| ID to addend | binary-u.127/proj=gf2_127,h2c=ti,mode=batch,n=1024 | gf2_127-u | batch | 59.0 ns | 58.9 ns .. 59.2 ns | per elem |
| ID to addend | binary-u.127/proj=none,h2c=pornin-addend,mode=batch,n=1024 | gf2_127-u | batch | 98.7 ns | 98.4 ns .. 99.1 ns | per elem |
| ID to addend | binary-u.127/proj=none,h2c=ti,mode=batch,n=1024 | gf2_127-u | batch | 120 ns | 119 ns .. 120 ns | per elem |
| ID to addend | binary-w.127/proj=fp127,h2c=pornin-addend,mode=batch,n=1024 | gf2_127-w | batch | 49.5 ns | 49.4 ns .. 49.6 ns | per elem |
| ID to addend | binary-w.127/proj=fp127,h2c=ti,mode=batch,n=1024 | gf2_127-w | batch | 60.6 ns | 60.4 ns .. 60.9 ns | per elem |
| ID to addend | binary-w.127/proj=fp130,h2c=pornin-addend,mode=batch,n=1024 | gf2_127-w | batch | 53.4 ns | 53.3 ns .. 53.6 ns | per elem |
| ID to addend | binary-w.127/proj=fp130,h2c=ti,mode=batch,n=1024 | gf2_127-w | batch | 84.9 ns | 84.7 ns .. 85.2 ns | per elem |
| ID to addend | binary-w.127/proj=gf2_127,h2c=pornin-addend,mode=batch,n=1024 | gf2_127-w | batch | 45.8 ns | 45.7 ns .. 45.9 ns | per elem |
| ID to addend | binary-w.127/proj=gf2_127,h2c=ti,mode=batch,n=1024 | gf2_127-w | batch | 55.7 ns | 55.5 ns .. 55.8 ns | per elem |
| ID to addend | binary-w.127/proj=none,h2c=pornin-addend,mode=batch,n=1024 | gf2_127-w | batch | 93.0 ns | 92.8 ns .. 93.2 ns | per elem |
| ID to addend | binary-w.127/proj=none,h2c=ti,mode=batch,n=1024 | gf2_127-w | batch | 112 ns | 112 ns .. 113 ns | per elem |
| ID to addend | twisted.61x2/proj=fp127,h2c=elligator2,mode=batch,n=1024 | twisted61x2 | batch | 947 ns | 942 ns .. 953 ns | per elem |
| ID to addend | twisted.61x2/proj=fp127,h2c=ti,mode=batch,n=1024 | twisted61x2 | batch | 662 ns | 661 ns .. 663 ns | per elem |
| ID to addend | twisted.61x2/proj=fp130,h2c=elligator2,mode=batch,n=1024 | twisted61x2 | batch | 942 ns | 941 ns .. 943 ns | per elem |
| ID to addend | twisted.61x2/proj=fp130,h2c=ti,mode=batch,n=1024 | twisted61x2 | batch | 677 ns | 676 ns .. 678 ns | per elem |
| ID to addend | twisted.61x2/proj=gf2_127,h2c=elligator2,mode=batch,n=1024 | twisted61x2 | batch | 936 ns | 934 ns .. 937 ns | per elem |
| ID to addend | twisted.61x2/proj=gf2_127,h2c=ti,mode=batch,n=1024 | twisted61x2 | batch | 658 ns | 657 ns .. 659 ns | per elem |
| ID to addend | twisted.61x2/proj=none,h2c=elligator2,mode=batch,n=1024 | twisted61x2 | batch | 996 ns | 994 ns .. 998 ns | per elem |
| ID to addend | twisted.61x2/proj=none,h2c=ti,mode=batch,n=1024 | twisted61x2 | batch | 696 ns | 695 ns .. 697 ns | per elem |
| hash to addend | gf2_109-lambda/try-and-increment to (x, λ) | gf2_109-lambda | per-element | 1.17 µs | 1.16 µs .. 1.17 µs | per elem |
| hash to addend | gf2_109-lambda/try-and-increment to (x, λ), batched | gf2_109-lambda | batch | 131 ns | 130 ns .. 132 ns | per elem |
| hash to addend | gf2_122-gls-lambda/try-and-increment to (x, λ) | gf2_122-gls-lambda | per-element | 679 ns | 678 ns .. 681 ns | per elem |
| hash to addend | gf2_122-gls-lambda/try-and-increment to (x, λ), batched | gf2_122-gls-lambda | batch | 121 ns | 120 ns .. 122 ns | per elem |
| hash to addend | gf2_122-lambda/try-and-increment to (x, λ) | gf2_122-lambda | per-element | 672 ns | 669 ns .. 674 ns | per elem |
| hash to addend | gf2_122-lambda/try-and-increment to (x, λ), batched | gf2_122-lambda | batch | 119 ns | 118 ns .. 120 ns | per elem |
| hash to addend | gf2_127-lambda/try-and-increment to (x, λ) | gf2_127-lambda | per-element | 369 ns | 368 ns .. 371 ns | per elem |
| hash to addend | gf2_127-lambda/try-and-increment to (x, λ), batched | gf2_127-lambda | batch | 111 ns | 111 ns .. 112 ns | per elem |
| steps: digest | digest/sha512 (ristretto input) | ristretto255 | per-element | 175 ns | 175 ns .. 176 ns | per elem |
| steps: ristretto255 | ristretto255/from_uniform_bytes (2 maps + add) | ristretto255 | per-element | 5.83 µs | 5.82 µs .. 5.85 µs | per elem |
| x on curve | ristretto255/decompress (valid, inv sqrt) | ristretto255 | per-element | 2.93 µs | 2.92 µs .. 2.94 µs | per elem |
| x on curve | secp256k1/x: parse compressed (sqrt) | secp256k1 | per-element | 3.10 µs | 3.09 µs .. 3.11 µ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 | 655 ns | 653 ns .. 657 ns | per elem |
| one map to addend | gf2_109-lambda/pornin map x1 to (x, λ), batched | gf2_109-lambda | batch | 105 ns | 104 ns .. 105 ns | per elem |
| one map to addend | gf2_109-u/pornin map x1 to (u, v) | gf2_109-u | per-element | 657 ns | 656 ns .. 659 ns | per elem |
| one map to addend | gf2_109-u/pornin map x1 to (u, v), batched | gf2_109-u | batch | 110 ns | 109 ns .. 110 ns | per elem |
| one map to addend | gf2_109-w/pornin map x1 to (x, λ) | gf2_109-w | per-element | 652 ns | 650 ns .. 653 ns | per elem |
| one map to addend | gf2_109-w/pornin map x1 to (x, λ), batched | gf2_109-w | batch | 104 ns | 104 ns .. 104 ns | per elem |
| one map to addend | gf2_122-gls-lambda/pornin map x1 to (x, λ) | gf2_122-gls-lambda | per-element | 385 ns | 384 ns .. 386 ns | per elem |
| one map to addend | gf2_122-gls-lambda/pornin map x1 to (x, λ), batched | gf2_122-gls-lambda | batch | 95.0 ns | 94.7 ns .. 95.4 ns | per elem |
| one map to addend | gf2_122-gls-u/pornin map x1 to (u, v) | gf2_122-gls-u | per-element | 390 ns | 389 ns .. 390 ns | per elem |
| one map to addend | gf2_122-gls-u/pornin map x1 to (u, v), batched | gf2_122-gls-u | batch | 97.6 ns | 97.4 ns .. 97.8 ns | per elem |
| one map to addend | gf2_122-gls-w/pornin map x1 to (x, λ) | gf2_122-gls-w | per-element | 385 ns | 384 ns .. 386 ns | per elem |
| one map to addend | gf2_122-gls-w/pornin map x1 to (x, λ), batched | gf2_122-gls-w | batch | 94.6 ns | 94.4 ns .. 94.9 ns | per elem |
| one map to addend | gf2_122-lambda/pornin map x1 to (x, λ) | gf2_122-lambda | per-element | 381 ns | 380 ns .. 382 ns | per elem |
| one map to addend | gf2_122-lambda/pornin map x1 to (x, λ), batched | gf2_122-lambda | batch | 95.0 ns | 94.7 ns .. 95.2 ns | per elem |
| one map to addend | gf2_122-u/pornin map x1 to (u, v) | gf2_122-u | per-element | 391 ns | 390 ns .. 392 ns | per elem |
| one map to addend | gf2_122-u/pornin map x1 to (u, v), batched | gf2_122-u | batch | 99.3 ns | 99.0 ns .. 99.5 ns | per elem |
| one map to addend | gf2_122-w/pornin map x1 to (x, λ) | gf2_122-w | per-element | 381 ns | 380 ns .. 382 ns | per elem |
| one map to addend | gf2_122-w/pornin map x1 to (x, λ), batched | gf2_122-w | batch | 95.2 ns | 95.0 ns .. 95.5 ns | per elem |
| one map to addend | gf2_127-lambda/pornin map x1 to (x, λ) | gf2_127-lambda | per-element | 245 ns | 244 ns .. 246 ns | per elem |
| one map to addend | gf2_127-lambda/pornin map x1 to (x, λ), batched | gf2_127-lambda | batch | 92.7 ns | 92.4 ns .. 93.0 ns | per elem |
| one map to addend | gf2_127-u/pornin map x1 to (u, v) | gf2_127-u | per-element | 249 ns | 248 ns .. 250 ns | per elem |
| one map to addend | gf2_127-u/pornin map x1 to (u, v), batched | gf2_127-u | batch | 98.0 ns | 97.4 ns .. 98.6 ns | per elem |
| one map to addend | gf2_127-w/pornin map x1 to (x, λ) | gf2_127-w | per-element | 244 ns | 243 ns .. 245 ns | per elem |
| one map to addend | gf2_127-w/pornin map x1 to (x, λ), batched | gf2_127-w | batch | 92.8 ns | 92.4 ns .. 93.2 ns | per elem |
| two maps summed | gf2_127/pornin map x2 | gf2_127 | per-element | 452 ns | 451 ns .. 453 ns | per elem |
| one map | gf2_109/pornin map x1 | gf2_109 | per-element | 675 ns | 673 ns .. 677 ns | per elem |
| one map | gf2_109/pornin map x1, batched | gf2_109 | batch | 114 ns | 113 ns .. 114 ns | per elem |
| one map | gf2_122/pornin map x1 | gf2_122 | per-element | 392 ns | 391 ns .. 393 ns | per elem |
| one map | gf2_122/pornin map x1, batched | gf2_122 | batch | 103 ns | 102 ns .. 103 ns | per elem |
| one map | gf2_122-gls/pornin map x1 | gf2_122-gls | per-element | 394 ns | 393 ns .. 395 ns | per elem |
| one map | gf2_122-gls/pornin map x1, batched | gf2_122-gls | batch | 101 ns | 101 ns .. 102 ns | per elem |
| one map | gf2_127/pornin map x1 | gf2_127 | per-element | 256 ns | 254 ns .. 258 ns | per elem |
| one map | gf2_127/pornin map x1, batched | gf2_127 | batch | 103 ns | 102 ns .. 103 ns | per elem |
| one map | edwards107/elligator2 x1 | edwards107 | per-element | 1.28 µs | 1.27 µs .. 1.29 µs | per elem |
| one map | edwards127/elligator2 x1 | edwards127 | per-element | 1.51 µs | 1.50 µs .. 1.51 µs | per elem |
| one map | edwards61x2/elligator2 x1 | edwards61x2 | per-element | 792 ns | 790 ns .. 794 ns | per elem |
| one map | twisted-goldilocks2/elligator2 x1 | twisted-goldilocks2 | per-element | 2.75 µs | 2.75 µs .. 2.76 µ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 | 981 ns | 979 ns .. 984 ns | per elem |
| one map | twisted64x2/elligator2 x1 | twisted64x2 | per-element | 1.38 µs | 1.38 µs .. 1.38 µs | per elem |
| one map | weier107/sswu x1 | weier107 | per-element | 1.26 µs | 1.26 µs .. 1.26 µs | per elem |
| one map | weier127/sswu x1 | weier127 | per-element | 1.29 µs | 1.29 µs .. 1.29 µs | per elem |
| one map | weier61x2/sswu x1 | weier61x2 | per-element | 812 ns | 809 ns .. 816 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
620 benchmarks
| operation | benchmark | family | mode | time | 95% CI | unit |
|---|---|---|---|---|---|---|
| encode (hash + cells) | xor-sha256.64/m=12150,n=3500 | xor | per-element | 255 ns | 254 ns .. 256 ns | per elem |
| encode (hash + cells) | xor-sha256.64/m=1350,n=3500 | xor | per-element | 218 ns | 218 ns .. 218 ns | per elem |
| encode (hash + cells) | xor-sha256.64/m=150,n=3500 | xor | per-element | 188 ns | 188 ns .. 188 ns | per elem |
| encode (hash + cells) | xor-sha256.64/m=20,n=3500 | xor | per-element | 161 ns | 161 ns .. 162 ns | per elem |
| encode (hash + cells) | xor-sha256.64/m=5,n=3500 | xor | per-element | 144 ns | 143 ns .. 144 ns | per elem |
| encode (hash + cells) | xor-siphash.64/m=12150,n=3500 | xor-siphash | per-element | 219 ns | 219 ns .. 219 ns | per elem |
| encode (hash + cells) | xor-siphash.64/m=12150,n=3500,map=mcg64 | xor-siphash | per-element | 218 ns | 217 ns .. 218 ns | per elem |
| encode (hash + cells) | xor-siphash.64/m=1350,n=3500 | xor-siphash | per-element | 183 ns | 183 ns .. 183 ns | per elem |
| encode (hash + cells) | xor-siphash.64/m=1350,n=3500,map=mcg64 | xor-siphash | per-element | 182 ns | 182 ns .. 182 ns | per elem |
| encode (hash + cells) | xor-siphash.64/m=150,n=3500 | xor-siphash | per-element | 152 ns | 152 ns .. 153 ns | per elem |
| encode (hash + cells) | xor-siphash.64/m=150,n=3500,map=mcg64 | xor-siphash | per-element | 151 ns | 151 ns .. 151 ns | per elem |
| encode (hash + cells) | xor-siphash.64/m=20,n=3500 | xor-siphash | per-element | 124 ns | 124 ns .. 125 ns | per elem |
| encode (hash + cells) | xor-siphash.64/m=20,n=3500,map=mcg64 | xor-siphash | per-element | 123 ns | 123 ns .. 123 ns | per elem |
| encode (hash + cells) | xor-siphash.64/m=5,n=3500 | xor-siphash | per-element | 107 ns | 107 ns .. 108 ns | per elem |
| encode (hash + cells) | xor-siphash.64/m=5,n=3500,map=mcg64 | xor-siphash | per-element | 105 ns | 104 ns .. 106 ns | per elem |
| encode (hash + cells) | binary.109/m=12150,n=3500,h2c=pornin | gf2_109 | per-element | 643 ns | 642 ns .. 644 ns | per elem |
| encode (hash + cells) | binary.109/m=12150,n=3500,h2c=pornin,proj=gf2_127,mapproj=gf2_127 | gf2_109 | per-element | 553 ns | 552 ns .. 554 ns | per elem |
| encode (hash + cells) | binary.109/m=1350,n=3500,h2c=pornin | gf2_109 | per-element | 513 ns | 512 ns .. 514 ns | per elem |
| encode (hash + cells) | binary.109/m=1350,n=3500,h2c=pornin,proj=gf2_127,mapproj=gf2_127 | gf2_109 | per-element | 418 ns | 418 ns .. 419 ns | per elem |
| encode (hash + cells) | binary.109/m=5,n=3500,h2c=pornin | gf2_109 | per-element | 266 ns | 264 ns .. 267 ns | per elem |
| encode (hash + cells) | binary.109/m=5,n=3500,h2c=pornin,proj=gf2_127,mapproj=gf2_127 | gf2_109 | per-element | 170 ns | 170 ns .. 171 ns | per elem |
| encode (hash + cells) | binary-lambda.109/m=12150,n=3500,h2c=pornin-addend | gf2_109-lambda | per-element | 597 ns | 596 ns .. 598 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 | 500 ns | 497 ns .. 503 ns | per elem |
| encode (hash + cells) | binary-lambda.109/m=1350,n=3500,h2c=pornin-addend | gf2_109-lambda | per-element | 488 ns | 487 ns .. 489 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 | 395 ns | 394 ns .. 395 ns | per elem |
| encode (hash + cells) | binary-lambda.109/m=5,n=3500,h2c=pornin-addend | gf2_109-lambda | per-element | 247 ns | 246 ns .. 247 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 | 151 ns | 151 ns .. 151 ns | per elem |
| encode (hash + cells) | binary-u.109/m=12150,n=3500,h2c=pornin-addend | gf2_109-u | per-element | 531 ns | 531 ns .. 532 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 | 437 ns | 436 ns .. 438 ns | per elem |
| encode (hash + cells) | binary-u.109/m=1350,n=3500,h2c=pornin-addend | gf2_109-u | per-element | 422 ns | 422 ns .. 423 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 | 331 ns | 330 ns .. 331 ns | per elem |
| encode (hash + cells) | binary-u.109/m=150,n=3500,h2c=pornin-addend | gf2_109-u | per-element | 344 ns | 344 ns .. 345 ns | per elem |
| encode (hash + cells) | binary-u.109/m=20,n=3500,h2c=pornin-addend | gf2_109-u | per-element | 278 ns | 278 ns .. 279 ns | per elem |
| encode (hash + cells) | binary-u.109/m=5,n=3500,h2c=pornin-addend | gf2_109-u | per-element | 240 ns | 239 ns .. 240 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 | 148 ns | 147 ns .. 148 ns | per elem |
| encode (hash + cells) | binary-w.109/m=12150,n=3500,h2c=pornin-addend | gf2_109-w | per-element | 596 ns | 596 ns .. 597 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 | 500 ns | 500 ns .. 501 ns | per elem |
| encode (hash + cells) | binary-w.109/m=1350,n=3500,h2c=pornin-addend | gf2_109-w | per-element | 490 ns | 489 ns .. 491 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 | 397 ns | 396 ns .. 397 ns | per elem |
| encode (hash + cells) | binary-w.109/m=5,n=3500,h2c=pornin-addend | gf2_109-w | per-element | 249 ns | 249 ns .. 249 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 | 154 ns | 154 ns .. 154 ns | per elem |
| encode (hash + cells) | binary.122/m=12150,n=3500,h2c=pornin | gf2_122 | per-element | 673 ns | 671 ns .. 674 ns | per elem |
| encode (hash + cells) | binary.122/m=12150,n=3500,h2c=pornin,proj=gf2_127,mapproj=gf2_127 | gf2_122 | per-element | 552 ns | 550 ns .. 553 ns | per elem |
| encode (hash + cells) | binary.122/m=1350,n=3500,h2c=pornin | gf2_122 | per-element | 537 ns | 536 ns .. 538 ns | per elem |
| encode (hash + cells) | binary.122/m=1350,n=3500,h2c=pornin,proj=gf2_127,mapproj=gf2_127 | gf2_122 | per-element | 435 ns | 435 ns .. 436 ns | per elem |
| encode (hash + cells) | binary.122/m=5,n=3500,h2c=pornin | gf2_122 | per-element | 271 ns | 270 ns .. 272 ns | per elem |
| encode (hash + cells) | binary.122/m=5,n=3500,h2c=pornin,proj=gf2_127,mapproj=gf2_127 | gf2_122 | per-element | 173 ns | 173 ns .. 173 ns | per elem |
| encode (hash + cells) | binary.122-gls/m=12150,n=3500,h2c=pornin | gf2_122-gls | per-element | 635 ns | 634 ns .. 636 ns | per elem |
| encode (hash + cells) | binary.122-gls/m=12150,n=3500,h2c=pornin,proj=gf2_127,mapproj=gf2_127 | gf2_122-gls | per-element | 534 ns | 533 ns .. 535 ns | per elem |
| encode (hash + cells) | binary.122-gls/m=1350,n=3500,h2c=pornin | gf2_122-gls | per-element | 509 ns | 508 ns .. 510 ns | per elem |
| encode (hash + cells) | binary.122-gls/m=1350,n=3500,h2c=pornin,proj=gf2_127,mapproj=gf2_127 | gf2_122-gls | per-element | 408 ns | 407 ns .. 409 ns | per elem |
| encode (hash + cells) | binary.122-gls/m=5,n=3500,h2c=pornin | gf2_122-gls | per-element | 259 ns | 257 ns .. 260 ns | per elem |
| encode (hash + cells) | binary.122-gls/m=5,n=3500,h2c=pornin,proj=gf2_127,mapproj=gf2_127 | gf2_122-gls | per-element | 162 ns | 162 ns .. 163 ns | per elem |
| encode (hash + cells) | binary-lambda.122-gls/m=12150,n=3500,h2c=pornin-addend | gf2_122-gls-lambda | per-element | 608 ns | 607 ns .. 610 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 | 502 ns | 501 ns .. 503 ns | per elem |
| encode (hash + cells) | binary-lambda.122-gls/m=1350,n=3500,h2c=pornin-addend | gf2_122-gls-lambda | per-element | 501 ns | 500 ns .. 502 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 | 400 ns | 399 ns .. 401 ns | per elem |
| encode (hash + cells) | binary-lambda.122-gls/m=5,n=3500,h2c=pornin-addend | gf2_122-gls-lambda | per-element | 250 ns | 249 ns .. 250 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 | 154 ns | 154 ns .. 155 ns | per elem |
| encode (hash + cells) | binary-u.122-gls/m=12150,n=3500,h2c=pornin-addend | gf2_122-gls-u | per-element | 544 ns | 542 ns .. 547 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 | 442 ns | 440 ns .. 444 ns | per elem |
| encode (hash + cells) | binary-u.122-gls/m=1350,n=3500,h2c=pornin-addend | gf2_122-gls-u | per-element | 432 ns | 431 ns .. 433 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 | 333 ns | 332 ns .. 334 ns | per elem |
| encode (hash + cells) | binary-u.122-gls/m=150,n=3500,h2c=pornin-addend | gf2_122-gls-u | per-element | 349 ns | 348 ns .. 350 ns | per elem |
| encode (hash + cells) | binary-u.122-gls/m=20,n=3500,h2c=pornin-addend | gf2_122-gls-u | per-element | 280 ns | 280 ns .. 280 ns | per elem |
| encode (hash + cells) | binary-u.122-gls/m=5,n=3500,h2c=pornin-addend | gf2_122-gls-u | per-element | 238 ns | 238 ns .. 239 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 | 140 ns | 140 ns .. 141 ns | per elem |
| encode (hash + cells) | binary-w.122-gls/m=12150,n=3500,h2c=pornin-addend | gf2_122-gls-w | per-element | 606 ns | 605 ns .. 606 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 | 510 ns | 508 ns .. 513 ns | per elem |
| encode (hash + cells) | binary-w.122-gls/m=1350,n=3500,h2c=pornin-addend | gf2_122-gls-w | per-element | 498 ns | 498 ns .. 499 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 | 402 ns | 401 ns .. 403 ns | per elem |
| encode (hash + cells) | binary-w.122-gls/m=5,n=3500,h2c=pornin-addend | gf2_122-gls-w | per-element | 250 ns | 250 ns .. 251 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 | 155 ns | 155 ns .. 155 ns | per elem |
| encode (hash + cells) | binary-lambda.122/m=12150,n=3500,h2c=pornin-addend | gf2_122-lambda | per-element | 613 ns | 612 ns .. 615 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 | 506 ns | 506 ns .. 507 ns | per elem |
| encode (hash + cells) | binary-lambda.122/m=1350,n=3500,h2c=pornin-addend | gf2_122-lambda | per-element | 505 ns | 503 ns .. 507 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 | 403 ns | 402 ns .. 403 ns | per elem |
| encode (hash + cells) | binary-lambda.122/m=5,n=3500,h2c=pornin-addend | gf2_122-lambda | per-element | 250 ns | 250 ns .. 251 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 | 155 ns | 155 ns .. 156 ns | per elem |
| encode (hash + cells) | binary-u.122/m=12150,n=3500,h2c=pornin-addend | gf2_122-u | per-element | 543 ns | 542 ns .. 544 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 | 440 ns | 439 ns .. 441 ns | per elem |
| encode (hash + cells) | binary-u.122/m=1350,n=3500,h2c=pornin-addend | gf2_122-u | per-element | 436 ns | 435 ns .. 437 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 | 332 ns | 331 ns .. 333 ns | per elem |
| encode (hash + cells) | binary-u.122/m=150,n=3500,h2c=pornin-addend | gf2_122-u | per-element | 354 ns | 353 ns .. 355 ns | per elem |
| encode (hash + cells) | binary-u.122/m=20,n=3500,h2c=pornin-addend | gf2_122-u | per-element | 282 ns | 282 ns .. 283 ns | per elem |
| encode (hash + cells) | binary-u.122/m=5,n=3500,h2c=pornin-addend | gf2_122-u | per-element | 239 ns | 238 ns .. 239 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 | 144 ns | 143 ns .. 144 ns | per elem |
| encode (hash + cells) | binary-w.122/m=12150,n=3500,h2c=pornin-addend | gf2_122-w | per-element | 616 ns | 615 ns .. 617 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 | 516 ns | 513 ns .. 518 ns | per elem |
| encode (hash + cells) | binary-w.122/m=1350,n=3500,h2c=pornin-addend | gf2_122-w | per-element | 504 ns | 503 ns .. 505 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 | 409 ns | 407 ns .. 410 ns | per elem |
| encode (hash + cells) | binary-w.122/m=5,n=3500,h2c=pornin-addend | gf2_122-w | per-element | 249 ns | 249 ns .. 250 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 | 157 ns | 156 ns .. 158 ns | per elem |
| encode (hash + cells) | binary.127/m=12150,n=3500,h2c=pornin | gf2_127 | per-element | 630 ns | 629 ns .. 631 ns | per elem |
| encode (hash + cells) | binary.127/m=12150,n=3500,h2c=pornin,map=mcg64 | gf2_127 | per-element | 635 ns | 634 ns .. 637 ns | per elem |
| encode (hash + cells) | binary.127/m=12150,n=3500,h2c=pornin,proj=gf2_127,mapproj=gf2_127 | gf2_127 | per-element | 541 ns | 541 ns .. 542 ns | per elem |
| encode (hash + cells) | binary.127/m=1350,n=3500,h2c=pornin | gf2_127 | per-element | 503 ns | 502 ns .. 505 ns | per elem |
| encode (hash + cells) | binary.127/m=1350,n=3500,h2c=pornin,map=mcg64 | gf2_127 | per-element | 502 ns | 502 ns .. 503 ns | per elem |
| encode (hash + cells) | binary.127/m=1350,n=3500,h2c=pornin,proj=gf2_127,mapproj=gf2_127 | gf2_127 | per-element | 412 ns | 411 ns .. 413 ns | per elem |
| encode (hash + cells) | binary.127/m=150,n=3500,h2c=pornin,map=mcg64 | gf2_127 | per-element | 394 ns | 393 ns .. 394 ns | per elem |
| encode (hash + cells) | binary.127/m=20,n=3500,h2c=pornin,map=mcg64 | gf2_127 | per-element | 302 ns | 302 ns .. 303 ns | per elem |
| encode (hash + cells) | binary.127/m=5,n=3500,h2c=pornin | gf2_127 | per-element | 248 ns | 248 ns .. 248 ns | per elem |
| encode (hash + cells) | binary.127/m=5,n=3500,h2c=pornin,map=mcg64 | gf2_127 | per-element | 244 ns | 244 ns .. 245 ns | per elem |
| encode (hash + cells) | binary.127/m=5,n=3500,h2c=pornin,proj=gf2_127,mapproj=gf2_127 | gf2_127 | per-element | 154 ns | 154 ns .. 154 ns | per elem |
| encode (hash + cells) | binary-lambda.127/m=12150,n=3500,h2c=pornin-addend | gf2_127-lambda | per-element | 583 ns | 582 ns .. 584 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 | 484 ns | 484 ns .. 485 ns | per elem |
| encode (hash + cells) | binary-lambda.127/m=1350,n=3500,h2c=pornin-addend | gf2_127-lambda | per-element | 474 ns | 473 ns .. 475 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 | 379 ns | 379 ns .. 380 ns | per elem |
| encode (hash + cells) | binary-lambda.127/m=150,n=3500,h2c=pornin-addend | gf2_127-lambda | per-element | 376 ns | 375 ns .. 377 ns | per elem |
| encode (hash + cells) | binary-lambda.127/m=20,n=3500,h2c=pornin-addend | gf2_127-lambda | per-element | 291 ns | 289 ns .. 294 ns | per elem |
| encode (hash + cells) | binary-lambda.127/m=5,n=3500,h2c=pornin-addend | gf2_127-lambda | per-element | 234 ns | 233 ns .. 234 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 | 139 ns | 139 ns .. 139 ns | per elem |
| encode (hash + cells) | binary-u.127/m=12150,n=3500,h2c=pornin-addend | gf2_127-u | per-element | 520 ns | 520 ns .. 521 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 | 427 ns | 426 ns .. 429 ns | per elem |
| encode (hash + cells) | binary-u.127/m=1350,n=3500,h2c=pornin-addend | gf2_127-u | per-element | 414 ns | 414 ns .. 415 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 | 320 ns | 319 ns .. 321 ns | per elem |
| encode (hash + cells) | binary-u.127/m=150,n=3500,h2c=pornin-addend | gf2_127-u | per-element | 335 ns | 334 ns .. 336 ns | per elem |
| encode (hash + cells) | binary-u.127/m=20,n=3500,h2c=pornin-addend | gf2_127-u | per-element | 266 ns | 266 ns .. 267 ns | per elem |
| encode (hash + cells) | binary-u.127/m=5,n=3500,h2c=pornin-addend | gf2_127-u | per-element | 225 ns | 224 ns .. 225 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 | 132 ns | 132 ns .. 132 ns | per elem |
| encode (hash + cells) | binary-w.127/m=12150,n=3500,h2c=pornin-addend | gf2_127-w | per-element | 586 ns | 584 ns .. 587 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 | 485 ns | 484 ns .. 486 ns | per elem |
| encode (hash + cells) | binary-w.127/m=1350,n=3500,h2c=pornin-addend | gf2_127-w | per-element | 476 ns | 475 ns .. 477 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 | 380 ns | 379 ns .. 381 ns | per elem |
| encode (hash + cells) | binary-w.127/m=150,n=3500,h2c=pornin-addend | gf2_127-w | per-element | 376 ns | 375 ns .. 376 ns | per elem |
| encode (hash + cells) | binary-w.127/m=20,n=3500,h2c=pornin-addend | gf2_127-w | per-element | 288 ns | 288 ns .. 288 ns | per elem |
| encode (hash + cells) | binary-w.127/m=5,n=3500,h2c=pornin-addend | gf2_127-w | per-element | 233 ns | 233 ns .. 234 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 | 139 ns | 139 ns .. 140 ns | per elem |
| encode (hash + cells) | edwards.107/m=1350,n=3500,h2c=ti | edwards107 | per-element | 1.47 µs | 1.47 µs .. 1.47 µs | per elem |
| encode (hash + cells) | edwards.127/m=1350,n=3500,h2c=ti | edwards127 | per-element | 1.73 µs | 1.73 µs .. 1.73 µs | per elem |
| encode (hash + cells) | edwards.61x2/m=1350,n=3500,h2c=ti | edwards61x2 | per-element | 1.22 µs | 1.22 µs .. 1.22 µs | per elem |
| encode (hash + cells) | twisted.goldilocks2/m=1350,n=3500,h2c=ti | twisted-goldilocks2 | per-element | 2.86 µs | 2.85 µs .. 2.87 µs | per elem |
| encode (hash + cells) | twisted.128/m=1350,n=3500,h2c=ti | twisted128 | per-element | 2.61 µs | 2.60 µs .. 2.61 µs | per elem |
| encode (hash + cells) | twisted.61x2/m=1350,n=3500,h2c=ti | twisted61x2 | per-element | 1.18 µs | 1.18 µs .. 1.18 µs | per elem |
| encode (hash + cells) | twisted.64x2/m=1350,n=3500,h2c=ti | twisted64x2 | per-element | 1.58 µs | 1.58 µs .. 1.59 µs | per elem |
| encode (hash + cells) | weier.107/m=1350,n=3500,h2c=ti | weier107 | per-element | 1.74 µs | 1.74 µs .. 1.74 µs | per elem |
| encode (hash + cells) | weier-jacobian.107/m=1350,n=3500,h2c=ti | weier107-jacobian | per-element | 1.64 µs | 1.64 µs .. 1.65 µs | per elem |
| encode (hash + cells) | weier.127/m=1350,n=3500,h2c=ti | weier127 | per-element | 2.07 µs | 2.07 µs .. 2.07 µs | per elem |
| encode (hash + cells) | weier-jacobian.127/m=1350,n=3500,h2c=ti | weier127-jacobian | per-element | 1.91 µs | 1.91 µs .. 1.91 µs | per elem |
| encode (hash + cells) | weier.61x2/m=1350,n=3500,h2c=ti | weier61x2 | per-element | 1.54 µs | 1.53 µs .. 1.54 µs | per elem |
| encode (hash + cells) | weier-jacobian.61x2/m=1350,n=3500,h2c=ti | weier61x2-jacobian | per-element | 1.48 µs | 1.48 µs .. 1.48 µs | per elem |
| encode (hash + cells) | ristretto255/m=12150,n=3500 | ristretto255 | per-element | 8.25 µs | 8.23 µs .. 8.27 µs | per elem |
| encode (hash + cells) | ristretto255/m=12150,n=3500,map=mcg64 | ristretto255 | per-element | 8.23 µs | 8.22 µs .. 8.25 µs | per elem |
| encode (hash + cells) | ristretto255/m=1350,n=3500 | ristretto255 | per-element | 7.69 µs | 7.67 µs .. 7.70 µs | per elem |
| encode (hash + cells) | ristretto255/m=1350,n=3500,map=mcg64 | ristretto255 | per-element | 7.66 µs | 7.65 µs .. 7.67 µs | per elem |
| encode (hash + cells) | ristretto255/m=150,n=3500 | ristretto255 | per-element | 7.14 µs | 7.13 µs .. 7.15 µs | per elem |
| encode (hash + cells) | ristretto255/m=150,n=3500,map=mcg64 | ristretto255 | per-element | 7.12 µs | 7.11 µs .. 7.13 µs | per elem |
| encode (hash + cells) | ristretto255/m=20,n=3500 | ristretto255 | per-element | 6.67 µs | 6.67 µs .. 6.68 µs | per elem |
| encode (hash + cells) | ristretto255/m=20,n=3500,map=mcg64 | ristretto255 | per-element | 6.65 µs | 6.64 µs .. 6.66 µs | per elem |
| encode (hash + cells) | ristretto255/m=5,n=3500 | ristretto255 | per-element | 6.39 µs | 6.37 µs .. 6.41 µs | per elem |
| encode (hash + cells) | ristretto255/m=5,n=3500,map=mcg64 | ristretto255 | per-element | 6.35 µs | 6.34 µs .. 6.36 µs | per elem |
| cell updates | xor-sha256.64/m=1350,n=3500 | xor | per-element | 168 ns | 167 ns .. 168 ns | per elem |
| cell updates | xor-siphash.64/m=1350,n=3500 | xor-siphash | per-element | 166 ns | 166 ns .. 167 ns | per elem |
| cell updates | binary.109/m=12150,n=3500 | gf2_109 | per-element | 516 ns | 515 ns .. 517 ns | per elem |
| cell updates | binary.109/m=1350,n=3500 | gf2_109 | per-element | 384 ns | 384 ns .. 385 ns | per elem |
| cell updates | binary.109/m=5,n=3500 | gf2_109 | per-element | 134 ns | 134 ns .. 134 ns | per elem |
| cell updates | binary-lambda.109/m=12150,n=3500 | gf2_109-lambda | per-element | 471 ns | 470 ns .. 472 ns | per elem |
| cell updates | binary-lambda.109/m=1350,n=3500 | gf2_109-lambda | per-element | 368 ns | 367 ns .. 369 ns | per elem |
| cell updates | binary-lambda.109/m=5,n=3500 | gf2_109-lambda | per-element | 129 ns | 129 ns .. 129 ns | per elem |
| cell updates | binary-u.109/m=12150,n=3500 | gf2_109-u | per-element | 407 ns | 406 ns .. 408 ns | per elem |
| cell updates | binary-u.109/m=1350,n=3500 | gf2_109-u | per-element | 299 ns | 299 ns .. 300 ns | per elem |
| cell updates | binary-u.109/m=150,n=3500 | gf2_109-u | per-element | 221 ns | 220 ns .. 221 ns | per elem |
| cell updates | binary-u.109/m=20,n=3500 | gf2_109-u | per-element | 154 ns | 154 ns .. 155 ns | per elem |
| cell updates | binary-u.109/m=5,n=3500 | gf2_109-u | per-element | 116 ns | 115 ns .. 116 ns | per elem |
| cell updates | binary-w.109/m=12150,n=3500 | gf2_109-w | per-element | 471 ns | 470 ns .. 472 ns | per elem |
| cell updates | binary-w.109/m=1350,n=3500 | gf2_109-w | per-element | 369 ns | 368 ns .. 370 ns | per elem |
| cell updates | binary-w.109/m=5,n=3500 | gf2_109-w | per-element | 129 ns | 129 ns .. 129 ns | per elem |
| cell updates | binary.122/m=12150,n=3500 | gf2_122 | per-element | 527 ns | 526 ns .. 528 ns | per elem |
| cell updates | binary.122/m=1350,n=3500 | gf2_122 | per-element | 397 ns | 396 ns .. 398 ns | per elem |
| cell updates | binary.122/m=5,n=3500 | gf2_122 | per-element | 138 ns | 137 ns .. 138 ns | per elem |
| cell updates | binary.122-gls/m=12150,n=3500 | gf2_122-gls | per-element | 512 ns | 512 ns .. 513 ns | per elem |
| cell updates | binary.122-gls/m=1350,n=3500 | gf2_122-gls | per-element | 383 ns | 382 ns .. 384 ns | per elem |
| cell updates | binary.122-gls/m=5,n=3500 | gf2_122-gls | per-element | 134 ns | 134 ns .. 134 ns | per elem |
| cell updates | binary-lambda.122-gls/m=12150,n=3500 | gf2_122-gls-lambda | per-element | 491 ns | 490 ns .. 492 ns | per elem |
| cell updates | binary-lambda.122-gls/m=1350,n=3500 | gf2_122-gls-lambda | per-element | 384 ns | 384 ns .. 385 ns | per elem |
| cell updates | binary-lambda.122-gls/m=5,n=3500 | gf2_122-gls-lambda | per-element | 134 ns | 134 ns .. 134 ns | per elem |
| cell updates | binary-u.122-gls/m=12150,n=3500 | gf2_122-gls-u | per-element | 422 ns | 421 ns .. 423 ns | per elem |
| cell updates | binary-u.122-gls/m=1350,n=3500 | gf2_122-gls-u | per-element | 312 ns | 312 ns .. 313 ns | per elem |
| cell updates | binary-u.122-gls/m=150,n=3500 | gf2_122-gls-u | per-element | 229 ns | 229 ns .. 230 ns | per elem |
| cell updates | binary-u.122-gls/m=20,n=3500 | gf2_122-gls-u | per-element | 160 ns | 160 ns .. 161 ns | per elem |
| cell updates | binary-u.122-gls/m=5,n=3500 | gf2_122-gls-u | per-element | 118 ns | 118 ns .. 119 ns | per elem |
| cell updates | binary-w.122-gls/m=12150,n=3500 | gf2_122-gls-w | per-element | 489 ns | 489 ns .. 490 ns | per elem |
| cell updates | binary-w.122-gls/m=1350,n=3500 | gf2_122-gls-w | per-element | 383 ns | 382 ns .. 384 ns | per elem |
| cell updates | binary-w.122-gls/m=5,n=3500 | gf2_122-gls-w | per-element | 133 ns | 133 ns .. 133 ns | per elem |
| cell updates | binary-lambda.122/m=12150,n=3500 | gf2_122-lambda | per-element | 493 ns | 490 ns .. 496 ns | per elem |
| cell updates | binary-lambda.122/m=1350,n=3500 | gf2_122-lambda | per-element | 384 ns | 383 ns .. 385 ns | per elem |
| cell updates | binary-lambda.122/m=5,n=3500 | gf2_122-lambda | per-element | 135 ns | 134 ns .. 135 ns | per elem |
| cell updates | binary-u.122/m=12150,n=3500 | gf2_122-u | per-element | 422 ns | 421 ns .. 423 ns | per elem |
| cell updates | binary-u.122/m=1350,n=3500 | gf2_122-u | per-element | 312 ns | 311 ns .. 313 ns | per elem |
| cell updates | binary-u.122/m=150,n=3500 | gf2_122-u | per-element | 229 ns | 229 ns .. 230 ns | per elem |
| cell updates | binary-u.122/m=20,n=3500 | gf2_122-u | per-element | 161 ns | 160 ns .. 161 ns | per elem |
| cell updates | binary-u.122/m=5,n=3500 | gf2_122-u | per-element | 119 ns | 119 ns .. 120 ns | per elem |
| cell updates | binary-w.122/m=12150,n=3500 | gf2_122-w | per-element | 501 ns | 499 ns .. 502 ns | per elem |
| cell updates | binary-w.122/m=1350,n=3500 | gf2_122-w | per-element | 387 ns | 386 ns .. 388 ns | per elem |
| cell updates | binary-w.122/m=5,n=3500 | gf2_122-w | per-element | 134 ns | 133 ns .. 134 ns | per elem |
| cell updates | binary.127/m=12150,n=3500 | gf2_127 | per-element | 518 ns | 517 ns .. 519 ns | per elem |
| cell updates | binary.127/m=1350,n=3500 | gf2_127 | per-element | 386 ns | 385 ns .. 387 ns | per elem |
| cell updates | binary.127/m=5,n=3500 | gf2_127 | per-element | 133 ns | 133 ns .. 133 ns | per elem |
| cell updates | binary-lambda.127/m=12150,n=3500 | gf2_127-lambda | per-element | 484 ns | 483 ns .. 486 ns | per elem |
| cell updates | binary-lambda.127/m=1350,n=3500 | gf2_127-lambda | per-element | 377 ns | 376 ns .. 378 ns | per elem |
| cell updates | binary-lambda.127/m=150,n=3500 | gf2_127-lambda | per-element | 276 ns | 276 ns .. 277 ns | per elem |
| cell updates | binary-lambda.127/m=20,n=3500 | gf2_127-lambda | per-element | 187 ns | 187 ns .. 188 ns | per elem |
| cell updates | binary-lambda.127/m=5,n=3500 | gf2_127-lambda | per-element | 130 ns | 130 ns .. 130 ns | per elem |
| cell updates | binary-u.127/m=12150,n=3500 | gf2_127-u | per-element | 411 ns | 410 ns .. 412 ns | per elem |
| cell updates | binary-u.127/m=1350,n=3500 | gf2_127-u | per-element | 304 ns | 304 ns .. 305 ns | per elem |
| cell updates | binary-u.127/m=150,n=3500 | gf2_127-u | per-element | 225 ns | 224 ns .. 226 ns | per elem |
| cell updates | binary-u.127/m=20,n=3500 | gf2_127-u | per-element | 158 ns | 157 ns .. 160 ns | per elem |
| cell updates | binary-u.127/m=5,n=3500 | gf2_127-u | per-element | 115 ns | 115 ns .. 115 ns | per elem |
| cell updates | binary-w.127/m=12150,n=3500 | gf2_127-w | per-element | 480 ns | 479 ns .. 480 ns | per elem |
| cell updates | binary-w.127/m=1350,n=3500 | gf2_127-w | per-element | 373 ns | 372 ns .. 373 ns | per elem |
| cell updates | binary-w.127/m=150,n=3500 | gf2_127-w | per-element | 273 ns | 273 ns .. 274 ns | per elem |
| cell updates | binary-w.127/m=20,n=3500 | gf2_127-w | per-element | 186 ns | 186 ns .. 187 ns | per elem |
| cell updates | binary-w.127/m=5,n=3500 | gf2_127-w | per-element | 132 ns | 131 ns .. 132 ns | per elem |
| cell updates | edwards.107/m=1350,n=3500 | edwards107 | per-element | 473 ns | 473 ns .. 474 ns | per elem |
| cell updates | edwards.127/m=1350,n=3500 | edwards127 | per-element | 488 ns | 487 ns .. 489 ns | per elem |
| cell updates | edwards.61x2/m=1350,n=3500 | edwards61x2 | per-element | 456 ns | 455 ns .. 457 ns | per elem |
| cell updates | twisted.goldilocks2/m=1350,n=3500 | twisted-goldilocks2 | per-element | 582 ns | 581 ns .. 584 ns | per elem |
| cell updates | twisted.128/m=1350,n=3500 | twisted128 | per-element | 617 ns | 616 ns .. 619 ns | per elem |
| cell updates | twisted.61x2/m=1350,n=3500 | twisted61x2 | per-element | 450 ns | 449 ns .. 452 ns | per elem |
| cell updates | twisted.64x2/m=1350,n=3500 | twisted64x2 | per-element | 561 ns | 560 ns .. 562 ns | per elem |
| cell updates | weier.107/m=1350,n=3500 | weier107 | per-element | 788 ns | 786 ns .. 790 ns | per elem |
| cell updates | weier-jacobian.107/m=1350,n=3500 | weier107-jacobian | per-element | 697 ns | 696 ns .. 699 ns | per elem |
| cell updates | weier.127/m=1350,n=3500 | weier127 | per-element | 910 ns | 908 ns .. 913 ns | per elem |
| cell updates | weier-jacobian.127/m=1350,n=3500 | weier127-jacobian | per-element | 742 ns | 740 ns .. 744 ns | per elem |
| cell updates | weier.61x2/m=1350,n=3500 | weier61x2 | per-element | 817 ns | 812 ns .. 823 ns | per elem |
| cell updates | weier-jacobian.61x2/m=1350,n=3500 | weier61x2-jacobian | per-element | 768 ns | 766 ns .. 770 ns | per elem |
| cell updates | ristretto255/m=1350,n=3500 | ristretto255 | per-element | 1.74 µs | 1.74 µs .. 1.75 µs | per elem |
| peel, per difference | xor-sha256.64/d=1350,m=2700,prefilter=true,batch=true | xor | batch | 1.03 µs | 1.03 µs .. 1.03 µs | per elem |
| peel, per difference | xor-siphash.64/d=1350,m=2700,prefilter=true,batch=true | xor-siphash | batch | 988 ns | 987 ns .. 990 ns | per elem |
| peel, per difference | binary.109/d=10000,m=20000,prefilter=true,batch=true,h2c=pornin | gf2_109 | batch | 1.70 µs | 1.69 µs .. 1.70 µ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 | 1.45 µs | 1.45 µs .. 1.46 µs | per elem |
| peel, per difference | binary.109/d=1350,m=2700,prefilter=true,batch=true,h2c=pornin | gf2_109 | batch | 1.39 µs | 1.39 µs .. 1.39 µs | 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 | 1.16 µs | 1.16 µs .. 1.17 µs | 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 | 962 ns | 960 ns .. 964 ns | per elem |
| peel, per difference | binary.109/d=4,m=8,prefilter=true,batch=true,h2c=pornin | gf2_109 | batch | 820 ns | 817 ns .. 824 ns | per elem |
| peel, per difference | binary-lambda.109/d=10000,m=20000,prefilter=true,batch=true,h2c=pornin-addend | gf2_109-lambda | batch | 1.67 µs | 1.67 µs .. 1.67 µ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 | 1.44 µs | 1.43 µs .. 1.44 µs | per elem |
| peel, per difference | binary-lambda.109/d=1350,m=2700,prefilter=true,batch=true,h2c=pornin-addend | gf2_109-lambda | batch | 1.37 µs | 1.37 µs .. 1.37 µs | 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 | 1.14 µs | 1.14 µs .. 1.15 µs | 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 | 927 ns | 925 ns .. 929 ns | per elem |
| peel, per difference | binary-lambda.109/d=4,m=8,prefilter=true,batch=true,h2c=pornin-addend | gf2_109-lambda | batch | 795 ns | 793 ns .. 798 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 | 2.27 µs | 2.26 µs .. 2.27 µs | per elem |
| peel, per difference | binary-u.109/d=10000,m=20000,prefilter=false,batch=true,h2c=pornin-addend | gf2_109-u | batch | 1.35 µs | 1.35 µs .. 1.35 µs | per elem |
| peel, per difference | binary-u.109/d=10000,m=20000,prefilter=true,batch=false,h2c=pornin-addend | gf2_109-u | per-element | 2.11 µs | 2.10 µs .. 2.11 µ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.57 µs | 1.57 µs .. 1.58 µ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 | 1.33 µs | 1.33 µs .. 1.34 µs | per elem |
| peel, per difference | binary-u.109/d=1350,m=2700,prefilter=false,batch=false,h2c=pornin-addend | gf2_109-u | per-element | 2.04 µs | 2.03 µs .. 2.04 µs | per elem |
| peel, per difference | binary-u.109/d=1350,m=2700,prefilter=false,batch=true,h2c=pornin-addend | gf2_109-u | batch | 1.12 µs | 1.11 µs .. 1.12 µs | 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.82 µs | 1.82 µs .. 1.83 µs | per elem |
| peel, per difference | binary-u.109/d=1350,m=2700,prefilter=true,batch=true,h2c=pornin-addend | gf2_109-u | batch | 1.30 µs | 1.30 µs .. 1.30 µs | 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 | 1.07 µs | 1.07 µs .. 1.07 µs | 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.78 µs | 1.78 µs .. 1.79 µs | per elem |
| peel, per difference | binary-u.109/d=150,m=300,prefilter=false,batch=true,h2c=pornin-addend | gf2_109-u | batch | 865 ns | 863 ns .. 868 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.58 µs | 1.58 µs .. 1.58 µs | per elem |
| peel, per difference | binary-u.109/d=150,m=300,prefilter=true,batch=true,h2c=pornin-addend | gf2_109-u | batch | 1.04 µs | 1.04 µs .. 1.05 µs | 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.43 µs | 1.43 µs .. 1.44 µs | per elem |
| peel, per difference | binary-u.109/d=20,m=40,prefilter=false,batch=true,h2c=pornin-addend | gf2_109-u | batch | 750 ns | 749 ns .. 752 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 | 1.31 µs | 1.30 µs .. 1.31 µs | per elem |
| peel, per difference | binary-u.109/d=20,m=40,prefilter=true,batch=true,h2c=pornin-addend | gf2_109-u | batch | 881 ns | 878 ns .. 884 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 | 938 ns | 933 ns .. 943 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 | 953 ns | 951 ns .. 955 ns | per elem |
| peel, per difference | binary-u.109/d=4,m=8,prefilter=false,batch=true,h2c=pornin-addend | gf2_109-u | batch | 722 ns | 720 ns .. 723 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 | 1.02 µs | 1.02 µs .. 1.03 µs | per elem |
| peel, per difference | binary-u.109/d=4,m=8,prefilter=true,batch=true,h2c=pornin-addend | gf2_109-u | batch | 805 ns | 802 ns .. 807 ns | per elem |
| peel, per difference | binary-w.109/d=10000,m=20000,prefilter=true,batch=true,h2c=pornin-addend | gf2_109-w | batch | 1.66 µs | 1.66 µs .. 1.67 µ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 | 1.42 µs | 1.42 µs .. 1.43 µs | per elem |
| peel, per difference | binary-w.109/d=1350,m=2700,prefilter=true,batch=true,h2c=pornin-addend | gf2_109-w | batch | 1.37 µs | 1.36 µs .. 1.37 µs | 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 | 1.13 µs | 1.13 µs .. 1.14 µs | 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 | 922 ns | 920 ns .. 924 ns | per elem |
| peel, per difference | binary-w.109/d=4,m=8,prefilter=true,batch=true,h2c=pornin-addend | gf2_109-w | batch | 795 ns | 793 ns .. 798 ns | per elem |
| peel, per difference | binary.122/d=10000,m=20000,prefilter=true,batch=true,h2c=pornin | gf2_122 | batch | 1.69 µs | 1.68 µs .. 1.70 µs | per elem |
| peel, per difference | binary.122/d=10000,m=20000,prefilter=true,batch=true,h2c=pornin,proj=gf2_127,mapproj=gf2_127 | gf2_122 | batch | 1.47 µs | 1.46 µs .. 1.47 µs | per elem |
| peel, per difference | binary.122/d=1350,m=2700,prefilter=true,batch=true,h2c=pornin | gf2_122 | batch | 1.39 µs | 1.39 µs .. 1.40 µs | per elem |
| peel, per difference | binary.122/d=1350,m=2700,prefilter=true,batch=true,h2c=pornin,proj=gf2_127,mapproj=gf2_127 | gf2_122 | batch | 1.16 µs | 1.16 µs .. 1.16 µs | per elem |
| peel, per difference | binary.122/d=4,m=10,prefilter=true,batch=true,h2c=pornin,proj=gf2_127,mapproj=gf2_127 | gf2_122 | batch | 771 ns | 768 ns .. 774 ns | per elem |
| peel, per difference | binary.122/d=4,m=8,prefilter=true,batch=true,h2c=pornin | gf2_122 | batch | 683 ns | 682 ns .. 685 ns | per elem |
| peel, per difference | binary.122-gls/d=10000,m=20000,prefilter=true,batch=true,h2c=pornin | gf2_122-gls | batch | 1.67 µs | 1.66 µs .. 1.67 µs | per elem |
| peel, per difference | binary.122-gls/d=10000,m=20000,prefilter=true,batch=true,h2c=pornin,proj=gf2_127,mapproj=gf2_127 | gf2_122-gls | batch | 1.45 µs | 1.44 µs .. 1.45 µs | per elem |
| peel, per difference | binary.122-gls/d=1350,m=2700,prefilter=true,batch=true,h2c=pornin | gf2_122-gls | batch | 1.37 µs | 1.37 µs .. 1.37 µs | per elem |
| peel, per difference | binary.122-gls/d=1350,m=2700,prefilter=true,batch=true,h2c=pornin,proj=gf2_127,mapproj=gf2_127 | gf2_122-gls | batch | 1.15 µs | 1.14 µs .. 1.15 µs | per elem |
| peel, per difference | binary.122-gls/d=4,m=10,prefilter=true,batch=true,h2c=pornin,proj=gf2_127,mapproj=gf2_127 | gf2_122-gls | batch | 765 ns | 762 ns .. 768 ns | per elem |
| peel, per difference | binary.122-gls/d=4,m=8,prefilter=true,batch=true,h2c=pornin | gf2_122-gls | batch | 676 ns | 674 ns .. 677 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.67 µs | 1.66 µs .. 1.68 µ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.44 µs | 1.43 µs .. 1.44 µ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 | 1.37 µs | 1.37 µs .. 1.38 µs | 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 | 1.14 µs | 1.14 µs .. 1.15 µs | 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 | 734 ns | 732 ns .. 737 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 | 661 ns | 659 ns .. 663 ns | per elem |
| peel, per difference | binary-u.122-gls/d=10000,m=20000,prefilter=false,batch=false,h2c=pornin-addend | gf2_122-gls-u | per-element | 1.86 µs | 1.86 µs .. 1.87 µs | per elem |
| peel, per difference | binary-u.122-gls/d=10000,m=20000,prefilter=false,batch=true,h2c=pornin-addend | gf2_122-gls-u | batch | 1.35 µs | 1.34 µs .. 1.35 µs | per elem |
| peel, per difference | binary-u.122-gls/d=10000,m=20000,prefilter=true,batch=false,h2c=pornin-addend | gf2_122-gls-u | per-element | 1.85 µs | 1.85 µs .. 1.85 µs | 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.57 µs | 1.57 µs .. 1.58 µ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 | 1.34 µs | 1.34 µs .. 1.34 µs | per elem |
| peel, per difference | binary-u.122-gls/d=1350,m=2700,prefilter=false,batch=false,h2c=pornin-addend | gf2_122-gls-u | per-element | 1.61 µs | 1.60 µs .. 1.61 µs | per elem |
| peel, per difference | binary-u.122-gls/d=1350,m=2700,prefilter=false,batch=true,h2c=pornin-addend | gf2_122-gls-u | batch | 1.10 µs | 1.10 µs .. 1.11 µs | per elem |
| peel, per difference | binary-u.122-gls/d=1350,m=2700,prefilter=true,batch=false,h2c=pornin-addend | gf2_122-gls-u | per-element | 1.58 µs | 1.57 µs .. 1.58 µs | 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 | 1.30 µs | 1.29 µs .. 1.30 µs | 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 | 1.06 µs | 1.06 µs .. 1.07 µs | per elem |
| peel, per difference | binary-u.122-gls/d=150,m=300,prefilter=false,batch=false,h2c=pornin-addend | gf2_122-gls-u | per-element | 1.32 µs | 1.31 µs .. 1.32 µs | per elem |
| peel, per difference | binary-u.122-gls/d=150,m=300,prefilter=false,batch=true,h2c=pornin-addend | gf2_122-gls-u | batch | 834 ns | 831 ns .. 837 ns | per elem |
| peel, per difference | binary-u.122-gls/d=150,m=300,prefilter=true,batch=false,h2c=pornin-addend | gf2_122-gls-u | per-element | 1.30 µs | 1.29 µs .. 1.30 µs | per elem |
| peel, per difference | binary-u.122-gls/d=150,m=300,prefilter=true,batch=true,h2c=pornin-addend | gf2_122-gls-u | batch | 1.01 µs | 1.01 µs .. 1.02 µs | per elem |
| peel, per difference | binary-u.122-gls/d=20,m=40,prefilter=false,batch=false,h2c=pornin-addend | gf2_122-gls-u | per-element | 1.05 µs | 1.04 µs .. 1.05 µs | per elem |
| peel, per difference | binary-u.122-gls/d=20,m=40,prefilter=false,batch=true,h2c=pornin-addend | gf2_122-gls-u | batch | 696 ns | 693 ns .. 699 ns | per elem |
| peel, per difference | binary-u.122-gls/d=20,m=40,prefilter=true,batch=false,h2c=pornin-addend | gf2_122-gls-u | per-element | 1.05 µs | 1.05 µs .. 1.06 µs | per elem |
| peel, per difference | binary-u.122-gls/d=20,m=40,prefilter=true,batch=true,h2c=pornin-addend | gf2_122-gls-u | batch | 823 ns | 819 ns .. 826 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 | 728 ns | 726 ns .. 730 ns | per elem |
| peel, per difference | binary-u.122-gls/d=4,m=8,prefilter=false,batch=false,h2c=pornin-addend | gf2_122-gls-u | per-element | 718 ns | 716 ns .. 720 ns | per elem |
| peel, per difference | binary-u.122-gls/d=4,m=8,prefilter=false,batch=true,h2c=pornin-addend | gf2_122-gls-u | batch | 600 ns | 597 ns .. 604 ns | per elem |
| peel, per difference | binary-u.122-gls/d=4,m=8,prefilter=true,batch=false,h2c=pornin-addend | gf2_122-gls-u | per-element | 796 ns | 794 ns .. 799 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 | 676 ns | 673 ns .. 678 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.67 µs | 1.67 µs .. 1.67 µ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.44 µs | 1.44 µs .. 1.44 µ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 | 1.38 µs | 1.38 µs .. 1.38 µs | 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 | 1.14 µs | 1.14 µs .. 1.15 µs | 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 | 732 ns | 729 ns .. 734 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 | 665 ns | 662 ns .. 667 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.67 µs | 1.66 µs .. 1.67 µ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.45 µs | 1.44 µs .. 1.46 µs | per elem |
| peel, per difference | binary-lambda.122/d=1350,m=2700,prefilter=true,batch=true,h2c=pornin-addend | gf2_122-lambda | batch | 1.38 µs | 1.37 µs .. 1.38 µs | 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 | 1.15 µs | 1.15 µs .. 1.15 µs | 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 | 735 ns | 733 ns .. 737 ns | per elem |
| peel, per difference | binary-lambda.122/d=4,m=8,prefilter=true,batch=true,h2c=pornin-addend | gf2_122-lambda | batch | 659 ns | 657 ns .. 662 ns | per elem |
| peel, per difference | binary-u.122/d=10000,m=20000,prefilter=false,batch=false,h2c=pornin-addend | gf2_122-u | per-element | 1.84 µs | 1.84 µs .. 1.85 µs | per elem |
| peel, per difference | binary-u.122/d=10000,m=20000,prefilter=false,batch=true,h2c=pornin-addend | gf2_122-u | batch | 1.34 µs | 1.34 µs .. 1.35 µs | per elem |
| peel, per difference | binary-u.122/d=10000,m=20000,prefilter=true,batch=false,h2c=pornin-addend | gf2_122-u | per-element | 1.86 µs | 1.86 µs .. 1.87 µs | per elem |
| peel, per difference | binary-u.122/d=10000,m=20000,prefilter=true,batch=true,h2c=pornin-addend | gf2_122-u | batch | 1.57 µs | 1.57 µs .. 1.58 µ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 | 1.33 µs | 1.33 µs .. 1.33 µs | per elem |
| peel, per difference | binary-u.122/d=1350,m=2700,prefilter=false,batch=false,h2c=pornin-addend | gf2_122-u | per-element | 1.62 µs | 1.61 µs .. 1.62 µs | per elem |
| peel, per difference | binary-u.122/d=1350,m=2700,prefilter=false,batch=true,h2c=pornin-addend | gf2_122-u | batch | 1.11 µs | 1.10 µs .. 1.11 µs | per elem |
| peel, per difference | binary-u.122/d=1350,m=2700,prefilter=true,batch=false,h2c=pornin-addend | gf2_122-u | per-element | 1.59 µs | 1.59 µs .. 1.59 µs | per elem |
| peel, per difference | binary-u.122/d=1350,m=2700,prefilter=true,batch=true,h2c=pornin-addend | gf2_122-u | batch | 1.30 µs | 1.30 µs .. 1.30 µs | 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 | 1.06 µs | 1.06 µs .. 1.06 µs | per elem |
| peel, per difference | binary-u.122/d=150,m=300,prefilter=false,batch=false,h2c=pornin-addend | gf2_122-u | per-element | 1.33 µs | 1.32 µs .. 1.33 µs | per elem |
| peel, per difference | binary-u.122/d=150,m=300,prefilter=false,batch=true,h2c=pornin-addend | gf2_122-u | batch | 837 ns | 834 ns .. 839 ns | per elem |
| peel, per difference | binary-u.122/d=150,m=300,prefilter=true,batch=false,h2c=pornin-addend | gf2_122-u | per-element | 1.31 µs | 1.30 µs .. 1.31 µs | per elem |
| peel, per difference | binary-u.122/d=150,m=300,prefilter=true,batch=true,h2c=pornin-addend | gf2_122-u | batch | 1.03 µs | 1.02 µs .. 1.04 µs | per elem |
| peel, per difference | binary-u.122/d=20,m=40,prefilter=false,batch=false,h2c=pornin-addend | gf2_122-u | per-element | 1.05 µs | 1.05 µs .. 1.05 µs | per elem |
| peel, per difference | binary-u.122/d=20,m=40,prefilter=false,batch=true,h2c=pornin-addend | gf2_122-u | batch | 690 ns | 688 ns .. 692 ns | per elem |
| peel, per difference | binary-u.122/d=20,m=40,prefilter=true,batch=false,h2c=pornin-addend | gf2_122-u | per-element | 1.05 µs | 1.04 µs .. 1.05 µs | per elem |
| peel, per difference | binary-u.122/d=20,m=40,prefilter=true,batch=true,h2c=pornin-addend | gf2_122-u | batch | 826 ns | 823 ns .. 830 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 | 751 ns | 745 ns .. 757 ns | per elem |
| peel, per difference | binary-u.122/d=4,m=8,prefilter=false,batch=false,h2c=pornin-addend | gf2_122-u | per-element | 713 ns | 712 ns .. 714 ns | per elem |
| peel, per difference | binary-u.122/d=4,m=8,prefilter=false,batch=true,h2c=pornin-addend | gf2_122-u | batch | 603 ns | 597 ns .. 611 ns | per elem |
| peel, per difference | binary-u.122/d=4,m=8,prefilter=true,batch=false,h2c=pornin-addend | gf2_122-u | per-element | 793 ns | 791 ns .. 795 ns | per elem |
| peel, per difference | binary-u.122/d=4,m=8,prefilter=true,batch=true,h2c=pornin-addend | gf2_122-u | batch | 675 ns | 673 ns .. 676 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.68 µs | 1.68 µs .. 1.69 µ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.43 µs | 1.43 µs .. 1.44 µs | per elem |
| peel, per difference | binary-w.122/d=1350,m=2700,prefilter=true,batch=true,h2c=pornin-addend | gf2_122-w | batch | 1.38 µs | 1.38 µs .. 1.39 µs | 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 | 1.14 µs | 1.14 µs .. 1.14 µs | 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 | 730 ns | 728 ns .. 733 ns | per elem |
| peel, per difference | binary-w.122/d=4,m=8,prefilter=true,batch=true,h2c=pornin-addend | gf2_122-w | batch | 680 ns | 677 ns .. 684 ns | per elem |
| peel, per difference | binary.127/d=10000,m=20000,prefilter=true,batch=true,h2c=pornin | gf2_127 | batch | 1.66 µs | 1.66 µs .. 1.67 µ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 | 1.44 µs | 1.44 µs .. 1.45 µs | per elem |
| peel, per difference | binary.127/d=1350,m=2700,prefilter=true,batch=true,h2c=pornin | gf2_127 | batch | 1.37 µs | 1.37 µs .. 1.37 µs | 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 | 1.15 µs | 1.15 µs .. 1.15 µs | 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 | 660 ns | 657 ns .. 663 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=false,batch=false,h2c=pornin-addend | gf2_127-lambda | per-element | 1.64 µs | 1.64 µs .. 1.65 µs | per elem |
| peel, per difference | binary-lambda.127/d=10000,m=20000,prefilter=false,batch=true,h2c=pornin-addend | gf2_127-lambda | batch | 1.40 µs | 1.40 µs .. 1.40 µs | per elem |
| peel, per difference | binary-lambda.127/d=10000,m=20000,prefilter=true,batch=false,h2c=pornin-addend | gf2_127-lambda | per-element | 1.77 µs | 1.77 µs .. 1.78 µs | per elem |
| peel, per difference | binary-lambda.127/d=10000,m=20000,prefilter=true,batch=true,h2c=pornin-addend | gf2_127-lambda | batch | 1.63 µs | 1.63 µs .. 1.64 µ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 | 1.40 µs | 1.40 µs .. 1.41 µs | per elem |
| peel, per difference | binary-lambda.127/d=1350,m=2700,prefilter=false,batch=false,h2c=pornin-addend | gf2_127-lambda | per-element | 1.38 µs | 1.38 µs .. 1.39 µs | per elem |
| peel, per difference | binary-lambda.127/d=1350,m=2700,prefilter=false,batch=true,h2c=pornin-addend | gf2_127-lambda | batch | 1.16 µs | 1.15 µs .. 1.16 µs | per elem |
| peel, per difference | binary-lambda.127/d=1350,m=2700,prefilter=true,batch=false,h2c=pornin-addend | gf2_127-lambda | per-element | 1.49 µs | 1.48 µs .. 1.50 µs | per elem |
| peel, per difference | binary-lambda.127/d=1350,m=2700,prefilter=true,batch=true,h2c=pornin-addend | gf2_127-lambda | batch | 1.35 µs | 1.35 µs .. 1.35 µs | 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 | 1.12 µs | 1.12 µs .. 1.13 µs | per elem |
| peel, per difference | binary-lambda.127/d=150,m=300,prefilter=false,batch=false,h2c=pornin-addend | gf2_127-lambda | per-element | 1.08 µs | 1.08 µs .. 1.08 µs | per elem |
| peel, per difference | binary-lambda.127/d=150,m=300,prefilter=false,batch=true,h2c=pornin-addend | gf2_127-lambda | batch | 848 ns | 846 ns .. 851 ns | per elem |
| peel, per difference | binary-lambda.127/d=150,m=300,prefilter=true,batch=false,h2c=pornin-addend | gf2_127-lambda | per-element | 1.16 µs | 1.16 µs .. 1.16 µs | per elem |
| peel, per difference | binary-lambda.127/d=150,m=300,prefilter=true,batch=true,h2c=pornin-addend | gf2_127-lambda | batch | 1.03 µs | 1.03 µs .. 1.04 µs | per elem |
| peel, per difference | binary-lambda.127/d=20,m=40,prefilter=false,batch=false,h2c=pornin-addend | gf2_127-lambda | per-element | 827 ns | 825 ns .. 829 ns | per elem |
| peel, per difference | binary-lambda.127/d=20,m=40,prefilter=false,batch=true,h2c=pornin-addend | gf2_127-lambda | batch | 665 ns | 663 ns .. 668 ns | per elem |
| peel, per difference | binary-lambda.127/d=20,m=40,prefilter=true,batch=false,h2c=pornin-addend | gf2_127-lambda | per-element | 890 ns | 888 ns .. 891 ns | per elem |
| peel, per difference | binary-lambda.127/d=20,m=40,prefilter=true,batch=true,h2c=pornin-addend | gf2_127-lambda | batch | 796 ns | 794 ns .. 798 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 | 605 ns | 604 ns .. 606 ns | per elem |
| peel, per difference | binary-lambda.127/d=4,m=8,prefilter=false,batch=false,h2c=pornin-addend | gf2_127-lambda | per-element | 542 ns | 540 ns .. 543 ns | per elem |
| peel, per difference | binary-lambda.127/d=4,m=8,prefilter=false,batch=true,h2c=pornin-addend | gf2_127-lambda | batch | 495 ns | 493 ns .. 497 ns | per elem |
| peel, per difference | binary-lambda.127/d=4,m=8,prefilter=true,batch=false,h2c=pornin-addend | gf2_127-lambda | per-element | 623 ns | 621 ns .. 626 ns | per elem |
| peel, per difference | binary-lambda.127/d=4,m=8,prefilter=true,batch=true,h2c=pornin-addend | gf2_127-lambda | batch | 576 ns | 574 ns .. 578 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.56 µs | 1.56 µs .. 1.56 µs | per elem |
| peel, per difference | binary-u.127/d=10000,m=20000,prefilter=false,batch=true,h2c=pornin-addend | gf2_127-u | batch | 1.32 µs | 1.32 µs .. 1.32 µs | 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.70 µs | 1.70 µs .. 1.71 µ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.57 µs | 1.57 µs .. 1.58 µ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 | 1.33 µs | 1.33 µs .. 1.34 µs | 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.33 µs | 1.32 µs .. 1.33 µs | per elem |
| peel, per difference | binary-u.127/d=1350,m=2700,prefilter=false,batch=true,h2c=pornin-addend | gf2_127-u | batch | 1.09 µs | 1.09 µs .. 1.09 µs | 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.42 µs | 1.42 µs .. 1.42 µs | per elem |
| peel, per difference | binary-u.127/d=1350,m=2700,prefilter=true,batch=true,h2c=pornin-addend | gf2_127-u | batch | 1.29 µs | 1.28 µs .. 1.29 µs | 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 | 1.06 µs | 1.06 µs .. 1.06 µs | 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.05 µs | 1.05 µs .. 1.05 µs | per elem |
| peel, per difference | binary-u.127/d=150,m=300,prefilter=false,batch=true,h2c=pornin-addend | gf2_127-u | batch | 819 ns | 818 ns .. 821 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.14 µs | 1.13 µs .. 1.14 µs | per elem |
| peel, per difference | binary-u.127/d=150,m=300,prefilter=true,batch=true,h2c=pornin-addend | gf2_127-u | batch | 1.00 µs | 1.00 µs .. 1.01 µs | per elem |
| peel, per difference | binary-u.127/d=20,m=40,prefilter=false,batch=false,h2c=pornin-addend | gf2_127-u | per-element | 819 ns | 817 ns .. 821 ns | per elem |
| peel, per difference | binary-u.127/d=20,m=40,prefilter=false,batch=true,h2c=pornin-addend | gf2_127-u | batch | 661 ns | 659 ns .. 663 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 | 884 ns | 880 ns .. 891 ns | per elem |
| peel, per difference | binary-u.127/d=20,m=40,prefilter=true,batch=true,h2c=pornin-addend | gf2_127-u | batch | 789 ns | 787 ns .. 792 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 | 625 ns | 621 ns .. 629 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 | 551 ns | 550 ns .. 553 ns | per elem |
| peel, per difference | binary-u.127/d=4,m=8,prefilter=false,batch=true,h2c=pornin-addend | gf2_127-u | batch | 510 ns | 509 ns .. 512 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 | 632 ns | 630 ns .. 634 ns | per elem |
| peel, per difference | binary-u.127/d=4,m=8,prefilter=true,batch=true,h2c=pornin-addend | gf2_127-u | batch | 589 ns | 588 ns .. 591 ns | per elem |
| peel, per difference | binary-w.127/d=10000,m=20000,prefilter=false,batch=false,h2c=pornin-addend | gf2_127-w | per-element | 1.66 µs | 1.65 µs .. 1.66 µs | per elem |
| peel, per difference | binary-w.127/d=10000,m=20000,prefilter=false,batch=true,h2c=pornin-addend | gf2_127-w | batch | 1.42 µs | 1.41 µs .. 1.42 µs | per elem |
| peel, per difference | binary-w.127/d=10000,m=20000,prefilter=true,batch=false,h2c=pornin-addend | gf2_127-w | per-element | 1.78 µs | 1.78 µs .. 1.78 µs | per elem |
| peel, per difference | binary-w.127/d=10000,m=20000,prefilter=true,batch=true,h2c=pornin-addend | gf2_127-w | batch | 1.65 µs | 1.65 µs .. 1.65 µ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 | 1.40 µs | 1.40 µs .. 1.41 µs | per elem |
| peel, per difference | binary-w.127/d=1350,m=2700,prefilter=false,batch=false,h2c=pornin-addend | gf2_127-w | per-element | 1.39 µs | 1.39 µs .. 1.39 µs | per elem |
| peel, per difference | binary-w.127/d=1350,m=2700,prefilter=false,batch=true,h2c=pornin-addend | gf2_127-w | batch | 1.16 µs | 1.16 µs .. 1.17 µs | per elem |
| peel, per difference | binary-w.127/d=1350,m=2700,prefilter=true,batch=false,h2c=pornin-addend | gf2_127-w | per-element | 1.49 µs | 1.48 µs .. 1.49 µs | per elem |
| peel, per difference | binary-w.127/d=1350,m=2700,prefilter=true,batch=true,h2c=pornin-addend | gf2_127-w | batch | 1.36 µs | 1.36 µs .. 1.36 µs | 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 | 1.12 µs | 1.12 µs .. 1.13 µs | per elem |
| peel, per difference | binary-w.127/d=150,m=300,prefilter=false,batch=false,h2c=pornin-addend | gf2_127-w | per-element | 1.09 µs | 1.09 µs .. 1.10 µs | per elem |
| peel, per difference | binary-w.127/d=150,m=300,prefilter=false,batch=true,h2c=pornin-addend | gf2_127-w | batch | 861 ns | 856 ns .. 865 ns | per elem |
| peel, per difference | binary-w.127/d=150,m=300,prefilter=true,batch=false,h2c=pornin-addend | gf2_127-w | per-element | 1.18 µs | 1.18 µs .. 1.18 µs | per elem |
| peel, per difference | binary-w.127/d=150,m=300,prefilter=true,batch=true,h2c=pornin-addend | gf2_127-w | batch | 1.04 µs | 1.04 µs .. 1.05 µs | per elem |
| peel, per difference | binary-w.127/d=20,m=40,prefilter=false,batch=false,h2c=pornin-addend | gf2_127-w | per-element | 829 ns | 826 ns .. 831 ns | per elem |
| peel, per difference | binary-w.127/d=20,m=40,prefilter=false,batch=true,h2c=pornin-addend | gf2_127-w | batch | 668 ns | 664 ns .. 671 ns | per elem |
| peel, per difference | binary-w.127/d=20,m=40,prefilter=true,batch=false,h2c=pornin-addend | gf2_127-w | per-element | 887 ns | 885 ns .. 888 ns | per elem |
| peel, per difference | binary-w.127/d=20,m=40,prefilter=true,batch=true,h2c=pornin-addend | gf2_127-w | batch | 794 ns | 791 ns .. 797 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 | 612 ns | 610 ns .. 615 ns | per elem |
| peel, per difference | binary-w.127/d=4,m=8,prefilter=false,batch=false,h2c=pornin-addend | gf2_127-w | per-element | 551 ns | 548 ns .. 553 ns | per elem |
| peel, per difference | binary-w.127/d=4,m=8,prefilter=false,batch=true,h2c=pornin-addend | gf2_127-w | batch | 508 ns | 505 ns .. 510 ns | per elem |
| peel, per difference | binary-w.127/d=4,m=8,prefilter=true,batch=false,h2c=pornin-addend | gf2_127-w | per-element | 626 ns | 624 ns .. 627 ns | per elem |
| peel, per difference | binary-w.127/d=4,m=8,prefilter=true,batch=true,h2c=pornin-addend | gf2_127-w | batch | 584 ns | 581 ns .. 587 ns | per elem |
| peel, per difference | edwards.107/d=1350,m=2700,prefilter=true,batch=true,h2c=ti | edwards107 | batch | 2.39 µs | 2.38 µs .. 2.40 µs | per elem |
| peel, per difference | edwards.127/d=1350,m=2700,prefilter=true,batch=true,h2c=ti | edwards127 | batch | 2.64 µs | 2.64 µs .. 2.65 µs | per elem |
| peel, per difference | edwards.61x2/d=1350,m=2700,prefilter=true,batch=true,h2c=ti | edwards61x2 | batch | 2.12 µs | 2.11 µs .. 2.12 µs | per elem |
| peel, per difference | twisted.goldilocks2/d=1350,m=2700,prefilter=true,batch=true,h2c=ti | twisted-goldilocks2 | batch | 3.81 µs | 3.80 µs .. 3.82 µs | per elem |
| peel, per difference | twisted.128/d=1350,m=2700,prefilter=true,batch=true,h2c=ti | twisted128 | batch | 3.64 µs | 3.63 µs .. 3.64 µs | per elem |
| peel, per difference | twisted.61x2/d=1350,m=2700,prefilter=true,batch=true,h2c=ti | twisted61x2 | batch | 2.08 µs | 2.07 µs .. 2.08 µs | per elem |
| peel, per difference | twisted.64x2/d=1350,m=2700,prefilter=true,batch=true,h2c=ti | twisted64x2 | batch | 2.51 µs | 2.50 µs .. 2.52 µs | per elem |
| peel, per difference | weier.107/d=1350,m=2700,prefilter=true,batch=true,h2c=ti | weier107 | batch | 2.67 µs | 2.66 µs .. 2.68 µs | per elem |
| peel, per difference | weier-jacobian.107/d=1350,m=2700,prefilter=true,batch=true,h2c=ti | weier107-jacobian | batch | 2.57 µs | 2.56 µs .. 2.58 µs | per elem |
| peel, per difference | weier.127/d=1350,m=2700,prefilter=true,batch=true,h2c=ti | weier127 | batch | 3.04 µs | 3.04 µs .. 3.05 µs | per elem |
| peel, per difference | weier-jacobian.127/d=1350,m=2700,prefilter=true,batch=true,h2c=ti | weier127-jacobian | batch | 2.81 µs | 2.80 µs .. 2.82 µs | per elem |
| peel, per difference | weier.61x2/d=1350,m=2700,prefilter=true,batch=true,h2c=ti | weier61x2 | batch | 2.45 µs | 2.44 µs .. 2.46 µs | per elem |
| peel, per difference | weier-jacobian.61x2/d=1350,m=2700,prefilter=true,batch=true,h2c=ti | weier61x2-jacobian | batch | 2.37 µs | 2.37 µs .. 2.38 µs | per elem |
| peel, per difference | ristretto255/d=1350,m=2700,prefilter=true,batch=true | ristretto255 | batch | 9.13 µs | 9.11 µs .. 9.15 µs | per elem |
| rateless encode and decode, per difference | xor-sha256.64/d=10 | xor | per-element | 758 ns | 754 ns .. 764 ns | per elem |
| rateless encode and decode, per difference | xor-sha256.64/d=100 | xor | per-element | 1.34 µs | 1.34 µs .. 1.35 µs | per elem |
| rateless encode and decode, per difference | xor-sha256.64/d=1000 | xor | per-element | 2.28 µs | 2.28 µs .. 2.29 µs | per elem |
| rateless encode and decode, per difference | xor-sha256.64/d=10000 | xor | per-element | 4.24 µs | 4.22 µs .. 4.26 µs | per elem |
| rateless encode and decode, per difference | xor-sha256.64/d=100000 | xor | per-element | 11.1 µs | 11.0 µs .. 11.1 µs | per elem |
| rateless encode and decode, per difference | xor-sha256.64/d=20 | xor | per-element | 921 ns | 917 ns .. 927 ns | per elem |
| rateless encode and decode, per difference | xor-sha256.64/d=40 | xor | per-element | 1.06 µs | 1.06 µs .. 1.07 µs | per elem |
| rateless encode and decode, per difference | xor-sha256.64/d=50000 | xor | per-element | 7.98 µs | 7.94 µs .. 8.03 µs | per elem |
| rateless encode and decode, per difference | xor-siphash.64/d=10 | xor-siphash | per-element | 617 ns | 616 ns .. 619 ns | per elem |
| rateless encode and decode, per difference | xor-siphash.64/d=10,map=mcg64 | xor-siphash | per-element | 611 ns | 609 ns .. 613 ns | per elem |
| rateless encode and decode, per difference | xor-siphash.64/d=100 | xor-siphash | per-element | 1.15 µs | 1.15 µs .. 1.15 µs | per elem |
| rateless encode and decode, per difference | xor-siphash.64/d=100,map=mcg64 | xor-siphash | per-element | 1.14 µs | 1.13 µs .. 1.15 µs | per elem |
| rateless encode and decode, per difference | xor-siphash.64/d=1000 | xor-siphash | per-element | 2.05 µs | 2.05 µs .. 2.06 µs | per elem |
| rateless encode and decode, per difference | xor-siphash.64/d=1000,map=mcg64 | xor-siphash | per-element | 1.99 µs | 1.99 µs .. 2.00 µs | per elem |
| rateless encode and decode, per difference | xor-siphash.64/d=10000 | xor-siphash | per-element | 3.88 µs | 3.87 µs .. 3.88 µs | per elem |
| rateless encode and decode, per difference | xor-siphash.64/d=10000,map=chacha8 | xor-siphash | per-element | 4.47 µs | 4.44 µs .. 4.50 µs | per elem |
| rateless encode and decode, per difference | xor-siphash.64/d=10000,map=mcg64 | xor-siphash | per-element | 3.88 µs | 3.87 µs .. 3.89 µs | per elem |
| rateless encode and decode, per difference | xor-siphash.64/d=100000 | xor-siphash | per-element | 10.7 µs | 10.7 µs .. 10.8 µs | per elem |
| rateless encode and decode, per difference | xor-siphash.64/d=100000,map=chacha8 | xor-siphash | per-element | 16.4 µs | 16.4 µs .. 16.4 µs | per elem |
| rateless encode and decode, per difference | xor-siphash.64/d=100000,map=mcg64 | xor-siphash | per-element | 10.6 µs | 10.6 µs .. 10.7 µs | per elem |
| rateless encode and decode, per difference | xor-siphash.64/d=20 | xor-siphash | per-element | 765 ns | 763 ns .. 768 ns | per elem |
| rateless encode and decode, per difference | xor-siphash.64/d=20,map=mcg64 | xor-siphash | per-element | 757 ns | 755 ns .. 759 ns | per elem |
| rateless encode and decode, per difference | xor-siphash.64/d=40 | xor-siphash | per-element | 893 ns | 891 ns .. 895 ns | per elem |
| rateless encode and decode, per difference | xor-siphash.64/d=40,map=mcg64 | xor-siphash | per-element | 894 ns | 892 ns .. 897 ns | per elem |
| rateless encode and decode, per difference | xor-siphash.64/d=50000 | xor-siphash | per-element | 7.72 µs | 7.68 µs .. 7.76 µs | per elem |
| rateless encode and decode, per difference | xor-siphash.64/d=50000,map=mcg64 | xor-siphash | per-element | 7.15 µs | 7.08 µs .. 7.23 µs | per elem |
| rateless encode and decode, per difference | binary.109/d=10,h2c=pornin | gf2_109 | per-element | 2.69 µs | 2.68 µs .. 2.69 µs | per elem |
| rateless encode and decode, per difference | binary.109/d=1000,h2c=pornin | gf2_109 | per-element | 5.53 µs | 5.52 µs .. 5.54 µs | per elem |
| rateless encode and decode, per difference | binary.109/d=100000,h2c=pornin | gf2_109 | per-element | 19.0 µs | 19.0 µs .. 19.1 µs | per elem |
| rateless encode and decode, per difference | binary-lambda.109/d=10,h2c=pornin-addend | gf2_109-lambda | per-element | 2.62 µs | 2.62 µs .. 2.63 µs | per elem |
| rateless encode and decode, per difference | binary-lambda.109/d=1000,h2c=pornin-addend | gf2_109-lambda | per-element | 5.47 µs | 5.46 µs .. 5.48 µs | per elem |
| rateless encode and decode, per difference | binary-lambda.109/d=100000,h2c=pornin-addend | gf2_109-lambda | per-element | 18.2 µs | 18.2 µs .. 18.2 µs | per elem |
| rateless encode and decode, per difference | binary-u.109/d=10,h2c=pornin-addend | gf2_109-u | per-element | 2.55 µs | 2.55 µs .. 2.56 µs | per elem |
| rateless encode and decode, per difference | binary-u.109/d=100,h2c=pornin-addend | gf2_109-u | per-element | 3.76 µs | 3.76 µs .. 3.77 µs | per elem |
| rateless encode and decode, per difference | binary-u.109/d=1000,h2c=pornin-addend | gf2_109-u | per-element | 5.15 µs | 5.15 µs .. 5.16 µs | per elem |
| rateless encode and decode, per difference | binary-u.109/d=10000,h2c=pornin-addend | gf2_109-u | per-element | 7.44 µs | 7.41 µs .. 7.46 µs | per elem |
| rateless encode and decode, per difference | binary-u.109/d=100000,h2c=pornin-addend | gf2_109-u | per-element | 19.5 µs | 19.4 µs .. 19.8 µs | per elem |
| rateless encode and decode, per difference | binary-u.109/d=20,h2c=pornin-addend | gf2_109-u | per-element | 2.95 µs | 2.95 µs .. 2.96 µs | per elem |
| rateless encode and decode, per difference | binary-u.109/d=40,h2c=pornin-addend | gf2_109-u | per-element | 3.29 µs | 3.29 µs .. 3.30 µs | per elem |
| rateless encode and decode, per difference | binary-u.109/d=50000,h2c=pornin-addend | gf2_109-u | per-element | 13.8 µs | 13.7 µs .. 13.9 µs | per elem |
| rateless encode and decode, per difference | binary-w.109/d=10,h2c=pornin-addend | gf2_109-w | per-element | 2.63 µs | 2.62 µs .. 2.63 µs | per elem |
| rateless encode and decode, per difference | binary-w.109/d=1000,h2c=pornin-addend | gf2_109-w | per-element | 5.46 µs | 5.45 µs .. 5.48 µs | per elem |
| rateless encode and decode, per difference | binary-w.109/d=100000,h2c=pornin-addend | gf2_109-w | per-element | 18.1 µs | 18.0 µs .. 18.1 µs | per elem |
| rateless encode and decode, per difference | binary.122/d=10,h2c=pornin | gf2_122 | per-element | 2.05 µs | 2.05 µs .. 2.06 µs | per elem |
| rateless encode and decode, per difference | binary.122/d=1000,h2c=pornin | gf2_122 | per-element | 4.70 µs | 4.69 µs .. 4.71 µs | per elem |
| rateless encode and decode, per difference | binary.122/d=100000,h2c=pornin | gf2_122 | per-element | 18.3 µs | 18.2 µs .. 18.3 µs | per elem |
| rateless encode and decode, per difference | binary.122-gls/d=10,h2c=pornin | gf2_122-gls | per-element | 2.03 µs | 2.03 µs .. 2.03 µs | per elem |
| rateless encode and decode, per difference | binary.122-gls/d=1000,h2c=pornin | gf2_122-gls | per-element | 4.61 µs | 4.61 µs .. 4.62 µs | per elem |
| rateless encode and decode, per difference | binary.122-gls/d=100000,h2c=pornin | gf2_122-gls | per-element | 18.0 µs | 18.0 µs .. 18.0 µ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.99 µs | 1.99 µs .. 2.00 µs | per elem |
| rateless encode and decode, per difference | binary-lambda.122-gls/d=1000,h2c=pornin-addend | gf2_122-gls-lambda | per-element | 4.61 µs | 4.60 µs .. 4.62 µs | per elem |
| rateless encode and decode, per difference | binary-lambda.122-gls/d=100000,h2c=pornin-addend | gf2_122-gls-lambda | per-element | 17.9 µs | 17.8 µs .. 18.1 µ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.93 µs | 1.93 µs .. 1.93 µs | per elem |
| rateless encode and decode, per difference | binary-u.122-gls/d=100,h2c=pornin-addend | gf2_122-gls-u | per-element | 2.98 µs | 2.98 µs .. 2.99 µs | per elem |
| rateless encode and decode, per difference | binary-u.122-gls/d=1000,h2c=pornin-addend | gf2_122-gls-u | per-element | 4.33 µs | 4.33 µs .. 4.34 µs | per elem |
| rateless encode and decode, per difference | binary-u.122-gls/d=10000,h2c=pornin-addend | gf2_122-gls-u | per-element | 6.85 µs | 6.83 µs .. 6.86 µs | per elem |
| rateless encode and decode, per difference | binary-u.122-gls/d=100000,h2c=pornin-addend | gf2_122-gls-u | per-element | 18.9 µs | 18.9 µs .. 19.0 µs | per elem |
| rateless encode and decode, per difference | binary-u.122-gls/d=20,h2c=pornin-addend | gf2_122-gls-u | per-element | 2.29 µs | 2.28 µs .. 2.31 µs | per elem |
| rateless encode and decode, per difference | binary-u.122-gls/d=40,h2c=pornin-addend | gf2_122-gls-u | per-element | 2.55 µs | 2.55 µs .. 2.56 µs | per elem |
| rateless encode and decode, per difference | binary-u.122-gls/d=50000,h2c=pornin-addend | gf2_122-gls-u | per-element | 13.1 µs | 13.1 µs .. 13.2 µs | per elem |
| rateless encode and decode, per difference | binary-w.122-gls/d=10,h2c=pornin-addend | gf2_122-gls-w | per-element | 2.00 µs | 2.00 µs .. 2.00 µs | per elem |
| rateless encode and decode, per difference | binary-w.122-gls/d=1000,h2c=pornin-addend | gf2_122-gls-w | per-element | 4.65 µs | 4.64 µs .. 4.65 µs | per elem |
| rateless encode and decode, per difference | binary-w.122-gls/d=100000,h2c=pornin-addend | gf2_122-gls-w | per-element | 18.1 µs | 18.0 µs .. 18.1 µs | per elem |
| rateless encode and decode, per difference | binary-lambda.122/d=10,h2c=pornin-addend | gf2_122-lambda | per-element | 2.01 µs | 2.00 µs .. 2.01 µs | per elem |
| rateless encode and decode, per difference | binary-lambda.122/d=1000,h2c=pornin-addend | gf2_122-lambda | per-element | 4.64 µs | 4.63 µs .. 4.66 µs | per elem |
| rateless encode and decode, per difference | binary-lambda.122/d=100000,h2c=pornin-addend | gf2_122-lambda | per-element | 18.0 µs | 18.0 µs .. 18.1 µs | per elem |
| rateless encode and decode, per difference | binary-u.122/d=10,h2c=pornin-addend | gf2_122-u | per-element | 1.93 µs | 1.93 µs .. 1.93 µs | per elem |
| rateless encode and decode, per difference | binary-u.122/d=100,h2c=pornin-addend | gf2_122-u | per-element | 2.97 µs | 2.96 µs .. 2.98 µs | per elem |
| rateless encode and decode, per difference | binary-u.122/d=1000,h2c=pornin-addend | gf2_122-u | per-element | 4.33 µs | 4.32 µs .. 4.35 µs | per elem |
| rateless encode and decode, per difference | binary-u.122/d=10000,h2c=pornin-addend | gf2_122-u | per-element | 6.70 µs | 6.69 µs .. 6.71 µs | per elem |
| rateless encode and decode, per difference | binary-u.122/d=100000,h2c=pornin-addend | gf2_122-u | per-element | 17.5 µs | 17.5 µs .. 17.6 µs | per elem |
| rateless encode and decode, per difference | binary-u.122/d=20,h2c=pornin-addend | gf2_122-u | per-element | 2.26 µs | 2.25 µs .. 2.26 µs | per elem |
| rateless encode and decode, per difference | binary-u.122/d=40,h2c=pornin-addend | gf2_122-u | per-element | 2.54 µs | 2.53 µs .. 2.55 µs | per elem |
| rateless encode and decode, per difference | binary-u.122/d=50000,h2c=pornin-addend | gf2_122-u | per-element | 12.5 µs | 12.5 µs .. 12.5 µs | per elem |
| rateless encode and decode, per difference | binary-w.122/d=10,h2c=pornin-addend | gf2_122-w | per-element | 2.02 µs | 2.00 µs .. 2.04 µs | per elem |
| rateless encode and decode, per difference | binary-w.122/d=1000,h2c=pornin-addend | gf2_122-w | per-element | 4.63 µs | 4.62 µs .. 4.64 µs | per elem |
| rateless encode and decode, per difference | binary-w.122/d=100000,h2c=pornin-addend | gf2_122-w | per-element | 17.8 µs | 17.8 µs .. 17.9 µs | per elem |
| rateless encode and decode, per difference | binary.127/d=10,h2c=pornin | gf2_127 | per-element | 1.65 µs | 1.65 µs .. 1.66 µs | per elem |
| rateless encode and decode, per difference | binary.127/d=10,h2c=pornin,map=mcg64 | gf2_127 | per-element | 1.65 µs | 1.64 µs .. 1.65 µs | per elem |
| rateless encode and decode, per difference | binary.127/d=100,h2c=pornin,map=mcg64 | gf2_127 | per-element | 2.65 µs | 2.65 µs .. 2.66 µs | per elem |
| rateless encode and decode, per difference | binary.127/d=1000,h2c=pornin | gf2_127 | per-element | 4.14 µs | 4.13 µs .. 4.14 µs | per elem |
| rateless encode and decode, per difference | binary.127/d=1000,h2c=pornin,map=mcg64 | gf2_127 | per-element | 4.05 µs | 4.04 µs .. 4.07 µs | per elem |
| rateless encode and decode, per difference | binary.127/d=10000,h2c=pornin,map=chacha8 | gf2_127 | per-element | 7.71 µs | 7.67 µs .. 7.77 µs | per elem |
| rateless encode and decode, per difference | binary.127/d=10000,h2c=pornin,map=mcg64 | gf2_127 | per-element | 6.58 µs | 6.50 µs .. 6.69 µs | per elem |
| rateless encode and decode, per difference | binary.127/d=100000,h2c=pornin | gf2_127 | per-element | 19.7 µs | 19.7 µs .. 19.8 µs | per elem |
| rateless encode and decode, per difference | binary.127/d=100000,h2c=pornin,map=chacha8 | gf2_127 | per-element | 23.9 µs | 23.9 µs .. 24.0 µs | per elem |
| rateless encode and decode, per difference | binary.127/d=100000,h2c=pornin,map=mcg64 | gf2_127 | per-element | 16.3 µs | 16.2 µs .. 16.3 µs | per elem |
| rateless encode and decode, per difference | binary.127/d=20,h2c=pornin,map=mcg64 | gf2_127 | per-element | 1.94 µs | 1.94 µs .. 1.94 µs | per elem |
| rateless encode and decode, per difference | binary.127/d=40,h2c=pornin,map=mcg64 | gf2_127 | per-element | 2.22 µs | 2.22 µs .. 2.23 µs | per elem |
| rateless encode and decode, per difference | binary.127/d=50000,h2c=pornin,map=mcg64 | gf2_127 | per-element | 12.1 µs | 12.0 µs .. 12.1 µs | per elem |
| rateless encode and decode, per difference | binary-lambda.127/d=10,h2c=pornin-addend | gf2_127-lambda | per-element | 1.57 µs | 1.57 µs .. 1.57 µs | per elem |
| rateless encode and decode, per difference | binary-lambda.127/d=100,h2c=pornin-addend | gf2_127-lambda | per-element | 2.63 µs | 2.62 µs .. 2.63 µs | per elem |
| rateless encode and decode, per difference | binary-lambda.127/d=1000,h2c=pornin-addend | gf2_127-lambda | per-element | 4.05 µs | 4.04 µs .. 4.06 µs | per elem |
| rateless encode and decode, per difference | binary-lambda.127/d=10000,h2c=pornin-addend | gf2_127-lambda | per-element | 6.54 µs | 6.51 µs .. 6.58 µs | per elem |
| rateless encode and decode, per difference | binary-lambda.127/d=100000,h2c=pornin-addend | gf2_127-lambda | per-element | 17.5 µs | 17.5 µs .. 17.6 µs | per elem |
| rateless encode and decode, per difference | binary-lambda.127/d=20,h2c=pornin-addend | gf2_127-lambda | per-element | 1.89 µs | 1.88 µs .. 1.89 µs | per elem |
| rateless encode and decode, per difference | binary-lambda.127/d=40,h2c=pornin-addend | gf2_127-lambda | per-element | 2.17 µs | 2.17 µs .. 2.18 µs | per elem |
| rateless encode and decode, per difference | binary-lambda.127/d=50000,h2c=pornin-addend | gf2_127-lambda | per-element | 12.5 µs | 12.4 µs .. 12.6 µs | per elem |
| rateless encode and decode, per difference | binary-u.127/d=10,h2c=pornin-addend | gf2_127-u | per-element | 1.53 µs | 1.53 µs .. 1.53 µs | per elem |
| rateless encode and decode, per difference | binary-u.127/d=100,h2c=pornin-addend | gf2_127-u | per-element | 2.47 µs | 2.46 µs .. 2.47 µs | per elem |
| rateless encode and decode, per difference | binary-u.127/d=1000,h2c=pornin-addend | gf2_127-u | per-element | 3.84 µs | 3.81 µs .. 3.90 µs | per elem |
| rateless encode and decode, per difference | binary-u.127/d=10000,h2c=pornin-addend | gf2_127-u | per-element | 6.21 µs | 6.20 µs .. 6.23 µs | per elem |
| rateless encode and decode, per difference | binary-u.127/d=100000,h2c=pornin-addend | gf2_127-u | per-element | 17.1 µs | 17.0 µs .. 17.3 µs | per elem |
| rateless encode and decode, per difference | binary-u.127/d=20,h2c=pornin-addend | gf2_127-u | per-element | 1.81 µs | 1.80 µs .. 1.81 µs | per elem |
| rateless encode and decode, per difference | binary-u.127/d=40,h2c=pornin-addend | gf2_127-u | per-element | 2.07 µs | 2.07 µs .. 2.07 µs | per elem |
| rateless encode and decode, per difference | binary-u.127/d=50000,h2c=pornin-addend | gf2_127-u | per-element | 11.9 µs | 11.9 µs .. 12.0 µs | per elem |
| rateless encode and decode, per difference | binary-w.127/d=10,h2c=pornin-addend | gf2_127-w | per-element | 1.58 µs | 1.57 µs .. 1.58 µs | per elem |
| rateless encode and decode, per difference | binary-w.127/d=100,h2c=pornin-addend | gf2_127-w | per-element | 2.62 µs | 2.62 µs .. 2.62 µs | per elem |
| rateless encode and decode, per difference | binary-w.127/d=1000,h2c=pornin-addend | gf2_127-w | per-element | 4.05 µs | 4.05 µs .. 4.06 µs | per elem |
| rateless encode and decode, per difference | binary-w.127/d=10000,h2c=pornin-addend | gf2_127-w | per-element | 6.50 µs | 6.49 µs .. 6.51 µs | per elem |
| rateless encode and decode, per difference | binary-w.127/d=100000,h2c=pornin-addend | gf2_127-w | per-element | 17.3 µs | 17.3 µs .. 17.4 µs | per elem |
| rateless encode and decode, per difference | binary-w.127/d=20,h2c=pornin-addend | gf2_127-w | per-element | 1.89 µs | 1.89 µs .. 1.90 µs | per elem |
| rateless encode and decode, per difference | binary-w.127/d=40,h2c=pornin-addend | gf2_127-w | per-element | 2.18 µs | 2.17 µs .. 2.18 µs | per elem |
| rateless encode and decode, per difference | binary-w.127/d=50000,h2c=pornin-addend | gf2_127-w | per-element | 12.3 µs | 12.3 µs .. 12.4 µs | per elem |
| rateless encode and decode, per difference | edwards.107/d=1000,h2c=ti | edwards107 | per-element | 9.04 µs | 9.02 µs .. 9.07 µs | per elem |
| rateless encode and decode, per difference | edwards.127/d=1000,h2c=ti | edwards127 | per-element | 9.89 µs | 9.87 µs .. 9.91 µs | per elem |
| rateless encode and decode, per difference | edwards.61x2/d=1000,h2c=ti | edwards61x2 | per-element | 6.93 µs | 6.92 µs .. 6.95 µs | per elem |
| rateless encode and decode, per difference | twisted.goldilocks2/d=1000,h2c=ti | twisted-goldilocks2 | per-element | 11.7 µs | 11.7 µs .. 11.7 µs | per elem |
| rateless encode and decode, per difference | twisted.128/d=1000,h2c=ti | twisted128 | per-element | 11.2 µs | 11.1 µs .. 11.2 µs | per elem |
| rateless encode and decode, per difference | twisted.61x2/d=1000,h2c=ti | twisted61x2 | per-element | 6.15 µs | 6.13 µs .. 6.18 µs | per elem |
| rateless encode and decode, per difference | twisted.64x2/d=1000,h2c=ti | twisted64x2 | per-element | 7.46 µs | 7.44 µs .. 7.48 µs | per elem |
| rateless encode and decode, per difference | weier.107/d=1000,h2c=ti | weier107 | per-element | 8.14 µs | 8.12 µs .. 8.16 µs | per elem |
| rateless encode and decode, per difference | weier-jacobian.107/d=1000,h2c=ti | weier107-jacobian | per-element | 7.72 µs | 7.70 µs .. 7.75 µs | per elem |
| rateless encode and decode, per difference | weier.127/d=1000,h2c=ti | weier127 | per-element | 9.39 µs | 9.37 µs .. 9.42 µs | per elem |
| rateless encode and decode, per difference | weier-jacobian.127/d=1000,h2c=ti | weier127-jacobian | per-element | 8.62 µs | 8.61 µs .. 8.64 µs | per elem |
| rateless encode and decode, per difference | weier.61x2/d=1000,h2c=ti | weier61x2 | per-element | 7.42 µs | 7.41 µs .. 7.43 µs | per elem |
| rateless encode and decode, per difference | weier-jacobian.61x2/d=1000,h2c=ti | weier61x2-jacobian | per-element | 7.21 µs | 7.20 µs .. 7.22 µs | per elem |
| rateless encode and decode, per difference | ristretto255/d=10 | ristretto255 | per-element | 17.8 µs | 17.8 µs .. 17.9 µs | per elem |
| rateless encode and decode, per difference | ristretto255/d=10,map=mcg64 | ristretto255 | per-element | 17.9 µs | 17.8 µs .. 17.9 µs | per elem |
| rateless encode and decode, per difference | ristretto255/d=100 | ristretto255 | per-element | 24.3 µs | 24.2 µs .. 24.4 µs | per elem |
| rateless encode and decode, per difference | ristretto255/d=100,map=mcg64 | ristretto255 | per-element | 24.3 µs | 24.2 µs .. 24.4 µs | per elem |
| rateless encode and decode, per difference | ristretto255/d=1000 | ristretto255 | per-element | 28.8 µs | 28.7 µs .. 28.9 µs | per elem |
| rateless encode and decode, per difference | ristretto255/d=1000,map=mcg64 | ristretto255 | per-element | 28.7 µs | 28.6 µs .. 28.8 µs | per elem |
| rateless encode and decode, per difference | ristretto255/d=10000 | ristretto255 | per-element | 33.9 µs | 33.8 µs .. 34.0 µs | per elem |
| rateless encode and decode, per difference | ristretto255/d=10000,map=chacha8 | ristretto255 | per-element | 36.3 µs | 36.1 µs .. 36.5 µs | per elem |
| rateless encode and decode, per difference | ristretto255/d=10000,map=mcg64 | ristretto255 | per-element | 34.2 µs | 33.6 µs .. 35.1 µs | per elem |
| rateless encode and decode, per difference | ristretto255/d=100000 | ristretto255 | per-element | 48.0 µs | 47.9 µs .. 48.1 µs | per elem |
| rateless encode and decode, per difference | ristretto255/d=100000,map=chacha8 | ristretto255 | per-element | 54.1 µs | 54.0 µs .. 54.3 µs | per elem |
| rateless encode and decode, per difference | ristretto255/d=100000,map=mcg64 | ristretto255 | per-element | 47.0 µs | 46.7 µs .. 47.4 µs | per elem |
| rateless encode and decode, per difference | ristretto255/d=20 | ristretto255 | per-element | 20.3 µs | 20.2 µs .. 20.3 µs | per elem |
| rateless encode and decode, per difference | ristretto255/d=20,map=mcg64 | ristretto255 | per-element | 20.2 µs | 20.1 µs .. 20.3 µs | per elem |
| rateless encode and decode, per difference | ristretto255/d=40 | ristretto255 | per-element | 22.2 µs | 22.2 µs .. 22.3 µs | per elem |
| rateless encode and decode, per difference | ristretto255/d=40,map=mcg64 | ristretto255 | per-element | 22.2 µs | 22.1 µs .. 22.3 µs | per elem |
| rateless encode and decode, per difference | ristretto255/d=50000 | ristretto255 | per-element | 43.3 µs | 43.2 µs .. 43.5 µs | per elem |
| rateless encode and decode, per difference | ristretto255/d=50000,map=mcg64 | ristretto255 | per-element | 42.2 µs | 42.1 µs .. 42.4 µs | per elem |
| mapping, per index | chacha8/next | mapping | per-element | 10.5 ns | 10.5 ns .. 10.5 ns | per elem |
| mapping, per index | mcg64/next | mapping | per-element | 4.09 ns | 4.08 ns .. 4.10 ns | per elem |
| mapping, per index | sha256-ctr/next | mapping | per-element | 22.6 ns | 22.5 ns .. 22.6 ns | per elem |
| mapping, per index | xoshiro256pp/next | mapping | per-element | 4.43 ns | 4.42 ns .. 4.43 ns | per elem |
| mapping, per item | chacha8/item,m=12150 | mapping | per-element | 216 ns | 215 ns .. 216 ns | per elem |
| mapping, per item | chacha8/item,m=1350 | mapping | per-element | 180 ns | 180 ns .. 181 ns | per elem |
| mapping, per item | chacha8/item,m=150 | mapping | per-element | 141 ns | 141 ns .. 141 ns | per elem |
| mapping, per item | chacha8/item,m=20 | mapping | per-element | 105 ns | 104 ns .. 105 ns | per elem |
| mapping, per item | chacha8/item,m=5 | mapping | per-element | 81.1 ns | 80.8 ns .. 81.4 ns | per elem |
| mapping, per item | mcg64/item,m=12150 | mapping | per-element | 157 ns | 157 ns .. 158 ns | per elem |
| mapping, per item | mcg64/item,m=1350 | mapping | per-element | 122 ns | 122 ns .. 122 ns | per elem |
| mapping, per item | mcg64/item,m=150 | mapping | per-element | 83.8 ns | 83.6 ns .. 83.9 ns | per elem |
| mapping, per item | mcg64/item,m=20 | mapping | per-element | 46.1 ns | 46.0 ns .. 46.2 ns | per elem |
| mapping, per item | mcg64/item,m=5 | mapping | per-element | 21.4 ns | 21.3 ns .. 21.4 ns | per elem |
| mapping, per item | sha256-ctr/item,m=12150 | mapping | per-element | 430 ns | 429 ns .. 431 ns | per elem |
| mapping, per item | sha256-ctr/item,m=1350 | mapping | per-element | 334 ns | 334 ns .. 335 ns | per elem |
| mapping, per item | sha256-ctr/item,m=150 | mapping | per-element | 237 ns | 236 ns .. 237 ns | per elem |
| mapping, per item | sha256-ctr/item,m=20 | mapping | per-element | 148 ns | 147 ns .. 148 ns | per elem |
| mapping, per item | sha256-ctr/item,m=5 | mapping | per-element | 89.9 ns | 89.7 ns .. 90.1 ns | per elem |
| mapping, per item | xoshiro256pp/item,m=12150 | mapping | per-element | 159 ns | 158 ns .. 159 ns | per elem |
| mapping, per item | xoshiro256pp/item,m=1350 | mapping | per-element | 124 ns | 123 ns .. 124 ns | per elem |
| mapping, per item | xoshiro256pp/item,m=150 | mapping | per-element | 86.0 ns | 85.9 ns .. 86.1 ns | per elem |
| mapping, per item | xoshiro256pp/item,m=20 | mapping | per-element | 49.0 ns | 49.0 ns .. 49.1 ns | per elem |
| mapping, per item | xoshiro256pp/item,m=5 | mapping | per-element | 26.4 ns | 26.4 ns .. 26.5 ns | per elem |
| map digest of an ID | projection-fp127/digest of id | mapping | per-element | 13.6 ns | 13.6 ns .. 13.7 ns | per elem |
| map digest of an ID | projection-fp130/digest of id | mapping | per-element | 26.0 ns | 26.0 ns .. 26.1 ns | per elem |
| map digest of an ID | projection-gf2_127/digest of id | mapping | per-element | 9.67 ns | 9.65 ns .. 9.69 ns | per elem |
| map digest of an ID | salted-sha256/digest of id | mapping | per-element | 51.4 ns | 51.3 ns .. 51.5 ns | per elem |
| per-salt keys | projection-fp127/keys | mapping | per-element | 404 ns | 403 ns .. 406 ns | per elem |
| per-salt keys | projection-fp130/keys | mapping | per-element | 406 ns | 406 ns .. 407 ns | per elem |
| per-salt keys | projection-gf2_127/keys | mapping | per-element | 375 ns | 375 ns .. 376 ns | per elem |
| per-salt keys | salted-sha256/keys | mapping | per-element | 127 ns | 127 ns .. 127 ns | per elem |
| item ID | sha256/id | xor | per-element | 50.2 ns | 50.0 ns .. 50.3 ns | per elem |
| map digest | salted-sha256/digest | mapping | per-element | 51.8 ns | 51.7 ns .. 51.9 ns | per elem |
digest
Figure
11 benchmarks
| operation | benchmark | family | mode | time | 95% CI | unit |
|---|---|---|---|---|---|---|
| digest | xor-sha256 | xor | per-element | 55.1 ns | 54.3 ns .. 55.9 ns | per elem |
| digest | gf2_109/batch | gf2_109 | batch | 147 ns | 146 ns .. 147 ns | per elem |
| digest | gf2_122/batch | gf2_122 | batch | 138 ns | 136 ns .. 139 ns | per elem |
| digest | gf2_122-gls/batch | gf2_122-gls | batch | 136 ns | 135 ns .. 136 ns | per elem |
| digest | gf2_127/batch | gf2_127 | batch | 127 ns | 127 ns .. 128 ns | per elem |
| digest | edwards107/batch | edwards107 | batch | 961 ns | 958 ns .. 964 ns | per elem |
| digest | edwards127/batch | edwards127 | batch | 1.24 µs | 1.23 µs .. 1.24 µs | per elem |
| digest | weier107/batch | weier107 | batch | 937 ns | 933 ns .. 941 ns | per elem |
| digest | weier127/batch | weier127 | batch | 1.21 µs | 1.21 µs .. 1.21 µs | per elem |
| digest | ristretto255/streaming | ristretto255 | streaming | 6.18 µs | 6.16 µs .. 6.20 µs | per elem |
| digest | secp256k1/try-and-increment + combine_keys | secp256k1 | batch | 6.34 µs | 6.32 µs .. 6.36 µs | per elem |
curve generation
Figure
85 benchmarks
| operation | benchmark | family | mode | time | 95% CI | unit |
|---|---|---|---|---|---|---|
| accept certificate | gf2_109/0 | gf2_109 | total | 74.4 µs | 74.2 µs .. 74.5 µs | per iter |
| accept certificate | gf2_122/0 | gf2_122 | total | 70.1 µs | 69.9 µs .. 70.2 µs | per iter |
| accept certificate | gf2_122-gls/0 | gf2_122-gls | total | 78.3 µs | 78.0 µs .. 78.6 µs | per iter |
| accept certificate | gf2_127/0 | gf2_127 | total | 69.9 µs | 69.8 µs .. 70.1 µs | per iter |
| accept certificate | edwards107/0 | edwards107 | total | 78.4 µs | 78.1 µs .. 78.7 µs | per iter |
| accept certificate | edwards127/0 | edwards127 | total | 78.3 µs | 78.0 µs .. 78.7 µs | per iter |
| accept certificate | edwards61x2/0 | edwards61x2 | total | 82.6 µs | 82.3 µs .. 83.1 µs | per iter |
| accept certificate | twisted-goldilocks2/0 | twisted-goldilocks2 | total | 83.5 µs | 82.9 µs .. 84.1 µs | per iter |
| accept certificate | twisted128/0 | twisted128 | total | 87.5 µs | 87.3 µs .. 88.0 µs | per iter |
| accept certificate | twisted61x2/0 | twisted61x2 | total | 80.7 µs | 80.5 µs .. 81.0 µs | per iter |
| accept certificate | twisted64x2/0 | twisted64x2 | total | 86.9 µs | 86.4 µs .. 87.4 µs | per iter |
| accept certificate | weier107/0 | weier107 | total | 82.4 µs | 82.1 µs .. 82.8 µs | per iter |
| accept certificate | weier127/0 | weier127 | total | 91.2 µs | 91.0 µs .. 91.4 µs | per iter |
| accept certificate | weier61x2/0 | weier61x2 | total | 87.0 µs | 86.8 µs .. 87.2 µs | per iter |
| verify certificate | gf2_109/198 rejections/0 | gf2_109 | total | 258 µs | 258 µs .. 259 µs | per iter |
| verify certificate | gf2_122/4 rejections/0 | gf2_122 | total | 73.5 µs | 73.2 µs .. 73.9 µs | per iter |
| verify certificate | gf2_122-gls/60 rejections/0 | gf2_122-gls | total | 147 µs | 147 µs .. 147 µs | per iter |
| verify certificate | gf2_127/30 rejections/0 | gf2_127 | total | 84.5 µs | 84.3 µs .. 84.9 µs | per iter |
| verify certificate | edwards107/28 rejections/0 | edwards107 | total | 183 µs | 183 µs .. 184 µs | per iter |
| verify certificate | edwards127/56 rejections/0 | edwards127 | total | 307 µs | 299 µs .. 317 µs | per iter |
| verify certificate | edwards61x2/118 rejections/0 | edwards61x2 | total | 374 µs | 372 µs .. 376 µs | per iter |
| verify certificate | twisted-goldilocks2/32 rejections/0 | twisted-goldilocks2 | total | 221 µs | 221 µs .. 222 µs | per iter |
| verify certificate | twisted128/4 rejections/0 | twisted128 | total | 98.3 µs | 98.0 µs .. 98.7 µs | per iter |
| verify certificate | twisted61x2/344 rejections/0 | twisted61x2 | total | 696 µs | 696 µs .. 697 µs | per iter |
| verify certificate | twisted64x2/36 rejections/0 | twisted64x2 | total | 177 µs | 176 µs .. 177 µs | per iter |
| verify certificate | weier107/519 rejections/0 | weier107 | total | 475 µs | 474 µs .. 476 µs | per iter |
| verify certificate | weier127/125 rejections/0 | weier127 | total | 203 µs | 202 µs .. 205 µs | per iter |
| verify certificate | weier61x2/123 rejections/0 | weier61x2 | total | 193 µs | 192 µs .. 193 µs | per iter |
| embedding-degree bound | gf2_109/0 | gf2_109 | total | 43.6 µs | 43.4 µs .. 43.8 µs | per iter |
| embedding-degree bound | gf2_122/0 | gf2_122 | total | 43.2 µs | 42.9 µs .. 43.6 µs | per iter |
| embedding-degree bound | gf2_122-gls/0 | gf2_122-gls | total | 43.8 µs | 43.2 µs .. 44.2 µs | per iter |
| embedding-degree bound | gf2_127/0 | gf2_127 | total | 43.3 µs | 43.0 µs .. 43.6 µs | per iter |
| embedding-degree bound | edwards107/0 | edwards107 | total | 43.1 µs | 42.4 µs .. 43.5 µs | per iter |
| embedding-degree bound | edwards127/0 | edwards127 | total | 43.3 µs | 43.2 µs .. 43.4 µs | per iter |
| embedding-degree bound | edwards61x2/0 | edwards61x2 | total | 43.4 µs | 43.0 µs .. 44.0 µs | per iter |
| embedding-degree bound | twisted-goldilocks2/0 | twisted-goldilocks2 | total | 42.1 µs | 42.0 µs .. 42.2 µs | per iter |
| embedding-degree bound | twisted128/0 | twisted128 | total | 44.3 µs | 44.0 µs .. 44.5 µs | per iter |
| embedding-degree bound | twisted61x2/0 | twisted61x2 | total | 43.7 µs | 43.4 µs .. 44.3 µs | per iter |
| embedding-degree bound | twisted64x2/0 | twisted64x2 | total | 43.3 µs | 43.2 µs .. 43.4 µs | per iter |
| embedding-degree bound | weier107/0 | weier107 | total | 43.6 µs | 43.3 µs .. 43.7 µs | per iter |
| embedding-degree bound | weier127/0 | weier127 | total | 44.4 µs | 43.7 µs .. 45.1 µs | per iter |
| embedding-degree bound | weier61x2/0 | weier61x2 | total | 44.2 µs | 43.9 µs .. 44.4 µs | per iter |
| find (Rust: AGM + sieve) | gf2_127 agm+sieve/index 114/1 | gf2_127 | total | 24.8 ms | 24.7 ms .. 25.0 ms | per iter |
| find (Rust: AGM + sieve) | gf2_127 agm+sieve/index 14/3 | gf2_127 | total | 2.49 ms | 2.49 ms .. 2.50 ms | per iter |
| find (Rust: AGM + sieve) | gf2_127 agm+sieve/index 30/0 | gf2_127 | total | 4.92 ms | 4.90 ms .. 4.95 ms | per iter |
| find (Rust: AGM + sieve) | gf2_127 agm+sieve/index 54/2 | gf2_127 | total | 12.2 ms | 12.2 ms .. 12.3 ms | per iter |
| certify (Rust: AGM + sieve + order witnesses) | gf2_127 agm+sieve/index 114/1 | gf2_127 | total | 25.3 ms | 25.1 ms .. 25.4 ms | per iter |
| certify (Rust: AGM + sieve + order witnesses) | gf2_127 agm+sieve/index 14/3 | gf2_127 | total | 2.63 ms | 2.62 ms .. 2.64 ms | per iter |
| certify (Rust: AGM + sieve + order witnesses) | gf2_127 agm+sieve/index 30/0 | gf2_127 | total | 5.08 ms | 5.07 ms .. 5.10 ms | per iter |
| certify (Rust: AGM + sieve + order witnesses) | gf2_127 agm+sieve/index 54/2 | gf2_127 | total | 12.4 ms | 12.4 ms .. 12.5 ms | per iter |
| point count (PARI) | gf2_127 | gf2_127 | total | 3.53 ms | 3.51 ms .. 3.56 ms | per iter |
| point count (PARI) | edwards127 | edwards127 | total | 77.0 ms | 76.9 ms .. 77.1 ms | per iter |
| point count (PARI) | edwards61x2 | edwards61x2 | total | 64.1 ms | 64.0 ms .. 64.2 ms | per iter |
| point count (PARI) | twisted-goldilocks2 | twisted-goldilocks2 | total | 79.1 ms | 78.8 ms .. 79.5 ms | per iter |
| point count (PARI) | twisted61x2 | twisted61x2 | total | 70.4 ms | 70.2 ms .. 70.6 ms | per iter |
| point count (PARI) | twisted64x2 | twisted64x2 | total | 84.7 ms | 84.5 ms .. 84.9 ms | per iter |
| point count (PARI) | weier127 | weier127 | total | 87.9 ms | 87.7 ms .. 88.2 ms | per iter |
| point count (PARI) | weier61x2 | weier61x2 | total | 61.6 ms | 61.5 ms .. 61.7 ms | per iter |
| point count (Rust AGM) | order | gf2_127 | total | 484 µs | 482 µs .. 486 µs | per iter |
| AGM steps | tables | gf2_127 | total | 1.76 ms | 1.75 ms .. 1.77 ms | per iter |
| AGM steps | trace | gf2_127 | total | 491 µs | 489 µs .. 493 µs | per iter |
| Z_q ring op | mul | gf2_127 | total | 2.45 µs | 2.44 µs .. 2.46 µs | per iter |
| Z_q ring op | sigma | gf2_127 | total | 2.71 µs | 2.70 µs .. 2.73 µs | per iter |
| Z_q ring op | sigma_inv | gf2_127 | total | 2.50 µs | 2.49 µs .. 2.51 µs | per iter |
| Z_q ring op | square | gf2_127 | total | 1.48 µs | 1.47 µs .. 1.48 µs | per iter |
| sieve, one l | gf2_127/11 | gf2_127 | total | 365 µs | 364 µs .. 366 µs | per iter |
| sieve, one l | gf2_127/13 | gf2_127 | total | 701 µs | 700 µs .. 702 µs | per iter |
| sieve, one l | gf2_127/3 | gf2_127 | total | 3.78 µs | 3.77 µs .. 3.79 µs | per iter |
| sieve, one l | gf2_127/5 | gf2_127 | total | 18.1 µs | 18.0 µs .. 18.2 µs | per iter |
| sieve, one l | gf2_127/7 | gf2_127 | total | 63.9 µs | 63.7 µs .. 64.0 µs | per iter |
| sieve, one l | edwards127/11 | edwards127 | total | 2.47 ms | 2.47 ms .. 2.48 ms | per iter |
| sieve, one l | edwards127/13 | edwards127 | total | 4.79 ms | 4.78 ms .. 4.80 ms | per iter |
| sieve, one l | edwards127/3 | edwards127 | total | 15.4 µs | 15.3 µs .. 15.4 µs | per iter |
| sieve, one l | edwards127/5 | edwards127 | total | 109 µs | 108 µs .. 109 µs | per iter |
| sieve, one l | edwards127/7 | edwards127 | total | 413 µs | 412 µs .. 414 µs | per iter |
| sieve, one l | edwards127/8 | edwards127 | total | 1.13 µs | 1.13 µs .. 1.14 µs | per iter |
| sieve, one l | weier127/11 | weier127 | total | 2.47 ms | 2.47 ms .. 2.48 ms | per iter |
| sieve, one l | weier127/13 | weier127 | total | 4.79 ms | 4.78 ms .. 4.79 ms | per iter |
| sieve, one l | weier127/2 | weier127 | total | 9.75 µs | 9.73 µs .. 9.76 µs | per iter |
| sieve, one l | weier127/3 | weier127 | total | 15.3 µs | 15.2 µs .. 15.3 µs | per iter |
| sieve, one l | weier127/5 | weier127 | total | 109 µs | 109 µs .. 109 µs | per iter |
| sieve, one l | weier127/7 | weier127 | total | 411 µs | 410 µs .. 411 µs | per iter |
| sieve, per candidate | gf2_127/7 | gf2_127 | per-element | 42.8 µs | 42.8 µs .. 42.9 µs | per elem |
| sieve, per candidate | edwards127/13 | edwards127 | per-element | 1.70 ms | 1.70 ms .. 1.70 ms | per elem |
| sieve, per candidate | weier127/13 | weier127 | per-element | 1.05 ms | 1.05 ms .. 1.05 ms | 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) | 53.4 ns | xor-sha256/xor 32B, 1 accumulator | 0.26 ns | 54.1 ns | 54.8 ns | 55.7 ns | 56.9 ns | 58.0 ns |
| gf2_109 | one at a time | gf2_109/pornin map x1 | 675 ns | binary.109/mode=throughput | 20.4 ns | 734 ns | 783 ns | 862 ns | 951 ns | 1.04 µs |
| gf2_109 | batched | gf2_109/pornin map x1, batched | 114 ns | binary.109/mode=throughput | 20.4 ns | 173 ns | 222 ns | 301 ns | 390 ns | 480 ns |
| gf2_109-lambda | one at a time | gf2_109-lambda/pornin map x1 to (x, λ) | 655 ns | binary-lambda.109/mode=throughput | 18.9 ns | 710 ns | 755 ns | 829 ns | 911 ns | 994 ns |
| gf2_109-lambda | batched | gf2_109-lambda/pornin map x1 to (x, λ), batched | 105 ns | binary-lambda.109/mode=throughput | 18.9 ns | 159 ns | 205 ns | 278 ns | 361 ns | 444 ns |
| gf2_109-u | one at a time | gf2_109-u/pornin map x1 to (u, v) | 657 ns | binary-u.109/mode=throughput | 13.5 ns | 697 ns | 729 ns | 782 ns | 841 ns | 900 ns |
| gf2_109-u | batched | gf2_109-u/pornin map x1 to (u, v), batched | 110 ns | binary-u.109/mode=throughput | 13.5 ns | 149 ns | 181 ns | 234 ns | 293 ns | 352 ns |
| gf2_109-w | one at a time | gf2_109-w/pornin map x1 to (x, λ) | 652 ns | binary-w.109/mode=throughput | 18.9 ns | 707 ns | 752 ns | 826 ns | 909 ns | 992 ns |
| gf2_109-w | batched | gf2_109-w/pornin map x1 to (x, λ), batched | 104 ns | binary-w.109/mode=throughput | 18.9 ns | 159 ns | 204 ns | 278 ns | 361 ns | 444 ns |
| gf2_122 | one at a time | gf2_122/pornin map x1 | 392 ns | binary.122/mode=throughput | 19.9 ns | 449 ns | 497 ns | 575 ns | 662 ns | 750 ns |
| gf2_122 | batched | gf2_122/pornin map x1, batched | 103 ns | binary.122/mode=throughput | 19.9 ns | 161 ns | 208 ns | 286 ns | 373 ns | 461 ns |
| gf2_122-gls | one at a time | gf2_122-gls/pornin map x1 | 394 ns | binary.122-gls/mode=throughput | 19.3 ns | 450 ns | 497 ns | 572 ns | 657 ns | 741 ns |
| gf2_122-gls | batched | gf2_122-gls/pornin map x1, batched | 101 ns | binary.122-gls/mode=throughput | 19.3 ns | 157 ns | 204 ns | 279 ns | 363 ns | 448 ns |
| gf2_122-gls-lambda | one at a time | gf2_122-gls-lambda/pornin map x1 to (x, λ) | 385 ns | binary-lambda.122-gls/mode=throughput | 20.3 ns | 443 ns | 492 ns | 571 ns | 660 ns | 749 ns |
| gf2_122-gls-lambda | batched | gf2_122-gls-lambda/pornin map x1 to (x, λ), batched | 95.0 ns | binary-lambda.122-gls/mode=throughput | 20.3 ns | 154 ns | 202 ns | 281 ns | 370 ns | 459 ns |
| gf2_122-gls-u | one at a time | gf2_122-gls-u/pornin map x1 to (u, v) | 390 ns | binary-u.122-gls/mode=throughput | 13.7 ns | 429 ns | 462 ns | 516 ns | 576 ns | 636 ns |
| gf2_122-gls-u | batched | gf2_122-gls-u/pornin map x1 to (u, v), batched | 97.6 ns | binary-u.122-gls/mode=throughput | 13.7 ns | 137 ns | 170 ns | 224 ns | 284 ns | 344 ns |
| gf2_122-gls-w | one at a time | gf2_122-gls-w/pornin map x1 to (x, λ) | 385 ns | binary-w.122-gls/mode=throughput | 20.3 ns | 444 ns | 492 ns | 572 ns | 660 ns | 750 ns |
| gf2_122-gls-w | batched | gf2_122-gls-w/pornin map x1 to (x, λ), batched | 94.6 ns | binary-w.122-gls/mode=throughput | 20.3 ns | 154 ns | 202 ns | 281 ns | 370 ns | 459 ns |
| gf2_122-lambda | one at a time | gf2_122-lambda/pornin map x1 to (x, λ) | 381 ns | binary-lambda.122/mode=throughput | 20.2 ns | 440 ns | 488 ns | 568 ns | 656 ns | 745 ns |
| gf2_122-lambda | batched | gf2_122-lambda/pornin map x1 to (x, λ), batched | 95.0 ns | binary-lambda.122/mode=throughput | 20.2 ns | 154 ns | 202 ns | 281 ns | 370 ns | 459 ns |
| gf2_122-u | one at a time | gf2_122-u/pornin map x1 to (u, v) | 391 ns | binary-u.122/mode=throughput | 14.3 ns | 432 ns | 467 ns | 523 ns | 585 ns | 648 ns |
| gf2_122-u | batched | gf2_122-u/pornin map x1 to (u, v), batched | 99.3 ns | binary-u.122/mode=throughput | 14.3 ns | 141 ns | 175 ns | 231 ns | 294 ns | 357 ns |
| gf2_122-w | one at a time | gf2_122-w/pornin map x1 to (x, λ) | 381 ns | binary-w.122/mode=throughput | 20.5 ns | 440 ns | 489 ns | 570 ns | 659 ns | 749 ns |
| gf2_122-w | batched | gf2_122-w/pornin map x1 to (x, λ), batched | 95.2 ns | binary-w.122/mode=throughput | 20.5 ns | 155 ns | 204 ns | 284 ns | 374 ns | 464 ns |
| gf2_127 | one at a time | gf2_127/pornin map x1 | 256 ns | binary.127/mode=throughput | 19.5 ns | 313 ns | 360 ns | 436 ns | 521 ns | 607 ns |
| gf2_127 | batched | gf2_127/pornin map x1, batched | 103 ns | binary.127/mode=throughput | 19.5 ns | 159 ns | 206 ns | 282 ns | 368 ns | 454 ns |
| gf2_127-lambda | one at a time | gf2_127-lambda/pornin map x1 to (x, λ) | 245 ns | binary-lambda.127/mode=throughput | 17.6 ns | 296 ns | 338 ns | 407 ns | 484 ns | 562 ns |
| gf2_127-lambda | batched | gf2_127-lambda/pornin map x1 to (x, λ), batched | 92.7 ns | binary-lambda.127/mode=throughput | 17.6 ns | 144 ns | 186 ns | 255 ns | 332 ns | 409 ns |
| gf2_127-u | one at a time | gf2_127-u/pornin map x1 to (u, v) | 249 ns | binary-u.127/mode=throughput | 13.2 ns | 287 ns | 319 ns | 371 ns | 428 ns | 486 ns |
| gf2_127-u | batched | gf2_127-u/pornin map x1 to (u, v), batched | 98.0 ns | binary-u.127/mode=throughput | 13.2 ns | 136 ns | 168 ns | 219 ns | 277 ns | 335 ns |
| gf2_127-w | one at a time | gf2_127-w/pornin map x1 to (x, λ) | 244 ns | binary-w.127/mode=throughput | 17.7 ns | 295 ns | 337 ns | 406 ns | 484 ns | 562 ns |
| gf2_127-w | batched | gf2_127-w/pornin map x1 to (x, λ), batched | 92.8 ns | binary-w.127/mode=throughput | 17.7 ns | 144 ns | 186 ns | 255 ns | 333 ns | 411 ns |
| edwards107 | one at a time | edwards.107/mode=indep | 919 ns | edwards.107/mode=throughput | 27.6 ns | 999 ns | 1.06 µs | 1.17 µs | 1.29 µs | 1.41 µs |
| edwards107 | batched | edwards.107/mode=batch,n=1024 | 916 ns | edwards.107/mode=throughput | 27.6 ns | 996 ns | 1.06 µs | 1.17 µs | 1.29 µs | 1.41 µs |
| edwards127 | one at a time | edwards.127/mode=indep | 1.22 µs | edwards.127/mode=throughput | 27.5 ns | 1.30 µs | 1.37 µs | 1.48 µs | 1.60 µs | 1.72 µs |
| edwards127 | batched | edwards.127/mode=batch,n=1024 | 1.24 µs | edwards.127/mode=throughput | 27.5 ns | 1.32 µs | 1.38 µs | 1.49 µs | 1.61 µs | 1.73 µs |
| edwards61x2 | one at a time | edwards.61x2/mode=indep | 707 ns | edwards.61x2/mode=throughput | 25.8 ns | 781 ns | 843 ns | 944 ns | 1.06 µs | 1.17 µs |
| edwards61x2 | batched | edwards.61x2/mode=batch,n=1024 | 706 ns | edwards.61x2/mode=throughput | 25.8 ns | 781 ns | 842 ns | 943 ns | 1.06 µs | 1.17 µs |
| twisted-goldilocks2 | one at a time | twisted.goldilocks2/mode=indep | 2.21 µs | twisted.goldilocks2/mode=throughput | 28.7 ns | 2.30 µs | 2.37 µs | 2.48 µs | 2.60 µs | 2.73 µs |
| twisted-goldilocks2 | batched | twisted.goldilocks2/mode=batch,n=1024 | 2.24 µs | twisted.goldilocks2/mode=throughput | 28.7 ns | 2.32 µs | 2.39 µs | 2.50 µs | 2.63 µs | 2.75 µs |
| twisted128 | one at a time | twisted.128/mode=indep | 1.97 µs | twisted.128/mode=throughput | 31.1 ns | 2.06 µs | 2.13 µs | 2.25 µs | 2.39 µs | 2.53 µs |
| twisted128 | batched | twisted.128/mode=batch,n=1024 | 1.96 µs | twisted.128/mode=throughput | 31.1 ns | 2.05 µs | 2.12 µs | 2.25 µs | 2.38 µs | 2.52 µs |
| twisted61x2 | one at a time | twisted.61x2/mode=indep | 706 ns | twisted.61x2/mode=throughput | 24.9 ns | 778 ns | 838 ns | 935 ns | 1.04 µs | 1.15 µs |
| twisted61x2 | batched | twisted.61x2/mode=batch,n=1024 | 711 ns | twisted.61x2/mode=throughput | 24.9 ns | 783 ns | 842 ns | 940 ns | 1.05 µs | 1.16 µs |
| twisted64x2 | one at a time | twisted.64x2/mode=indep | 1.00 µs | twisted.64x2/mode=throughput | 33.3 ns | 1.10 µs | 1.18 µs | 1.31 µs | 1.45 µs | 1.60 µs |
| twisted64x2 | batched | twisted.64x2/mode=batch,n=1024 | 1.00 µs | twisted.64x2/mode=throughput | 33.3 ns | 1.10 µs | 1.18 µs | 1.31 µs | 1.46 µs | 1.60 µs |
| weier107 | one at a time | weier.107/mode=indep | 892 ns | weier.107/mode=throughput | 48.6 ns | 1.03 µs | 1.15 µs | 1.34 µs | 1.55 µs | 1.76 µs |
| weier107 | batched | weier.107/mode=batch,n=1024 | 901 ns | weier.107/mode=throughput | 48.6 ns | 1.04 µs | 1.16 µs | 1.35 µs | 1.56 µs | 1.77 µs |
| weier107-jacobian | one at a time | weier-jacobian.107/mode=indep | 886 ns | weier-jacobian.107/mode=throughput | 44.1 ns | 1.01 µs | 1.12 µs | 1.29 µs | 1.49 µs | 1.68 µs |
| weier107-jacobian | batched | weier-jacobian.107/mode=batch,n=1024 | 893 ns | weier-jacobian.107/mode=throughput | 44.1 ns | 1.02 µs | 1.13 µs | 1.30 µs | 1.49 µs | 1.69 µs |
| weier127 | one at a time | weier.127/mode=indep | 1.16 µs | weier.127/mode=throughput | 58.7 ns | 1.33 µs | 1.47 µs | 1.70 µs | 1.96 µs | 2.22 µs |
| weier127 | batched | weier.127/mode=batch,n=1024 | 1.17 µs | weier.127/mode=throughput | 58.7 ns | 1.34 µs | 1.48 µs | 1.71 µs | 1.96 µs | 2.22 µs |
| weier127-jacobian | one at a time | weier-jacobian.127/mode=indep | 1.15 µs | weier-jacobian.127/mode=throughput | 48.1 ns | 1.29 µs | 1.41 µs | 1.60 µs | 1.81 µs | 2.02 µs |
| weier127-jacobian | batched | weier-jacobian.127/mode=batch,n=1024 | 1.16 µs | weier-jacobian.127/mode=throughput | 48.1 ns | 1.30 µs | 1.41 µs | 1.60 µs | 1.81 µs | 2.02 µs |
| weier61x2 | one at a time | weier.61x2/mode=indep | 696 ns | weier.61x2/mode=throughput | 50.6 ns | 842 ns | 963 ns | 1.16 µs | 1.38 µs | 1.60 µs |
| weier61x2 | batched | weier.61x2/mode=batch,n=1024 | 698 ns | weier.61x2/mode=throughput | 50.6 ns | 844 ns | 965 ns | 1.16 µs | 1.38 µs | 1.61 µs |
| weier61x2-jacobian | one at a time | weier-jacobian.61x2/mode=indep | 702 ns | weier-jacobian.61x2/mode=throughput | 50.2 ns | 847 ns | 967 ns | 1.16 µs | 1.38 µs | 1.60 µs |
| weier61x2-jacobian | batched | weier-jacobian.61x2/mode=batch,n=1024 | 698 ns | weier-jacobian.61x2/mode=throughput | 50.2 ns | 844 ns | 964 ns | 1.16 µs | 1.38 µs | 1.60 µs |
| ristretto255 | one at a time | ristretto255/hash_from_bytes<Sha512> | 6.03 µs | ristretto255/+=, 8 accumulators | 116 ns | 6.37 µs | 6.65 µs | 7.10 µs | 7.60 µs | 8.11 µs |
Intel(R) Xeon(R) W-1390P @ 3.50GHz · rustc 1.98.1 · RUSTFLAGS=-C target-cpu=x86-64-v3 -C target-feature=+pclmulqdq · ef9e82d39fbf · full profile · 2026-10-08