Benchmark run Apple M4 · generic · full · ef9e82d3
Run Apple M4 · generic · full · ef9e82d3 started 2026-10-08T07:13:46Z on Apple M4 (macOS 27.0.1, arm64) and timed commit ef9e82d39fbf06c605e1740360370f0003dc4ca4, built by rustc 1.98.1 (48a229cea 2026-09-01) with RUSTFLAGS -C target-cpu=generic, in the full profile.
790 benchmarks from run Apple M4 · generic · 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 94 to 100% of each rebuilt estimate.
| curve | security | per cell | per new item | per party and round | curve selection | dominated by | |||
|---|---|---|---|---|---|---|---|---|---|
| rho | add | encode | decode | hash + prepare | sums retained, | sums rebuilt, , | available tools | ||
| GF(2^127), 16 bytes | |||||||||
| gf2_127(X:S:Z:T) extended accumulators, Pornin's formulas | 62.8 | 155 ns (7.79× the best) | 106 ns (10.64× the best) | 88.0 ns (tied for the best, within noise) | 227 ns (1.27× the best) | 2.33 µs (1.71× the best) | 211 ms (7.33× the best) | Rust (AGM), PARI | none |
| gf2_127-lambdaincompleteλ-projective (X:L:Z) accumulators; hashed straight to : no prepare | 62.8 | 132 ns (6.60× the best) | 87.0 ns (8.72× the best) | 87.9 ns (tied for the best, within noise) | 179 ns (best) | 1.96 µs (1.44× the best) | 179 ms (6.21× the best) | 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 | 131 ns (6.58× the best) | 76.5 ns (7.67× the best) | 89.2 ns (1.01× the best) | 184 ns (1.03× the best) | 1.96 µs (1.44× the best) | 178 ms (6.19× the best) | 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 | 116 ns (5.84× the best) | 76.5 ns (7.67× the best) | 121 ns (1.38× the best) | 213 ns (1.19× the best) | 1.79 µs (1.31× the best) | 158 ms (5.49× the best) | Rust (AGM), PARI | none |
| GF(2^122) = GF(2^61)[u], dense constant, 16 bytes | |||||||||
| gf2_122(X:S:Z:T) extended | 60.3 | 263 ns (13.20× the best) | 202 ns (20.28× the best) | 187 ns (2.12× the best) | 413 ns (2.31× the best) | 3.98 µs (2.92× the best) | 358 ms (12.42× the best) | Rust (AGM), PARI | gf2_122-w, gf2_127, gf2_127-lambda, gf2_127-u, gf2_127-w |
| gf2_122-lambdaincompleteλ-projective; hashed straight to : no prepare | 60.3 | 217 ns (10.90× the best) | 156 ns (15.63× the best) | 186 ns (2.12× the best) | 361 ns (2.02× the best) | 3.31 µs (2.43× the best) | 295 ms (10.26× the best) | Rust (AGM), PARI | gf2_122-w, gf2_127, gf2_127-lambda, gf2_127-u, gf2_127-w |
| gf2_122-wincompleteλ-projective, w codec | 60.3 | 211 ns (10.58× the best) | 130 ns (13.07× the best) | 153 ns (1.74× the best) | 329 ns (1.83× the best) | 3.19 µs (2.34× the best) | 287 ms (9.95× the best) | Rust (AGM), PARI | gf2_127, gf2_127-lambda, gf2_127-u, gf2_127-w |
| gf2_122-uunscaled (X:S:Z), w codec | 60.3 | 183 ns (9.19× the best) | 132 ns (13.26× the best) | 204 ns (2.32× the best) | 392 ns (2.19× the best) | 2.88 µs (2.11× the best) | 249 ms (8.66× the best) | Rust (AGM), PARI | gf2_127, gf2_127-lambda, gf2_127-u, gf2_127-w |
| GF(2^122), constant in GF(2^61) (GLS-shaped), 16 bytes | |||||||||
| gf2_122-gls(X:S:Z:T) extended | 59.8 | 246 ns (12.33× the best) | 194 ns (19.45× the best) | 162 ns (1.85× the best) | 353 ns (1.97× the best) | 3.69 µs (2.71× the best) | 334 ms (11.60× the best) | Rust (AGM), PARI | gf2_122-gls-w, gf2_122-w, gf2_127, gf2_127-lambda, gf2_127-u, gf2_127-w |
| gf2_122-gls-lambdaincompleteλ-projective; hashed straight to : no prepare | 59.8 | 216 ns (10.85× the best) | 156 ns (15.63× the best) | 163 ns (1.85× the best) | 327 ns (1.82× the best) | 3.26 µs (2.39× the best) | 294 ms (10.21× the best) | Rust (AGM), PARI | gf2_127, gf2_127-lambda, gf2_127-u, gf2_127-w |
| gf2_122-gls-wincompleteλ-projective, w codec | 59.8 | 217 ns (10.87× the best) | 130 ns (13.01× the best) | 138 ns (1.57× the best) | 312 ns (1.74× the best) | 3.25 µs (2.39× the best) | 295 ms (10.23× the best) | Rust (AGM), PARI | gf2_127, gf2_127-lambda, gf2_127-u, gf2_127-w |
| gf2_122-gls-uunscaled (X:S:Z), w codec | 59.8 | 182 ns (9.16× the best) | 133 ns (13.32× the best) | 187 ns (2.13× the best) | 360 ns (2.01× the best) | 2.84 µs (2.08× the best) | 248 ms (8.62× the best) | Rust (AGM), PARI | gf2_127, gf2_127-lambda, gf2_127-u, gf2_127-w |
| GF(2^109), 14 bytes | |||||||||
| gf2_109(X:S:Z:T) extended | 53.8 | 403 ns (20.23× the best) | 306 ns (30.66× the best) | 263 ns (2.99× the best) | 614 ns (3.43× the best) | 6.08 µs (4.47× the best) | 548 ms (19.03× the best) | Rust (AGM), PARI | 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 |
| gf2_109-lambdaincompleteλ-projective; hashed straight to : no prepare | 53.8 | 331 ns (16.63× the best) | 221 ns (22.20× the best) | 263 ns (2.99× the best) | 511 ns (2.85× the best) | 5.01 µs (3.68× the best) | 451 ms (15.65× the best) | Rust (AGM), 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 |
| gf2_109-wincompleteλ-projective, w codec | 53.8 | 332 ns (16.67× the best) | 204 ns (20.42× the best) | 240 ns (2.73× the best) | 517 ns (2.88× the best) | 5.02 µs (3.69× the best) | 452 ms (15.68× the best) | Rust (AGM), 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 |
| gf2_109-uunscaled (X:S:Z), w codec; Pornin x1: hash to addend; output already an addend | 53.8 | 289 ns (14.53× the best) | 206 ns (20.63× the best) | 319 ns (3.62× the best) | 593 ns (3.31× the best) | 4.52 µs (3.32× the best) | 394 ms (13.68× the best) | Rust (AGM), 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 |
| F_p, p = 2^127 − 1, 16 bytes | |||||||||
| edwards127a = 1 Edwards, extended += cached | 62.3 | 19.9 ns (best) | 21.7 ns (2.18× the best) | 485 ns (5.51× the best) | 1.09 µs (6.09× the best) | 1.36 µs (best) | 28.8 ms (best) | PARI | none |
| weier127short Weierstrass, projective += affine | 63.3 | 44.7 ns (2.24× the best) | 9.97 ns (best) | 484 ns (5.51× the best) | 1.03 µs (5.75× the best) | 1.64 µs (1.20× the best) | 62.4 ms (2.17× the best) | PARI | none |
| weier127-jacobianincompleteshort Weierstrass, Jacobian += affine | 63.3 | 36.6 ns (1.84× the best) | 15.3 ns (1.54× the best) | 483 ns (5.49× the best) | 1.00 µs (5.60× the best) | 1.50 µs (1.10× the best) | 51.4 ms (1.78× the best) | PARI | none |
bold: the best of its column; italic, dotted: tied with the best within the confidence intervals; shading: ratio to the best, pale yellow at 1× to purple at 16× or more; grey: baseline, not compared.
Machine
| Apple M4 · generic · full · ef9e82d3 | |
|---|---|
| CPU | Apple M4, 10 cores, 24 GiB |
| OS | macOS 27.0.1 (Darwin 27.0.0, arm64) |
| rustc | rustc 1.98.1 (48a229cea 2026-09-01) |
| RUSTFLAGS | -C target-cpu=generic |
| field backend features | neon |
| commit | ef9e82d39fbf06c605e1740360370f0003dc4ca4 |
| suites | compare compare109 compare122 group riblt |
| profile | full |
| criterion arguments | –warm-up-time 3 –measurement-time 5 –sample-size 100 –nresamples 100000 binary|gf2|xor|edwards.?127|weier(-jacobian)?.?127|fp127|riblt.mapping |
| run | 2026-10-08T07:13:46Z .. 2026-10-08T09:30:18Z |
Load averages by phase while the run timed (Measurement methodology).
| phase | seconds | 1-minute average, mean | runnable, mean | runnable, most |
|---|---|---|---|---|
| idle before | 25 | 2.10 | 1.01 | 2.0 |
| compare | 515 | 2.02 | 2.01 | 9.0 |
| compare109 | 255 | 1.93 | 1.98 | 3.9 |
| compare122 | 450 | 2.13 | 2.14 | 11.0 |
| group | 2435 | 2.09 | 2.08 | 18.0 |
| group wide | 1140 | 1.97 | 1.97 | 15.1 |
| riblt mapping | 330 | 2.05 | 2.02 | 8.0 |
| riblt plan | 60 | 2.07 | 2.17 | 3.1 |
| riblt | 2875 | 2.11 | 2.13 | 18.0 |
| idle after | 30 | 3.75 | 4.18 | 7.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 |
|---|---|
| edwards.127 | lead |
| weier-jacobian.127 | lead |
| weier.127 | lead |
| binary-u.127 | lead |
| binary-w.127 | lead |
| binary-lambda.127 | lead |
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 | ti-addend | spot | ||
| binary-lambda.122 | ti-addend | spot | ||
| binary-lambda.122-gls | ti-addend | spot | ||
| binary-lambda.127 | ti-addend | buffer | fp127 | fp127 |
| binary-u.109 | pornin-addend | spot | ||
| binary-u.122 | ti | spot | ||
| binary-u.122-gls | ti | spot | ||
| binary-u.127 | pornin-addend | buffer | fp127 | fp127 |
| binary-w.109 | ti | spot | ||
| binary-w.122 | ti | spot | ||
| binary-w.122-gls | ti | spot | ||
| binary-w.127 | pornin-addend | buffer | fp127 | fp127 |
| binary.109 | ti | spot | ||
| binary.122 | ti | spot | ||
| binary.122-gls | ti | spot | ||
| binary.127 | ti | spot | ||
| edwards.127 | ti | full | fp130 | fp127 |
| weier-jacobian.127 | ti | full | fp127 | fp127 |
| weier.127 | ti | buffer | fp127 | fp127 |
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). 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): 38.0 ns at , 43.8 ns at , 54.4 ns at , 69.1 ns at , 90.1 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 | 196 ns (1.09× the best) | 31.2 ns (68.79× the best) | 155 ns (7.79× the best) | 715 ns (1.22× the best) | 1.09 µs (1.25× the best) | 1.71 µs (1.29× the best) | 2.40 µs (1.68× the best) | 3.11 µs (2.02× the best) |
| gf2_127compare suitePornin x1: hash to addend; output already an addend | 232 ns (1.29× the best) | in the hash | 155 ns (7.79× the best) | 720 ns (1.22× the best) | 1.10 µs (1.26× the best) | 1.71 µs (1.29× the best) | 2.41 µs (1.68× the best) | 3.11 µs (2.02× the best) |
| gf2_127-lambdaincompleteλ-projective (X:L:Z) accumulators | 196 ns (1.09× the best) | 56.6 ns (124.81× the best) | 132 ns (6.60× the best) | 672 ns (1.14× the best) | 992 ns (1.14× the best) | 1.52 µs (1.14× the best) | 2.11 µs (1.47× the best) | 2.71 µs (1.76× the best) |
| gf2_127-lambdaincompletecompare suitehashed straight to : no prepare | 179 ns (best) | in the hash | 132 ns (6.60× the best) | 599 ns (1.02× the best) | 919 ns (1.05× the best) | 1.44 µs (1.09× the best) | 2.03 µs (1.42× the best) | 2.63 µs (1.71× the best) |
| gf2_127-lambdaincompletecompare suitePornin x1: hash to addend; output already an addend | 184 ns (1.03× the best) | in the hash | 132 ns (6.60× the best) | 604 ns (1.03× the best) | 924 ns (1.06× the best) | 1.45 µs (1.09× the best) | 2.04 µs (1.42× the best) | 2.64 µs (1.71× the best) |
| gf2_127-wincompleteλ-projective, w codec: hashes and decodes to λ-affine | 221 ns (1.23× the best) | 0.97 ns (2.14× the best) | 131 ns (6.58× the best) | 640 ns (1.09× the best) | 959 ns (1.10× the best) | 1.48 µs (1.12× the best) | 2.07 µs (1.45× the best) | 2.67 µs (1.73× the best) |
| gf2_127-wincompletecompare suitePornin x1: hash to addend; output already an addend | 184 ns (1.03× the best) | in the hash | 131 ns (6.58× the best) | 603 ns (1.03× the best) | 922 ns (1.06× the best) | 1.44 µs (1.09× the best) | 2.03 µs (1.42× the best) | 2.63 µs (1.71× the best) |
| gf2_127-uunscaled (X:S:Z), w codec, direct addend hashes | 258 ns (1.44× the best) | 0.98 ns (2.17× the best) | 116 ns (5.84× the best) | 634 ns (1.08× the best) | 917 ns (1.05× the best) | 1.38 µs (1.04× the best) | 1.90 µs (1.33× the best) | 2.44 µs (1.58× the best) |
| gf2_127-ucompare suitePornin x1: hash to addend; output already an addend | 213 ns (1.19× the best) | in the hash | 116 ns (5.84× the best) | 588 ns (best) | 871 ns (best) | 1.34 µs (1.01× the best) | 1.86 µs (1.30× the best) | 2.39 µs (1.55× the best) |
| GF(2^122) = GF(2^61)[u], dense constant, 16 bytes | ||||||||
| gf2_122(X:S:Z:T) extended | 350 ns (1.96× the best) | 63.1 ns (139.03× the best) | 263 ns (13.20× the best) | 1.21 µs (2.07× the best) | 1.85 µs (2.12× the best) | 2.89 µs (2.17× the best) | 4.05 µs (2.83× the best) | 5.23 µs (3.40× the best) |
| gf2_122compare suitePornin x1: hash to addend; output already an addend | 510 ns (2.85× the best) | in the hash | 263 ns (13.20× the best) | 1.31 µs (2.23× the best) | 1.95 µs (2.23× the best) | 2.98 µs (2.24× the best) | 4.15 µs (2.90× the best) | 5.32 µs (3.46× the best) |
| gf2_122-lambdaincompleteλ-projective | 350 ns (1.95× the best) | 100 ns (220.88× the best) | 217 ns (10.90× the best) | 1.12 µs (1.90× the best) | 1.64 µs (1.88× the best) | 2.50 µs (1.88× the best) | 3.46 µs (2.42× the best) | 4.44 µs (2.88× the best) |
| gf2_122-lambdaincompletecompare suitehashed straight to : no prepare | 361 ns (2.02× the best) | in the hash | 217 ns (10.90× the best) | 1.03 µs (1.75× the best) | 1.55 µs (1.78× the best) | 2.41 µs (1.81× the best) | 3.38 µs (2.36× the best) | 4.35 µs (2.83× the best) |
| gf2_122-lambdaincompletecompare suitePornin x1: hash to addend; output already an addend | 428 ns (2.39× the best) | in the hash | 217 ns (10.90× the best) | 1.10 µs (1.86× the best) | 1.62 µs (1.86× the best) | 2.48 µs (1.86× the best) | 3.44 µs (2.41× the best) | 4.42 µs (2.87× the best) |
| gf2_122-wincompleteλ-projective, w codec | 328 ns (1.83× the best) | 0.99 ns (2.17× the best) | 211 ns (10.58× the best) | 977 ns (1.66× the best) | 1.49 µs (1.71× the best) | 2.32 µs (1.75× the best) | 3.26 µs (2.28× the best) | 4.20 µs (2.73× the best) |
| gf2_122-wincompletecompare suitePornin x1: hash to addend; output already an addend | 429 ns (2.39× the best) | in the hash | 211 ns (10.58× the best) | 1.08 µs (1.83× the best) | 1.59 µs (1.82× the best) | 2.42 µs (1.82× the best) | 3.36 µs (2.35× the best) | 4.30 µs (2.80× the best) |
| gf2_122-uunscaled (X:S:Z), w codec | 391 ns (2.18× the best) | 0.99 ns (2.17× the best) | 183 ns (9.19× the best) | 961 ns (1.63× the best) | 1.40 µs (1.61× the best) | 2.13 µs (1.60× the best) | 2.95 µs (2.06× the best) | 3.77 µs (2.45× the best) |
| gf2_122-ucompare suitePornin x1: hash to addend; output already an addend | 622 ns (3.47× the best) | in the hash | 183 ns (9.19× the best) | 1.19 µs (2.03× the best) | 1.63 µs (1.88× the best) | 2.36 µs (1.78× the best) | 3.18 µs (2.22× the best) | 4.00 µs (2.60× the best) |
| GF(2^122), constant in GF(2^61) (GLS-shaped), 16 bytes | ||||||||
| gf2_122-gls(X:S:Z:T) extended | 309 ns (1.72× the best) | 44.3 ns (97.56× the best) | 246 ns (12.33× the best) | 1.10 µs (1.88× the best) | 1.70 µs (1.95× the best) | 2.67 µs (2.01× the best) | 3.76 µs (2.62× the best) | 4.86 µs (3.15× the best) |
| gf2_122-glscompare suitePornin x1: hash to addend; output already an addend | 410 ns (2.29× the best) | in the hash | 246 ns (12.33× the best) | 1.16 µs (1.97× the best) | 1.75 µs (2.01× the best) | 2.72 µs (2.05× the best) | 3.81 µs (2.66× the best) | 4.91 µs (3.19× the best) |
| gf2_122-gls-lambdaincompleteλ-projective | 315 ns (1.76× the best) | 101 ns (221.53× the best) | 216 ns (10.85× the best) | 1.08 µs (1.84× the best) | 1.60 µs (1.84× the best) | 2.46 µs (1.85× the best) | 3.42 µs (2.39× the best) | 4.39 µs (2.85× the best) |
| gf2_122-gls-lambdaincompletecompare suitehashed straight to : no prepare | 327 ns (1.82× the best) | in the hash | 216 ns (10.85× the best) | 992 ns (1.69× the best) | 1.51 µs (1.74× the best) | 2.37 µs (1.78× the best) | 3.33 µs (2.33× the best) | 4.30 µs (2.79× the best) |
| gf2_122-gls-lambdaincompletecompare suitePornin x1: hash to addend; output already an addend | 404 ns (2.25× the best) | in the hash | 216 ns (10.85× the best) | 1.07 µs (1.82× the best) | 1.59 µs (1.83× the best) | 2.45 µs (1.84× the best) | 3.41 µs (2.38× the best) | 4.38 µs (2.84× the best) |
| gf2_122-gls-wincompleteλ-projective, w codec | 311 ns (1.73× the best) | 0.97 ns (2.14× the best) | 217 ns (10.87× the best) | 977 ns (1.66× the best) | 1.50 µs (1.72× the best) | 2.36 µs (1.77× the best) | 3.32 µs (2.32× the best) | 4.29 µs (2.79× the best) |
| gf2_122-gls-wincompletecompare suitePornin x1: hash to addend; output already an addend | 404 ns (2.25× the best) | in the hash | 217 ns (10.87× the best) | 1.07 µs (1.82× the best) | 1.59 µs (1.83× the best) | 2.45 µs (1.84× the best) | 3.41 µs (2.38× the best) | 4.38 µs (2.85× the best) |
| gf2_122-gls-uunscaled (X:S:Z), w codec | 359 ns (2.00× the best) | 1.01 ns (2.22× the best) | 182 ns (9.16× the best) | 927 ns (1.58× the best) | 1.37 µs (1.57× the best) | 2.09 µs (1.57× the best) | 2.90 µs (2.03× the best) | 3.73 µs (2.42× the best) |
| gf2_122-gls-ucompare suitePornin x1: hash to addend; output already an addend | 593 ns (3.31× the best) | in the hash | 182 ns (9.16× the best) | 1.16 µs (1.97× the best) | 1.60 µs (1.84× the best) | 2.32 µs (1.75× the best) | 3.14 µs (2.19× the best) | 3.96 µs (2.57× the best) |
| GF(2^109), 14 bytes | ||||||||
| gf2_109(X:S:Z:T) extended | 518 ns (2.89× the best) | 95.7 ns (210.88× the best) | 403 ns (20.23× the best) | 1.82 µs (3.10× the best) | 2.79 µs (3.20× the best) | 4.37 µs (3.29× the best) | 6.15 µs (4.30× the best) | 7.94 µs (5.16× the best) |
| gf2_109compare suitePornin x1: hash to addend; output already an addend | 636 ns (3.55× the best) | in the hash | 403 ns (20.23× the best) | 1.84 µs (3.13× the best) | 2.81 µs (3.23× the best) | 4.39 µs (3.31× the best) | 6.17 µs (4.31× the best) | 7.96 µs (5.17× the best) |
| gf2_109-lambdaincompleteλ-projective | 517 ns (2.88× the best) | 147 ns (324.46× the best) | 331 ns (16.63× the best) | 1.66 µs (2.83× the best) | 2.46 µs (2.82× the best) | 3.76 µs (2.83× the best) | 5.23 µs (3.65× the best) | 6.70 µs (4.36× the best) |
| gf2_109-lambdaincompletecompare suitehashed straight to : no prepare | 511 ns (2.85× the best) | in the hash | 331 ns (16.63× the best) | 1.51 µs (2.57× the best) | 2.31 µs (2.65× the best) | 3.61 µs (2.72× the best) | 5.07 µs (3.55× the best) | 6.55 µs (4.26× the best) |
| gf2_109-lambdaincompletecompare suitePornin x1: hash to addend; output already an addend | 521 ns (2.91× the best) | in the hash | 331 ns (16.63× the best) | 1.52 µs (2.59× the best) | 2.32 µs (2.66× the best) | 3.62 µs (2.72× the best) | 5.09 µs (3.55× the best) | 6.56 µs (4.26× the best) |
| gf2_109-wincompleteλ-projective, w codec | 516 ns (2.88× the best) | 0.97 ns (2.14× the best) | 332 ns (16.67× the best) | 1.52 µs (2.58× the best) | 2.32 µs (2.66× the best) | 3.62 µs (2.73× the best) | 5.09 µs (3.56× the best) | 6.57 µs (4.27× the best) |
| gf2_109-wincompletecompare suitePornin x1: hash to addend; output already an addend | 522 ns (2.92× the best) | in the hash | 332 ns (16.67× the best) | 1.52 µs (2.59× the best) | 2.32 µs (2.67× the best) | 3.63 µs (2.73× the best) | 5.10 µs (3.56× the best) | 6.58 µs (4.27× the best) |
| gf2_109-uunscaled (X:S:Z), w codec | 592 ns (3.30× the best) | 0.98 ns (2.16× the best) | 289 ns (14.53× the best) | 1.47 µs (2.50× the best) | 2.17 µs (2.49× the best) | 3.31 µs (2.49× the best) | 4.59 µs (3.21× the best) | 5.88 µs (3.82× the best) |
| gf2_109-ucompare suitePornin x1: hash to addend; output already an addend | 593 ns (3.31× the best) | in the hash | 289 ns (14.53× the best) | 1.47 µs (2.50× the best) | 2.17 µs (2.49× the best) | 3.31 µs (2.49× the best) | 4.59 µs (3.21× the best) | 5.88 µs (3.82× the best) |
| F_p, p = 2^127 − 1, 16 bytes | ||||||||
| edwards127a = 1 Edwards, extended += cached | 1.06 µs (5.94× the best) | 27.2 ns (59.99× the best) | 19.9 ns (best) | 1.19 µs (2.02× the best) | 1.24 µs (1.42× the best) | 1.33 µs (best) | 1.43 µs (best) | 1.54 µs (best) |
| weier127short Weierstrass, projective += affine | 1.03 µs (5.75× the best) | 0.45 ns (tied for the best, within noise) | 44.7 ns (2.24× the best) | 1.20 µs (2.04× the best) | 1.31 µs (1.51× the best) | 1.50 µs (1.13× the best) | 1.71 µs (1.19× the best) | 1.92 µs (1.25× the best) |
| weier127-jacobianincompleteshort Weierstrass, Jacobian += affine | 1.00 µs (5.60× the best) | 0.46 ns (tied for the best, within noise, 1.01×) | 36.6 ns (1.84× the best) | 1.15 µs (1.95× the best) | 1.24 µs (1.42× the best) | 1.39 µs (1.05× the best) | 1.57 µs (1.10× the best) | 1.75 µs (1.14× 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) | : | : | : | : | : | |
| GF(2^127), 16 bytes | ||||||||
| gf2_127(X:S:Z:T) extended accumulators, Pornin's formulas | 890 ns (1.57× the best) | 31.6 ns (54.91× the best) | 155 ns (7.79× the best) | 1.41 µs (1.45× the best) | 1.79 µs (1.42× the best) | 2.40 µs (1.69× the best) | 3.10 µs (1.94× the best) | 3.80 µs (2.14× the best) |
| gf2_127compare suitePornin x1: hash to addend; output already an addend | 619 ns (1.09× the best) | in the hash | 155 ns (7.79× the best) | 1.11 µs (1.14× the best) | 1.48 µs (1.18× the best) | 2.10 µs (1.48× the best) | 2.79 µs (1.75× the best) | 3.50 µs (1.97× the best) |
| gf2_127compare suitePornin x2: hash to addend; output already an addend | 1.35 µs (2.38× the best) | in the hash | 155 ns (7.79× the best) | 1.84 µs (1.89× the best) | 2.22 µs (1.76× the best) | 2.83 µs (1.99× the best) | 3.53 µs (2.21× the best) | 4.23 µs (2.38× the best) |
| gf2_127-lambdaincompleteλ-projective (X:L:Z) accumulators | 880 ns (1.55× the best) | 412 ns (716.46× the best) | 132 ns (6.60× the best) | 1.71 µs (1.76× the best) | 2.03 µs (1.62× the best) | 2.56 µs (1.80× the best) | 3.15 µs (1.97× the best) | 3.75 µs (2.10× the best) |
| gf2_127-lambdaincompletecompare suitehashed straight to : no prepare | 870 ns (1.53× the best) | in the hash | 132 ns (6.60× the best) | 1.29 µs (1.33× the best) | 1.61 µs (1.28× the best) | 2.13 µs (1.50× the best) | 2.72 µs (1.71× the best) | 3.32 µs (1.87× the best) |
| gf2_127-lambdaincompletecompare suitePornin x1: hash to addend; output already an addend | 567 ns (tied for the best, within noise) | in the hash | 132 ns (6.60× the best) | 987 ns (1.01× the best) | 1.31 µs (1.04× the best) | 1.83 µs (1.29× the best) | 2.42 µs (1.52× the best) | 3.02 µs (1.70× the best) |
| gf2_127-wincompleteλ-projective, w codec: hashes and decodes to λ-affine | 975 ns (1.72× the best) | 0.62 ns (1.07× the best) | 131 ns (6.58× the best) | 1.39 µs (1.43× the best) | 1.71 µs (1.36× the best) | 2.24 µs (1.57× the best) | 2.82 µs (1.77× the best) | 3.42 µs (1.92× the best) |
| gf2_127-wincompletecompare suitePornin x1: hash to addend; output already an addend | 569 ns (tied for the best, within noise, 1.00×) | in the hash | 131 ns (6.58× the best) | 987 ns (1.01× the best) | 1.31 µs (1.04× the best) | 1.83 µs (1.29× the best) | 2.42 µs (1.51× the best) | 3.01 µs (1.69× the best) |
| gf2_127-uunscaled (X:S:Z), w codec, direct addend hashes | 1.00 µs (1.77× the best) | 0.62 ns (1.07× the best) | 116 ns (5.84× the best) | 1.38 µs (1.42× the best) | 1.66 µs (1.32× the best) | 2.13 µs (1.49× the best) | 2.65 µs (1.66× the best) | 3.18 µs (1.79× the best) |
| gf2_127-ucompare suitePornin x1: hash to addend; output already an addend | 598 ns (1.05× the best) | in the hash | 116 ns (5.84× the best) | 973 ns (best) | 1.26 µs (best) | 1.72 µs (1.21× the best) | 2.24 µs (1.40× the best) | 2.78 µs (1.56× the best) |
| GF(2^122) = GF(2^61)[u], dense constant, 16 bytes | ||||||||
| gf2_122(X:S:Z:T) extended | 1.16 µs (2.05× the best) | 64.2 ns (111.60× the best) | 263 ns (13.20× the best) | 2.03 µs (2.08× the best) | 2.66 µs (2.12× the best) | 3.70 µs (2.60× the best) | 4.87 µs (3.05× the best) | 6.04 µs (3.40× the best) |
| gf2_122compare suitePornin x1: hash to addend; output already an addend | 897 ns (1.58× the best) | in the hash | 263 ns (13.20× the best) | 1.70 µs (1.74× the best) | 2.33 µs (1.86× the best) | 3.37 µs (2.37× the best) | 4.53 µs (2.84× the best) | 5.71 µs (3.21× the best) |
| gf2_122-lambdaincompleteλ-projective | 1.18 µs (2.08× the best) | 521 ns (906.55× the best) | 217 ns (10.90× the best) | 2.37 µs (2.44× the best) | 2.90 µs (2.30× the best) | 3.75 µs (2.64× the best) | 4.72 µs (2.95× the best) | 5.69 µs (3.20× the best) |
| gf2_122-lambdaincompletecompare suitehashed straight to : no prepare | 1.18 µs (2.07× the best) | in the hash | 217 ns (10.90× the best) | 1.84 µs (1.89× the best) | 2.37 µs (1.88× the best) | 3.23 µs (2.27× the best) | 4.19 µs (2.62× the best) | 5.16 µs (2.90× the best) |
| gf2_122-lambdaincompletecompare suitePornin x1: hash to addend; output already an addend | 801 ns (1.41× the best) | in the hash | 217 ns (10.90× the best) | 1.47 µs (1.51× the best) | 1.99 µs (1.59× the best) | 2.85 µs (2.00× the best) | 3.82 µs (2.39× the best) | 4.79 µs (2.69× the best) |
| gf2_122-wincompleteλ-projective, w codec | 1.21 µs (2.14× the best) | 0.62 ns (1.07× the best) | 211 ns (10.58× the best) | 1.86 µs (1.92× the best) | 2.37 µs (1.89× the best) | 3.21 µs (2.25× the best) | 4.14 µs (2.59× the best) | 5.09 µs (2.86× the best) |
| gf2_122-wincompletecompare suitePornin x1: hash to addend; output already an addend | 799 ns (1.41× the best) | in the hash | 211 ns (10.58× the best) | 1.45 µs (1.49× the best) | 1.96 µs (1.56× the best) | 2.79 µs (1.96× the best) | 3.73 µs (2.33× the best) | 4.67 µs (2.63× the best) |
| gf2_122-uunscaled (X:S:Z), w codec | 1.27 µs (2.25× the best) | 0.62 ns (1.07× the best) | 183 ns (9.19× the best) | 1.84 µs (1.90× the best) | 2.29 µs (1.82× the best) | 3.01 µs (2.12× the best) | 3.83 µs (2.40× the best) | 4.65 µs (2.62× the best) |
| gf2_122-ucompare suitePornin x1: hash to addend; output already an addend | 857 ns (1.51× the best) | in the hash | 183 ns (9.19× the best) | 1.43 µs (1.47× the best) | 1.87 µs (1.49× the best) | 2.59 µs (1.82× the best) | 3.41 µs (2.13× the best) | 4.24 µs (2.38× the best) |
| GF(2^122), constant in GF(2^61) (GLS-shaped), 16 bytes | ||||||||
| gf2_122-gls(X:S:Z:T) extended | 1.20 µs (2.12× the best) | 44.2 ns (76.84× the best) | 246 ns (12.33× the best) | 2.00 µs (2.05× the best) | 2.59 µs (2.06× the best) | 3.56 µs (2.50× the best) | 4.65 µs (2.91× the best) | 5.75 µs (3.23× the best) |
| gf2_122-glscompare suitePornin x1: hash to addend; output already an addend | 865 ns (1.53× the best) | in the hash | 246 ns (12.33× the best) | 1.62 µs (1.66× the best) | 2.21 µs (1.76× the best) | 3.18 µs (2.23× the best) | 4.27 µs (2.67× the best) | 5.37 µs (3.02× the best) |
| gf2_122-gls-lambdaincompleteλ-projective | 1.18 µs (2.08× the best) | 524 ns (911.40× the best) | 216 ns (10.85× the best) | 2.37 µs (2.43× the best) | 2.89 µs (2.30× the best) | 3.74 µs (2.63× the best) | 4.70 µs (2.94× the best) | 5.67 µs (3.19× the best) |
| gf2_122-gls-lambdaincompletecompare suitehashed straight to : no prepare | 1.16 µs (2.05× the best) | in the hash | 216 ns (10.85× the best) | 1.82 µs (1.88× the best) | 2.35 µs (1.87× the best) | 3.20 µs (2.25× the best) | 4.16 µs (2.61× the best) | 5.13 µs (2.88× the best) |
| gf2_122-gls-lambdaincompletecompare suitePornin x1: hash to addend; output already an addend | 788 ns (1.39× the best) | in the hash | 216 ns (10.85× the best) | 1.45 µs (1.49× the best) | 1.98 µs (1.57× the best) | 2.83 µs (1.99× the best) | 3.79 µs (2.37× the best) | 4.76 µs (2.68× the best) |
| gf2_122-gls-wincompleteλ-projective, w codec | 1.24 µs (2.19× the best) | 0.62 ns (1.08× the best) | 217 ns (10.87× the best) | 1.91 µs (1.96× the best) | 2.43 µs (1.94× the best) | 3.29 µs (2.31× the best) | 4.25 µs (2.66× the best) | 5.22 µs (2.93× the best) |
| gf2_122-gls-wincompletecompare suitePornin x1: hash to addend; output already an addend | 791 ns (1.40× the best) | in the hash | 217 ns (10.87× the best) | 1.46 µs (1.50× the best) | 1.98 µs (1.58× the best) | 2.84 µs (1.99× the best) | 3.80 µs (2.38× the best) | 4.77 µs (2.68× the best) |
| gf2_122-gls-uunscaled (X:S:Z), w codec | 1.25 µs (2.20× the best) | 0.62 ns (1.07× the best) | 182 ns (9.16× the best) | 1.82 µs (1.87× the best) | 2.26 µs (1.80× the best) | 2.98 µs (2.10× the best) | 3.79 µs (2.37× the best) | 4.62 µs (2.59× the best) |
| gf2_122-gls-ucompare suitePornin x1: hash to addend; output already an addend | 843 ns (1.49× the best) | in the hash | 182 ns (9.16× the best) | 1.41 µs (1.45× the best) | 1.85 µs (1.47× the best) | 2.57 µs (1.81× the best) | 3.39 µs (2.12× the best) | 4.21 µs (2.37× the best) |
| GF(2^109), 14 bytes | ||||||||
| gf2_109(X:S:Z:T) extended | 5.86 µs (10.34× the best) | 95.3 ns (165.70× the best) | 403 ns (20.23× the best) | 7.16 µs (7.36× the best) | 8.13 µs (6.47× the best) | 9.72 µs (6.83× the best) | 11.5 µs (7.19× the best) | 13.3 µs (7.46× the best) |
| gf2_109compare suitePornin x1: hash to addend; output already an addend | 3.39 µs (5.98× the best) | in the hash | 403 ns (20.23× the best) | 4.60 µs (4.72× the best) | 5.57 µs (4.43× the best) | 7.15 µs (5.03× the best) | 8.93 µs (5.59× the best) | 10.7 µs (6.02× the best) |
| gf2_109-lambdaincompleteλ-projective | 5.87 µs (10.35× the best) | 2.86 µs (4982.19× the best) | 331 ns (16.63× the best) | 9.73 µs (10.00× the best) | 10.5 µs (8.38× the best) | 11.8 µs (8.32× the best) | 13.3 µs (8.32× the best) | 14.8 µs (8.30× the best) |
| gf2_109-lambdaincompletecompare suitehashed straight to : no prepare | 5.85 µs (10.31× the best) | in the hash | 331 ns (16.63× the best) | 6.84 µs (7.03× the best) | 7.64 µs (6.08× the best) | 8.95 µs (6.29× the best) | 10.4 µs (6.52× the best) | 11.9 µs (6.68× the best) |
| gf2_109-lambdaincompletecompare suitePornin x1: hash to addend; output already an addend | 3.28 µs (5.78× the best) | in the hash | 331 ns (16.63× the best) | 4.28 µs (4.40× the best) | 5.07 µs (4.04× the best) | 6.38 µs (4.48× the best) | 7.84 µs (4.91× the best) | 9.32 µs (5.24× the best) |
| gf2_109-wincompleteλ-projective, w codec | 5.78 µs (10.20× the best) | 0.62 ns (1.08× the best) | 332 ns (16.67× the best) | 6.78 µs (6.97× the best) | 7.58 µs (6.03× the best) | 8.89 µs (6.25× the best) | 10.4 µs (6.48× the best) | 11.8 µs (6.65× the best) |
| gf2_109-wincompletecompare suitePornin x1: hash to addend; output already an addend | 3.27 µs (5.77× the best) | in the hash | 332 ns (16.67× the best) | 4.28 µs (4.39× the best) | 5.07 µs (4.04× the best) | 6.38 µs (4.49× the best) | 7.85 µs (4.91× the best) | 9.33 µs (5.24× the best) |
| gf2_109-uunscaled (X:S:Z), w codec | 5.87 µs (10.36× the best) | 0.62 ns (1.08× the best) | 289 ns (14.53× the best) | 6.75 µs (6.94× the best) | 7.45 µs (5.93× the best) | 8.59 µs (6.04× the best) | 9.87 µs (6.18× the best) | 11.2 µs (6.27× the best) |
| gf2_109-ucompare suitePornin x1: hash to addend; output already an addend | 3.34 µs (5.89× the best) | in the hash | 289 ns (14.53× the best) | 4.22 µs (4.33× the best) | 4.91 µs (3.91× the best) | 6.05 µs (4.26× the best) | 7.34 µs (4.59× the best) | 8.63 µs (4.85× the best) |
| F_p, p = 2^127 − 1, 16 bytes | ||||||||
| edwards127a = 1 Edwards, extended += cached | 1.07 µs (1.88× the best) | 573 ns (996.17× the best) | 19.9 ns (tied for the best, within noise) | 1.73 µs (1.78× the best) | 1.79 µs (1.42× the best) | 1.88 µs (1.32× the best) | 1.98 µs (1.24× the best) | 2.09 µs (1.17× the best) |
| edwards127compare suiteElligator 2 x1: hash + prepare | 1.32 µs (2.33× the best) | 573 ns (996.17× the best) | 19.9 ns (tied for the best, within noise) | 1.99 µs (2.05× the best) | 2.04 µs (1.63× the best) | 2.13 µs (1.50× the best) | 2.23 µs (1.40× the best) | 2.34 µs (1.32× the best) |
| weier127short Weierstrass, projective += affine | 1.03 µs (1.82× the best) | 0.58 ns (tied for the best, within noise) | 44.7 ns (2.24× the best) | 1.20 µs (1.23× the best) | 1.31 µs (1.04× the best) | 1.50 µs (1.05× the best) | 1.71 µs (1.07× the best) | 1.93 µs (1.08× the best) |
| weier127compare suiteSSWU x1: hash + prepare | 1.12 µs (1.98× the best) | 0.58 ns (tied for the best, within noise) | 44.7 ns (2.24× the best) | 1.29 µs (1.33× the best) | 1.40 µs (1.12× the best) | 1.59 µs (1.12× the best) | 1.80 µs (1.13× the best) | 2.02 µs (1.13× the best) |
| weier127-jacobianincompleteshort Weierstrass, Jacobian += affine | 1.03 µs (1.82× the best) | 0.57 ns (tied for the best, within noise) | 36.6 ns (1.84× the best) | 1.18 µs (1.21× the best) | 1.27 µs (1.01× the best) | 1.42 µs (best) | 1.60 µs (best) | 1.78 µs (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 | 890 ns | 196 ns (best) | 4.5× | 2 | 31.6 ns | 31.2 ns (68.79× the best) | 1.0× | 0 | 462 ns | 106 ns (10.64× the best) | 4.4× | 1 | 446 ns | 88.0 ns (tied for the best, within noise) | 5.1× | 1 |
| gf2_127-lambdaincompleteλ-projective (X:L:Z) accumulators | 880 ns | 196 ns (1.00× the best) | 4.5× | 2 | 412 ns | 56.6 ns (124.81× the best) | 7.3× | 1 | 442 ns | 87.0 ns (8.72× the best) | 5.1× | 1 | 447 ns | 87.9 ns (tied for the best, within noise) | 5.1× | 1 |
| gf2_127-wincompleteλ-projective, w codec: hashes and decodes to λ-affine | 975 ns | 221 ns (1.13× the best) | 4.4× | 2.2 | 0.62 ns | 0.97 ns (2.14× the best) | 0.6× | 0 | 432 ns | 76.5 ns (7.67× the best) | 5.7× | 1 | 447 ns | 89.2 ns (1.01× the best) | 5.0× | 1 |
| gf2_127-uunscaled (X:S:Z), w codec, direct addend hashes | 1.00 µs | 258 ns (1.32× the best) | 3.9× | 2.1 | 0.62 ns | 0.98 ns (2.17× the best) | 0.6× | 0 | 438 ns | 76.5 ns (7.67× the best) | 5.7× | 1 | 479 ns | 121 ns (1.38× the best) | 4.0× | 1 |
| GF(2^122) = GF(2^61)[u], dense constant, 16 bytes | ||||||||||||||||
| gf2_122(X:S:Z:T) extended | 1.16 µs | 350 ns (1.79× the best) | 3.3× | 1.9 | 64.2 ns | 63.1 ns (139.03× the best) | 1.0× | 0 | 618 ns | 202 ns (20.28× the best) | 3.1× | 1 | 607 ns | 187 ns (2.12× the best) | 3.3× | 1 |
| gf2_122-lambdaincompleteλ-projective | 1.18 µs | 350 ns (1.79× the best) | 3.4× | 2 | 521 ns | 100 ns (220.88× the best) | 5.2× | 1 | 573 ns | 156 ns (15.63× the best) | 3.7× | 1 | 607 ns | 186 ns (2.12× the best) | 3.3× | 1 |
| gf2_122-wincompleteλ-projective, w codec | 1.21 µs | 328 ns (1.67× the best) | 3.7× | 2.1 | 0.62 ns | 0.99 ns (2.17× the best) | 0.6× | 0 | 551 ns | 130 ns (13.07× the best) | 4.2× | 1 | 601 ns | 153 ns (1.74× the best) | 3.9× | 1.1 |
| gf2_122-uunscaled (X:S:Z), w codec | 1.27 µs | 391 ns (2.00× the best) | 3.3× | 2.1 | 0.62 ns | 0.99 ns (2.17× the best) | 0.6× | 0 | 564 ns | 132 ns (13.26× the best) | 4.3× | 1 | 676 ns | 204 ns (2.32× the best) | 3.3× | 1.1 |
| GF(2^122), constant in GF(2^61) (GLS-shaped), 16 bytes | ||||||||||||||||
| gf2_122-gls(X:S:Z:T) extended | 1.20 µs | 309 ns (1.58× the best) | 3.9× | 2.1 | 44.2 ns | 44.3 ns (97.56× the best) | 1.0× | 0 | 612 ns | 194 ns (19.45× the best) | 3.2× | 1 | 592 ns | 162 ns (1.85× the best) | 3.7× | 1 |
| gf2_122-gls-lambdaincompleteλ-projective | 1.18 µs | 315 ns (1.61× the best) | 3.7× | 2.1 | 524 ns | 101 ns (221.53× the best) | 5.2× | 1 | 576 ns | 156 ns (15.63× the best) | 3.7× | 1 | 599 ns | 163 ns (1.85× the best) | 3.7× | 1 |
| gf2_122-gls-wincompleteλ-projective, w codec | 1.24 µs | 311 ns (1.59× the best) | 4.0× | 2.2 | 0.62 ns | 0.97 ns (2.14× the best) | 0.6× | 0 | 555 ns | 130 ns (13.01× the best) | 4.3× | 1 | 591 ns | 138 ns (1.57× the best) | 4.3× | 1.1 |
| gf2_122-gls-uunscaled (X:S:Z), w codec | 1.25 µs | 359 ns (1.83× the best) | 3.5× | 2.1 | 0.62 ns | 1.01 ns (2.22× the best) | 0.6× | 0 | 562 ns | 133 ns (13.32× the best) | 4.2× | 1 | 639 ns | 187 ns (2.13× the best) | 3.4× | 1.1 |
| GF(2^109), 14 bytes | ||||||||||||||||
| gf2_109(X:S:Z:T) extended | 5.86 µs | 518 ns (2.65× the best) | 11.3× | 2 | 95.3 ns | 95.7 ns (210.88× the best) | 1.0× | 0 | 3.03 µs | 306 ns (30.66× the best) | 9.9× | 1 | 2.98 µs | 263 ns (2.99× the best) | 11.3× | 1 |
| gf2_109-lambdaincompleteλ-projective | 5.87 µs | 517 ns (2.64× the best) | 11.4× | 2 | 2.86 µs | 147 ns (324.46× the best) | 19.4× | 1 | 2.95 µs | 221 ns (22.20× the best) | 13.3× | 1 | 2.98 µs | 263 ns (2.99× the best) | 11.3× | 1 |
| gf2_109-wincompleteλ-projective, w codec | 5.78 µs | 516 ns (2.64× the best) | 11.2× | 1.9 | 0.62 ns | 0.97 ns (2.14× the best) | 0.6× | 0 | 2.90 µs | 204 ns (20.42× the best) | 14.2× | 1 | 2.96 µs | 240 ns (2.73× the best) | 12.3× | 1 |
| gf2_109-uunscaled (X:S:Z), w codec | 5.87 µs | 592 ns (3.02× the best) | 9.9× | 1.9 | 0.62 ns | 0.98 ns (2.16× the best) | 0.6× | 0 | 2.95 µs | 206 ns (20.63× the best) | 14.3× | 1 | 3.04 µs | 319 ns (3.62× the best) | 9.6× | 1 |
| F_p, p = 2^127 − 1, 16 bytes | ||||||||||||||||
| edwards127a = 1 Edwards, extended += cached | 1.07 µs | 1.06 µs (5.44× the best) | 1.0× | 0 | 573 ns | 27.2 ns (59.99× the best) | 21.0× | 1.1 | 536 ns | 21.7 ns (2.18× the best) | 24.7× | 1 | 485 ns | 485 ns (5.51× the best) | 1.0× | 0 |
| weier127short Weierstrass, projective += affine | 1.03 µs | 1.03 µs (5.27× the best) | 1.0× | 0 | 0.58 ns | 0.45 ns (best) | 1.3× | 0 | 527 ns | 9.97 ns (best) | 52.9× | 1 | 487 ns | 484 ns (5.51× the best) | 1.0× | 0 |
| weier127-jacobianincompleteshort Weierstrass, Jacobian += affine | 1.03 µs | 1.00 µs (5.12× the best) | 1.0× | 0.1 | 0.57 ns | 0.46 ns (1.01× the best) | 1.2× | 0 | 531 ns | 15.3 ns (1.54× the best) | 34.7× | 1 | 484 ns | 483 ns (5.49× 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 | 890 ns (1.01× the best) | 196 ns (tied for the best, within noise) | 31.6 ns (54.91× the best) | 31.2 ns (68.79× the best) | 462 ns (1.07× the best) | 106 ns (10.64× the best) | 446 ns (tied for the best, within noise) | 88.0 ns (tied for the best, within noise) | ||||||||
| gf2_127-lambdaincompleteλ-projective (X:L:Z) accumulators | 880 ns (best) | 430 ns (best) | 247 ns (best) | 196 ns (tied for the best, within noise, 1.00×) | 412 ns (716.46× the best) | 115 ns (81.26× the best) | 65.7 ns (121.70× the best) | 56.6 ns (124.81× the best) | 442 ns (1.02× the best) | 146 ns (1.72× the best) | 95.8 ns (4.70× the best) | 87.0 ns (8.72× the best) | 447 ns (tied for the best, within noise, 1.00×) | 149 ns (best) | 96.8 ns (best) | 87.9 ns (tied for the best, within noise) |
| gf2_127-wincompleteλ-projective, w codec: hashes and decodes to λ-affine | 975 ns (1.11× the best) | 467 ns (1.08× the best) | 278 ns (1.13× the best) | 221 ns (1.13× the best) | 0.62 ns (1.07× the best) | 1.85 ns (1.31× the best) | 1.01 ns (1.88× the best) | 0.97 ns (2.14× the best) | 432 ns (best) | 135 ns (1.59× the best) | 85.1 ns (4.18× the best) | 76.5 ns (7.67× the best) | 447 ns (tied for the best, within noise, 1.00×) | 153 ns (1.02× the best) | 97.8 ns (1.01× the best) | 89.2 ns (1.01× the best) |
| gf2_127-uunscaled (X:S:Z), w codec, direct addend hashes | 1.00 µs (1.14× the best) | 515 ns (1.20× the best) | 313 ns (1.27× the best) | 258 ns (1.32× the best) | 0.62 ns (1.07× the best) | 1.85 ns (1.30× the best) | 1.01 ns (1.87× the best) | 0.98 ns (2.17× the best) | 438 ns (1.01× the best) | 131 ns (1.54× the best) | 85.9 ns (4.22× the best) | 76.5 ns (7.67× the best) | 479 ns (1.07× the best) | 185 ns (1.24× the best) | 131 ns (1.35× the best) | 121 ns (1.38× the best) |
| GF(2^122) = GF(2^61)[u], dense constant, 16 bytes | ||||||||||||||||
| gf2_122(X:S:Z:T) extended | 1.16 µs (1.32× the best) | 350 ns (1.79× the best) | 64.2 ns (111.60× the best) | 63.1 ns (139.03× the best) | 618 ns (1.43× the best) | 202 ns (20.28× the best) | 607 ns (1.36× the best) | 187 ns (2.12× the best) | ||||||||
| gf2_122-lambdaincompleteλ-projective | 1.18 µs (1.34× the best) | 350 ns (1.79× the best) | 521 ns (906.55× the best) | 100 ns (220.88× the best) | 573 ns (1.33× the best) | 156 ns (15.63× the best) | 607 ns (1.36× the best) | 186 ns (2.12× the best) | ||||||||
| gf2_122-wincompleteλ-projective, w codec | 1.21 µs (1.38× the best) | 328 ns (1.67× the best) | 0.62 ns (1.07× the best) | 0.99 ns (2.17× the best) | 551 ns (1.28× the best) | 130 ns (13.07× the best) | 601 ns (1.35× the best) | 153 ns (1.74× the best) | ||||||||
| gf2_122-uunscaled (X:S:Z), w codec | 1.27 µs (1.45× the best) | 391 ns (2.00× the best) | 0.62 ns (1.07× the best) | 0.99 ns (2.17× the best) | 564 ns (1.31× the best) | 132 ns (13.26× the best) | 676 ns (1.51× the best) | 204 ns (2.32× the best) | ||||||||
| GF(2^122), constant in GF(2^61) (GLS-shaped), 16 bytes | ||||||||||||||||
| gf2_122-gls(X:S:Z:T) extended | 1.20 µs (1.37× the best) | 309 ns (1.58× the best) | 44.2 ns (76.84× the best) | 44.3 ns (97.56× the best) | 612 ns (1.42× the best) | 194 ns (19.45× the best) | 592 ns (1.33× the best) | 162 ns (1.85× the best) | ||||||||
| gf2_122-gls-lambdaincompleteλ-projective | 1.18 µs (1.34× the best) | 315 ns (1.61× the best) | 524 ns (911.40× the best) | 101 ns (221.53× the best) | 576 ns (1.33× the best) | 156 ns (15.63× the best) | 599 ns (1.34× the best) | 163 ns (1.85× the best) | ||||||||
| gf2_122-gls-wincompleteλ-projective, w codec | 1.24 µs (1.41× the best) | 311 ns (1.59× the best) | 0.62 ns (1.08× the best) | 0.97 ns (2.14× the best) | 555 ns (1.28× the best) | 130 ns (13.01× the best) | 591 ns (1.32× the best) | 138 ns (1.57× the best) | ||||||||
| gf2_122-gls-uunscaled (X:S:Z), w codec | 1.25 µs (1.42× the best) | 359 ns (1.83× the best) | 0.62 ns (1.07× the best) | 1.01 ns (2.22× the best) | 562 ns (1.30× the best) | 133 ns (13.32× the best) | 639 ns (1.43× the best) | 187 ns (2.13× the best) | ||||||||
| GF(2^109), 14 bytes | ||||||||||||||||
| gf2_109(X:S:Z:T) extended | 5.86 µs (6.66× the best) | 518 ns (2.65× the best) | 95.3 ns (165.70× the best) | 95.7 ns (210.88× the best) | 3.03 µs (7.00× the best) | 306 ns (30.66× the best) | 2.98 µs (6.67× the best) | 263 ns (2.99× the best) | ||||||||
| gf2_109-lambdaincompleteλ-projective | 5.87 µs (6.67× the best) | 517 ns (2.64× the best) | 2.86 µs (4982.19× the best) | 147 ns (324.46× the best) | 2.95 µs (6.82× the best) | 221 ns (22.20× the best) | 2.98 µs (6.68× the best) | 263 ns (2.99× the best) | ||||||||
| gf2_109-wincompleteλ-projective, w codec | 5.78 µs (6.57× the best) | 516 ns (2.64× the best) | 0.62 ns (1.08× the best) | 0.97 ns (2.14× the best) | 2.90 µs (6.70× the best) | 204 ns (20.42× the best) | 2.96 µs (6.64× the best) | 240 ns (2.73× the best) | ||||||||
| gf2_109-uunscaled (X:S:Z), w codec | 5.87 µs (6.67× the best) | 592 ns (3.02× the best) | 0.62 ns (1.08× the best) | 0.98 ns (2.16× the best) | 2.95 µs (6.82× the best) | 206 ns (20.63× the best) | 3.04 µs (6.82× the best) | 319 ns (3.62× the best) | ||||||||
| F_p, p = 2^127 − 1, 16 bytes | ||||||||||||||||
| edwards127a = 1 Edwards, extended += cached | 1.07 µs (1.21× the best) | 1.07 µs (2.50× the best) | 1.07 µs (4.32× the best) | 1.06 µs (5.44× the best) | 573 ns (996.17× the best) | 105 ns (74.13× the best) | 37.1 ns (68.62× the best) | 27.2 ns (59.99× the best) | 536 ns (1.24× the best) | 99.7 ns (1.17× the best) | 32.1 ns (1.57× the best) | 21.7 ns (2.18× the best) | 485 ns (1.09× the best) | 493 ns (3.31× the best) | 487 ns (5.04× the best) | 485 ns (5.51× the best) |
| weier127short Weierstrass, projective += affine | 1.03 µs (1.17× the best) | 1.03 µs (2.40× the best) | 1.04 µs (4.19× the best) | 1.03 µs (5.27× the best) | 0.58 ns (tied for the best, within noise) | 1.42 ns (tied for the best, within noise, 1.00×) | 0.54 ns (tied for the best, within noise) | 0.45 ns (tied for the best, within noise) | 527 ns (1.22× the best) | 85.1 ns (best) | 20.4 ns (best) | 9.97 ns (best) | 487 ns (1.09× the best) | 487 ns (3.26× the best) | 482 ns (4.98× the best) | 484 ns (5.51× the best) |
| weier127-jacobianincompleteshort Weierstrass, Jacobian += affine | 1.03 µs (1.17× the best) | 1.03 µs (2.39× the best) | 1.03 µs (4.17× the best) | 1.00 µs (5.12× the best) | 0.57 ns (tied for the best, within noise) | 1.41 ns (tied for the best, within noise) | 0.54 ns (tied for the best, within noise, 1.00×) | 0.46 ns (tied for the best, within noise, 1.01×) | 531 ns (1.23× the best) | 90.0 ns (1.06× the best) | 25.8 ns (1.27× the best) | 15.3 ns (1.54× the best) | 484 ns (1.09× the best) | 485 ns (3.25× the best) | 482 ns (4.98× the best) | 483 ns (5.49× the best) |
bold: the best of its column; italic, dotted: tied with the best within the confidence intervals; shading: ratio to the best, pale yellow at 1× to purple at 16× or more; grey: baseline, not compared.
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-lambda.127, ti-addend, checksum projected in , mapping in
| lifetime | term | salted SHA-256 | projection |
|---|---|---|---|
| per item | ID, the item’s SHA-256 | 32.5 ns | 32.5 ns |
| per salt | accept the curve | not timed | not timed |
| per salt | checksum keys | 71.0 ns | 261 ns |
| per salt | mapping keys | 71.0 ns | 261 ns |
| per salt and item | hash to the addend | 176 ns | 147 ns |
| per salt and item | mapping seed | 32.9 ns | 9.40 ns |
| per salt and item | mapping walk below m = 1350 | 36.4 ns | 36.4 ns |
| per cell | add | 132 ns | 132 ns |
| per cell | encode | 87.0 ns | 87.0 ns |
| per cell | decode | 87.9 ns | 87.9 ns |
| measured | insertion per item, k = 13.57 cells | 2.04 µs | 1.98 µs |
binary-u.127, pornin-addend, checksum projected in , mapping in
| lifetime | term | salted SHA-256 | projection |
|---|---|---|---|
| per item | ID, the item’s SHA-256 | 32.5 ns | 32.5 ns |
| per salt | accept the curve | not timed | not timed |
| per salt | checksum keys | 71.0 ns | 261 ns |
| per salt | mapping keys | 71.0 ns | 261 ns |
| per salt and item | hash to the addend | 212 ns | 191 ns |
| per salt and item | mapping seed | 32.9 ns | 9.40 ns |
| per salt and item | mapping walk below m = 1350 | 36.4 ns | 36.4 ns |
| per cell | add | 116 ns | 116 ns |
| per cell | encode | 76.5 ns | 76.5 ns |
| per cell | decode | 121 ns | 121 ns |
| measured | insertion per item, k = 13.57 cells | 1.90 µs | 1.89 µs |
binary-w.127, pornin-addend, checksum projected in , mapping in
| lifetime | term | salted SHA-256 | projection |
|---|---|---|---|
| per item | ID, the item’s SHA-256 | 32.5 ns | 32.5 ns |
| per salt | accept the curve | not timed | not timed |
| per salt | checksum keys | 71.0 ns | 261 ns |
| per salt | mapping keys | 71.0 ns | 261 ns |
| per salt and item | hash to the addend | 183 ns | 162 ns |
| per salt and item | mapping seed | 32.9 ns | 9.40 ns |
| per salt and item | mapping walk below m = 1350 | 36.4 ns | 36.4 ns |
| per cell | add | 131 ns | 131 ns |
| per cell | encode | 76.5 ns | 76.5 ns |
| per cell | decode | 89.2 ns | 89.2 ns |
| measured | insertion per item, k = 13.57 cells | 2.04 µs | 2.01 µs |
edwards.127, ti, checksum projected in , mapping in
| lifetime | term | salted SHA-256 | projection |
|---|---|---|---|
| per item | ID, the item’s SHA-256 | 32.5 ns | 32.5 ns |
| per salt | accept the curve | not timed | not timed |
| per salt | checksum keys | 71.0 ns | 311 ns |
| per salt | mapping keys | 71.0 ns | 261 ns |
| per salt and item | hash to the addend | 1.10 µs | 1.05 µs |
| per salt and item | mapping seed | 32.9 ns | 9.40 ns |
| per salt and item | mapping walk below m = 1350 | 36.4 ns | 36.4 ns |
| per cell | add | 19.9 ns | 19.9 ns |
| per cell | encode | 21.7 ns | 21.7 ns |
| per cell | decode | 485 ns | 485 ns |
| measured | insertion per item, k = 13.57 cells | 1.42 µs | 1.35 µs |
weier.127, ti, checksum projected in , mapping in
| lifetime | term | salted SHA-256 | projection |
|---|---|---|---|
| per item | ID, the item’s SHA-256 | 32.5 ns | 32.5 ns |
| per salt | accept the curve | not timed | not timed |
| per salt | checksum keys | 71.0 ns | 261 ns |
| per salt | mapping keys | 71.0 ns | 261 ns |
| per salt and item | hash to the addend | 1.01 µs | 965 ns |
| per salt and item | mapping seed | 32.9 ns | 9.40 ns |
| per salt and item | mapping walk below m = 1350 | 36.4 ns | 36.4 ns |
| per cell | add | 44.7 ns | 44.7 ns |
| per cell | encode | 9.97 ns | 9.97 ns |
| per cell | decode | 484 ns | 484 ns |
| measured | insertion per item, k = 13.57 cells | 1.68 µs | 1.61 µs |
weier-jacobian.127, ti, checksum projected in , mapping in
| lifetime | term | salted SHA-256 | projection |
|---|---|---|---|
| per item | ID, the item’s SHA-256 | 32.5 ns | 32.5 ns |
| per salt | accept the curve | not timed | not timed |
| per salt | checksum keys | 71.0 ns | 261 ns |
| per salt | mapping keys | 71.0 ns | 261 ns |
| per salt and item | hash to the addend | 1.01 µs | 987 ns |
| per salt and item | mapping seed | 32.9 ns | 9.40 ns |
| per salt and item | mapping walk below m = 1350 | 36.4 ns | 36.4 ns |
| per cell | add | 36.6 ns | 36.6 ns |
| per cell | encode | 15.3 ns | 15.3 ns |
| per cell | decode | 483 ns | 483 ns |
| measured | insertion per item, k = 13.57 cells | 1.56 µs | 1.49 µs |
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 | 0.73 ns | 0.39 ns | |||||||||||||||
| GF(2^127), 16 bytes | |||||||||||||||||
| gf2_127(X:S:Z:T) extended accumulators, Pornin's formulas | 619 ns (best) | 196 ns (tied for the best, within noise) | 31.6 ns (54.91× the best) | 31.2 ns (68.79× the best) | 155 ns (7.79× the best) | 156 ns (7.05× the best) | 0.69 ns (1.07× the best) | 0.59 ns (1.76× the best) | 30.3 ns (15.83× the best) | 462 ns (1.07× the best) | 106 ns (10.64× the best) | 446 ns (tied for the best, within noise) | 88.0 ns (tied for the best, within noise) | ||||
| gf2_127-lambdaincompleteλ-projective (X:L:Z) accumulators | 880 ns (1.42× the best) | 196 ns (tied for the best, within noise, 1.00×) | 567 ns (tied for the best, within noise) | 179 ns (best) | 412 ns (716.46× the best) | 56.6 ns (124.81× the best) | 132 ns (6.60× the best) | 135 ns (6.12× the best) | 131 ns (5.78× the best) | 0.64 ns (tied for the best, within noise) | 0.55 ns (1.62× the best) | 15.1 ns (4.07× the best) | 15.1 ns (7.91× the best) | 442 ns (1.02× the best) | 87.0 ns (8.72× the best) | 447 ns (tied for the best, within noise, 1.00×) | 87.9 ns (tied for the best, within noise) |
| gf2_127-wincompleteλ-projective, w codec: hashes and decodes to λ-affine | 975 ns (1.58× the best) | 221 ns (1.13× the best) | 569 ns (tied for the best, within noise, 1.00×) | 184 ns (1.03× the best) | 0.62 ns (1.07× the best) | 0.97 ns (2.14× the best) | 131 ns (6.58× the best) | 135 ns (6.11× the best) | 131 ns (5.79× the best) | 0.65 ns (tied for the best, within noise, 1.00×) | 0.55 ns (1.62× the best) | 15.0 ns (4.06× the best) | 15.1 ns (7.87× the best) | 432 ns (best) | 76.5 ns (7.67× the best) | 447 ns (tied for the best, within noise, 1.00×) | 89.2 ns (1.01× the best) |
| gf2_127-uunscaled (X:S:Z), w codec, direct addend hashes | 1.00 µs (1.62× the best) | 258 ns (1.32× the best) | 598 ns (1.05× the best) | 213 ns (1.19× the best) | 0.62 ns (1.07× the best) | 0.98 ns (2.17× the best) | 116 ns (5.84× the best) | 119 ns (5.41× the best) | 119 ns (5.24× the best) | 0.68 ns (1.05× the best) | 0.54 ns (1.61× the best) | 48.6 ns (13.12× the best) | 48.7 ns (25.41× the best) | 438 ns (1.01× the best) | 76.5 ns (7.67× the best) | 479 ns (1.07× the best) | 121 ns (1.38× the best) |
| GF(2^122) = GF(2^61)[u], dense constant, 16 bytes | |||||||||||||||||
| gf2_122(X:S:Z:T) extended | 897 ns (1.45× the best) | 350 ns (1.79× the best) | 64.2 ns (111.60× the best) | 63.1 ns (139.03× the best) | 263 ns (13.20× the best) | 267 ns (12.10× the best) | 0.69 ns (1.07× the best) | 0.84 ns (2.49× the best) | 53.7 ns (28.03× the best) | 618 ns (1.43× the best) | 202 ns (20.28× the best) | 607 ns (1.36× the best) | 187 ns (2.12× the best) | ||||
| gf2_122-lambdaincompleteλ-projective | 1.18 µs (1.91× the best) | 350 ns (1.79× the best) | 801 ns (1.41× the best) | 361 ns (2.02× the best) | 521 ns (906.55× the best) | 100 ns (220.88× the best) | 217 ns (10.90× the best) | 219 ns (9.94× the best) | 0.65 ns (tied for the best, within noise, 1.00×) | 0.84 ns (2.49× the best) | 27.9 ns (14.57× the best) | 573 ns (1.33× the best) | 156 ns (15.63× the best) | 607 ns (1.36× the best) | 186 ns (2.12× the best) | ||
| gf2_122-wincompleteλ-projective, w codec | 1.21 µs (1.96× the best) | 328 ns (1.67× the best) | 799 ns (1.41× the best) | 429 ns (2.39× the best) | 0.62 ns (1.07× the best) | 0.99 ns (2.17× the best) | 211 ns (10.58× the best) | 219 ns (9.93× the best) | 0.64 ns (tied for the best, within noise, 1.00×) | 0.84 ns (2.49× the best) | 27.8 ns (14.51× the best) | 551 ns (1.28× the best) | 130 ns (13.07× the best) | 601 ns (1.35× the best) | 153 ns (1.74× the best) | ||
| gf2_122-uunscaled (X:S:Z), w codec | 1.27 µs (2.06× the best) | 391 ns (2.00× the best) | 857 ns (1.51× the best) | 622 ns (3.47× the best) | 0.62 ns (1.07× the best) | 0.99 ns (2.17× the best) | 183 ns (9.19× the best) | 183 ns (8.31× the best) | 0.69 ns (1.07× the best) | 0.83 ns (2.46× the best) | 84.9 ns (44.33× the best) | 564 ns (1.31× the best) | 132 ns (13.26× the best) | 676 ns (1.51× the best) | 204 ns (2.32× the best) | ||
| GF(2^122), constant in GF(2^61) (GLS-shaped), 16 bytes | |||||||||||||||||
| gf2_122-gls(X:S:Z:T) extended | 865 ns (1.40× the best) | 309 ns (1.58× the best) | 44.2 ns (76.84× the best) | 44.3 ns (97.56× the best) | 246 ns (12.33× the best) | 240 ns (10.88× the best) | 1.02 ns (1.58× the best) | 0.84 ns (2.49× the best) | 54.4 ns (28.41× the best) | 612 ns (1.42× the best) | 194 ns (19.45× the best) | 592 ns (1.33× the best) | 162 ns (1.85× the best) | ||||
| gf2_122-gls-lambdaincompleteλ-projective | 1.18 µs (1.90× the best) | 315 ns (1.61× the best) | 788 ns (1.39× the best) | 327 ns (1.82× the best) | 524 ns (911.40× the best) | 101 ns (221.53× the best) | 216 ns (10.85× the best) | 219 ns (9.94× the best) | 0.65 ns (tied for the best, within noise, 1.00×) | 0.84 ns (2.49× the best) | 27.8 ns (14.53× the best) | 576 ns (1.33× the best) | 156 ns (15.63× the best) | 599 ns (1.34× the best) | 163 ns (1.85× the best) | ||
| gf2_122-gls-wincompleteλ-projective, w codec | 1.24 µs (2.01× the best) | 311 ns (1.59× the best) | 791 ns (1.40× the best) | 404 ns (2.25× the best) | 0.62 ns (1.08× the best) | 0.97 ns (2.14× the best) | 217 ns (10.87× the best) | 219 ns (9.94× the best) | 0.65 ns (tied for the best, within noise, 1.00×) | 0.84 ns (2.48× the best) | 27.9 ns (14.58× the best) | 555 ns (1.28× the best) | 130 ns (13.01× the best) | 591 ns (1.32× the best) | 138 ns (1.57× the best) | ||
| gf2_122-gls-uunscaled (X:S:Z), w codec | 1.25 µs (2.02× the best) | 359 ns (1.83× the best) | 843 ns (1.49× the best) | 593 ns (3.31× the best) | 0.62 ns (1.07× the best) | 1.01 ns (2.22× the best) | 182 ns (9.16× the best) | 183 ns (8.29× the best) | 0.69 ns (1.07× the best) | 0.84 ns (2.49× the best) | 85.0 ns (44.39× the best) | 562 ns (1.30× the best) | 133 ns (13.32× the best) | 639 ns (1.43× the best) | 187 ns (2.13× the best) | ||
| GF(2^109), 14 bytes | |||||||||||||||||
| gf2_109(X:S:Z:T) extended | 3.39 µs (5.48× the best) | 518 ns (2.65× the best) | 95.3 ns (165.70× the best) | 95.7 ns (210.88× the best) | 403 ns (20.23× the best) | 403 ns (18.27× the best) | 0.69 ns (1.06× the best) | 0.59 ns (1.74× the best) | 72.9 ns (38.07× the best) | 3.03 µs (7.00× the best) | 306 ns (30.66× the best) | 2.98 µs (6.67× the best) | 263 ns (2.99× the best) | ||||
| gf2_109-lambdaincompleteλ-projective | 5.87 µs (9.49× the best) | 517 ns (2.64× the best) | 3.28 µs (5.78× the best) | 511 ns (2.85× the best) | 2.86 µs (4982.19× the best) | 147 ns (324.46× the best) | 331 ns (16.63× the best) | 334 ns (15.12× the best) | 0.65 ns (tied for the best, within noise, 1.00×) | 0.57 ns (1.70× the best) | 39.3 ns (20.52× the best) | 2.95 µs (6.82× the best) | 221 ns (22.20× the best) | 2.98 µs (6.68× the best) | 263 ns (2.99× the best) | ||
| gf2_109-wincompleteλ-projective, w codec | 5.78 µs (9.35× the best) | 516 ns (2.64× the best) | 3.27 µs (5.77× the best) | 522 ns (2.92× the best) | 0.62 ns (1.08× the best) | 0.97 ns (2.14× the best) | 332 ns (16.67× the best) | 335 ns (15.17× the best) | 0.64 ns (tied for the best, within noise, 1.00×) | 0.58 ns (1.71× the best) | 39.4 ns (20.59× the best) | 2.90 µs (6.70× the best) | 204 ns (20.42× the best) | 2.96 µs (6.64× the best) | 240 ns (2.73× the best) | ||
| gf2_109-uunscaled (X:S:Z), w codec | 5.87 µs (9.50× the best) | 592 ns (3.02× the best) | 3.34 µs (5.89× the best) | 593 ns (3.31× the best) | 0.62 ns (1.08× the best) | 0.98 ns (2.16× the best) | 289 ns (14.53× the best) | 290 ns (13.13× the best) | 0.69 ns (1.07× the best) | 0.58 ns (1.72× the best) | 115 ns (60.25× the best) | 2.95 µs (6.82× the best) | 206 ns (20.63× the best) | 3.04 µs (6.82× the best) | 319 ns (3.62× the best) | ||
| F_p, p = 2^127 − 1, 16 bytes | |||||||||||||||||
| edwards127a = 1 Edwards, extended += cached | 1.07 µs (1.72× the best) | 1.06 µs (5.44× the best) | 573 ns (996.17× the best) | 27.2 ns (59.99× the best) | 19.9 ns (best) | 22.1 ns (best) | 22.7 ns (best) | 1.36 ns (2.11× the best) | 0.34 ns (best) | 3.70 ns (best) | 1.91 ns (best) | 536 ns (1.24× the best) | 21.7 ns (2.18× the best) | 485 ns (1.09× the best) | 485 ns (5.51× the best) | ||
| weier127short Weierstrass, projective += affine | 1.03 µs (1.67× the best) | 1.03 µs (5.27× the best) | 0.58 ns (tied for the best, within noise) | 0.45 ns (tied for the best, within noise) | 44.7 ns (2.24× the best) | 46.2 ns (2.10× the best) | 46.4 ns (2.05× the best) | 0.76 ns (1.17× the best) | 0.34 ns (1.01× the best) | 3.81 ns (1.03× the best) | 1.98 ns (1.04× the best) | 527 ns (1.22× the best) | 9.97 ns (best) | 487 ns (1.09× the best) | 484 ns (5.51× the best) | ||
| weier127-jacobianincompleteshort Weierstrass, Jacobian += affine | 1.03 µs (1.67× the best) | 1.00 µs (5.12× the best) | 0.57 ns (tied for the best, within noise) | 0.46 ns (tied for the best, within noise, 1.01×) | 36.6 ns (1.84× the best) | 45.0 ns (2.04× the best) | 37.6 ns (1.66× the best) | 0.76 ns (1.17× the best) | 0.34 ns (1.01× the best) | 8.92 ns (2.41× the best) | 4.29 ns (2.24× the best) | 531 ns (1.23× the best) | 15.3 ns (1.54× the best) | 484 ns (1.09× the best) | 483 ns (5.49× the best) | ||
bold: the best of its column; italic, dotted: tied with the best within the confidence intervals; shading: ratio to the best, pale yellow at 1× to purple at 16× or more; grey: baseline, not compared.
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) | 13.2 ns (8.60× the best) | 13.4 ns (3.69× the best) | 2.58 ns (1.35× the best) | 4.19 ns (1.15× the best) | xor | 2.61 ns (best) | 3.50 ns (1.47× the best) | 391 ns (best) | 42.0 ns (7.36× the best) | |||
| gf2_122GF(2^61)[u]/(u^2 + u + 1) | 24.6 ns (16.00× the best) | 29.1 ns (8.00× the best) | 3.84 ns (2.01× the best) | 16.7 ns (4.60× the best) | xor | 3.41 ns (1.31× the best) | 2.39 ns (best) | 494 ns (1.26× the best) | 74.0 ns (12.95× the best) | |||
| gf2_109F_2[z]/(z^109 + z^5 + z^4 + z^2 + 1) | 34.7 ns (22.59× the best) | 38.9 ns (10.69× the best) | 21.8 ns (11.38× the best) | 26.7 ns (7.34× the best) | xor | 19.2 ns (7.38× the best) | 3.28 ns (1.38× the best) | 2.82 µs (7.22× the best) | 109 ns (19.02× the best) | |||
| prime | ||||||||||||
| fp127p = 2^127 − 1 | 1.54 ns (best) | 3.64 ns (best) | 1.91 ns (best) | 3.64 ns (best) | 0.94 ns (best) | 474 ns (181.79× the best) | 525 ns (best) | 519 ns (1.33× the best) | 5.71 ns (best) | 0.35 ns (best) | 0.57 ns (best) | |
bold: the best of its column; italic, dotted: tied with the best within the confidence intervals; shading: ratio to the best, pale yellow at 1× to purple at 16× or more; grey: baseline, not compared.
Which bench each cell is
| operation | curve | bench | time | 95% CI |
|---|---|---|---|---|
| field mul, throughput | gf2_127 | field/gf2_127/mul throughput (8 chains) | 13.2 ns | 13.2 ns .. 13.3 ns |
| field mul, throughput | gf2_109 | field/gf2_109/mul throughput (8 chains) | 34.7 ns | 34.6 ns .. 34.9 ns |
| field mul, throughput | gf2_122 | field/gf2_122/mul throughput (8 chains) | 24.6 ns | 24.6 ns .. 24.7 ns |
| field mul, throughput | fp127 | field/fp127/mul throughput (8 chains) | 1.54 ns | 1.54 ns .. 1.54 ns |
| field mul, latency | gf2_127 | field/gf2_127/mul latency (dependent chain) | 13.4 ns | 13.4 ns .. 13.5 ns |
| field mul, latency | gf2_109 | field/gf2_109/mul latency (dependent chain) | 38.9 ns | 38.8 ns .. 39.0 ns |
| field mul, latency | gf2_122 | field/gf2_122/mul latency (dependent chain) | 29.1 ns | 29.1 ns .. 29.2 ns |
| field mul, latency | fp127 | field/fp127/mul latency (dependent chain) | 3.64 ns | 3.63 ns .. 3.65 ns |
| field square, throughput | gf2_127 | field/gf2_127/square throughput (8 chains) | 2.58 ns | 2.58 ns .. 2.59 ns |
| field square, throughput | gf2_109 | field/gf2_109/square throughput (8 chains) | 21.8 ns | 21.7 ns .. 21.8 ns |
| field square, throughput | gf2_122 | field/gf2_122/square throughput (8 chains) | 3.84 ns | 3.83 ns .. 3.85 ns |
| field square, throughput | fp127 | field/fp127/square throughput (8 chains) | 1.91 ns | 1.91 ns .. 1.92 ns |
| field square, latency | gf2_127 | field/gf2_127/square latency (dependent chain) | 4.19 ns | 4.18 ns .. 4.20 ns |
| field square, latency | gf2_109 | field/gf2_109/square latency (dependent chain) | 26.7 ns | 26.7 ns .. 26.8 ns |
| field square, latency | gf2_122 | field/gf2_122/square latency (dependent chain) | 16.7 ns | 16.7 ns .. 16.8 ns |
| field square, latency | fp127 | field/fp127/square latency (dependent chain) | 3.64 ns | 3.63 ns .. 3.65 ns |
| field add | fp127 | field/fp127/add | 0.94 ns | 0.94 ns .. 0.94 ns |
| field sqrt | gf2_127 | field/gf2_127/sqrt | 2.61 ns | 2.60 ns .. 2.62 ns |
| field sqrt | gf2_109 | field/gf2_109/sqrt | 19.2 ns | 19.2 ns .. 19.3 ns |
| field sqrt | gf2_122 | field/gf2_122/sqrt | 3.41 ns | 3.40 ns .. 3.41 ns |
| field sqrt | fp127 | field/fp127/sqrt (x^(2^125)) | 474 ns | 473 ns .. 475 ns |
| field sqrt ratio | fp127 | field/fp127/sqrt_ratio | 525 ns | 523 ns .. 526 ns |
| field halftrace | gf2_127 | field/gf2_127/halftrace (byte tables) | 3.50 ns | 3.49 ns .. 3.51 ns |
| field halftrace | gf2_109 | field/gf2_109/halftrace (byte tables) | 3.28 ns | 3.27 ns .. 3.29 ns |
| field halftrace | gf2_122 | field/gf2_122/qsolve (z^2 + z = c, 2 base halftraces) | 2.39 ns | 2.38 ns .. 2.39 ns |
| field invert, one at a time | gf2_127 | field/gf2_127/invert | 391 ns | 390 ns .. 392 ns |
| field invert, one at a time | gf2_109 | field/gf2_109/invert | 2.82 µs | 2.82 µs .. 2.83 µs |
| field invert, one at a time | gf2_122 | field/gf2_122/invert | 494 ns | 493 ns .. 495 ns |
| field invert, one at a time | fp127 | field/fp127/invert | 519 ns | 518 ns .. 521 ns |
| field invert, batched | gf2_127 | field/gf2_127/batch invert (product tree) | 42.0 ns | 42.0 ns .. 42.1 ns |
| field invert, batched | gf2_109 | field/gf2_109/batch invert (product tree) | 109 ns | 108 ns .. 109 ns |
| field invert, batched | gf2_122 | field/gf2_122/batch invert (product tree) | 74.0 ns | 73.8 ns .. 74.1 ns |
| field invert, batched | fp127 | field/fp127/batch invert (product tree) | 5.71 ns | 5.69 ns .. 5.74 ns |
| field pack | fp127 | field/fp127/pack | 0.35 ns | 0.35 ns .. 0.36 ns |
| field unpack | fp127 | field/fp127/unpack | 0.57 ns | 0.57 ns .. 0.57 ns |
| point add, throughput | xor | add/xor-sha256/xor 32B, 8 accumulators | 0.73 ns | 0.73 ns .. 0.73 ns |
| point add, throughput | gf2_127 | group.add/binary.127/mode=throughput | 155 ns | 155 ns .. 155 ns |
| point add, throughput | gf2_127-lambda | group.add/binary-lambda.127/mode=throughput | 132 ns | 131 ns .. 132 ns |
| point add, throughput | gf2_127-w | group.add/binary-w.127/mode=throughput | 131 ns | 131 ns .. 131 ns |
| point add, throughput | gf2_127-u | group.add/binary-u.127/mode=throughput | 116 ns | 116 ns .. 116 ns |
| point add, throughput | gf2_109 | group.add/binary.109/mode=throughput | 403 ns | 402 ns .. 404 ns |
| point add, throughput | gf2_109-lambda | group.add/binary-lambda.109/mode=throughput | 331 ns | 330 ns .. 332 ns |
| point add, throughput | gf2_109-w | group.add/binary-w.109/mode=throughput | 332 ns | 331 ns .. 332 ns |
| point add, throughput | gf2_109-u | group.add/binary-u.109/mode=throughput | 289 ns | 289 ns .. 290 ns |
| point add, throughput | gf2_122 | group.add/binary.122/mode=throughput | 263 ns | 262 ns .. 264 ns |
| point add, throughput | gf2_122-lambda | group.add/binary-lambda.122/mode=throughput | 217 ns | 217 ns .. 217 ns |
| point add, throughput | gf2_122-w | group.add/binary-w.122/mode=throughput | 211 ns | 209 ns .. 212 ns |
| point add, throughput | gf2_122-u | group.add/binary-u.122/mode=throughput | 183 ns | 183 ns .. 183 ns |
| point add, throughput | gf2_122-gls | group.add/binary.122-gls/mode=throughput | 246 ns | 245 ns .. 247 ns |
| point add, throughput | gf2_122-gls-lambda | group.add/binary-lambda.122-gls/mode=throughput | 216 ns | 215 ns .. 217 ns |
| point add, throughput | gf2_122-gls-w | group.add/binary-w.122-gls/mode=throughput | 217 ns | 216 ns .. 217 ns |
| point add, throughput | gf2_122-gls-u | group.add/binary-u.122-gls/mode=throughput | 182 ns | 182 ns .. 183 ns |
| point add, throughput | edwards127 | group.add/edwards.127/mode=throughput | 19.9 ns | 19.9 ns .. 19.9 ns |
| point add, throughput | weier127 | group.add/weier.127/mode=throughput | 44.7 ns | 44.6 ns .. 44.8 ns |
| point add, throughput | weier127-jacobian | group.add/weier-jacobian.127/mode=throughput | 36.6 ns | 36.5 ns .. 36.8 ns |
| point add, latency | xor | add/xor-sha256/xor 32B, 1 accumulator | 0.39 ns | 0.39 ns .. 0.39 ns |
| point add, latency | gf2_127 | group.add/binary.127/mode=latency | 156 ns | 155 ns .. 156 ns |
| point add, latency | gf2_127-lambda | group.add/binary-lambda.127/mode=latency | 135 ns | 135 ns .. 135 ns |
| point add, latency | gf2_127-w | group.add/binary-w.127/mode=latency | 135 ns | 135 ns .. 135 ns |
| point add, latency | gf2_127-u | group.add/binary-u.127/mode=latency | 119 ns | 119 ns .. 120 ns |
| point add, latency | gf2_109 | group.add/binary.109/mode=latency | 403 ns | 403 ns .. 404 ns |
| point add, latency | gf2_109-lambda | group.add/binary-lambda.109/mode=latency | 334 ns | 333 ns .. 335 ns |
| point add, latency | gf2_109-w | group.add/binary-w.109/mode=latency | 335 ns | 334 ns .. 335 ns |
| point add, latency | gf2_109-u | group.add/binary-u.109/mode=latency | 290 ns | 289 ns .. 290 ns |
| point add, latency | gf2_122 | group.add/binary.122/mode=latency | 267 ns | 266 ns .. 268 ns |
| point add, latency | gf2_122-lambda | group.add/binary-lambda.122/mode=latency | 219 ns | 219 ns .. 220 ns |
| point add, latency | gf2_122-w | group.add/binary-w.122/mode=latency | 219 ns | 219 ns .. 220 ns |
| point add, latency | gf2_122-u | group.add/binary-u.122/mode=latency | 183 ns | 183 ns .. 184 ns |
| point add, latency | gf2_122-gls | group.add/binary.122-gls/mode=latency | 240 ns | 239 ns .. 241 ns |
| point add, latency | gf2_122-gls-lambda | group.add/binary-lambda.122-gls/mode=latency | 219 ns | 219 ns .. 220 ns |
| point add, latency | gf2_122-gls-w | group.add/binary-w.122-gls/mode=latency | 219 ns | 219 ns .. 220 ns |
| point add, latency | gf2_122-gls-u | group.add/binary-u.122-gls/mode=latency | 183 ns | 183 ns .. 183 ns |
| point add, latency | edwards127 | group.add/edwards.127/mode=latency | 22.1 ns | 22.0 ns .. 22.1 ns |
| point add, latency | weier127 | group.add/weier.127/mode=latency | 46.2 ns | 46.1 ns .. 46.3 ns |
| point add, latency | weier127-jacobian | group.add/weier-jacobian.127/mode=latency | 45.0 ns | 44.8 ns .. 45.1 ns |
| point subtract | gf2_127-lambda | group.sub/binary-lambda.127/mode=throughput | 131 ns | 131 ns .. 131 ns |
| point subtract | gf2_127-w | group.sub/binary-w.127/mode=throughput | 131 ns | 131 ns .. 131 ns |
| point subtract | gf2_127-u | group.sub/binary-u.127/mode=throughput | 119 ns | 118 ns .. 119 ns |
| point subtract | edwards127 | group.sub/edwards.127/mode=throughput | 22.7 ns | 22.6 ns .. 22.7 ns |
| point subtract | weier127 | group.sub/weier.127/mode=throughput | 46.4 ns | 46.3 ns .. 46.5 ns |
| point subtract | weier127-jacobian | group.sub/weier-jacobian.127/mode=throughput | 37.6 ns | 37.5 ns .. 37.6 ns |
| point negate | gf2_127 | negate/gf2_127/affine (y += x) | 0.69 ns | 0.69 ns .. 0.69 ns |
| point negate | gf2_127-lambda | group.neg/binary-lambda.127 | 0.64 ns | 0.64 ns .. 0.65 ns |
| point negate | gf2_127-w | group.neg/binary-w.127 | 0.65 ns | 0.65 ns .. 0.65 ns |
| point negate | gf2_127-u | group.neg/binary-u.127 | 0.68 ns | 0.67 ns .. 0.69 ns |
| point negate | gf2_109 | negate/gf2_109/affine (y += x) | 0.69 ns | 0.68 ns .. 0.69 ns |
| point negate | gf2_109-lambda | group.neg/binary-lambda.109 | 0.65 ns | 0.64 ns .. 0.65 ns |
| point negate | gf2_109-w | group.neg/binary-w.109 | 0.64 ns | 0.64 ns .. 0.65 ns |
| point negate | gf2_109-u | group.neg/binary-u.109 | 0.69 ns | 0.69 ns .. 0.69 ns |
| point negate | gf2_122 | negate/gf2_122/affine (y += x) | 0.69 ns | 0.69 ns .. 0.69 ns |
| point negate | gf2_122-lambda | group.neg/binary-lambda.122 | 0.65 ns | 0.64 ns .. 0.65 ns |
| point negate | gf2_122-w | group.neg/binary-w.122 | 0.64 ns | 0.64 ns .. 0.65 ns |
| point negate | gf2_122-u | group.neg/binary-u.122 | 0.69 ns | 0.69 ns .. 0.69 ns |
| point negate | gf2_122-gls | group.neg/binary.122-gls | 1.02 ns | 1.02 ns .. 1.02 ns |
| point negate | gf2_122-gls-lambda | group.neg/binary-lambda.122-gls | 0.65 ns | 0.64 ns .. 0.65 ns |
| point negate | gf2_122-gls-w | group.neg/binary-w.122-gls | 0.65 ns | 0.64 ns .. 0.65 ns |
| point negate | gf2_122-gls-u | group.neg/binary-u.122-gls | 0.69 ns | 0.69 ns .. 0.69 ns |
| point negate | edwards127 | negate/edwards127/extended (-X, -T) | 1.36 ns | 1.35 ns .. 1.37 ns |
| point negate | weier127 | group.neg/weier.127 | 0.76 ns | 0.75 ns .. 0.76 ns |
| point negate | weier127-jacobian | group.neg/weier-jacobian.127 | 0.76 ns | 0.75 ns .. 0.76 ns |
| point prepare, one at a time | gf2_127 | group.prepare/binary.127/mode=indep | 31.6 ns | 31.5 ns .. 31.6 ns |
| point prepare, one at a time | gf2_127-lambda | group.prepare/binary-lambda.127/mode=indep | 412 ns | 411 ns .. 412 ns |
| point prepare, one at a time | gf2_127-w | group.prepare/binary-w.127/mode=indep | 0.62 ns | 0.62 ns .. 0.62 ns |
| point prepare, one at a time | gf2_127-u | group.prepare/binary-u.127/mode=indep | 0.62 ns | 0.62 ns .. 0.62 ns |
| point prepare, one at a time | gf2_109 | group.prepare/binary.109/mode=indep | 95.3 ns | 95.1 ns .. 95.4 ns |
| point prepare, one at a time | gf2_109-lambda | group.prepare/binary-lambda.109/mode=indep | 2.86 µs | 2.86 µs .. 2.87 µs |
| point prepare, one at a time | gf2_109-w | group.prepare/binary-w.109/mode=indep | 0.62 ns | 0.62 ns .. 0.62 ns |
| point prepare, one at a time | gf2_109-u | group.prepare/binary-u.109/mode=indep | 0.62 ns | 0.62 ns .. 0.62 ns |
| point prepare, one at a time | gf2_122 | group.prepare/binary.122/mode=indep | 64.2 ns | 64.0 ns .. 64.3 ns |
| point prepare, one at a time | gf2_122-lambda | group.prepare/binary-lambda.122/mode=indep | 521 ns | 520 ns .. 523 ns |
| point prepare, one at a time | gf2_122-w | group.prepare/binary-w.122/mode=indep | 0.62 ns | 0.61 ns .. 0.62 ns |
| point prepare, one at a time | gf2_122-u | group.prepare/binary-u.122/mode=indep | 0.62 ns | 0.62 ns .. 0.62 ns |
| point prepare, one at a time | gf2_122-gls | group.prepare/binary.122-gls/mode=indep | 44.2 ns | 44.0 ns .. 44.3 ns |
| point prepare, one at a time | gf2_122-gls-lambda | group.prepare/binary-lambda.122-gls/mode=indep | 524 ns | 522 ns .. 525 ns |
| point prepare, one at a time | gf2_122-gls-w | group.prepare/binary-w.122-gls/mode=indep | 0.62 ns | 0.62 ns .. 0.62 ns |
| point prepare, one at a time | gf2_122-gls-u | group.prepare/binary-u.122-gls/mode=indep | 0.62 ns | 0.61 ns .. 0.62 ns |
| point prepare, one at a time | edwards127 | group.prepare/edwards.127/mode=indep | 573 ns | 571 ns .. 574 ns |
| point prepare, one at a time | weier127 | group.prepare/weier.127/mode=indep | 0.58 ns | 0.57 ns .. 0.58 ns |
| point prepare, one at a time | weier127-jacobian | group.prepare/weier-jacobian.127/mode=indep | 0.57 ns | 0.57 ns .. 0.58 ns |
| point prepare, batched | gf2_127 | group.prepare/binary.127/mode=batch,n=1024 | 31.2 ns | 31.2 ns .. 31.3 ns |
| point prepare, batched | gf2_127-lambda | group.prepare/binary-lambda.127/mode=batch,n=1024 | 56.6 ns | 56.5 ns .. 56.8 ns |
| point prepare, batched | gf2_127-w | group.prepare/binary-w.127/mode=batch,n=1024 | 0.97 ns | 0.96 ns .. 0.98 ns |
| point prepare, batched | gf2_127-u | group.prepare/binary-u.127/mode=batch,n=1024 | 0.98 ns | 0.98 ns .. 0.99 ns |
| point prepare, batched | gf2_109 | group.prepare/binary.109/mode=batch,n=1024 | 95.7 ns | 95.5 ns .. 95.9 ns |
| point prepare, batched | gf2_109-lambda | group.prepare/binary-lambda.109/mode=batch,n=1024 | 147 ns | 147 ns .. 147 ns |
| point prepare, batched | gf2_109-w | group.prepare/binary-w.109/mode=batch,n=1024 | 0.97 ns | 0.96 ns .. 0.98 ns |
| point prepare, batched | gf2_109-u | group.prepare/binary-u.109/mode=batch,n=1024 | 0.98 ns | 0.97 ns .. 0.99 ns |
| point prepare, batched | gf2_122 | group.prepare/binary.122/mode=batch,n=1024 | 63.1 ns | 62.9 ns .. 63.3 ns |
| point prepare, batched | gf2_122-lambda | group.prepare/binary-lambda.122/mode=batch,n=1024 | 100 ns | 99.9 ns .. 101 ns |
| point prepare, batched | gf2_122-w | group.prepare/binary-w.122/mode=batch,n=1024 | 0.99 ns | 0.98 ns .. 1.00 ns |
| point prepare, batched | gf2_122-u | group.prepare/binary-u.122/mode=batch,n=1024 | 0.99 ns | 0.98 ns .. 0.99 ns |
| point prepare, batched | gf2_122-gls | group.prepare/binary.122-gls/mode=batch,n=1024 | 44.3 ns | 44.1 ns .. 44.4 ns |
| point prepare, batched | gf2_122-gls-lambda | group.prepare/binary-lambda.122-gls/mode=batch,n=1024 | 101 ns | 100 ns .. 101 ns |
| point prepare, batched | gf2_122-gls-w | group.prepare/binary-w.122-gls/mode=batch,n=1024 | 0.97 ns | 0.96 ns .. 0.99 ns |
| point prepare, batched | gf2_122-gls-u | group.prepare/binary-u.122-gls/mode=batch,n=1024 | 1.01 ns | 0.98 ns .. 1.04 ns |
| point prepare, batched | edwards127 | group.prepare/edwards.127/mode=batch,n=1024 | 27.2 ns | 27.2 ns .. 27.3 ns |
| point prepare, batched | weier127 | group.prepare/weier.127/mode=batch,n=1024 | 0.45 ns | 0.45 ns .. 0.46 ns |
| point prepare, batched | weier127-jacobian | group.prepare/weier-jacobian.127/mode=batch,n=1024 | 0.46 ns | 0.46 ns .. 0.46 ns |
| is identity | gf2_127 | group.is_identity/binary.127 | 0.59 ns | 0.59 ns .. 0.60 ns |
| is identity | gf2_127-lambda | group.is_identity/binary-lambda.127 | 0.55 ns | 0.54 ns .. 0.55 ns |
| is identity | gf2_127-w | group.is_identity/binary-w.127 | 0.55 ns | 0.54 ns .. 0.55 ns |
| is identity | gf2_127-u | group.is_identity/binary-u.127 | 0.54 ns | 0.54 ns .. 0.55 ns |
| is identity | gf2_109 | group.is_identity/binary.109 | 0.59 ns | 0.58 ns .. 0.59 ns |
| is identity | gf2_109-lambda | group.is_identity/binary-lambda.109 | 0.57 ns | 0.57 ns .. 0.58 ns |
| is identity | gf2_109-w | group.is_identity/binary-w.109 | 0.58 ns | 0.58 ns .. 0.58 ns |
| is identity | gf2_109-u | group.is_identity/binary-u.109 | 0.58 ns | 0.58 ns .. 0.58 ns |
| is identity | gf2_122 | group.is_identity/binary.122 | 0.84 ns | 0.84 ns .. 0.84 ns |
| is identity | gf2_122-lambda | group.is_identity/binary-lambda.122 | 0.84 ns | 0.84 ns .. 0.84 ns |
| is identity | gf2_122-w | group.is_identity/binary-w.122 | 0.84 ns | 0.84 ns .. 0.84 ns |
| is identity | gf2_122-u | group.is_identity/binary-u.122 | 0.83 ns | 0.82 ns .. 0.84 ns |
| is identity | gf2_122-gls | group.is_identity/binary.122-gls | 0.84 ns | 0.84 ns .. 0.84 ns |
| is identity | gf2_122-gls-lambda | group.is_identity/binary-lambda.122-gls | 0.84 ns | 0.84 ns .. 0.84 ns |
| is identity | gf2_122-gls-w | group.is_identity/binary-w.122-gls | 0.84 ns | 0.84 ns .. 0.84 ns |
| is identity | gf2_122-gls-u | group.is_identity/binary-u.122-gls | 0.84 ns | 0.84 ns .. 0.84 ns |
| is identity | edwards127 | group.is_identity/edwards.127 | 0.34 ns | 0.33 ns .. 0.34 ns |
| is identity | weier127 | group.is_identity/weier.127 | 0.34 ns | 0.34 ns .. 0.34 ns |
| is identity | weier127-jacobian | group.is_identity/weier-jacobian.127 | 0.34 ns | 0.34 ns .. 0.34 ns |
| equals addend, match | gf2_127-lambda | group.equals/binary-lambda.127/mode=match | 15.1 ns | 15.0 ns .. 15.1 ns |
| equals addend, match | gf2_127-w | group.equals/binary-w.127/mode=match | 15.0 ns | 15.0 ns .. 15.1 ns |
| equals addend, match | gf2_127-u | group.equals/binary-u.127/mode=match | 48.6 ns | 48.5 ns .. 48.7 ns |
| equals addend, match | edwards127 | group.equals/edwards.127/mode=match | 3.70 ns | 3.68 ns .. 3.72 ns |
| equals addend, match | weier127 | group.equals/weier.127/mode=match | 3.81 ns | 3.80 ns .. 3.82 ns |
| equals addend, match | weier127-jacobian | group.equals/weier-jacobian.127/mode=match | 8.92 ns | 8.89 ns .. 8.96 ns |
| equals addend, mismatch | gf2_127 | group.equals/binary.127/mode=mismatch | 30.3 ns | 30.3 ns .. 30.4 ns |
| equals addend, mismatch | gf2_127-lambda | group.equals/binary-lambda.127/mode=mismatch | 15.1 ns | 15.1 ns .. 15.2 ns |
| equals addend, mismatch | gf2_127-w | group.equals/binary-w.127/mode=mismatch | 15.1 ns | 15.0 ns .. 15.1 ns |
| equals addend, mismatch | gf2_127-u | group.equals/binary-u.127/mode=mismatch | 48.7 ns | 48.6 ns .. 48.8 ns |
| equals addend, mismatch | gf2_109 | group.equals/binary.109/mode=mismatch | 72.9 ns | 72.7 ns .. 73.1 ns |
| equals addend, mismatch | gf2_109-lambda | group.equals/binary-lambda.109/mode=mismatch | 39.3 ns | 39.2 ns .. 39.4 ns |
| equals addend, mismatch | gf2_109-w | group.equals/binary-w.109/mode=mismatch | 39.4 ns | 39.3 ns .. 39.5 ns |
| equals addend, mismatch | gf2_109-u | group.equals/binary-u.109/mode=mismatch | 115 ns | 115 ns .. 116 ns |
| equals addend, mismatch | gf2_122 | group.equals/binary.122/mode=mismatch | 53.7 ns | 53.5 ns .. 53.9 ns |
| equals addend, mismatch | gf2_122-lambda | group.equals/binary-lambda.122/mode=mismatch | 27.9 ns | 27.8 ns .. 28.0 ns |
| equals addend, mismatch | gf2_122-w | group.equals/binary-w.122/mode=mismatch | 27.8 ns | 27.7 ns .. 27.9 ns |
| equals addend, mismatch | gf2_122-u | group.equals/binary-u.122/mode=mismatch | 84.9 ns | 84.7 ns .. 85.1 ns |
| equals addend, mismatch | gf2_122-gls | group.equals/binary.122-gls/mode=mismatch | 54.4 ns | 54.3 ns .. 54.5 ns |
| equals addend, mismatch | gf2_122-gls-lambda | group.equals/binary-lambda.122-gls/mode=mismatch | 27.8 ns | 27.7 ns .. 27.9 ns |
| equals addend, mismatch | gf2_122-gls-w | group.equals/binary-w.122-gls/mode=mismatch | 27.9 ns | 27.9 ns .. 28.0 ns |
| equals addend, mismatch | gf2_122-gls-u | group.equals/binary-u.122-gls/mode=mismatch | 85.0 ns | 84.8 ns .. 85.2 ns |
| equals addend, mismatch | edwards127 | group.equals/edwards.127/mode=mismatch | 1.91 ns | 1.91 ns .. 1.92 ns |
| equals addend, mismatch | weier127 | group.equals/weier.127/mode=mismatch | 1.98 ns | 1.98 ns .. 1.99 ns |
| equals addend, mismatch | weier127-jacobian | group.equals/weier-jacobian.127/mode=mismatch | 4.29 ns | 4.28 ns .. 4.31 ns |
| encode, one at a time | gf2_127 | group.encode/binary.127/mode=indep | 462 ns | 461 ns .. 462 ns |
| encode, one at a time | gf2_127-lambda | group.encode/binary-lambda.127/mode=indep | 442 ns | 441 ns .. 443 ns |
| encode, one at a time | gf2_127-w | group.encode/binary-w.127/mode=indep | 432 ns | 432 ns .. 433 ns |
| encode, one at a time | gf2_127-u | group.encode/binary-u.127/mode=indep | 438 ns | 437 ns .. 438 ns |
| encode, one at a time | gf2_109 | group.encode/binary.109/mode=indep | 3.03 µs | 3.02 µs .. 3.03 µs |
| encode, one at a time | gf2_109-lambda | group.encode/binary-lambda.109/mode=indep | 2.95 µs | 2.94 µs .. 2.95 µs |
| encode, one at a time | gf2_109-w | group.encode/binary-w.109/mode=indep | 2.90 µs | 2.89 µs .. 2.91 µs |
| encode, one at a time | gf2_109-u | group.encode/binary-u.109/mode=indep | 2.95 µs | 2.93 µs .. 2.96 µs |
| encode, one at a time | gf2_122 | group.encode/binary.122/mode=indep | 618 ns | 616 ns .. 619 ns |
| encode, one at a time | gf2_122-lambda | group.encode/binary-lambda.122/mode=indep | 573 ns | 572 ns .. 575 ns |
| encode, one at a time | gf2_122-w | group.encode/binary-w.122/mode=indep | 551 ns | 550 ns .. 553 ns |
| encode, one at a time | gf2_122-u | group.encode/binary-u.122/mode=indep | 564 ns | 563 ns .. 566 ns |
| encode, one at a time | gf2_122-gls | group.encode/binary.122-gls/mode=indep | 612 ns | 609 ns .. 614 ns |
| encode, one at a time | gf2_122-gls-lambda | group.encode/binary-lambda.122-gls/mode=indep | 576 ns | 575 ns .. 578 ns |
| encode, one at a time | gf2_122-gls-w | group.encode/binary-w.122-gls/mode=indep | 555 ns | 553 ns .. 556 ns |
| encode, one at a time | gf2_122-gls-u | group.encode/binary-u.122-gls/mode=indep | 562 ns | 561 ns .. 564 ns |
| encode, one at a time | edwards127 | group.encode/edwards.127/mode=indep | 536 ns | 534 ns .. 538 ns |
| encode, one at a time | weier127 | group.encode/weier.127/mode=indep | 527 ns | 526 ns .. 528 ns |
| encode, one at a time | weier127-jacobian | group.encode/weier-jacobian.127/mode=indep | 531 ns | 530 ns .. 532 ns |
| encode, batched | gf2_127 | group.encode/binary.127/mode=batch,n=1024 | 106 ns | 106 ns .. 106 ns |
| encode, batched | gf2_127-lambda | group.encode/binary-lambda.127/mode=batch,n=1024 | 87.0 ns | 86.8 ns .. 87.1 ns |
| encode, batched | gf2_127-w | group.encode/binary-w.127/mode=batch,n=1024 | 76.5 ns | 76.3 ns .. 76.6 ns |
| encode, batched | gf2_127-u | group.encode/binary-u.127/mode=batch,n=1024 | 76.5 ns | 75.9 ns .. 77.2 ns |
| encode, batched | gf2_109 | group.encode/binary.109/mode=batch,n=1024 | 306 ns | 305 ns .. 306 ns |
| encode, batched | gf2_109-lambda | group.encode/binary-lambda.109/mode=batch,n=1024 | 221 ns | 221 ns .. 222 ns |
| encode, batched | gf2_109-w | group.encode/binary-w.109/mode=batch,n=1024 | 204 ns | 203 ns .. 204 ns |
| encode, batched | gf2_109-u | group.encode/binary-u.109/mode=batch,n=1024 | 206 ns | 205 ns .. 207 ns |
| encode, batched | gf2_122 | group.encode/binary.122/mode=batch,n=1024 | 202 ns | 202 ns .. 203 ns |
| encode, batched | gf2_122-lambda | group.encode/binary-lambda.122/mode=batch,n=1024 | 156 ns | 155 ns .. 156 ns |
| encode, batched | gf2_122-w | group.encode/binary-w.122/mode=batch,n=1024 | 130 ns | 130 ns .. 131 ns |
| encode, batched | gf2_122-u | group.encode/binary-u.122/mode=batch,n=1024 | 132 ns | 132 ns .. 133 ns |
| encode, batched | gf2_122-gls | group.encode/binary.122-gls/mode=batch,n=1024 | 194 ns | 193 ns .. 195 ns |
| encode, batched | gf2_122-gls-lambda | group.encode/binary-lambda.122-gls/mode=batch,n=1024 | 156 ns | 155 ns .. 156 ns |
| encode, batched | gf2_122-gls-w | group.encode/binary-w.122-gls/mode=batch,n=1024 | 130 ns | 129 ns .. 130 ns |
| encode, batched | gf2_122-gls-u | group.encode/binary-u.122-gls/mode=batch,n=1024 | 133 ns | 133 ns .. 133 ns |
| encode, batched | edwards127 | group.encode/edwards.127/mode=batch,n=1024 | 21.7 ns | 21.7 ns .. 21.7 ns |
| encode, batched | weier127 | group.encode/weier.127/mode=batch,n=1024 | 9.97 ns | 9.95 ns .. 9.99 ns |
| encode, batched | weier127-jacobian | group.encode/weier-jacobian.127/mode=batch,n=1024 | 15.3 ns | 15.3 ns .. 15.4 ns |
| decode, one at a time | gf2_127 | group.decode/binary.127/mode=indep | 446 ns | 445 ns .. 447 ns |
| decode, one at a time | gf2_127-lambda | group.decode/binary-lambda.127/mode=indep | 447 ns | 446 ns .. 447 ns |
| decode, one at a time | gf2_127-w | group.decode/binary-w.127/mode=indep | 447 ns | 446 ns .. 448 ns |
| decode, one at a time | gf2_127-u | group.decode/binary-u.127/mode=indep | 479 ns | 478 ns .. 480 ns |
| decode, one at a time | gf2_109 | group.decode/binary.109/mode=indep | 2.98 µs | 2.97 µs .. 2.98 µs |
| decode, one at a time | gf2_109-lambda | group.decode/binary-lambda.109/mode=indep | 2.98 µs | 2.98 µs .. 2.99 µs |
| decode, one at a time | gf2_109-w | group.decode/binary-w.109/mode=indep | 2.96 µs | 2.96 µs .. 2.97 µs |
| decode, one at a time | gf2_109-u | group.decode/binary-u.109/mode=indep | 3.04 µs | 3.04 µs .. 3.05 µs |
| decode, one at a time | gf2_122 | group.decode/binary.122/mode=indep | 607 ns | 606 ns .. 609 ns |
| decode, one at a time | gf2_122-lambda | group.decode/binary-lambda.122/mode=indep | 607 ns | 605 ns .. 608 ns |
| decode, one at a time | gf2_122-w | group.decode/binary-w.122/mode=indep | 601 ns | 600 ns .. 603 ns |
| decode, one at a time | gf2_122-u | group.decode/binary-u.122/mode=indep | 676 ns | 674 ns .. 677 ns |
| decode, one at a time | gf2_122-gls | group.decode/binary.122-gls/mode=indep | 592 ns | 591 ns .. 594 ns |
| decode, one at a time | gf2_122-gls-lambda | group.decode/binary-lambda.122-gls/mode=indep | 599 ns | 595 ns .. 603 ns |
| decode, one at a time | gf2_122-gls-w | group.decode/binary-w.122-gls/mode=indep | 591 ns | 589 ns .. 592 ns |
| decode, one at a time | gf2_122-gls-u | group.decode/binary-u.122-gls/mode=indep | 639 ns | 637 ns .. 641 ns |
| decode, one at a time | edwards127 | group.decode/edwards.127/mode=indep | 485 ns | 484 ns .. 486 ns |
| decode, one at a time | weier127 | group.decode/weier.127/mode=indep | 487 ns | 486 ns .. 489 ns |
| decode, one at a time | weier127-jacobian | group.decode/weier-jacobian.127/mode=indep | 484 ns | 483 ns .. 486 ns |
| decode, batched | gf2_127 | group.decode/binary.127/mode=batch,n=1024 | 88.0 ns | 87.8 ns .. 88.1 ns |
| decode, batched | gf2_127-lambda | group.decode/binary-lambda.127/mode=batch,n=1024 | 87.9 ns | 87.8 ns .. 88.1 ns |
| decode, batched | gf2_127-w | group.decode/binary-w.127/mode=batch,n=1024 | 89.2 ns | 89.0 ns .. 89.3 ns |
| decode, batched | gf2_127-u | group.decode/binary-u.127/mode=batch,n=1024 | 121 ns | 121 ns .. 121 ns |
| decode, batched | gf2_109 | group.decode/binary.109/mode=batch,n=1024 | 263 ns | 262 ns .. 263 ns |
| decode, batched | gf2_109-lambda | group.decode/binary-lambda.109/mode=batch,n=1024 | 263 ns | 262 ns .. 263 ns |
| decode, batched | gf2_109-w | group.decode/binary-w.109/mode=batch,n=1024 | 240 ns | 239 ns .. 241 ns |
| decode, batched | gf2_109-u | group.decode/binary-u.109/mode=batch,n=1024 | 319 ns | 318 ns .. 319 ns |
| decode, batched | gf2_122 | group.decode/binary.122/mode=batch,n=1024 | 187 ns | 186 ns .. 187 ns |
| decode, batched | gf2_122-lambda | group.decode/binary-lambda.122/mode=batch,n=1024 | 186 ns | 186 ns .. 187 ns |
| decode, batched | gf2_122-w | group.decode/binary-w.122/mode=batch,n=1024 | 153 ns | 153 ns .. 154 ns |
| decode, batched | gf2_122-u | group.decode/binary-u.122/mode=batch,n=1024 | 204 ns | 204 ns .. 205 ns |
| decode, batched | gf2_122-gls | group.decode/binary.122-gls/mode=batch,n=1024 | 162 ns | 162 ns .. 163 ns |
| decode, batched | gf2_122-gls-lambda | group.decode/binary-lambda.122-gls/mode=batch,n=1024 | 163 ns | 162 ns .. 163 ns |
| decode, batched | gf2_122-gls-w | group.decode/binary-w.122-gls/mode=batch,n=1024 | 138 ns | 137 ns .. 138 ns |
| decode, batched | gf2_122-gls-u | group.decode/binary-u.122-gls/mode=batch,n=1024 | 187 ns | 186 ns .. 187 ns |
| decode, batched | edwards127 | group.decode/edwards.127/mode=batch,n=1024 | 485 ns | 483 ns .. 486 ns |
| decode, batched | weier127 | group.decode/weier.127/mode=batch,n=1024 | 484 ns | 483 ns .. 485 ns |
| decode, batched | weier127-jacobian | group.decode/weier-jacobian.127/mode=batch,n=1024 | 483 ns | 482 ns .. 484 ns |
| hash to curve, one at a time | gf2_127 | hash_to_curve/gf2_127/pornin map x1 | 619 ns | 617 ns .. 620 ns |
| hash to curve, one at a time | gf2_127-lambda | h2c/binary-lambda.127/mode=indep | 880 ns | 877 ns .. 883 ns |
| hash to curve, one at a time | gf2_127-w | h2c/binary-w.127/mode=indep | 975 ns | 973 ns .. 977 ns |
| hash to curve, one at a time | gf2_127-u | h2c/binary-u.127/mode=indep | 1.00 µs | 1.00 µs .. 1.00 µs |
| hash to curve, one at a time | gf2_109 | hash_to_curve/gf2_109/pornin map x1 | 3.39 µs | 3.39 µs .. 3.40 µs |
| hash to curve, one at a time | gf2_109-lambda | h2c/binary-lambda.109/mode=indep | 5.87 µs | 5.86 µs .. 5.88 µs |
| hash to curve, one at a time | gf2_109-w | h2c/binary-w.109/mode=indep | 5.78 µs | 5.77 µs .. 5.79 µs |
| hash to curve, one at a time | gf2_109-u | h2c/binary-u.109/mode=indep | 5.87 µs | 5.86 µs .. 5.88 µs |
| hash to curve, one at a time | gf2_122 | hash_to_curve/gf2_122/pornin map x1 | 897 ns | 894 ns .. 899 ns |
| hash to curve, one at a time | gf2_122-lambda | h2c/binary-lambda.122/mode=indep | 1.18 µs | 1.18 µs .. 1.19 µs |
| hash to curve, one at a time | gf2_122-w | h2c/binary-w.122/mode=indep | 1.21 µs | 1.21 µs .. 1.22 µs |
| hash to curve, one at a time | gf2_122-u | h2c/binary-u.122/mode=indep | 1.27 µs | 1.27 µs .. 1.28 µs |
| hash to curve, one at a time | gf2_122-gls | hash_to_curve/gf2_122-gls/pornin map x1 | 865 ns | 864 ns .. 867 ns |
| hash to curve, one at a time | gf2_122-gls-lambda | h2c/binary-lambda.122-gls/mode=indep | 1.18 µs | 1.18 µs .. 1.18 µs |
| hash to curve, one at a time | gf2_122-gls-w | h2c/binary-w.122-gls/mode=indep | 1.24 µs | 1.23 µs .. 1.26 µs |
| hash to curve, one at a time | gf2_122-gls-u | h2c/binary-u.122-gls/mode=indep | 1.25 µs | 1.25 µs .. 1.25 µs |
| hash to curve, one at a time | edwards127 | h2c/edwards.127/mode=indep | 1.07 µs | 1.06 µs .. 1.07 µs |
| hash to curve, one at a time | weier127 | h2c/weier.127/mode=indep | 1.03 µs | 1.03 µs .. 1.03 µs |
| hash to curve, one at a time | weier127-jacobian | h2c/weier-jacobian.127/mode=indep | 1.03 µs | 1.03 µs .. 1.03 µs |
| hash to curve, batched | gf2_127 | h2c/binary.127/mode=batch,n=1024 | 196 ns | 195 ns .. 196 ns |
| hash to curve, batched | gf2_127-lambda | h2c/binary-lambda.127/mode=batch,n=1024 | 196 ns | 196 ns .. 196 ns |
| hash to curve, batched | gf2_127-w | h2c/binary-w.127/mode=batch,n=1024 | 221 ns | 220 ns .. 222 ns |
| hash to curve, batched | gf2_127-u | h2c/binary-u.127/mode=batch,n=1024 | 258 ns | 257 ns .. 258 ns |
| hash to curve, batched | gf2_109 | h2c/binary.109/mode=batch,n=1024 | 518 ns | 517 ns .. 520 ns |
| hash to curve, batched | gf2_109-lambda | h2c/binary-lambda.109/mode=batch,n=1024 | 517 ns | 516 ns .. 518 ns |
| hash to curve, batched | gf2_109-w | h2c/binary-w.109/mode=batch,n=1024 | 516 ns | 515 ns .. 517 ns |
| hash to curve, batched | gf2_109-u | h2c/binary-u.109/mode=batch,n=1024 | 592 ns | 591 ns .. 593 ns |
| hash to curve, batched | gf2_122 | h2c/binary.122/mode=batch,n=1024 | 350 ns | 349 ns .. 351 ns |
| hash to curve, batched | gf2_122-lambda | h2c/binary-lambda.122/mode=batch,n=1024 | 350 ns | 348 ns .. 351 ns |
| hash to curve, batched | gf2_122-w | h2c/binary-w.122/mode=batch,n=1024 | 328 ns | 327 ns .. 328 ns |
| hash to curve, batched | gf2_122-u | h2c/binary-u.122/mode=batch,n=1024 | 391 ns | 390 ns .. 392 ns |
| hash to curve, batched | gf2_122-gls | h2c/binary.122-gls/mode=batch,n=1024 | 309 ns | 308 ns .. 310 ns |
| hash to curve, batched | gf2_122-gls-lambda | h2c/binary-lambda.122-gls/mode=batch,n=1024 | 315 ns | 314 ns .. 315 ns |
| hash to curve, batched | gf2_122-gls-w | h2c/binary-w.122-gls/mode=batch,n=1024 | 311 ns | 310 ns .. 311 ns |
| hash to curve, batched | gf2_122-gls-u | h2c/binary-u.122-gls/mode=batch,n=1024 | 359 ns | 358 ns .. 360 ns |
| hash to curve, batched | edwards127 | h2c/edwards.127/mode=batch,n=1024 | 1.06 µs | 1.06 µs .. 1.07 µs |
| hash to curve, batched | weier127 | h2c/weier.127/mode=batch,n=1024 | 1.03 µs | 1.03 µs .. 1.03 µs |
| hash to curve, batched | weier127-jacobian | h2c/weier-jacobian.127/mode=batch,n=1024 | 1.00 µs | 1.00 µs .. 1.01 µs |
| hash to addend, one at a time | gf2_127-lambda | hash_to_curve/gf2_127-lambda/pornin map x1 to (x, λ) | 567 ns | 566 ns .. 568 ns |
| hash to addend, one at a time | gf2_127-w | hash_to_curve/gf2_127-w/pornin map x1 to (x, λ) | 569 ns | 568 ns .. 569 ns |
| hash to addend, one at a time | gf2_127-u | hash_to_curve/gf2_127-u/pornin map x1 to (u, v) | 598 ns | 597 ns .. 599 ns |
| hash to addend, one at a time | gf2_109-lambda | hash_to_curve/gf2_109-lambda/pornin map x1 to (x, λ) | 3.28 µs | 3.27 µs .. 3.28 µs |
| hash to addend, one at a time | gf2_109-w | hash_to_curve/gf2_109-w/pornin map x1 to (x, λ) | 3.27 µs | 3.27 µs .. 3.28 µs |
| hash to addend, one at a time | gf2_109-u | hash_to_curve/gf2_109-u/pornin map x1 to (u, v) | 3.34 µs | 3.33 µs .. 3.34 µs |
| hash to addend, one at a time | gf2_122-lambda | hash_to_curve/gf2_122-lambda/pornin map x1 to (x, λ) | 801 ns | 799 ns .. 803 ns |
| hash to addend, one at a time | gf2_122-w | hash_to_curve/gf2_122-w/pornin map x1 to (x, λ) | 799 ns | 797 ns .. 800 ns |
| hash to addend, one at a time | gf2_122-u | hash_to_curve/gf2_122-u/pornin map x1 to (u, v) | 857 ns | 855 ns .. 858 ns |
| hash to addend, one at a time | gf2_122-gls-lambda | hash_to_curve/gf2_122-gls-lambda/pornin map x1 to (x, λ) | 788 ns | 787 ns .. 790 ns |
| hash to addend, one at a time | gf2_122-gls-w | hash_to_curve/gf2_122-gls-w/pornin map x1 to (x, λ) | 791 ns | 790 ns .. 793 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) | 843 ns | 841 ns .. 844 ns |
| hash to addend, batched | gf2_127-lambda | hash_to_curve/gf2_127-lambda/try-and-increment to (x, λ), batched | 179 ns | 179 ns .. 180 ns |
| hash to addend, batched | gf2_127-w | hash_to_curve/gf2_127-w/pornin map x1 to (x, λ), batched | 184 ns | 184 ns .. 185 ns |
| hash to addend, batched | gf2_127-u | hash_to_curve/gf2_127-u/pornin map x1 to (u, v), batched | 213 ns | 212 ns .. 213 ns |
| hash to addend, batched | gf2_109-lambda | hash_to_curve/gf2_109-lambda/try-and-increment to (x, λ), batched | 511 ns | 510 ns .. 511 ns |
| hash to addend, batched | gf2_109-w | hash_to_curve/gf2_109-w/pornin map x1 to (x, λ), batched | 522 ns | 522 ns .. 523 ns |
| hash to addend, batched | gf2_109-u | hash_to_curve/gf2_109-u/pornin map x1 to (u, v), batched | 593 ns | 591 ns .. 594 ns |
| hash to addend, batched | gf2_122-lambda | hash_to_curve/gf2_122-lambda/try-and-increment to (x, λ), batched | 361 ns | 349 ns .. 376 ns |
| hash to addend, batched | gf2_122-w | hash_to_curve/gf2_122-w/pornin map x1 to (x, λ), batched | 429 ns | 403 ns .. 454 ns |
| hash to addend, batched | gf2_122-u | hash_to_curve/gf2_122-u/pornin map x1 to (u, v), batched | 622 ns | 603 ns .. 638 ns |
| hash to addend, batched | gf2_122-gls-lambda | hash_to_curve/gf2_122-gls-lambda/try-and-increment to (x, λ), batched | 327 ns | 314 ns .. 341 ns |
| hash to addend, batched | gf2_122-gls-w | hash_to_curve/gf2_122-gls-w/pornin map x1 to (x, λ), batched | 404 ns | 383 ns .. 424 ns |
| hash to addend, batched | gf2_122-gls-u | hash_to_curve/gf2_122-gls-u/pornin map x1 to (u, v), batched | 593 ns | 585 ns .. 599 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 | 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 | 2 | 2 | 3 | 2 | 1 | 1 | 2 | 2 | 6 | 1 | 1 | |
| gf2_127-lambdaincompleteλ-projective (X:L:Z) accumulators | 4 | 4 | 2 | 1 | 1 | 1 | 2 | 4 | 4 | 6 | 3 | 6 |
| gf2_127-wincompleteλ-projective, w codec: hashes and decodes to λ-affine | 4 | 4 | 2 | 1 | 1 | 1 | 2 | 4 | 4 | 6 | 3 | 6 |
| gf2_127-uunscaled (X:S:Z), w codec, direct addend hashes | 4 | 4 | 2 | 1 | 1 | 1 | 2 | 4 | 4 | 6 | 3 | 6 |
| GF(2^122) = GF(2^61)[u], dense constant, 16 bytes | ||||||||||||
| gf2_122(X:S:Z:T) extended | 2 | 2 | 3 | 2 | 1 | 1 | 2 | 2 | 1 | 1 | 1 | |
| gf2_122-lambdaincompleteλ-projective | 2 | 2 | 2 | 1 | 1 | 1 | 2 | 2 | 1 | 1 | 1 | |
| gf2_122-wincompleteλ-projective, w codec | 2 | 2 | 2 | 1 | 1 | 1 | 2 | 2 | 1 | 1 | 1 | |
| gf2_122-uunscaled (X:S:Z), w codec | 2 | 2 | 2 | 1 | 1 | 1 | 2 | 2 | 1 | 1 | 1 | |
| GF(2^122), constant in GF(2^61) (GLS-shaped), 16 bytes | ||||||||||||
| gf2_122-gls(X:S:Z:T) extended | 2 | 2 | 3 | 1 | 1 | 1 | 2 | 2 | 1 | 1 | 1 | |
| gf2_122-gls-lambdaincompleteλ-projective | 2 | 2 | 2 | 1 | 1 | 1 | 2 | 2 | 1 | 1 | 1 | |
| gf2_122-gls-wincompleteλ-projective, w codec | 2 | 2 | 2 | 1 | 1 | 1 | 2 | 2 | 1 | 1 | 1 | |
| gf2_122-gls-uunscaled (X:S:Z), w codec | 2 | 2 | 2 | 1 | 1 | 1 | 2 | 2 | 1 | 1 | 1 | |
| GF(2^109), 14 bytes | ||||||||||||
| gf2_109(X:S:Z:T) extended | 2 | 2 | 3 | 2 | 1 | 1 | 2 | 2 | 1 | 1 | 1 | |
| gf2_109-lambdaincompleteλ-projective | 2 | 2 | 2 | 1 | 1 | 1 | 2 | 2 | 1 | 1 | 1 | |
| gf2_109-wincompleteλ-projective, w codec | 2 | 2 | 2 | 1 | 1 | 1 | 2 | 2 | 1 | 1 | 1 | |
| gf2_109-uunscaled (X:S:Z), w codec | 2 | 2 | 2 | 1 | 1 | 1 | 2 | 2 | 1 | 1 | 1 | |
| F_p, p = 2^127 − 1, 16 bytes | ||||||||||||
| edwards127a = 1 Edwards, extended += cached | 5 | 4 | 3 | 1 | 2 | 1 | 2 | 4 | 4 | 8 | 5 | 23 |
| weier127short Weierstrass, projective += affine | 4 | 4 | 2 | 1 | 2 | 1 | 2 | 4 | 4 | 6 | 3 | 6 |
| weier127-jacobianincompleteshort Weierstrass, Jacobian += affine | 4 | 4 | 2 | 1 | 1 | 1 | 2 | 4 | 4 | 8 | 5 | 23 |
| F_p, p = 2^107 − 1, 14 bytes | ||||||||||||
| edwards107a = 1 Edwards, extended += cached | ||||||||||||
| weier107short Weierstrass, projective += affine | ||||||||||||
| weier107-jacobianincompleteshort Weierstrass, Jacobian += affine | ||||||||||||
| F_p, p = 2^128 − 275, 16 bytes | ||||||||||||
| twisted128a = −1 twisted Edwards modulo 2-torsion, extended += cached | ||||||||||||
| F_{p²}, p = 2^61 − 1, 16 bytes | ||||||||||||
| edwards61x2a = 1 Edwards, signed-x codec, extended += cached | ||||||||||||
| weier61x2short Weierstrass, signed-x codec, projective += affine | ||||||||||||
| weier61x2-jacobianincompleteshort Weierstrass, signed-x codec, Jacobian += affine | ||||||||||||
| twisted61x2a = −1 Edwards modulo 2-torsion, extended += cached | ||||||||||||
| F_{p²}, p = 2^64 − 59, 16 bytes | ||||||||||||
| twisted64x2a = −1 Edwards modulo 2-torsion, extended += cached | ||||||||||||
| F_{p²}, p = 2^64 − 2^32 + 1, 16 bytes | ||||||||||||
| twisted-goldilocks2a = −1 Edwards modulo 2-torsion, extended += cached | ||||||||||||
| references, 32 and 33 bytes | ||||||||||||
| ristretto255curve25519-dalek | ||||||||||||
| secp256k1libsecp256k1 | ||||||||||||
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
50 benchmarks
| operation | benchmark | family | mode | time | 95% CI | unit |
|---|---|---|---|---|---|---|
| batch invert | gf2_109/batch invert (product tree) | gf2_109 | batch | 109 ns | 108 ns .. 109 ns | per elem |
| batch invert | gf2_122/batch invert (product tree) | gf2_122 | batch | 74.0 ns | 73.8 ns .. 74.1 ns | per elem |
| batch invert | gf2_127/batch invert (product tree) | gf2_127 | batch | 42.0 ns | 42.0 ns .. 42.1 ns | per elem |
| batch invert | fp127/batch invert (product tree) | fp127 | batch | 5.71 ns | 5.69 ns .. 5.74 ns | per elem |
| halftrace | gf2_109/halftrace | gf2_109 | per-element | 36.8 ns | 36.7 ns .. 36.9 ns | per elem |
| halftrace | gf2_109/halftrace (byte tables) | gf2_109 | per-element | 3.28 ns | 3.27 ns .. 3.29 ns | per elem |
| halftrace | gf2_122/qsolve (z^2 + z = c, 2 base halftraces) | gf2_122 | per-element | 2.39 ns | 2.38 ns .. 2.39 ns | per elem |
| halftrace | gf2_127/halftrace | gf2_127 | per-element | 15.1 ns | 15.1 ns .. 15.2 ns | per elem |
| halftrace | gf2_127/halftrace (byte tables) | gf2_127 | per-element | 3.50 ns | 3.49 ns .. 3.51 ns | per elem |
| halftrace | gf2_127/halftrace (nibble tables) | gf2_127 | per-element | 17.8 ns | 17.7 ns .. 17.8 ns | per elem |
| mul_u2 | gf2_122/mul_u2 (by a^2 = 1 + a) latency (dependent chain) | gf2_122 | latency | 0.26 ns | 0.26 ns .. 0.26 ns | per elem |
| mul_u2 | gf2_122/mul_u2 (by a^2 = 1 + a) throughput (8 chains) | gf2_122 | throughput | 0.13 ns | 0.13 ns .. 0.13 ns | per elem |
| trace | gf2_109/trace | gf2_109 | per-element | 0.45 ns | 0.45 ns .. 0.45 ns | per elem |
| trace | gf2_122/trace | gf2_122 | per-element | 0.34 ns | 0.34 ns .. 0.34 ns | per elem |
| trace | gf2_127/trace | gf2_127 | per-element | 0.34 ns | 0.34 ns .. 0.34 ns | per elem |
| pack | fp127/pack | fp127 | per-element | 0.35 ns | 0.35 ns .. 0.36 ns | per elem |
| normalize | gf2_109/normalize (to_u128) | gf2_109 | per-element | 0.53 ns | 0.53 ns .. 0.53 ns | per elem |
| normalize | gf2_122/normalize (to_u128) | gf2_122 | per-element | 0.70 ns | 0.70 ns .. 0.70 ns | per elem |
| normalize | gf2_127/normalize (to_u128) | gf2_127 | per-element | 0.42 ns | 0.42 ns .. 0.42 ns | per elem |
| unpack | fp127/unpack | fp127 | per-element | 0.57 ns | 0.57 ns .. 0.57 ns | per elem |
| neg | fp127/neg | fp127 | per-element | 0.75 ns | 0.75 ns .. 0.76 ns | per elem |
| add | fp127/add | fp127 | per-element | 0.94 ns | 0.94 ns .. 0.94 ns | per elem |
| square | gf2_109/square latency (dependent chain) | gf2_109 | latency | 26.7 ns | 26.7 ns .. 26.8 ns | per elem |
| square | gf2_109/square throughput (8 chains) | gf2_109 | throughput | 21.8 ns | 21.7 ns .. 21.8 ns | per elem |
| square | gf2_122/square latency (dependent chain) | gf2_122 | latency | 16.7 ns | 16.7 ns .. 16.8 ns | per elem |
| square | gf2_122/square throughput (8 chains) | gf2_122 | throughput | 3.84 ns | 3.83 ns .. 3.85 ns | per elem |
| square | gf2_127/square latency (dependent chain) | gf2_127 | latency | 4.19 ns | 4.18 ns .. 4.20 ns | per elem |
| square | gf2_127/square throughput (8 chains) | gf2_127 | throughput | 2.58 ns | 2.58 ns .. 2.59 ns | per elem |
| square | fp127/square latency (dependent chain) | fp127 | latency | 3.64 ns | 3.63 ns .. 3.65 ns | per elem |
| square | fp127/square throughput (8 chains) | fp127 | throughput | 1.91 ns | 1.91 ns .. 1.92 ns | per elem |
| sqrt | gf2_109/sqrt | gf2_109 | per-element | 19.2 ns | 19.2 ns .. 19.3 ns | per elem |
| sqrt | gf2_122/sqrt | gf2_122 | per-element | 3.41 ns | 3.40 ns .. 3.41 ns | per elem |
| sqrt | gf2_127/sqrt | gf2_127 | per-element | 2.61 ns | 2.60 ns .. 2.62 ns | per elem |
| sqrt | fp127/sqrt (x^(2^125)) | fp127 | per-element | 474 ns | 473 ns .. 475 ns | per elem |
| mul_base | gf2_122/mul_base (by a GF(2^61) constant) latency (dependent chain) | gf2_122 | latency | 20.9 ns | 20.9 ns .. 21.0 ns | per elem |
| mul_base | gf2_122/mul_base (by a GF(2^61) constant) throughput (8 chains) | gf2_122 | throughput | 13.9 ns | 13.8 ns .. 13.9 ns | per elem |
| mul | gf2_109/mul latency (dependent chain) | gf2_109 | latency | 38.9 ns | 38.8 ns .. 39.0 ns | per elem |
| mul | gf2_109/mul throughput (8 chains) | gf2_109 | throughput | 34.7 ns | 34.6 ns .. 34.9 ns | per elem |
| mul | gf2_122/mul latency (dependent chain) | gf2_122 | latency | 29.1 ns | 29.1 ns .. 29.2 ns | per elem |
| mul | gf2_122/mul throughput (8 chains) | gf2_122 | throughput | 24.6 ns | 24.6 ns .. 24.7 ns | per elem |
| mul | gf2_127/mul latency (dependent chain) | gf2_127 | latency | 13.4 ns | 13.4 ns .. 13.5 ns | per elem |
| mul | gf2_127/mul throughput (8 chains) | gf2_127 | throughput | 13.2 ns | 13.2 ns .. 13.3 ns | per elem |
| mul | fp127/mul latency (dependent chain) | fp127 | latency | 3.64 ns | 3.63 ns .. 3.65 ns | per elem |
| mul | fp127/mul throughput (8 chains) | fp127 | throughput | 1.54 ns | 1.54 ns .. 1.54 ns | per elem |
| pow_p34 | fp127/pow_p34 (x^(2^125-1)) | fp127 | per-element | 504 ns | 503 ns .. 505 ns | per elem |
| invert | gf2_109/invert | gf2_109 | per-element | 2.82 µs | 2.82 µs .. 2.83 µs | per elem |
| invert | gf2_122/invert | gf2_122 | per-element | 494 ns | 493 ns .. 495 ns | per elem |
| invert | gf2_127/invert | gf2_127 | per-element | 391 ns | 390 ns .. 392 ns | per elem |
| invert | fp127/invert | fp127 | per-element | 519 ns | 518 ns .. 521 ns | per elem |
| sqrt_ratio | fp127/sqrt_ratio | fp127 | per-element | 525 ns | 523 ns .. 526 ns | per elem |
group ops
277 benchmarks
| operation | benchmark | family | mode | time | 95% CI | unit |
|---|---|---|---|---|---|---|
| prepare | binary.109/mode=batch,n=1024 | gf2_109 | batch | 95.7 ns | 95.5 ns .. 95.9 ns | per elem |
| prepare | binary.109/mode=indep | gf2_109 | per-element | 95.3 ns | 95.1 ns .. 95.4 ns | per elem |
| prepare | binary-lambda.109/mode=batch,n=1024 | gf2_109-lambda | batch | 147 ns | 147 ns .. 147 ns | per elem |
| prepare | binary-lambda.109/mode=indep | gf2_109-lambda | per-element | 2.86 µs | 2.86 µs .. 2.87 µs | per elem |
| prepare | binary-u.109/mode=batch,n=1024 | gf2_109-u | batch | 0.98 ns | 0.97 ns .. 0.99 ns | per elem |
| prepare | binary-u.109/mode=indep | gf2_109-u | per-element | 0.62 ns | 0.62 ns .. 0.62 ns | per elem |
| prepare | binary-w.109/mode=batch,n=1024 | gf2_109-w | batch | 0.97 ns | 0.96 ns .. 0.98 ns | per elem |
| prepare | binary-w.109/mode=indep | gf2_109-w | per-element | 0.62 ns | 0.62 ns .. 0.62 ns | per elem |
| prepare | binary.122/mode=batch,n=1024 | gf2_122 | batch | 63.1 ns | 62.9 ns .. 63.3 ns | per elem |
| prepare | binary.122/mode=indep | gf2_122 | per-element | 64.2 ns | 64.0 ns .. 64.3 ns | per elem |
| prepare | binary.122-gls/mode=batch,n=1024 | gf2_122-gls | batch | 44.3 ns | 44.1 ns .. 44.4 ns | per elem |
| prepare | binary.122-gls/mode=indep | gf2_122-gls | per-element | 44.2 ns | 44.0 ns .. 44.3 ns | per elem |
| prepare | binary-lambda.122-gls/mode=batch,n=1024 | gf2_122-gls-lambda | batch | 101 ns | 100 ns .. 101 ns | per elem |
| prepare | binary-lambda.122-gls/mode=indep | gf2_122-gls-lambda | per-element | 524 ns | 522 ns .. 525 ns | per elem |
| prepare | binary-u.122-gls/mode=batch,n=1024 | gf2_122-gls-u | batch | 1.01 ns | 0.98 ns .. 1.04 ns | per elem |
| prepare | binary-u.122-gls/mode=indep | gf2_122-gls-u | per-element | 0.62 ns | 0.61 ns .. 0.62 ns | per elem |
| prepare | binary-w.122-gls/mode=batch,n=1024 | gf2_122-gls-w | batch | 0.97 ns | 0.96 ns .. 0.99 ns | per elem |
| prepare | binary-w.122-gls/mode=indep | gf2_122-gls-w | per-element | 0.62 ns | 0.62 ns .. 0.62 ns | per elem |
| prepare | binary-lambda.122/mode=batch,n=1024 | gf2_122-lambda | batch | 100 ns | 99.9 ns .. 101 ns | per elem |
| prepare | binary-lambda.122/mode=indep | gf2_122-lambda | per-element | 521 ns | 520 ns .. 523 ns | per elem |
| prepare | binary-u.122/mode=batch,n=1024 | gf2_122-u | batch | 0.99 ns | 0.98 ns .. 0.99 ns | per elem |
| prepare | binary-u.122/mode=indep | gf2_122-u | per-element | 0.62 ns | 0.62 ns .. 0.62 ns | per elem |
| prepare | binary-w.122/mode=batch,n=1024 | gf2_122-w | batch | 0.99 ns | 0.98 ns .. 1.00 ns | per elem |
| prepare | binary-w.122/mode=indep | gf2_122-w | per-element | 0.62 ns | 0.61 ns .. 0.62 ns | per elem |
| prepare | binary.127/mode=batch,n=1024 | gf2_127 | batch | 31.2 ns | 31.2 ns .. 31.3 ns | per elem |
| prepare | binary.127/mode=indep | gf2_127 | per-element | 31.6 ns | 31.5 ns .. 31.6 ns | per elem |
| prepare | binary-lambda.127/mode=batch,n=1024 | gf2_127-lambda | batch | 56.6 ns | 56.5 ns .. 56.8 ns | per elem |
| prepare | binary-lambda.127/mode=batch,n=64 | gf2_127-lambda | batch | 65.7 ns | 65.6 ns .. 65.8 ns | per elem |
| prepare | binary-lambda.127/mode=batch,n=8 | gf2_127-lambda | batch | 115 ns | 115 ns .. 115 ns | per elem |
| prepare | binary-lambda.127/mode=indep | gf2_127-lambda | per-element | 412 ns | 411 ns .. 412 ns | per elem |
| prepare | binary-u.127/mode=batch,n=1024 | gf2_127-u | batch | 0.98 ns | 0.98 ns .. 0.99 ns | per elem |
| prepare | binary-u.127/mode=batch,n=64 | gf2_127-u | batch | 1.01 ns | 1.01 ns .. 1.01 ns | per elem |
| prepare | binary-u.127/mode=batch,n=8 | gf2_127-u | batch | 1.85 ns | 1.84 ns .. 1.85 ns | per elem |
| prepare | binary-u.127/mode=indep | gf2_127-u | per-element | 0.62 ns | 0.62 ns .. 0.62 ns | per elem |
| prepare | binary-w.127/mode=batch,n=1024 | gf2_127-w | batch | 0.97 ns | 0.96 ns .. 0.98 ns | per elem |
| prepare | binary-w.127/mode=batch,n=64 | gf2_127-w | batch | 1.01 ns | 1.01 ns .. 1.01 ns | per elem |
| prepare | binary-w.127/mode=batch,n=8 | gf2_127-w | batch | 1.85 ns | 1.84 ns .. 1.85 ns | per elem |
| prepare | binary-w.127/mode=indep | gf2_127-w | per-element | 0.62 ns | 0.62 ns .. 0.62 ns | per elem |
| prepare | edwards.127/mode=batch,n=1024 | edwards127 | batch | 27.2 ns | 27.2 ns .. 27.3 ns | per elem |
| prepare | edwards.127/mode=batch,n=64 | edwards127 | batch | 37.1 ns | 36.9 ns .. 37.2 ns | per elem |
| prepare | edwards.127/mode=batch,n=8 | edwards127 | batch | 105 ns | 105 ns .. 105 ns | per elem |
| prepare | edwards.127/mode=indep | edwards127 | per-element | 573 ns | 571 ns .. 574 ns | per elem |
| prepare | weier.127/mode=batch,n=1024 | weier127 | batch | 0.45 ns | 0.45 ns .. 0.46 ns | per elem |
| prepare | weier.127/mode=batch,n=64 | weier127 | batch | 0.54 ns | 0.54 ns .. 0.54 ns | per elem |
| prepare | weier.127/mode=batch,n=8 | weier127 | batch | 1.42 ns | 1.41 ns .. 1.43 ns | per elem |
| prepare | weier.127/mode=indep | weier127 | per-element | 0.58 ns | 0.57 ns .. 0.58 ns | per elem |
| prepare | weier-jacobian.127/mode=batch,n=1024 | weier127-jacobian | batch | 0.46 ns | 0.46 ns .. 0.46 ns | per elem |
| prepare | weier-jacobian.127/mode=batch,n=64 | weier127-jacobian | batch | 0.54 ns | 0.54 ns .. 0.55 ns | per elem |
| prepare | weier-jacobian.127/mode=batch,n=8 | weier127-jacobian | batch | 1.41 ns | 1.41 ns .. 1.42 ns | per elem |
| prepare | weier-jacobian.127/mode=indep | weier127-jacobian | per-element | 0.57 ns | 0.57 ns .. 0.58 ns | per elem |
| add | xor-sha256/xor 32B, 1 accumulator | xor | latency | 0.39 ns | 0.39 ns .. 0.39 ns | per elem |
| add | xor-sha256/xor 32B, 8 accumulators | xor | throughput | 0.73 ns | 0.73 ns .. 0.73 ns | per elem |
| add | binary.109/mode=latency | gf2_109 | latency | 403 ns | 403 ns .. 404 ns | per elem |
| add | binary.109/mode=throughput | gf2_109 | throughput | 403 ns | 402 ns .. 404 ns | per elem |
| add | gf2_109/extended += affine, 8 accumulators | gf2_109 | throughput | 504 ns | 500 ns .. 509 ns | per elem |
| add | binary-lambda.109/mode=latency | gf2_109-lambda | latency | 334 ns | 333 ns .. 335 ns | per elem |
| add | binary-lambda.109/mode=throughput | gf2_109-lambda | throughput | 331 ns | 330 ns .. 332 ns | per elem |
| add | binary-u.109/mode=latency | gf2_109-u | latency | 290 ns | 289 ns .. 290 ns | per elem |
| add | binary-u.109/mode=throughput | gf2_109-u | throughput | 289 ns | 289 ns .. 290 ns | per elem |
| add | binary-w.109/mode=latency | gf2_109-w | latency | 335 ns | 334 ns .. 335 ns | per elem |
| add | binary-w.109/mode=throughput | gf2_109-w | throughput | 332 ns | 331 ns .. 332 ns | per elem |
| add | binary.122/mode=latency | gf2_122 | latency | 267 ns | 266 ns .. 268 ns | per elem |
| add | binary.122/mode=throughput | gf2_122 | throughput | 263 ns | 262 ns .. 264 ns | per elem |
| add | gf2_122/extended += affine, 8 accumulators | gf2_122 | throughput | 330 ns | 330 ns .. 331 ns | per elem |
| add | binary.122-gls/mode=latency | gf2_122-gls | latency | 240 ns | 239 ns .. 241 ns | per elem |
| add | binary.122-gls/mode=throughput | gf2_122-gls | throughput | 246 ns | 245 ns .. 247 ns | per elem |
| add | gf2_122-gls/extended += affine, 8 accumulators | gf2_122-gls | throughput | 301 ns | 299 ns .. 303 ns | per elem |
| add | binary-lambda.122-gls/mode=latency | gf2_122-gls-lambda | latency | 219 ns | 219 ns .. 220 ns | per elem |
| add | binary-lambda.122-gls/mode=throughput | gf2_122-gls-lambda | throughput | 216 ns | 215 ns .. 217 ns | per elem |
| add | binary-u.122-gls/mode=latency | gf2_122-gls-u | latency | 183 ns | 183 ns .. 183 ns | per elem |
| add | binary-u.122-gls/mode=throughput | gf2_122-gls-u | throughput | 182 ns | 182 ns .. 183 ns | per elem |
| add | binary-w.122-gls/mode=latency | gf2_122-gls-w | latency | 219 ns | 219 ns .. 220 ns | per elem |
| add | binary-w.122-gls/mode=throughput | gf2_122-gls-w | throughput | 217 ns | 216 ns .. 217 ns | per elem |
| add | binary-lambda.122/mode=latency | gf2_122-lambda | latency | 219 ns | 219 ns .. 220 ns | per elem |
| add | binary-lambda.122/mode=throughput | gf2_122-lambda | throughput | 217 ns | 217 ns .. 217 ns | per elem |
| add | binary-u.122/mode=latency | gf2_122-u | latency | 183 ns | 183 ns .. 184 ns | per elem |
| add | binary-u.122/mode=throughput | gf2_122-u | throughput | 183 ns | 183 ns .. 183 ns | per elem |
| add | binary-w.122/mode=latency | gf2_122-w | latency | 219 ns | 219 ns .. 220 ns | per elem |
| add | binary-w.122/mode=throughput | gf2_122-w | throughput | 211 ns | 209 ns .. 212 ns | per elem |
| add | binary.127/mode=latency | gf2_127 | latency | 156 ns | 155 ns .. 156 ns | per elem |
| add | binary.127/mode=throughput | gf2_127 | throughput | 155 ns | 155 ns .. 155 ns | per elem |
| add | gf2_127/extended += affine, 8 accumulators | gf2_127 | throughput | 193 ns | 193 ns .. 194 ns | per elem |
| add | binary-lambda.127/mode=latency | gf2_127-lambda | latency | 135 ns | 135 ns .. 135 ns | per elem |
| add | binary-lambda.127/mode=throughput | gf2_127-lambda | throughput | 132 ns | 131 ns .. 132 ns | per elem |
| add | binary-u.127/mode=latency | gf2_127-u | latency | 119 ns | 119 ns .. 120 ns | per elem |
| add | binary-u.127/mode=throughput | gf2_127-u | throughput | 116 ns | 116 ns .. 116 ns | per elem |
| add | binary-w.127/mode=latency | gf2_127-w | latency | 135 ns | 135 ns .. 135 ns | per elem |
| add | binary-w.127/mode=throughput | gf2_127-w | throughput | 131 ns | 131 ns .. 131 ns | per elem |
| add | edwards.127/mode=latency | edwards127 | latency | 22.1 ns | 22.0 ns .. 22.1 ns | per elem |
| add | edwards.127/mode=throughput | edwards127 | throughput | 19.9 ns | 19.9 ns .. 19.9 ns | per elem |
| add | edwards127/+= montgomery affine, 8 accumulators | edwards127 | throughput | 40.4 ns | 40.3 ns .. 40.5 ns | per elem |
| add | weier.127/mode=latency | weier127 | latency | 46.2 ns | 46.1 ns .. 46.3 ns | per elem |
| add | weier.127/mode=throughput | weier127 | throughput | 44.7 ns | 44.6 ns .. 44.8 ns | per elem |
| add | weier-jacobian.127/mode=latency | weier127-jacobian | latency | 45.0 ns | 44.8 ns .. 45.1 ns | per elem |
| add | weier-jacobian.127/mode=throughput | weier127-jacobian | throughput | 36.6 ns | 36.5 ns .. 36.8 ns | per elem |
| subtract | binary-lambda.127/mode=throughput | gf2_127-lambda | throughput | 131 ns | 131 ns .. 131 ns | per elem |
| subtract | binary-u.127/mode=throughput | gf2_127-u | throughput | 119 ns | 118 ns .. 119 ns | per elem |
| subtract | binary-w.127/mode=throughput | gf2_127-w | throughput | 131 ns | 131 ns .. 131 ns | per elem |
| subtract | edwards.127/mode=throughput | edwards127 | throughput | 22.7 ns | 22.6 ns .. 22.7 ns | per elem |
| subtract | weier.127/mode=throughput | weier127 | throughput | 46.4 ns | 46.3 ns .. 46.5 ns | per elem |
| subtract | weier-jacobian.127/mode=throughput | weier127-jacobian | throughput | 37.6 ns | 37.5 ns .. 37.6 ns | per elem |
| negate | binary.109 | gf2_109 | per-element | 1.05 ns | 1.05 ns .. 1.05 ns | per elem |
| negate | gf2_109/affine (y += x) | gf2_109 | per-element | 0.69 ns | 0.68 ns .. 0.69 ns | per elem |
| negate | binary-lambda.109 | gf2_109-lambda | per-element | 0.65 ns | 0.64 ns .. 0.65 ns | per elem |
| negate | binary-u.109 | gf2_109-u | per-element | 0.69 ns | 0.69 ns .. 0.69 ns | per elem |
| negate | binary-w.109 | gf2_109-w | per-element | 0.64 ns | 0.64 ns .. 0.65 ns | per elem |
| negate | binary.122 | gf2_122 | per-element | 1.04 ns | 1.04 ns .. 1.05 ns | per elem |
| negate | gf2_122/affine (y += x) | gf2_122 | per-element | 0.69 ns | 0.69 ns .. 0.69 ns | per elem |
| negate | binary.122-gls | gf2_122-gls | per-element | 1.02 ns | 1.02 ns .. 1.02 ns | per elem |
| negate | binary-lambda.122-gls | gf2_122-gls-lambda | per-element | 0.65 ns | 0.64 ns .. 0.65 ns | per elem |
| negate | binary-u.122-gls | gf2_122-gls-u | per-element | 0.69 ns | 0.69 ns .. 0.69 ns | per elem |
| negate | binary-w.122-gls | gf2_122-gls-w | per-element | 0.65 ns | 0.64 ns .. 0.65 ns | per elem |
| negate | binary-lambda.122 | gf2_122-lambda | per-element | 0.65 ns | 0.64 ns .. 0.65 ns | per elem |
| negate | binary-u.122 | gf2_122-u | per-element | 0.69 ns | 0.69 ns .. 0.69 ns | per elem |
| negate | binary-w.122 | gf2_122-w | per-element | 0.64 ns | 0.64 ns .. 0.65 ns | per elem |
| negate | binary.127 | gf2_127 | per-element | 1.05 ns | 1.04 ns .. 1.05 ns | per elem |
| negate | gf2_127/affine (y += x) | gf2_127 | per-element | 0.69 ns | 0.69 ns .. 0.69 ns | per elem |
| negate | binary-lambda.127 | gf2_127-lambda | per-element | 0.64 ns | 0.64 ns .. 0.65 ns | per elem |
| negate | binary-u.127 | gf2_127-u | per-element | 0.68 ns | 0.67 ns .. 0.69 ns | per elem |
| negate | binary-w.127 | gf2_127-w | per-element | 0.65 ns | 0.65 ns .. 0.65 ns | per elem |
| negate | edwards.127 | edwards127 | per-element | 1.40 ns | 1.39 ns .. 1.40 ns | per elem |
| negate | edwards127/extended (-X, -T) | edwards127 | per-element | 1.36 ns | 1.35 ns .. 1.37 ns | per elem |
| negate | weier.127 | weier127 | per-element | 0.76 ns | 0.75 ns .. 0.76 ns | per elem |
| negate | weier127/projective (-Y) | weier127 | per-element | 0.85 ns | 0.85 ns .. 0.85 ns | per elem |
| negate | weier-jacobian.127 | weier127-jacobian | per-element | 0.76 ns | 0.75 ns .. 0.76 ns | per elem |
| is identity | binary.109 | gf2_109 | per-element | 0.59 ns | 0.58 ns .. 0.59 ns | per elem |
| is identity | binary-lambda.109 | gf2_109-lambda | per-element | 0.57 ns | 0.57 ns .. 0.58 ns | per elem |
| is identity | binary-u.109 | gf2_109-u | per-element | 0.58 ns | 0.58 ns .. 0.58 ns | per elem |
| is identity | binary-w.109 | gf2_109-w | per-element | 0.58 ns | 0.58 ns .. 0.58 ns | per elem |
| is identity | binary.122 | gf2_122 | per-element | 0.84 ns | 0.84 ns .. 0.84 ns | per elem |
| is identity | binary.122-gls | gf2_122-gls | per-element | 0.84 ns | 0.84 ns .. 0.84 ns | per elem |
| is identity | binary-lambda.122-gls | gf2_122-gls-lambda | per-element | 0.84 ns | 0.84 ns .. 0.84 ns | per elem |
| is identity | binary-u.122-gls | gf2_122-gls-u | per-element | 0.84 ns | 0.84 ns .. 0.84 ns | per elem |
| is identity | binary-w.122-gls | gf2_122-gls-w | per-element | 0.84 ns | 0.84 ns .. 0.84 ns | per elem |
| is identity | binary-lambda.122 | gf2_122-lambda | per-element | 0.84 ns | 0.84 ns .. 0.84 ns | per elem |
| is identity | binary-u.122 | gf2_122-u | per-element | 0.83 ns | 0.82 ns .. 0.84 ns | per elem |
| is identity | binary-w.122 | gf2_122-w | per-element | 0.84 ns | 0.84 ns .. 0.84 ns | per elem |
| is identity | binary.127 | gf2_127 | per-element | 0.59 ns | 0.59 ns .. 0.60 ns | per elem |
| is identity | binary-lambda.127 | gf2_127-lambda | per-element | 0.55 ns | 0.54 ns .. 0.55 ns | per elem |
| is identity | binary-u.127 | gf2_127-u | per-element | 0.54 ns | 0.54 ns .. 0.55 ns | per elem |
| is identity | binary-w.127 | gf2_127-w | per-element | 0.55 ns | 0.54 ns .. 0.55 ns | per elem |
| is identity | edwards.127 | edwards127 | per-element | 0.34 ns | 0.33 ns .. 0.34 ns | per elem |
| is identity | weier.127 | weier127 | per-element | 0.34 ns | 0.34 ns .. 0.34 ns | per elem |
| is identity | weier-jacobian.127 | weier127-jacobian | per-element | 0.34 ns | 0.34 ns .. 0.34 ns | per elem |
| equals addend | binary.109/mode=mismatch | gf2_109 | mismatch | 72.9 ns | 72.7 ns .. 73.1 ns | per elem |
| equals addend | binary-lambda.109/mode=mismatch | gf2_109-lambda | mismatch | 39.3 ns | 39.2 ns .. 39.4 ns | per elem |
| equals addend | binary-u.109/mode=mismatch | gf2_109-u | mismatch | 115 ns | 115 ns .. 116 ns | per elem |
| equals addend | binary-w.109/mode=mismatch | gf2_109-w | mismatch | 39.4 ns | 39.3 ns .. 39.5 ns | per elem |
| equals addend | binary.122/mode=mismatch | gf2_122 | mismatch | 53.7 ns | 53.5 ns .. 53.9 ns | per elem |
| equals addend | binary.122-gls/mode=mismatch | gf2_122-gls | mismatch | 54.4 ns | 54.3 ns .. 54.5 ns | per elem |
| equals addend | binary-lambda.122-gls/mode=mismatch | gf2_122-gls-lambda | mismatch | 27.8 ns | 27.7 ns .. 27.9 ns | per elem |
| equals addend | binary-u.122-gls/mode=mismatch | gf2_122-gls-u | mismatch | 85.0 ns | 84.8 ns .. 85.2 ns | per elem |
| equals addend | binary-w.122-gls/mode=mismatch | gf2_122-gls-w | mismatch | 27.9 ns | 27.9 ns .. 28.0 ns | per elem |
| equals addend | binary-lambda.122/mode=mismatch | gf2_122-lambda | mismatch | 27.9 ns | 27.8 ns .. 28.0 ns | per elem |
| equals addend | binary-u.122/mode=mismatch | gf2_122-u | mismatch | 84.9 ns | 84.7 ns .. 85.1 ns | per elem |
| equals addend | binary-w.122/mode=mismatch | gf2_122-w | mismatch | 27.8 ns | 27.7 ns .. 27.9 ns | per elem |
| equals addend | binary.127/mode=mismatch | gf2_127 | mismatch | 30.3 ns | 30.3 ns .. 30.4 ns | per elem |
| equals addend | binary-lambda.127/mode=match | gf2_127-lambda | match | 15.1 ns | 15.0 ns .. 15.1 ns | per elem |
| equals addend | binary-lambda.127/mode=mismatch | gf2_127-lambda | mismatch | 15.1 ns | 15.1 ns .. 15.2 ns | per elem |
| equals addend | binary-u.127/mode=match | gf2_127-u | match | 48.6 ns | 48.5 ns .. 48.7 ns | per elem |
| equals addend | binary-u.127/mode=mismatch | gf2_127-u | mismatch | 48.7 ns | 48.6 ns .. 48.8 ns | per elem |
| equals addend | binary-w.127/mode=match | gf2_127-w | match | 15.0 ns | 15.0 ns .. 15.1 ns | per elem |
| equals addend | binary-w.127/mode=mismatch | gf2_127-w | mismatch | 15.1 ns | 15.0 ns .. 15.1 ns | per elem |
| equals addend | edwards.127/mode=match | edwards127 | match | 3.70 ns | 3.68 ns .. 3.72 ns | per elem |
| equals addend | edwards.127/mode=mismatch | edwards127 | mismatch | 1.91 ns | 1.91 ns .. 1.92 ns | per elem |
| equals addend | weier.127/mode=match | weier127 | match | 3.81 ns | 3.80 ns .. 3.82 ns | per elem |
| equals addend | weier.127/mode=mismatch | weier127 | mismatch | 1.98 ns | 1.98 ns .. 1.99 ns | per elem |
| equals addend | weier-jacobian.127/mode=match | weier127-jacobian | match | 8.92 ns | 8.89 ns .. 8.96 ns | per elem |
| equals addend | weier-jacobian.127/mode=mismatch | weier127-jacobian | mismatch | 4.29 ns | 4.28 ns .. 4.31 ns | per elem |
| encode | binary.109/mode=batch,n=1024 | gf2_109 | batch | 306 ns | 305 ns .. 306 ns | per elem |
| encode | binary.109/mode=indep | gf2_109 | per-element | 3.03 µs | 3.02 µs .. 3.03 µs | per elem |
| encode | binary-lambda.109/mode=batch,n=1024 | gf2_109-lambda | batch | 221 ns | 221 ns .. 222 ns | per elem |
| encode | binary-lambda.109/mode=indep | gf2_109-lambda | per-element | 2.95 µs | 2.94 µs .. 2.95 µs | per elem |
| encode | binary-u.109/mode=batch,n=1024 | gf2_109-u | batch | 206 ns | 205 ns .. 207 ns | per elem |
| encode | binary-u.109/mode=indep | gf2_109-u | per-element | 2.95 µs | 2.93 µs .. 2.96 µs | per elem |
| encode | binary-w.109/mode=batch,n=1024 | gf2_109-w | batch | 204 ns | 203 ns .. 204 ns | per elem |
| encode | binary-w.109/mode=indep | gf2_109-w | per-element | 2.90 µs | 2.89 µs .. 2.91 µs | per elem |
| encode | binary.122/mode=batch,n=1024 | gf2_122 | batch | 202 ns | 202 ns .. 203 ns | per elem |
| encode | binary.122/mode=indep | gf2_122 | per-element | 618 ns | 616 ns .. 619 ns | per elem |
| encode | binary.122-gls/mode=batch,n=1024 | gf2_122-gls | batch | 194 ns | 193 ns .. 195 ns | per elem |
| encode | binary.122-gls/mode=indep | gf2_122-gls | per-element | 612 ns | 609 ns .. 614 ns | per elem |
| encode | binary-lambda.122-gls/mode=batch,n=1024 | gf2_122-gls-lambda | batch | 156 ns | 155 ns .. 156 ns | per elem |
| encode | binary-lambda.122-gls/mode=indep | gf2_122-gls-lambda | per-element | 576 ns | 575 ns .. 578 ns | per elem |
| encode | binary-u.122-gls/mode=batch,n=1024 | gf2_122-gls-u | batch | 133 ns | 133 ns .. 133 ns | per elem |
| encode | binary-u.122-gls/mode=indep | gf2_122-gls-u | per-element | 562 ns | 561 ns .. 564 ns | per elem |
| encode | binary-w.122-gls/mode=batch,n=1024 | gf2_122-gls-w | batch | 130 ns | 129 ns .. 130 ns | per elem |
| encode | binary-w.122-gls/mode=indep | gf2_122-gls-w | per-element | 555 ns | 553 ns .. 556 ns | per elem |
| encode | binary-lambda.122/mode=batch,n=1024 | gf2_122-lambda | batch | 156 ns | 155 ns .. 156 ns | per elem |
| encode | binary-lambda.122/mode=indep | gf2_122-lambda | per-element | 573 ns | 572 ns .. 575 ns | per elem |
| encode | binary-u.122/mode=batch,n=1024 | gf2_122-u | batch | 132 ns | 132 ns .. 133 ns | per elem |
| encode | binary-u.122/mode=indep | gf2_122-u | per-element | 564 ns | 563 ns .. 566 ns | per elem |
| encode | binary-w.122/mode=batch,n=1024 | gf2_122-w | batch | 130 ns | 130 ns .. 131 ns | per elem |
| encode | binary-w.122/mode=indep | gf2_122-w | per-element | 551 ns | 550 ns .. 553 ns | per elem |
| encode | binary.127/mode=batch,n=1024 | gf2_127 | batch | 106 ns | 106 ns .. 106 ns | per elem |
| encode | binary.127/mode=indep | gf2_127 | per-element | 462 ns | 461 ns .. 462 ns | per elem |
| encode | binary-lambda.127/mode=batch,n=1024 | gf2_127-lambda | batch | 87.0 ns | 86.8 ns .. 87.1 ns | per elem |
| encode | binary-lambda.127/mode=batch,n=64 | gf2_127-lambda | batch | 95.8 ns | 95.6 ns .. 96.1 ns | per elem |
| encode | binary-lambda.127/mode=batch,n=8 | gf2_127-lambda | batch | 146 ns | 146 ns .. 146 ns | per elem |
| encode | binary-lambda.127/mode=indep | gf2_127-lambda | per-element | 442 ns | 441 ns .. 443 ns | per elem |
| encode | binary-u.127/mode=batch,n=1024 | gf2_127-u | batch | 76.5 ns | 75.9 ns .. 77.2 ns | per elem |
| encode | binary-u.127/mode=batch,n=64 | gf2_127-u | batch | 85.9 ns | 85.7 ns .. 86.1 ns | per elem |
| encode | binary-u.127/mode=batch,n=8 | gf2_127-u | batch | 131 ns | 131 ns .. 131 ns | per elem |
| encode | binary-u.127/mode=indep | gf2_127-u | per-element | 438 ns | 437 ns .. 438 ns | per elem |
| encode | binary-w.127/mode=batch,n=1024 | gf2_127-w | batch | 76.5 ns | 76.3 ns .. 76.6 ns | per elem |
| encode | binary-w.127/mode=batch,n=64 | gf2_127-w | batch | 85.1 ns | 84.9 ns .. 85.4 ns | per elem |
| encode | binary-w.127/mode=batch,n=8 | gf2_127-w | batch | 135 ns | 135 ns .. 136 ns | per elem |
| encode | binary-w.127/mode=indep | gf2_127-w | per-element | 432 ns | 432 ns .. 433 ns | per elem |
| encode | edwards.127/mode=batch,n=1024 | edwards127 | batch | 21.7 ns | 21.7 ns .. 21.7 ns | per elem |
| encode | edwards.127/mode=batch,n=64 | edwards127 | batch | 32.1 ns | 32.0 ns .. 32.1 ns | per elem |
| encode | edwards.127/mode=batch,n=8 | edwards127 | batch | 99.7 ns | 99.3 ns .. 100 ns | per elem |
| encode | edwards.127/mode=indep | edwards127 | per-element | 536 ns | 534 ns .. 538 ns | per elem |
| encode | weier.127/mode=batch,n=1024 | weier127 | batch | 9.97 ns | 9.95 ns .. 9.99 ns | per elem |
| encode | weier.127/mode=batch,n=64 | weier127 | batch | 20.4 ns | 20.3 ns .. 20.4 ns | per elem |
| encode | weier.127/mode=batch,n=8 | weier127 | batch | 85.1 ns | 84.8 ns .. 85.4 ns | per elem |
| encode | weier.127/mode=indep | weier127 | per-element | 527 ns | 526 ns .. 528 ns | per elem |
| encode | weier-jacobian.127/mode=batch,n=1024 | weier127-jacobian | batch | 15.3 ns | 15.3 ns .. 15.4 ns | per elem |
| encode | weier-jacobian.127/mode=batch,n=64 | weier127-jacobian | batch | 25.8 ns | 25.7 ns .. 25.8 ns | per elem |
| encode | weier-jacobian.127/mode=batch,n=8 | weier127-jacobian | batch | 90.0 ns | 89.7 ns .. 90.3 ns | per elem |
| encode | weier-jacobian.127/mode=indep | weier127-jacobian | per-element | 531 ns | 530 ns .. 532 ns | per elem |
| decode | binary.109/mode=batch,n=1024 | gf2_109 | batch | 263 ns | 262 ns .. 263 ns | per elem |
| decode | binary.109/mode=indep | gf2_109 | per-element | 2.98 µs | 2.97 µs .. 2.98 µs | per elem |
| decode | binary-lambda.109/mode=batch,n=1024 | gf2_109-lambda | batch | 263 ns | 262 ns .. 263 ns | per elem |
| decode | binary-lambda.109/mode=indep | gf2_109-lambda | per-element | 2.98 µs | 2.98 µs .. 2.99 µs | per elem |
| decode | binary-u.109/mode=batch,n=1024 | gf2_109-u | batch | 319 ns | 318 ns .. 319 ns | per elem |
| decode | binary-u.109/mode=indep | gf2_109-u | per-element | 3.04 µs | 3.04 µs .. 3.05 µs | per elem |
| decode | binary-w.109/mode=batch,n=1024 | gf2_109-w | batch | 240 ns | 239 ns .. 241 ns | per elem |
| decode | binary-w.109/mode=indep | gf2_109-w | per-element | 2.96 µs | 2.96 µs .. 2.97 µs | per elem |
| decode | binary.122/mode=batch,n=1024 | gf2_122 | batch | 187 ns | 186 ns .. 187 ns | per elem |
| decode | binary.122/mode=indep | gf2_122 | per-element | 607 ns | 606 ns .. 609 ns | per elem |
| decode | binary.122-gls/mode=batch,n=1024 | gf2_122-gls | batch | 162 ns | 162 ns .. 163 ns | per elem |
| decode | binary.122-gls/mode=indep | gf2_122-gls | per-element | 592 ns | 591 ns .. 594 ns | per elem |
| decode | binary-lambda.122-gls/mode=batch,n=1024 | gf2_122-gls-lambda | batch | 163 ns | 162 ns .. 163 ns | per elem |
| decode | binary-lambda.122-gls/mode=indep | gf2_122-gls-lambda | per-element | 599 ns | 595 ns .. 603 ns | per elem |
| decode | binary-u.122-gls/mode=batch,n=1024 | gf2_122-gls-u | batch | 187 ns | 186 ns .. 187 ns | per elem |
| decode | binary-u.122-gls/mode=indep | gf2_122-gls-u | per-element | 639 ns | 637 ns .. 641 ns | per elem |
| decode | binary-w.122-gls/mode=batch,n=1024 | gf2_122-gls-w | batch | 138 ns | 137 ns .. 138 ns | per elem |
| decode | binary-w.122-gls/mode=indep | gf2_122-gls-w | per-element | 591 ns | 589 ns .. 592 ns | per elem |
| decode | binary-lambda.122/mode=batch,n=1024 | gf2_122-lambda | batch | 186 ns | 186 ns .. 187 ns | per elem |
| decode | binary-lambda.122/mode=indep | gf2_122-lambda | per-element | 607 ns | 605 ns .. 608 ns | per elem |
| decode | binary-u.122/mode=batch,n=1024 | gf2_122-u | batch | 204 ns | 204 ns .. 205 ns | per elem |
| decode | binary-u.122/mode=indep | gf2_122-u | per-element | 676 ns | 674 ns .. 677 ns | per elem |
| decode | binary-w.122/mode=batch,n=1024 | gf2_122-w | batch | 153 ns | 153 ns .. 154 ns | per elem |
| decode | binary-w.122/mode=indep | gf2_122-w | per-element | 601 ns | 600 ns .. 603 ns | per elem |
| decode | binary.127/mode=batch,n=1024 | gf2_127 | batch | 88.0 ns | 87.8 ns .. 88.1 ns | per elem |
| decode | binary.127/mode=indep | gf2_127 | per-element | 446 ns | 445 ns .. 447 ns | per elem |
| decode | binary-lambda.127/mode=batch,n=1024 | gf2_127-lambda | batch | 87.9 ns | 87.8 ns .. 88.1 ns | per elem |
| decode | binary-lambda.127/mode=batch,n=64 | gf2_127-lambda | batch | 96.8 ns | 96.6 ns .. 97.0 ns | per elem |
| decode | binary-lambda.127/mode=batch,n=8 | gf2_127-lambda | batch | 149 ns | 149 ns .. 149 ns | per elem |
| decode | binary-lambda.127/mode=indep | gf2_127-lambda | per-element | 447 ns | 446 ns .. 447 ns | per elem |
| decode | binary-u.127/mode=batch,n=1024 | gf2_127-u | batch | 121 ns | 121 ns .. 121 ns | per elem |
| decode | binary-u.127/mode=batch,n=64 | gf2_127-u | batch | 131 ns | 130 ns .. 131 ns | per elem |
| decode | binary-u.127/mode=batch,n=8 | gf2_127-u | batch | 185 ns | 185 ns .. 185 ns | per elem |
| decode | binary-u.127/mode=indep | gf2_127-u | per-element | 479 ns | 478 ns .. 480 ns | per elem |
| decode | binary-w.127/mode=batch,n=1024 | gf2_127-w | batch | 89.2 ns | 89.0 ns .. 89.3 ns | per elem |
| decode | binary-w.127/mode=batch,n=64 | gf2_127-w | batch | 97.8 ns | 97.6 ns .. 97.9 ns | per elem |
| decode | binary-w.127/mode=batch,n=8 | gf2_127-w | batch | 153 ns | 152 ns .. 153 ns | per elem |
| decode | binary-w.127/mode=indep | gf2_127-w | per-element | 447 ns | 446 ns .. 448 ns | per elem |
| decode | edwards.127/mode=batch,n=1024 | edwards127 | batch | 485 ns | 483 ns .. 486 ns | per elem |
| decode | edwards.127/mode=batch,n=64 | edwards127 | batch | 487 ns | 486 ns .. 489 ns | per elem |
| decode | edwards.127/mode=batch,n=8 | edwards127 | batch | 493 ns | 492 ns .. 494 ns | per elem |
| decode | edwards.127/mode=indep | edwards127 | per-element | 485 ns | 484 ns .. 486 ns | per elem |
| decode | weier.127/mode=batch,n=1024 | weier127 | batch | 484 ns | 483 ns .. 485 ns | per elem |
| decode | weier.127/mode=batch,n=64 | weier127 | batch | 482 ns | 481 ns .. 483 ns | per elem |
| decode | weier.127/mode=batch,n=8 | weier127 | batch | 487 ns | 486 ns .. 488 ns | per elem |
| decode | weier.127/mode=indep | weier127 | per-element | 487 ns | 486 ns .. 489 ns | per elem |
| decode | weier-jacobian.127/mode=batch,n=1024 | weier127-jacobian | batch | 483 ns | 482 ns .. 484 ns | per elem |
| decode | weier-jacobian.127/mode=batch,n=64 | weier127-jacobian | batch | 482 ns | 481 ns .. 483 ns | per elem |
| decode | weier-jacobian.127/mode=batch,n=8 | weier127-jacobian | batch | 485 ns | 484 ns .. 486 ns | per elem |
| decode | weier-jacobian.127/mode=indep | weier127-jacobian | per-element | 484 ns | 483 ns .. 486 ns | per elem |
| normalize | gf2_109/normalize, batched | gf2_109 | batch | 305 ns | 303 ns .. 307 ns | per elem |
| normalize | gf2_122/normalize, batched | gf2_122 | batch | 202 ns | 202 ns .. 202 ns | per elem |
| normalize | gf2_122-gls/normalize, batched | gf2_122-gls | batch | 195 ns | 194 ns .. 195 ns | per elem |
| batch sum | gf2_109/batch affine (tree sum) | gf2_109 | batch | 241 ns | 240 ns .. 242 ns | per elem |
| batch sum | gf2_122/batch affine (tree sum) | gf2_122 | batch | 154 ns | 153 ns .. 155 ns | per elem |
| batch sum | gf2_127/batch affine (tree sum) | gf2_127 | batch | 82.9 ns | 82.7 ns .. 83.0 ns | per elem |
| batch sum | edwards127/batch montgomery affine (tree sum) | edwards127 | batch | 30.8 ns | 30.7 ns .. 30.8 ns | per elem |
| batch sum | weier127/batch affine (tree sum) | weier127 | batch | 29.1 ns | 29.1 ns .. 29.2 ns | per elem |
hash to curve
Figure
115 benchmarks
| operation | benchmark | family | mode | time | 95% CI | unit |
|---|---|---|---|---|---|---|
| hash to curve | binary.109/mode=batch,n=1024 | gf2_109 | batch | 518 ns | 517 ns .. 520 ns | per elem |
| hash to curve | binary.109/mode=indep | gf2_109 | per-element | 5.86 µs | 5.85 µs .. 5.87 µs | per elem |
| hash to curve | binary-lambda.109/mode=batch,n=1024 | gf2_109-lambda | batch | 517 ns | 516 ns .. 518 ns | per elem |
| hash to curve | binary-lambda.109/mode=indep | gf2_109-lambda | per-element | 5.87 µs | 5.86 µs .. 5.88 µs | per elem |
| hash to curve | binary-u.109/mode=batch,n=1024 | gf2_109-u | batch | 592 ns | 591 ns .. 593 ns | per elem |
| hash to curve | binary-u.109/mode=indep | gf2_109-u | per-element | 5.87 µs | 5.86 µs .. 5.88 µs | per elem |
| hash to curve | binary-w.109/mode=batch,n=1024 | gf2_109-w | batch | 516 ns | 515 ns .. 517 ns | per elem |
| hash to curve | binary-w.109/mode=indep | gf2_109-w | per-element | 5.78 µs | 5.77 µs .. 5.79 µs | per elem |
| hash to curve | binary.122/mode=batch,n=1024 | gf2_122 | batch | 350 ns | 349 ns .. 351 ns | per elem |
| hash to curve | binary.122/mode=indep | gf2_122 | per-element | 1.16 µs | 1.16 µs .. 1.17 µs | per elem |
| hash to curve | binary.122-gls/mode=batch,n=1024 | gf2_122-gls | batch | 309 ns | 308 ns .. 310 ns | per elem |
| hash to curve | binary.122-gls/mode=indep | gf2_122-gls | per-element | 1.20 µs | 1.20 µs .. 1.21 µs | per elem |
| hash to curve | binary-lambda.122-gls/mode=batch,n=1024 | gf2_122-gls-lambda | batch | 315 ns | 314 ns .. 315 ns | per elem |
| hash to curve | binary-lambda.122-gls/mode=indep | gf2_122-gls-lambda | per-element | 1.18 µs | 1.18 µs .. 1.18 µs | per elem |
| hash to curve | binary-u.122-gls/mode=batch,n=1024 | gf2_122-gls-u | batch | 359 ns | 358 ns .. 360 ns | per elem |
| hash to curve | binary-u.122-gls/mode=indep | gf2_122-gls-u | per-element | 1.25 µs | 1.25 µs .. 1.25 µs | per elem |
| hash to curve | binary-w.122-gls/mode=batch,n=1024 | gf2_122-gls-w | batch | 311 ns | 310 ns .. 311 ns | per elem |
| hash to curve | binary-w.122-gls/mode=indep | gf2_122-gls-w | per-element | 1.24 µs | 1.23 µs .. 1.26 µs | per elem |
| hash to curve | binary-lambda.122/mode=batch,n=1024 | gf2_122-lambda | batch | 350 ns | 348 ns .. 351 ns | per elem |
| hash to curve | binary-lambda.122/mode=indep | gf2_122-lambda | per-element | 1.18 µs | 1.18 µs .. 1.19 µs | per elem |
| hash to curve | binary-u.122/mode=batch,n=1024 | gf2_122-u | batch | 391 ns | 390 ns .. 392 ns | per elem |
| hash to curve | binary-u.122/mode=indep | gf2_122-u | per-element | 1.27 µs | 1.27 µs .. 1.28 µs | per elem |
| hash to curve | binary-w.122/mode=batch,n=1024 | gf2_122-w | batch | 328 ns | 327 ns .. 328 ns | per elem |
| hash to curve | binary-w.122/mode=indep | gf2_122-w | per-element | 1.21 µs | 1.21 µs .. 1.22 µs | per elem |
| hash to curve | binary.127/mode=batch,n=1024 | gf2_127 | batch | 196 ns | 195 ns .. 196 ns | per elem |
| hash to curve | binary.127/mode=indep | gf2_127 | per-element | 890 ns | 889 ns .. 891 ns | per elem |
| hash to curve | binary-lambda.127/mode=batch,n=1024 | gf2_127-lambda | batch | 196 ns | 196 ns .. 196 ns | per elem |
| hash to curve | binary-lambda.127/mode=batch,n=64 | gf2_127-lambda | batch | 247 ns | 247 ns .. 248 ns | per elem |
| hash to curve | binary-lambda.127/mode=batch,n=8 | gf2_127-lambda | batch | 430 ns | 430 ns .. 431 ns | per elem |
| hash to curve | binary-lambda.127/mode=indep | gf2_127-lambda | per-element | 880 ns | 877 ns .. 883 ns | per elem |
| hash to curve | binary-u.127/mode=batch,n=1024 | gf2_127-u | batch | 258 ns | 257 ns .. 258 ns | per elem |
| hash to curve | binary-u.127/mode=batch,n=64 | gf2_127-u | batch | 313 ns | 312 ns .. 313 ns | per elem |
| hash to curve | binary-u.127/mode=batch,n=8 | gf2_127-u | batch | 515 ns | 514 ns .. 516 ns | per elem |
| hash to curve | binary-u.127/mode=indep | gf2_127-u | per-element | 1.00 µs | 1.00 µs .. 1.00 µs | per elem |
| hash to curve | binary-w.127/mode=batch,n=1024 | gf2_127-w | batch | 221 ns | 220 ns .. 222 ns | per elem |
| hash to curve | binary-w.127/mode=batch,n=64 | gf2_127-w | batch | 278 ns | 278 ns .. 279 ns | per elem |
| hash to curve | binary-w.127/mode=batch,n=8 | gf2_127-w | batch | 467 ns | 465 ns .. 469 ns | per elem |
| hash to curve | binary-w.127/mode=indep | gf2_127-w | per-element | 975 ns | 973 ns .. 977 ns | per elem |
| hash to curve | edwards.127/mode=batch,n=1024 | edwards127 | batch | 1.06 µs | 1.06 µs .. 1.07 µs | per elem |
| hash to curve | edwards.127/mode=batch,n=64 | edwards127 | batch | 1.07 µs | 1.06 µs .. 1.07 µs | per elem |
| hash to curve | edwards.127/mode=batch,n=8 | edwards127 | batch | 1.07 µs | 1.07 µs .. 1.08 µs | per elem |
| hash to curve | edwards.127/mode=indep | edwards127 | per-element | 1.07 µs | 1.06 µs .. 1.07 µs | per elem |
| hash to curve | edwards127/edwards-native try-and-increment | edwards127 | per-element | 1.13 µs | 1.13 µs .. 1.14 µs | per elem |
| hash to curve | weier.127/mode=batch,n=1024 | weier127 | batch | 1.03 µs | 1.03 µs .. 1.03 µs | per elem |
| hash to curve | weier.127/mode=batch,n=64 | weier127 | batch | 1.04 µs | 1.03 µs .. 1.04 µs | per elem |
| hash to curve | weier.127/mode=batch,n=8 | weier127 | batch | 1.03 µs | 1.03 µs .. 1.04 µs | per elem |
| hash to curve | weier.127/mode=indep | weier127 | per-element | 1.03 µs | 1.03 µs .. 1.03 µs | per elem |
| hash to curve | weier-jacobian.127/mode=batch,n=1024 | weier127-jacobian | batch | 1.00 µs | 1.00 µs .. 1.01 µs | per elem |
| hash to curve | weier-jacobian.127/mode=batch,n=64 | weier127-jacobian | batch | 1.03 µs | 1.03 µs .. 1.03 µs | per elem |
| hash to curve | weier-jacobian.127/mode=batch,n=8 | weier127-jacobian | batch | 1.03 µs | 1.03 µs .. 1.03 µs | per elem |
| hash to curve | weier-jacobian.127/mode=indep | weier127-jacobian | per-element | 1.03 µs | 1.03 µs .. 1.03 µs | per elem |
| ID to addend | binary-lambda.127/proj=fp127,h2c=pornin-addend,mode=batch,n=1024 | gf2_127-lambda | batch | 162 ns | 162 ns .. 162 ns | per elem |
| ID to addend | binary-lambda.127/proj=fp127,h2c=ti,mode=batch,n=1024 | gf2_127-lambda | batch | 222 ns | 221 ns .. 222 ns | per elem |
| ID to addend | binary-lambda.127/proj=fp127,h2c=ti-addend,mode=batch,n=1024 | gf2_127-lambda | batch | 147 ns | 147 ns .. 148 ns | per elem |
| ID to addend | binary-lambda.127/proj=fp130,h2c=pornin-addend,mode=batch,n=1024 | gf2_127-lambda | batch | 167 ns | 166 ns .. 167 ns | per elem |
| ID to addend | binary-lambda.127/proj=fp130,h2c=ti,mode=batch,n=1024 | gf2_127-lambda | batch | 238 ns | 238 ns .. 239 ns | per elem |
| ID to addend | binary-lambda.127/proj=fp130,h2c=ti-addend,mode=batch,n=1024 | gf2_127-lambda | batch | 165 ns | 165 ns .. 166 ns | per elem |
| ID to addend | binary-lambda.127/proj=gf2_127,h2c=pornin-addend,mode=batch,n=1024 | gf2_127-lambda | batch | 188 ns | 187 ns .. 188 ns | per elem |
| ID to addend | binary-lambda.127/proj=gf2_127,h2c=ti,mode=batch,n=1024 | gf2_127-lambda | batch | 294 ns | 293 ns .. 294 ns | per elem |
| ID to addend | binary-lambda.127/proj=gf2_127,h2c=ti-addend,mode=batch,n=1024 | gf2_127-lambda | batch | 220 ns | 219 ns .. 220 ns | per elem |
| ID to addend | binary-lambda.127/proj=none,h2c=pornin-addend,mode=batch,n=1024 | gf2_127-lambda | batch | 183 ns | 183 ns .. 184 ns | per elem |
| ID to addend | binary-lambda.127/proj=none,h2c=ti,mode=batch,n=1024 | gf2_127-lambda | batch | 250 ns | 249 ns .. 250 ns | per elem |
| ID to addend | binary-lambda.127/proj=none,h2c=ti-addend,mode=batch,n=1024 | gf2_127-lambda | batch | 176 ns | 176 ns .. 177 ns | per elem |
| ID to addend | binary-u.127/proj=fp127,h2c=pornin-addend,mode=batch,n=1024 | gf2_127-u | batch | 191 ns | 190 ns .. 191 ns | per elem |
| ID to addend | binary-u.127/proj=fp127,h2c=ti,mode=batch,n=1024 | gf2_127-u | batch | 209 ns | 208 ns .. 209 ns | per elem |
| ID to addend | binary-u.127/proj=fp130,h2c=pornin-addend,mode=batch,n=1024 | gf2_127-u | batch | 195 ns | 195 ns .. 196 ns | per elem |
| ID to addend | binary-u.127/proj=fp130,h2c=ti,mode=batch,n=1024 | gf2_127-u | batch | 223 ns | 222 ns .. 223 ns | per elem |
| ID to addend | binary-u.127/proj=gf2_127,h2c=pornin-addend,mode=batch,n=1024 | gf2_127-u | batch | 217 ns | 217 ns .. 217 ns | per elem |
| ID to addend | binary-u.127/proj=gf2_127,h2c=ti,mode=batch,n=1024 | gf2_127-u | batch | 279 ns | 278 ns .. 279 ns | per elem |
| ID to addend | binary-u.127/proj=none,h2c=pornin-addend,mode=batch,n=1024 | gf2_127-u | batch | 212 ns | 211 ns .. 212 ns | per elem |
| ID to addend | binary-u.127/proj=none,h2c=ti,mode=batch,n=1024 | gf2_127-u | batch | 246 ns | 246 ns .. 247 ns | per elem |
| ID to addend | binary-w.127/proj=fp127,h2c=pornin-addend,mode=batch,n=1024 | gf2_127-w | batch | 162 ns | 162 ns .. 162 ns | per elem |
| ID to addend | binary-w.127/proj=fp127,h2c=ti,mode=batch,n=1024 | gf2_127-w | batch | 175 ns | 174 ns .. 175 ns | per elem |
| ID to addend | binary-w.127/proj=fp130,h2c=pornin-addend,mode=batch,n=1024 | gf2_127-w | batch | 167 ns | 166 ns .. 167 ns | per elem |
| ID to addend | binary-w.127/proj=fp130,h2c=ti,mode=batch,n=1024 | gf2_127-w | batch | 188 ns | 188 ns .. 189 ns | per elem |
| ID to addend | binary-w.127/proj=gf2_127,h2c=pornin-addend,mode=batch,n=1024 | gf2_127-w | batch | 188 ns | 188 ns .. 189 ns | per elem |
| ID to addend | binary-w.127/proj=gf2_127,h2c=ti,mode=batch,n=1024 | gf2_127-w | batch | 242 ns | 241 ns .. 243 ns | per elem |
| ID to addend | binary-w.127/proj=none,h2c=pornin-addend,mode=batch,n=1024 | gf2_127-w | batch | 183 ns | 183 ns .. 184 ns | per elem |
| ID to addend | binary-w.127/proj=none,h2c=ti,mode=batch,n=1024 | gf2_127-w | batch | 210 ns | 209 ns .. 211 ns | per elem |
| ID to addend | edwards.127/proj=fp127,h2c=elligator2,mode=batch,n=1024 | edwards127 | batch | 1.84 µs | 1.84 µs .. 1.85 µs | per elem |
| ID to addend | edwards.127/proj=fp127,h2c=ti,mode=batch,n=1024 | edwards127 | batch | 1.05 µs | 1.05 µs .. 1.05 µs | per elem |
| ID to addend | edwards.127/proj=fp127,h2c=ti-addend,mode=batch,n=1024 | edwards127 | batch | 1.13 µs | 1.13 µs .. 1.14 µs | per elem |
| ID to addend | edwards.127/proj=fp130,h2c=elligator2,mode=batch,n=1024 | edwards127 | batch | 1.84 µs | 1.83 µs .. 1.85 µs | per elem |
| ID to addend | edwards.127/proj=fp130,h2c=ti,mode=batch,n=1024 | edwards127 | batch | 1.05 µs | 1.04 µs .. 1.05 µs | per elem |
| ID to addend | edwards.127/proj=fp130,h2c=ti-addend,mode=batch,n=1024 | edwards127 | batch | 1.12 µs | 1.12 µs .. 1.13 µs | per elem |
| ID to addend | edwards.127/proj=gf2_127,h2c=elligator2,mode=batch,n=1024 | edwards127 | batch | 1.87 µs | 1.87 µs .. 1.87 µs | per elem |
| ID to addend | edwards.127/proj=gf2_127,h2c=ti,mode=batch,n=1024 | edwards127 | batch | 1.11 µs | 1.11 µs .. 1.12 µs | per elem |
| ID to addend | edwards.127/proj=gf2_127,h2c=ti-addend,mode=batch,n=1024 | edwards127 | batch | 1.17 µs | 1.17 µs .. 1.18 µs | per elem |
| ID to addend | edwards.127/proj=none,h2c=elligator2,mode=batch,n=1024 | edwards127 | batch | 1.89 µs | 1.89 µs .. 1.90 µs | per elem |
| ID to addend | edwards.127/proj=none,h2c=ti,mode=batch,n=1024 | edwards127 | batch | 1.10 µs | 1.10 µs .. 1.11 µs | per elem |
| ID to addend | edwards.127/proj=none,h2c=ti-addend,mode=batch,n=1024 | edwards127 | batch | 1.18 µs | 1.17 µs .. 1.18 µs | per elem |
| ID to addend | weier.127/proj=fp127,h2c=sswu,mode=batch,n=1024 | weier127 | batch | 1.09 µs | 1.09 µs .. 1.09 µs | per elem |
| ID to addend | weier.127/proj=fp127,h2c=ti,mode=batch,n=1024 | weier127 | batch | 965 ns | 963 ns .. 967 ns | per elem |
| ID to addend | weier.127/proj=fp130,h2c=sswu,mode=batch,n=1024 | weier127 | batch | 1.10 µs | 1.09 µs .. 1.10 µs | per elem |
| ID to addend | weier.127/proj=fp130,h2c=ti,mode=batch,n=1024 | weier127 | batch | 1.03 µs | 1.03 µs .. 1.03 µs | per elem |
| ID to addend | weier.127/proj=gf2_127,h2c=sswu,mode=batch,n=1024 | weier127 | batch | 1.12 µs | 1.12 µs .. 1.13 µs | per elem |
| ID to addend | weier.127/proj=gf2_127,h2c=ti,mode=batch,n=1024 | weier127 | batch | 1.08 µs | 1.08 µs .. 1.08 µs | per elem |
| ID to addend | weier.127/proj=none,h2c=sswu,mode=batch,n=1024 | weier127 | batch | 1.12 µs | 1.12 µs .. 1.13 µs | per elem |
| ID to addend | weier.127/proj=none,h2c=ti,mode=batch,n=1024 | weier127 | batch | 1.01 µs | 1.01 µs .. 1.01 µs | per elem |
| ID to addend | weier-jacobian.127/proj=fp127,h2c=sswu,mode=batch,n=1024 | weier127-jacobian | batch | 1.12 µs | 1.11 µs .. 1.13 µs | per elem |
| ID to addend | weier-jacobian.127/proj=fp127,h2c=ti,mode=batch,n=1024 | weier127-jacobian | batch | 987 ns | 984 ns .. 990 ns | per elem |
| ID to addend | weier-jacobian.127/proj=fp130,h2c=sswu,mode=batch,n=1024 | weier127-jacobian | batch | 1.09 µs | 1.09 µs .. 1.10 µs | per elem |
| ID to addend | weier-jacobian.127/proj=fp130,h2c=ti,mode=batch,n=1024 | weier127-jacobian | batch | 1.03 µs | 1.02 µs .. 1.03 µs | per elem |
| ID to addend | weier-jacobian.127/proj=gf2_127,h2c=sswu,mode=batch,n=1024 | weier127-jacobian | batch | 1.12 µs | 1.11 µs .. 1.12 µs | per elem |
| ID to addend | weier-jacobian.127/proj=gf2_127,h2c=ti,mode=batch,n=1024 | weier127-jacobian | batch | 1.08 µs | 1.07 µs .. 1.08 µs | per elem |
| ID to addend | weier-jacobian.127/proj=none,h2c=sswu,mode=batch,n=1024 | weier127-jacobian | batch | 1.12 µs | 1.11 µs .. 1.12 µs | per elem |
| ID to addend | weier-jacobian.127/proj=none,h2c=ti,mode=batch,n=1024 | weier127-jacobian | batch | 1.01 µs | 1.01 µs .. 1.01 µs | per elem |
| hash to addend | gf2_109-lambda/try-and-increment to (x, λ) | gf2_109-lambda | per-element | 5.85 µs | 5.83 µs .. 5.86 µs | per elem |
| hash to addend | gf2_109-lambda/try-and-increment to (x, λ), batched | gf2_109-lambda | batch | 511 ns | 510 ns .. 511 ns | per elem |
| hash to addend | gf2_122-gls-lambda/try-and-increment to (x, λ) | gf2_122-gls-lambda | per-element | 1.16 µs | 1.16 µs .. 1.16 µs | per elem |
| hash to addend | gf2_122-gls-lambda/try-and-increment to (x, λ), batched | gf2_122-gls-lambda | batch | 327 ns | 314 ns .. 341 ns | per elem |
| hash to addend | gf2_122-lambda/try-and-increment to (x, λ) | gf2_122-lambda | per-element | 1.18 µs | 1.17 µs .. 1.18 µs | per elem |
| hash to addend | gf2_122-lambda/try-and-increment to (x, λ), batched | gf2_122-lambda | batch | 361 ns | 349 ns .. 376 ns | per elem |
| hash to addend | gf2_127-lambda/try-and-increment to (x, λ) | gf2_127-lambda | per-element | 870 ns | 869 ns .. 872 ns | per elem |
| hash to addend | gf2_127-lambda/try-and-increment to (x, λ), batched | gf2_127-lambda | batch | 179 ns | 179 ns .. 180 ns | 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
35 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 | 3.28 µs | 3.27 µs .. 3.28 µs | per elem |
| one map to addend | gf2_109-lambda/pornin map x1 to (x, λ), batched | gf2_109-lambda | batch | 521 ns | 520 ns .. 522 ns | per elem |
| one map to addend | gf2_109-u/pornin map x1 to (u, v) | gf2_109-u | per-element | 3.34 µs | 3.33 µs .. 3.34 µs | per elem |
| one map to addend | gf2_109-u/pornin map x1 to (u, v), batched | gf2_109-u | batch | 593 ns | 591 ns .. 594 ns | per elem |
| one map to addend | gf2_109-w/pornin map x1 to (x, λ) | gf2_109-w | per-element | 3.27 µs | 3.27 µs .. 3.28 µs | per elem |
| one map to addend | gf2_109-w/pornin map x1 to (x, λ), batched | gf2_109-w | batch | 522 ns | 522 ns .. 523 ns | per elem |
| one map to addend | gf2_122-gls-lambda/pornin map x1 to (x, λ) | gf2_122-gls-lambda | per-element | 788 ns | 787 ns .. 790 ns | per elem |
| one map to addend | gf2_122-gls-lambda/pornin map x1 to (x, λ), batched | gf2_122-gls-lambda | batch | 404 ns | 382 ns .. 425 ns | per elem |
| one map to addend | gf2_122-gls-u/pornin map x1 to (u, v) | gf2_122-gls-u | per-element | 843 ns | 841 ns .. 844 ns | per elem |
| one map to addend | gf2_122-gls-u/pornin map x1 to (u, v), batched | gf2_122-gls-u | batch | 593 ns | 585 ns .. 599 ns | per elem |
| one map to addend | gf2_122-gls-w/pornin map x1 to (x, λ) | gf2_122-gls-w | per-element | 791 ns | 790 ns .. 793 ns | per elem |
| one map to addend | gf2_122-gls-w/pornin map x1 to (x, λ), batched | gf2_122-gls-w | batch | 404 ns | 383 ns .. 424 ns | per elem |
| one map to addend | gf2_122-lambda/pornin map x1 to (x, λ) | gf2_122-lambda | per-element | 801 ns | 799 ns .. 803 ns | per elem |
| one map to addend | gf2_122-lambda/pornin map x1 to (x, λ), batched | gf2_122-lambda | batch | 428 ns | 402 ns .. 452 ns | per elem |
| one map to addend | gf2_122-u/pornin map x1 to (u, v) | gf2_122-u | per-element | 857 ns | 855 ns .. 858 ns | per elem |
| one map to addend | gf2_122-u/pornin map x1 to (u, v), batched | gf2_122-u | batch | 622 ns | 603 ns .. 638 ns | per elem |
| one map to addend | gf2_122-w/pornin map x1 to (x, λ) | gf2_122-w | per-element | 799 ns | 797 ns .. 800 ns | per elem |
| one map to addend | gf2_122-w/pornin map x1 to (x, λ), batched | gf2_122-w | batch | 429 ns | 403 ns .. 454 ns | per elem |
| one map to addend | gf2_127-lambda/pornin map x1 to (x, λ) | gf2_127-lambda | per-element | 567 ns | 566 ns .. 568 ns | per elem |
| one map to addend | gf2_127-lambda/pornin map x1 to (x, λ), batched | gf2_127-lambda | batch | 184 ns | 184 ns .. 184 ns | per elem |
| one map to addend | gf2_127-u/pornin map x1 to (u, v) | gf2_127-u | per-element | 598 ns | 597 ns .. 599 ns | per elem |
| one map to addend | gf2_127-u/pornin map x1 to (u, v), batched | gf2_127-u | batch | 213 ns | 212 ns .. 213 ns | per elem |
| one map to addend | gf2_127-w/pornin map x1 to (x, λ) | gf2_127-w | per-element | 569 ns | 568 ns .. 569 ns | per elem |
| one map to addend | gf2_127-w/pornin map x1 to (x, λ), batched | gf2_127-w | batch | 184 ns | 184 ns .. 185 ns | per elem |
| one map | gf2_109/pornin map x1 | gf2_109 | per-element | 3.39 µs | 3.39 µs .. 3.40 µs | per elem |
| one map | gf2_109/pornin map x1, batched | gf2_109 | batch | 636 ns | 635 ns .. 637 ns | per elem |
| one map | gf2_122/pornin map x1 | gf2_122 | per-element | 897 ns | 894 ns .. 899 ns | per elem |
| one map | gf2_122/pornin map x1, batched | gf2_122 | batch | 510 ns | 488 ns .. 539 ns | per elem |
| one map | gf2_122-gls/pornin map x1 | gf2_122-gls | per-element | 865 ns | 864 ns .. 867 ns | per elem |
| one map | gf2_122-gls/pornin map x1, batched | gf2_122-gls | batch | 410 ns | 409 ns .. 410 ns | per elem |
| one map | gf2_127/pornin map x1 | gf2_127 | per-element | 619 ns | 617 ns .. 620 ns | per elem |
| one map | gf2_127/pornin map x1, batched | gf2_127 | batch | 232 ns | 231 ns .. 232 ns | per elem |
| one map | edwards127/elligator2 x1 | edwards127 | per-element | 1.32 µs | 1.32 µs .. 1.32 µs | per elem |
| one map | weier127/sswu x1 | weier127 | per-element | 1.12 µs | 1.12 µs .. 1.13 µs | per elem |
| two maps summed | gf2_127/pornin map x2 | gf2_127 | per-element | 1.35 µs | 1.35 µs .. 1.36 µs | 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
306 benchmarks
| operation | benchmark | family | mode | time | 95% CI | unit |
|---|---|---|---|---|---|---|
| encode (hash + cells) | xor-sha256.64/m=12150,n=3500 | xor | per-element | 195 ns | 195 ns .. 196 ns | per elem |
| encode (hash + cells) | xor-sha256.64/m=1350,n=3500 | xor | per-element | 163 ns | 163 ns .. 164 ns | per elem |
| encode (hash + cells) | xor-sha256.64/m=150,n=3500 | xor | per-element | 138 ns | 138 ns .. 138 ns | per elem |
| encode (hash + cells) | xor-sha256.64/m=20,n=3500 | xor | per-element | 114 ns | 114 ns .. 115 ns | per elem |
| encode (hash + cells) | xor-sha256.64/m=5,n=3500 | xor | per-element | 96.2 ns | 95.9 ns .. 96.4 ns | per elem |
| encode (hash + cells) | xor-siphash.64/m=12150,n=3500 | xor-siphash | per-element | 185 ns | 184 ns .. 185 ns | per elem |
| encode (hash + cells) | xor-siphash.64/m=12150,n=3500,map=mcg64 | xor-siphash | per-element | 181 ns | 180 ns .. 181 ns | per elem |
| encode (hash + cells) | xor-siphash.64/m=1350,n=3500 | xor-siphash | per-element | 153 ns | 153 ns .. 154 ns | per elem |
| encode (hash + cells) | xor-siphash.64/m=1350,n=3500,map=mcg64 | xor-siphash | per-element | 149 ns | 149 ns .. 150 ns | per elem |
| encode (hash + cells) | xor-siphash.64/m=150,n=3500 | xor-siphash | per-element | 127 ns | 127 ns .. 128 ns | per elem |
| encode (hash + cells) | xor-siphash.64/m=150,n=3500,map=mcg64 | xor-siphash | per-element | 123 ns | 123 ns .. 123 ns | per elem |
| encode (hash + cells) | xor-siphash.64/m=20,n=3500 | xor-siphash | per-element | 103 ns | 103 ns .. 104 ns | per elem |
| encode (hash + cells) | xor-siphash.64/m=20,n=3500,map=mcg64 | xor-siphash | per-element | 98.6 ns | 98.3 ns .. 98.9 ns | per elem |
| encode (hash + cells) | xor-siphash.64/m=5,n=3500 | xor-siphash | per-element | 85.3 ns | 85.1 ns .. 85.5 ns | per elem |
| encode (hash + cells) | xor-siphash.64/m=5,n=3500,map=mcg64 | xor-siphash | per-element | 81.5 ns | 81.3 ns .. 81.7 ns | per elem |
| encode (hash + cells) | binary.109/m=1350,n=3500,h2c=ti | gf2_109 | per-element | 6.06 µs | 6.05 µs .. 6.07 µs | per elem |
| encode (hash + cells) | binary-lambda.109/m=1350,n=3500,h2c=ti-addend | gf2_109-lambda | per-element | 4.93 µs | 4.92 µs .. 4.94 µs | per elem |
| encode (hash + cells) | binary-u.109/m=1350,n=3500,h2c=pornin-addend | gf2_109-u | per-element | 4.53 µs | 4.52 µs .. 4.54 µs | per elem |
| encode (hash + cells) | binary-w.109/m=1350,n=3500,h2c=ti | gf2_109-w | per-element | 4.95 µs | 4.94 µs .. 4.96 µs | per elem |
| encode (hash + cells) | binary.122/m=1350,n=3500,h2c=ti | gf2_122 | per-element | 4.12 µs | 4.11 µs .. 4.12 µs | per elem |
| encode (hash + cells) | binary.122-gls/m=1350,n=3500,h2c=ti | gf2_122-gls | per-element | 3.76 µs | 3.75 µs .. 3.76 µs | per elem |
| encode (hash + cells) | binary-lambda.122-gls/m=1350,n=3500,h2c=ti-addend | gf2_122-gls-lambda | per-element | 3.23 µs | 3.22 µs .. 3.24 µs | per elem |
| encode (hash + cells) | binary-u.122-gls/m=1350,n=3500,h2c=ti | gf2_122-gls-u | per-element | 2.90 µs | 2.90 µs .. 2.91 µs | per elem |
| encode (hash + cells) | binary-w.122-gls/m=1350,n=3500,h2c=ti | gf2_122-gls-w | per-element | 3.23 µs | 3.23 µs .. 3.24 µs | per elem |
| encode (hash + cells) | binary-lambda.122/m=1350,n=3500,h2c=ti-addend | gf2_122-lambda | per-element | 3.29 µs | 3.28 µs .. 3.29 µs | per elem |
| encode (hash + cells) | binary-u.122/m=1350,n=3500,h2c=ti | gf2_122-u | per-element | 2.94 µs | 2.93 µs .. 2.95 µs | per elem |
| encode (hash + cells) | binary-w.122/m=1350,n=3500,h2c=ti | gf2_122-w | per-element | 3.27 µs | 3.26 µs .. 3.27 µs | per elem |
| encode (hash + cells) | binary.127/m=12150,n=3500,h2c=ti,map=mcg64 | gf2_127 | per-element | 3.19 µs | 3.19 µs .. 3.19 µs | per elem |
| encode (hash + cells) | binary.127/m=1350,n=3500,h2c=ti | gf2_127 | per-element | 2.43 µs | 2.43 µs .. 2.44 µs | per elem |
| encode (hash + cells) | binary.127/m=1350,n=3500,h2c=ti,map=mcg64 | gf2_127 | per-element | 2.46 µs | 2.45 µs .. 2.46 µs | per elem |
| encode (hash + cells) | binary.127/m=150,n=3500,h2c=ti,map=mcg64 | gf2_127 | per-element | 1.75 µs | 1.75 µs .. 1.75 µs | per elem |
| encode (hash + cells) | binary.127/m=20,n=3500,h2c=ti,map=mcg64 | gf2_127 | per-element | 1.13 µs | 1.12 µs .. 1.13 µs | per elem |
| encode (hash + cells) | binary.127/m=5,n=3500,h2c=ti,map=mcg64 | gf2_127 | per-element | 738 ns | 737 ns .. 740 ns | per elem |
| encode (hash + cells) | binary-lambda.127/m=12150,n=3500,h2c=ti-addend | gf2_127-lambda | per-element | 2.40 µs | 2.40 µs .. 2.41 µs | per elem |
| encode (hash + cells) | binary-lambda.127/m=12150,n=3500,h2c=ti-addend,proj=fp127,mapproj=fp127 | gf2_127-lambda | per-element | 2.29 µs | 2.28 µs .. 2.30 µs | per elem |
| encode (hash + cells) | binary-lambda.127/m=1350,n=3500,h2c=ti-addend | gf2_127-lambda | per-element | 2.04 µs | 2.03 µs .. 2.04 µs | per elem |
| encode (hash + cells) | binary-lambda.127/m=1350,n=3500,h2c=ti-addend,proj=fp127,mapproj=fp127 | gf2_127-lambda | per-element | 1.98 µs | 1.97 µs .. 1.99 µs | per elem |
| encode (hash + cells) | binary-lambda.127/m=5,n=3500,h2c=ti-addend | gf2_127-lambda | per-element | 629 ns | 627 ns .. 630 ns | per elem |
| encode (hash + cells) | binary-lambda.127/m=5,n=3500,h2c=ti-addend,proj=fp127,mapproj=fp127 | gf2_127-lambda | per-element | 571 ns | 569 ns .. 572 ns | per elem |
| encode (hash + cells) | binary-u.127/m=12150,n=3500,h2c=pornin-addend | gf2_127-u | per-element | 2.47 µs | 2.46 µs .. 2.47 µs | per elem |
| encode (hash + cells) | binary-u.127/m=12150,n=3500,h2c=pornin-addend,proj=fp127,mapproj=fp127 | gf2_127-u | per-element | 2.45 µs | 2.45 µs .. 2.45 µs | per elem |
| encode (hash + cells) | binary-u.127/m=1350,n=3500,h2c=pornin-addend | gf2_127-u | per-element | 1.90 µs | 1.89 µs .. 1.91 µs | per elem |
| encode (hash + cells) | binary-u.127/m=1350,n=3500,h2c=pornin-addend,proj=fp127,mapproj=fp127 | gf2_127-u | per-element | 1.89 µs | 1.88 µs .. 1.89 µs | per elem |
| encode (hash + cells) | binary-u.127/m=5,n=3500,h2c=pornin-addend | gf2_127-u | per-element | 615 ns | 614 ns .. 617 ns | per elem |
| encode (hash + cells) | binary-u.127/m=5,n=3500,h2c=pornin-addend,proj=fp127,mapproj=fp127 | gf2_127-u | per-element | 568 ns | 567 ns .. 569 ns | per elem |
| encode (hash + cells) | binary-w.127/m=12150,n=3500,h2c=pornin-addend | gf2_127-w | per-element | 2.40 µs | 2.40 µs .. 2.41 µs | per elem |
| encode (hash + cells) | binary-w.127/m=12150,n=3500,h2c=pornin-addend,proj=fp127,mapproj=fp127 | gf2_127-w | per-element | 2.37 µs | 2.36 µs .. 2.37 µs | per elem |
| encode (hash + cells) | binary-w.127/m=1350,n=3500,h2c=pornin-addend | gf2_127-w | per-element | 2.04 µs | 2.04 µs .. 2.05 µs | per elem |
| encode (hash + cells) | binary-w.127/m=1350,n=3500,h2c=pornin-addend,proj=fp127,mapproj=fp127 | gf2_127-w | per-element | 2.01 µs | 2.01 µs .. 2.02 µs | per elem |
| encode (hash + cells) | binary-w.127/m=5,n=3500,h2c=pornin-addend | gf2_127-w | per-element | 632 ns | 631 ns .. 634 ns | per elem |
| encode (hash + cells) | binary-w.127/m=5,n=3500,h2c=pornin-addend,proj=fp127,mapproj=fp127 | gf2_127-w | per-element | 584 ns | 583 ns .. 585 ns | per elem |
| encode (hash + cells) | edwards.127/m=12150,n=3500,h2c=ti | edwards127 | per-element | 1.53 µs | 1.53 µs .. 1.53 µs | per elem |
| encode (hash + cells) | edwards.127/m=12150,n=3500,h2c=ti,proj=fp130,mapproj=fp127 | edwards127 | 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.42 µs | 1.41 µs .. 1.42 µs | per elem |
| encode (hash + cells) | edwards.127/m=1350,n=3500,h2c=ti,proj=fp130,mapproj=fp127 | edwards127 | per-element | 1.35 µs | 1.35 µs .. 1.36 µs | per elem |
| encode (hash + cells) | edwards.127/m=150,n=3500,h2c=ti | edwards127 | per-element | 1.32 µs | 1.31 µs .. 1.32 µs | per elem |
| encode (hash + cells) | edwards.127/m=20,n=3500,h2c=ti | edwards127 | per-element | 1.24 µs | 1.24 µs .. 1.24 µs | per elem |
| encode (hash + cells) | edwards.127/m=5,n=3500,h2c=ti | edwards127 | per-element | 1.18 µs | 1.18 µs .. 1.19 µs | per elem |
| encode (hash + cells) | edwards.127/m=5,n=3500,h2c=ti,proj=fp130,mapproj=fp127 | edwards127 | per-element | 1.10 µs | 1.10 µs .. 1.10 µs | per elem |
| encode (hash + cells) | weier.127/m=12150,n=3500,h2c=ti | weier127 | per-element | 1.90 µs | 1.90 µs .. 1.91 µs | per elem |
| encode (hash + cells) | weier.127/m=12150,n=3500,h2c=ti,proj=fp127,mapproj=fp127 | weier127 | per-element | 1.84 µs | 1.83 µs .. 1.84 µs | per elem |
| encode (hash + cells) | weier.127/m=1350,n=3500,h2c=ti | weier127 | per-element | 1.68 µs | 1.68 µs .. 1.69 µs | per elem |
| encode (hash + cells) | weier.127/m=1350,n=3500,h2c=ti,proj=fp127,mapproj=fp127 | weier127 | per-element | 1.61 µs | 1.61 µs .. 1.62 µs | per elem |
| encode (hash + cells) | weier.127/m=5,n=3500,h2c=ti | weier127 | per-element | 1.20 µs | 1.20 µs .. 1.21 µs | per elem |
| encode (hash + cells) | weier.127/m=5,n=3500,h2c=ti,proj=fp127,mapproj=fp127 | weier127 | per-element | 1.12 µs | 1.12 µs .. 1.13 µs | per elem |
| encode (hash + cells) | weier-jacobian.127/m=12150,n=3500,h2c=ti | weier127-jacobian | per-element | 1.68 µs | 1.68 µs .. 1.69 µs | per elem |
| encode (hash + cells) | weier-jacobian.127/m=12150,n=3500,h2c=ti,proj=fp127,mapproj=fp127 | weier127-jacobian | per-element | 1.58 µs | 1.57 µs .. 1.58 µs | per elem |
| encode (hash + cells) | weier-jacobian.127/m=1350,n=3500,h2c=ti | weier127-jacobian | per-element | 1.56 µs | 1.56 µs .. 1.57 µs | per elem |
| encode (hash + cells) | weier-jacobian.127/m=1350,n=3500,h2c=ti,proj=fp127,mapproj=fp127 | weier127-jacobian | per-element | 1.49 µs | 1.49 µs .. 1.49 µs | per elem |
| encode (hash + cells) | weier-jacobian.127/m=150,n=3500,h2c=ti | weier127-jacobian | per-element | 1.40 µs | 1.40 µs .. 1.41 µs | per elem |
| encode (hash + cells) | weier-jacobian.127/m=20,n=3500,h2c=ti | weier127-jacobian | per-element | 1.26 µs | 1.26 µs .. 1.27 µs | per elem |
| encode (hash + cells) | weier-jacobian.127/m=5,n=3500,h2c=ti | weier127-jacobian | per-element | 1.17 µs | 1.17 µs .. 1.18 µs | per elem |
| encode (hash + cells) | weier-jacobian.127/m=5,n=3500,h2c=ti,proj=fp127,mapproj=fp127 | weier127-jacobian | per-element | 1.09 µs | 1.09 µs .. 1.10 µs | per elem |
| cell updates | xor-sha256.64/m=1350,n=3500 | xor | per-element | 139 ns | 139 ns .. 139 ns | per elem |
| cell updates | xor-siphash.64/m=1350,n=3500 | xor-siphash | per-element | 139 ns | 139 ns .. 139 ns | per elem |
| cell updates | binary.109/m=1350,n=3500 | gf2_109 | per-element | 5.46 µs | 5.45 µs .. 5.47 µs | per elem |
| cell updates | binary-lambda.109/m=1350,n=3500 | gf2_109-lambda | per-element | 4.45 µs | 4.45 µs .. 4.46 µs | per elem |
| cell updates | binary-u.109/m=1350,n=3500 | gf2_109-u | per-element | 3.95 µs | 3.94 µs .. 3.96 µs | per elem |
| cell updates | binary-w.109/m=1350,n=3500 | gf2_109-w | per-element | 4.43 µs | 4.43 µs .. 4.44 µs | per elem |
| cell updates | binary.122/m=1350,n=3500 | gf2_122 | per-element | 3.68 µs | 3.67 µs .. 3.69 µs | per elem |
| cell updates | binary.122-gls/m=1350,n=3500 | gf2_122-gls | per-element | 3.39 µs | 3.38 µs .. 3.40 µs | per elem |
| cell updates | binary-lambda.122-gls/m=1350,n=3500 | gf2_122-gls-lambda | per-element | 2.94 µs | 2.93 µs .. 2.94 µs | per elem |
| cell updates | binary-u.122-gls/m=1350,n=3500 | gf2_122-gls-u | per-element | 2.55 µs | 2.54 µs .. 2.55 µs | per elem |
| cell updates | binary-w.122-gls/m=1350,n=3500 | gf2_122-gls-w | per-element | 2.92 µs | 2.92 µs .. 2.93 µs | per elem |
| cell updates | binary-lambda.122/m=1350,n=3500 | gf2_122-lambda | per-element | 2.93 µs | 2.93 µs .. 2.94 µs | per elem |
| cell updates | binary-u.122/m=1350,n=3500 | gf2_122-u | per-element | 2.55 µs | 2.54 µs .. 2.56 µs | per elem |
| cell updates | binary-w.122/m=1350,n=3500 | gf2_122-w | per-element | 2.93 µs | 2.92 µs .. 2.94 µs | per elem |
| cell updates | binary.127/m=1350,n=3500 | gf2_127 | per-element | 2.20 µs | 2.20 µs .. 2.21 µs | per elem |
| cell updates | binary-lambda.127/m=12150,n=3500 | gf2_127-lambda | per-element | 2.21 µs | 2.21 µs .. 2.22 µs | per elem |
| cell updates | binary-lambda.127/m=1350,n=3500 | gf2_127-lambda | per-element | 1.86 µs | 1.86 µs .. 1.86 µs | per elem |
| cell updates | binary-lambda.127/m=5,n=3500 | gf2_127-lambda | per-element | 446 ns | 445 ns .. 447 ns | per elem |
| cell updates | binary-u.127/m=12150,n=3500 | gf2_127-u | per-element | 2.25 µs | 2.24 µs .. 2.25 µs | per elem |
| cell updates | binary-u.127/m=1350,n=3500 | gf2_127-u | per-element | 1.70 µs | 1.70 µs .. 1.70 µs | per elem |
| cell updates | binary-u.127/m=5,n=3500 | gf2_127-u | per-element | 404 ns | 403 ns .. 405 ns | per elem |
| cell updates | binary-w.127/m=12150,n=3500 | gf2_127-w | per-element | 2.21 µs | 2.21 µs .. 2.21 µs | per elem |
| cell updates | binary-w.127/m=1350,n=3500 | gf2_127-w | per-element | 1.86 µs | 1.86 µs .. 1.86 µs | per elem |
| cell updates | binary-w.127/m=5,n=3500 | gf2_127-w | per-element | 447 ns | 446 ns .. 448 ns | per elem |
| cell updates | edwards.127/m=12150,n=3500 | edwards127 | per-element | 459 ns | 458 ns .. 461 ns | per elem |
| cell updates | edwards.127/m=1350,n=3500 | edwards127 | per-element | 341 ns | 340 ns .. 341 ns | per elem |
| cell updates | edwards.127/m=150,n=3500 | edwards127 | per-element | 243 ns | 242 ns .. 243 ns | per elem |
| cell updates | edwards.127/m=20,n=3500 | edwards127 | per-element | 162 ns | 162 ns .. 163 ns | per elem |
| cell updates | edwards.127/m=5,n=3500 | edwards127 | per-element | 111 ns | 111 ns .. 112 ns | per elem |
| cell updates | weier.127/m=12150,n=3500 | weier127 | per-element | 875 ns | 873 ns .. 877 ns | per elem |
| cell updates | weier.127/m=1350,n=3500 | weier127 | per-element | 633 ns | 632 ns .. 635 ns | per elem |
| cell updates | weier.127/m=5,n=3500 | weier127 | per-element | 172 ns | 171 ns .. 172 ns | per elem |
| cell updates | weier-jacobian.127/m=12150,n=3500 | weier127-jacobian | per-element | 658 ns | 657 ns .. 660 ns | per elem |
| cell updates | weier-jacobian.127/m=1350,n=3500 | weier127-jacobian | per-element | 534 ns | 533 ns .. 535 ns | per elem |
| cell updates | weier-jacobian.127/m=150,n=3500 | weier127-jacobian | per-element | 377 ns | 376 ns .. 379 ns | per elem |
| cell updates | weier-jacobian.127/m=20,n=3500 | weier127-jacobian | per-element | 234 ns | 233 ns .. 235 ns | per elem |
| cell updates | weier-jacobian.127/m=5,n=3500 | weier127-jacobian | per-element | 147 ns | 146 ns .. 147 ns | per elem |
| peel, per difference | xor-sha256.64/d=1350,m=2700,prefilter=true,batch=true | xor | batch | 670 ns | 664 ns .. 677 ns | per elem |
| peel, per difference | xor-siphash.64/d=1350,m=2700,prefilter=true,batch=true | xor-siphash | batch | 662 ns | 657 ns .. 667 ns | per elem |
| peel, per difference | binary.109/d=1350,m=2700,prefilter=true,batch=true,h2c=ti | gf2_109 | batch | 7.58 µs | 7.54 µs .. 7.61 µs | per elem |
| peel, per difference | binary-lambda.109/d=1350,m=2700,prefilter=true,batch=true,h2c=ti-addend | gf2_109-lambda | batch | 5.97 µs | 5.95 µs .. 6.00 µs | per elem |
| peel, per difference | binary-u.109/d=1350,m=2700,prefilter=true,batch=true,h2c=pornin-addend | gf2_109-u | batch | 5.67 µs | 5.65 µs .. 5.68 µs | per elem |
| peel, per difference | binary-w.109/d=1350,m=2700,prefilter=true,batch=true,h2c=ti | gf2_109-w | batch | 5.91 µs | 5.89 µs .. 5.93 µs | per elem |
| peel, per difference | binary.122/d=1350,m=2700,prefilter=true,batch=true,h2c=ti | gf2_122 | batch | 5.22 µs | 5.21 µs .. 5.23 µs | per elem |
| peel, per difference | binary.122-gls/d=1350,m=2700,prefilter=true,batch=true,h2c=ti | gf2_122-gls | batch | 4.83 µs | 4.81 µs .. 4.86 µs | per elem |
| peel, per difference | binary-lambda.122-gls/d=1350,m=2700,prefilter=true,batch=true,h2c=ti-addend | gf2_122-gls-lambda | batch | 3.99 µs | 3.98 µs .. 4.00 µs | per elem |
| peel, per difference | binary-u.122-gls/d=1350,m=2700,prefilter=true,batch=true,h2c=ti | gf2_122-gls-u | batch | 3.86 µs | 3.85 µs .. 3.87 µs | per elem |
| peel, per difference | binary-w.122-gls/d=1350,m=2700,prefilter=true,batch=true,h2c=ti | gf2_122-gls-w | batch | 3.99 µs | 3.98 µs .. 4.00 µs | per elem |
| peel, per difference | binary-lambda.122/d=1350,m=2700,prefilter=true,batch=true,h2c=ti-addend | gf2_122-lambda | batch | 4.02 µs | 4.01 µs .. 4.03 µs | per elem |
| peel, per difference | binary-u.122/d=1350,m=2700,prefilter=true,batch=true,h2c=ti | gf2_122-u | batch | 3.81 µs | 3.79 µs .. 3.82 µs | per elem |
| peel, per difference | binary-w.122/d=1350,m=2700,prefilter=true,batch=true,h2c=ti | gf2_122-w | batch | 4.00 µs | 4.00 µs .. 4.01 µs | per elem |
| peel, per difference | binary.127/d=1350,m=2700,prefilter=true,batch=true,h2c=ti | gf2_127 | batch | 3.25 µs | 3.24 µs .. 3.26 µs | per elem |
| peel, per difference | binary-lambda.127/d=10000,m=20000,prefilter=true,batch=true,h2c=ti-addend | gf2_127-lambda | batch | 3.51 µs | 3.50 µs .. 3.51 µs | per elem |
| peel, per difference | binary-lambda.127/d=10000,m=20000,prefilter=true,batch=true,h2c=ti-addend,proj=fp127,mapproj=fp127 | gf2_127-lambda | batch | 3.34 µs | 3.34 µs .. 3.35 µs | per elem |
| peel, per difference | binary-lambda.127/d=1350,m=2700,prefilter=true,batch=true,h2c=ti-addend | gf2_127-lambda | batch | 2.73 µs | 2.72 µs .. 2.73 µs | per elem |
| peel, per difference | binary-lambda.127/d=1350,m=2700,prefilter=true,batch=true,h2c=ti-addend,proj=fp127,mapproj=fp127 | gf2_127-lambda | batch | 2.51 µs | 2.51 µs .. 2.52 µs | per elem |
| peel, per difference | binary-lambda.127/d=4,m=8,prefilter=true,batch=true,h2c=ti-addend | gf2_127-lambda | batch | 1.27 µs | 1.26 µs .. 1.27 µs | per elem |
| peel, per difference | binary-lambda.127/d=4,m=8,prefilter=true,batch=true,h2c=ti-addend,proj=fp127,mapproj=fp127 | gf2_127-lambda | batch | 1.06 µs | 1.06 µs .. 1.06 µs | per elem |
| peel, per difference | binary-u.127/d=10000,m=20000,prefilter=true,batch=true,h2c=pornin-addend | gf2_127-u | batch | 3.38 µs | 3.37 µs .. 3.38 µs | per elem |
| peel, per difference | binary-u.127/d=10000,m=20000,prefilter=true,batch=true,h2c=pornin-addend,proj=fp127,mapproj=fp127 | gf2_127-u | batch | 3.28 µs | 3.27 µs .. 3.28 µs | per elem |
| peel, per difference | binary-u.127/d=1350,m=2700,prefilter=true,batch=true,h2c=pornin-addend | gf2_127-u | batch | 2.67 µs | 2.66 µs .. 2.67 µs | per elem |
| peel, per difference | binary-u.127/d=1350,m=2700,prefilter=true,batch=true,h2c=pornin-addend,proj=fp127,mapproj=fp127 | gf2_127-u | batch | 2.49 µs | 2.48 µs .. 2.49 µs | per elem |
| peel, per difference | binary-u.127/d=4,m=8,prefilter=true,batch=true,h2c=pornin-addend | gf2_127-u | batch | 1.16 µs | 1.15 µs .. 1.16 µs | per elem |
| peel, per difference | binary-u.127/d=4,m=8,prefilter=true,batch=true,h2c=pornin-addend,proj=fp127,mapproj=fp127 | gf2_127-u | batch | 1.06 µs | 1.06 µs .. 1.07 µs | per elem |
| peel, per difference | binary-w.127/d=10000,m=20000,prefilter=true,batch=true,h2c=pornin-addend | gf2_127-w | batch | 3.50 µs | 3.49 µs .. 3.50 µs | per elem |
| peel, per difference | binary-w.127/d=10000,m=20000,prefilter=true,batch=true,h2c=pornin-addend,proj=fp127,mapproj=fp127 | gf2_127-w | batch | 3.35 µs | 3.34 µs .. 3.35 µs | per elem |
| peel, per difference | binary-w.127/d=1350,m=2700,prefilter=true,batch=true,h2c=pornin-addend | gf2_127-w | batch | 2.70 µs | 2.70 µs .. 2.71 µs | per elem |
| peel, per difference | binary-w.127/d=1350,m=2700,prefilter=true,batch=true,h2c=pornin-addend,proj=fp127,mapproj=fp127 | gf2_127-w | batch | 2.44 µs | 2.44 µs .. 2.45 µs | per elem |
| peel, per difference | binary-w.127/d=4,m=8,prefilter=true,batch=true,h2c=pornin-addend | gf2_127-w | batch | 980 ns | 977 ns .. 983 ns | per elem |
| peel, per difference | binary-w.127/d=4,m=8,prefilter=true,batch=true,h2c=pornin-addend,proj=fp127,mapproj=fp127 | gf2_127-w | batch | 894 ns | 892 ns .. 896 ns | per elem |
| peel, per difference | edwards.127/d=10000,m=20000,prefilter=false,batch=false,h2c=ti | edwards127 | per-element | 3.73 µs | 3.72 µs .. 3.74 µs | per elem |
| peel, per difference | edwards.127/d=10000,m=20000,prefilter=false,batch=true,h2c=ti | edwards127 | batch | 2.77 µs | 2.77 µs .. 2.78 µs | per elem |
| peel, per difference | edwards.127/d=10000,m=20000,prefilter=true,batch=false,h2c=ti | edwards127 | per-element | 2.80 µs | 2.79 µs .. 2.80 µs | per elem |
| peel, per difference | edwards.127/d=10000,m=20000,prefilter=true,batch=true,h2c=ti | edwards127 | batch | 2.26 µs | 2.25 µs .. 2.26 µs | per elem |
| peel, per difference | edwards.127/d=10000,m=20000,prefilter=true,batch=true,h2c=ti,proj=fp130,mapproj=fp127 | edwards127 | batch | 2.15 µs | 2.14 µs .. 2.15 µs | per elem |
| peel, per difference | edwards.127/d=1350,m=2700,prefilter=false,batch=false,h2c=ti | edwards127 | per-element | 3.48 µs | 3.47 µs .. 3.49 µs | per elem |
| peel, per difference | edwards.127/d=1350,m=2700,prefilter=false,batch=true,h2c=ti | edwards127 | batch | 2.53 µs | 2.52 µs .. 2.53 µs | per elem |
| peel, per difference | edwards.127/d=1350,m=2700,prefilter=true,batch=false,h2c=ti | edwards127 | per-element | 2.51 µs | 2.50 µs .. 2.52 µs | per elem |
| peel, per difference | edwards.127/d=1350,m=2700,prefilter=true,batch=true,h2c=ti | edwards127 | batch | 1.96 µs | 1.95 µs .. 1.96 µs | per elem |
| peel, per difference | edwards.127/d=1350,m=2700,prefilter=true,batch=true,h2c=ti,proj=fp130,mapproj=fp127 | edwards127 | batch | 1.78 µs | 1.78 µs .. 1.78 µs | per elem |
| peel, per difference | edwards.127/d=150,m=300,prefilter=false,batch=false,h2c=ti | edwards127 | per-element | 3.55 µs | 3.54 µs .. 3.56 µs | per elem |
| peel, per difference | edwards.127/d=150,m=300,prefilter=false,batch=true,h2c=ti | edwards127 | batch | 2.60 µs | 2.60 µs .. 2.61 µs | per elem |
| peel, per difference | edwards.127/d=150,m=300,prefilter=true,batch=false,h2c=ti | edwards127 | per-element | 2.38 µs | 2.38 µs .. 2.39 µs | per elem |
| peel, per difference | edwards.127/d=150,m=300,prefilter=true,batch=true,h2c=ti | edwards127 | batch | 1.84 µs | 1.84 µs .. 1.85 µs | per elem |
| peel, per difference | edwards.127/d=20,m=40,prefilter=false,batch=false,h2c=ti | edwards127 | per-element | 2.73 µs | 2.72 µs .. 2.73 µs | per elem |
| peel, per difference | edwards.127/d=20,m=40,prefilter=false,batch=true,h2c=ti | edwards127 | batch | 2.00 µs | 2.00 µs .. 2.01 µs | per elem |
| peel, per difference | edwards.127/d=20,m=40,prefilter=true,batch=false,h2c=ti | edwards127 | per-element | 2.13 µs | 2.13 µs .. 2.14 µs | per elem |
| peel, per difference | edwards.127/d=20,m=40,prefilter=true,batch=true,h2c=ti | edwards127 | batch | 1.68 µs | 1.67 µs .. 1.68 µs | per elem |
| peel, per difference | edwards.127/d=4,m=8,prefilter=false,batch=false,h2c=ti | edwards127 | per-element | 1.74 µs | 1.73 µs .. 1.75 µs | per elem |
| peel, per difference | edwards.127/d=4,m=8,prefilter=false,batch=true,h2c=ti | edwards127 | batch | 1.48 µs | 1.47 µs .. 1.48 µs | per elem |
| peel, per difference | edwards.127/d=4,m=8,prefilter=true,batch=false,h2c=ti | edwards127 | per-element | 1.79 µs | 1.78 µs .. 1.79 µs | per elem |
| peel, per difference | edwards.127/d=4,m=8,prefilter=true,batch=true,h2c=ti | edwards127 | batch | 1.52 µs | 1.52 µs .. 1.53 µs | per elem |
| peel, per difference | edwards.127/d=4,m=8,prefilter=true,batch=true,h2c=ti,proj=fp130,mapproj=fp127 | edwards127 | batch | 2.32 µs | 2.32 µs .. 2.33 µs | per elem |
| peel, per difference | weier.127/d=10000,m=20000,prefilter=true,batch=true,h2c=ti | weier127 | batch | 2.64 µs | 2.63 µs .. 2.65 µs | per elem |
| peel, per difference | weier.127/d=10000,m=20000,prefilter=true,batch=true,h2c=ti,proj=fp127,mapproj=fp127 | weier127 | batch | 2.57 µs | 2.56 µs .. 2.57 µs | per elem |
| peel, per difference | weier.127/d=1350,m=2700,prefilter=true,batch=true,h2c=ti | weier127 | batch | 2.24 µs | 2.24 µs .. 2.25 µs | per elem |
| peel, per difference | weier.127/d=1350,m=2700,prefilter=true,batch=true,h2c=ti,proj=fp127,mapproj=fp127 | weier127 | batch | 2.11 µs | 2.10 µs .. 2.11 µs | per elem |
| peel, per difference | weier.127/d=4,m=8,prefilter=true,batch=true,h2c=ti | weier127 | batch | 1.03 µs | 1.03 µs .. 1.04 µs | per elem |
| peel, per difference | weier.127/d=4,m=8,prefilter=true,batch=true,h2c=ti,proj=fp127,mapproj=fp127 | weier127 | batch | 1.07 µs | 1.07 µs .. 1.08 µs | per elem |
| peel, per difference | weier-jacobian.127/d=10000,m=20000,prefilter=false,batch=false,h2c=ti | weier127-jacobian | per-element | 3.05 µs | 3.04 µs .. 3.05 µs | per elem |
| peel, per difference | weier-jacobian.127/d=10000,m=20000,prefilter=false,batch=true,h2c=ti | weier127-jacobian | batch | 3.04 µs | 3.03 µs .. 3.05 µs | per elem |
| peel, per difference | weier-jacobian.127/d=10000,m=20000,prefilter=true,batch=false,h2c=ti | weier127-jacobian | per-element | 2.52 µs | 2.52 µs .. 2.53 µs | per elem |
| peel, per difference | weier-jacobian.127/d=10000,m=20000,prefilter=true,batch=true,h2c=ti | weier127-jacobian | batch | 2.48 µs | 2.47 µs .. 2.49 µs | per elem |
| peel, per difference | weier-jacobian.127/d=10000,m=20000,prefilter=true,batch=true,h2c=ti,proj=fp127,mapproj=fp127 | weier127-jacobian | batch | 2.33 µs | 2.32 µs .. 2.34 µs | per elem |
| peel, per difference | weier-jacobian.127/d=1350,m=2700,prefilter=false,batch=false,h2c=ti | weier127-jacobian | per-element | 2.70 µs | 2.69 µs .. 2.70 µs | per elem |
| peel, per difference | weier-jacobian.127/d=1350,m=2700,prefilter=false,batch=true,h2c=ti | weier127-jacobian | batch | 2.68 µs | 2.68 µs .. 2.69 µs | per elem |
| peel, per difference | weier-jacobian.127/d=1350,m=2700,prefilter=true,batch=false,h2c=ti | weier127-jacobian | per-element | 2.11 µs | 2.10 µs .. 2.11 µs | per elem |
| peel, per difference | weier-jacobian.127/d=1350,m=2700,prefilter=true,batch=true,h2c=ti | weier127-jacobian | batch | 2.11 µs | 2.11 µs .. 2.12 µs | per elem |
| peel, per difference | weier-jacobian.127/d=1350,m=2700,prefilter=true,batch=true,h2c=ti,proj=fp127,mapproj=fp127 | weier127-jacobian | batch | 1.96 µs | 1.95 µs .. 1.96 µs | per elem |
| peel, per difference | weier-jacobian.127/d=150,m=300,prefilter=false,batch=false,h2c=ti | weier127-jacobian | per-element | 2.63 µs | 2.62 µs .. 2.64 µs | per elem |
| peel, per difference | weier-jacobian.127/d=150,m=300,prefilter=false,batch=true,h2c=ti | weier127-jacobian | batch | 2.58 µs | 2.58 µs .. 2.59 µs | per elem |
| peel, per difference | weier-jacobian.127/d=150,m=300,prefilter=true,batch=false,h2c=ti | weier127-jacobian | per-element | 1.92 µs | 1.91 µs .. 1.92 µs | per elem |
| peel, per difference | weier-jacobian.127/d=150,m=300,prefilter=true,batch=true,h2c=ti | weier127-jacobian | batch | 1.89 µs | 1.89 µs .. 1.90 µs | per elem |
| peel, per difference | weier-jacobian.127/d=20,m=40,prefilter=false,batch=false,h2c=ti | weier127-jacobian | per-element | 2.15 µs | 2.14 µs .. 2.15 µs | per elem |
| peel, per difference | weier-jacobian.127/d=20,m=40,prefilter=false,batch=true,h2c=ti | weier127-jacobian | batch | 2.15 µs | 2.15 µs .. 2.16 µs | per elem |
| peel, per difference | weier-jacobian.127/d=20,m=40,prefilter=true,batch=false,h2c=ti | weier127-jacobian | per-element | 1.59 µs | 1.58 µs .. 1.59 µs | per elem |
| peel, per difference | weier-jacobian.127/d=20,m=40,prefilter=true,batch=true,h2c=ti | weier127-jacobian | batch | 1.59 µs | 1.58 µs .. 1.60 µs | per elem |
| peel, per difference | weier-jacobian.127/d=4,m=8,prefilter=false,batch=false,h2c=ti | weier127-jacobian | per-element | 937 ns | 933 ns .. 941 ns | per elem |
| peel, per difference | weier-jacobian.127/d=4,m=8,prefilter=false,batch=true,h2c=ti | weier127-jacobian | batch | 932 ns | 929 ns .. 935 ns | per elem |
| peel, per difference | weier-jacobian.127/d=4,m=8,prefilter=true,batch=false,h2c=ti | weier127-jacobian | per-element | 967 ns | 964 ns .. 970 ns | per elem |
| peel, per difference | weier-jacobian.127/d=4,m=8,prefilter=true,batch=true,h2c=ti | weier127-jacobian | batch | 981 ns | 977 ns .. 984 ns | per elem |
| peel, per difference | weier-jacobian.127/d=4,m=8,prefilter=true,batch=true,h2c=ti,proj=fp127,mapproj=fp127 | weier127-jacobian | batch | 1.01 µs | 1.00 µs .. 1.01 µs | per elem |
| rateless encode and decode, per difference | xor-sha256.64/d=10 | xor | per-element | 652 ns | 649 ns .. 654 ns | per elem |
| rateless encode and decode, per difference | xor-sha256.64/d=100 | xor | per-element | 1.41 µs | 1.40 µs .. 1.41 µs | per elem |
| rateless encode and decode, per difference | xor-sha256.64/d=1000 | xor | per-element | 2.53 µs | 2.52 µs .. 2.53 µs | per elem |
| rateless encode and decode, per difference | xor-sha256.64/d=10000 | xor | per-element | 4.14 µs | 4.12 µs .. 4.16 µs | per elem |
| rateless encode and decode, per difference | xor-sha256.64/d=100000 | xor | per-element | 6.90 µs | 6.89 µs .. 6.92 µs | per elem |
| rateless encode and decode, per difference | xor-sha256.64/d=20 | xor | per-element | 842 ns | 840 ns .. 844 ns | per elem |
| rateless encode and decode, per difference | xor-sha256.64/d=40 | xor | per-element | 1.05 µs | 1.05 µs .. 1.06 µs | per elem |
| rateless encode and decode, per difference | xor-sha256.64/d=50000 | xor | per-element | 5.65 µs | 5.63 µs .. 5.67 µs | per elem |
| rateless encode and decode, per difference | xor-siphash.64/d=10 | xor-siphash | per-element | 593 ns | 592 ns .. 594 ns | per elem |
| rateless encode and decode, per difference | xor-siphash.64/d=10,map=mcg64 | xor-siphash | per-element | 579 ns | 578 ns .. 580 ns | per elem |
| rateless encode and decode, per difference | xor-siphash.64/d=100 | xor-siphash | per-element | 1.33 µs | 1.33 µs .. 1.34 µs | per elem |
| rateless encode and decode, per difference | xor-siphash.64/d=100,map=mcg64 | xor-siphash | per-element | 1.31 µs | 1.31 µs .. 1.31 µs | per elem |
| rateless encode and decode, per difference | xor-siphash.64/d=1000 | xor-siphash | per-element | 2.45 µs | 2.44 µs .. 2.46 µs | per elem |
| rateless encode and decode, per difference | xor-siphash.64/d=1000,map=mcg64 | xor-siphash | per-element | 2.43 µs | 2.42 µs .. 2.43 µs | per elem |
| rateless encode and decode, per difference | xor-siphash.64/d=10000 | xor-siphash | per-element | 4.06 µs | 4.05 µs .. 4.07 µs | per elem |
| rateless encode and decode, per difference | xor-siphash.64/d=10000,map=chacha8 | xor-siphash | per-element | 4.65 µs | 4.64 µs .. 4.67 µs | per elem |
| rateless encode and decode, per difference | xor-siphash.64/d=10000,map=mcg64 | xor-siphash | per-element | 4.02 µs | 4.01 µs .. 4.04 µs | per elem |
| rateless encode and decode, per difference | xor-siphash.64/d=100000 | xor-siphash | per-element | 6.81 µs | 6.80 µs .. 6.83 µs | per elem |
| rateless encode and decode, per difference | xor-siphash.64/d=100000,map=chacha8 | xor-siphash | per-element | 10.1 µs | 10.1 µs .. 10.1 µs | per elem |
| rateless encode and decode, per difference | xor-siphash.64/d=100000,map=mcg64 | xor-siphash | per-element | 6.33 µs | 6.31 µs .. 6.36 µs | per elem |
| rateless encode and decode, per difference | xor-siphash.64/d=20 | xor-siphash | per-element | 776 ns | 773 ns .. 778 ns | per elem |
| rateless encode and decode, per difference | xor-siphash.64/d=20,map=mcg64 | xor-siphash | per-element | 758 ns | 757 ns .. 760 ns | per elem |
| rateless encode and decode, per difference | xor-siphash.64/d=40 | xor-siphash | per-element | 987 ns | 985 ns .. 988 ns | per elem |
| rateless encode and decode, per difference | xor-siphash.64/d=40,map=mcg64 | xor-siphash | per-element | 960 ns | 957 ns .. 963 ns | per elem |
| rateless encode and decode, per difference | xor-siphash.64/d=50000 | xor-siphash | per-element | 5.58 µs | 5.55 µs .. 5.60 µs | per elem |
| rateless encode and decode, per difference | xor-siphash.64/d=50000,map=mcg64 | xor-siphash | per-element | 5.46 µs | 5.44 µs .. 5.48 µs | per elem |
| rateless encode and decode, per difference | binary.109/d=1000,h2c=ti | gf2_109 | per-element | 44.3 µs | 44.2 µs .. 44.4 µs | per elem |
| rateless encode and decode, per difference | binary-lambda.109/d=1000,h2c=ti-addend | gf2_109-lambda | per-element | 39.1 µs | 39.0 µs .. 39.3 µs | per elem |
| rateless encode and decode, per difference | binary-u.109/d=1000,h2c=pornin-addend | gf2_109-u | per-element | 29.4 µs | 29.3 µs .. 29.4 µs | per elem |
| rateless encode and decode, per difference | binary-w.109/d=1000,h2c=ti | gf2_109-w | per-element | 39.4 µs | 39.3 µs .. 39.5 µs | per elem |
| rateless encode and decode, per difference | binary.122/d=1000,h2c=ti | gf2_122 | per-element | 21.5 µs | 21.4 µs .. 21.6 µs | per elem |
| rateless encode and decode, per difference | binary.122-gls/d=1000,h2c=ti | gf2_122-gls | per-element | 19.8 µs | 19.6 µs .. 20.1 µs | per elem |
| rateless encode and decode, per difference | binary-lambda.122-gls/d=1000,h2c=ti-addend | gf2_122-gls-lambda | per-element | 17.3 µs | 17.2 µs .. 17.3 µs | per elem |
| rateless encode and decode, per difference | binary-u.122-gls/d=1000,h2c=ti | gf2_122-gls-u | per-element | 17.1 µs | 16.8 µs .. 17.4 µs | per elem |
| rateless encode and decode, per difference | binary-w.122-gls/d=1000,h2c=ti | gf2_122-gls-w | per-element | 17.6 µs | 17.5 µs .. 17.7 µs | per elem |
| rateless encode and decode, per difference | binary-lambda.122/d=1000,h2c=ti-addend | gf2_122-lambda | per-element | 18.0 µs | 17.9 µs .. 18.0 µs | per elem |
| rateless encode and decode, per difference | binary-u.122/d=1000,h2c=ti | gf2_122-u | per-element | 17.0 µs | 16.9 µs .. 17.1 µs | per elem |
| rateless encode and decode, per difference | binary-w.122/d=1000,h2c=ti | gf2_122-w | per-element | 18.1 µs | 18.1 µs .. 18.2 µs | per elem |
| rateless encode and decode, per difference | binary.127/d=10,h2c=ti,map=mcg64 | gf2_127 | per-element | 6.00 µs | 5.94 µs .. 6.06 µs | per elem |
| rateless encode and decode, per difference | binary.127/d=100,h2c=ti,map=mcg64 | gf2_127 | per-element | 10.1 µs | 10.1 µs .. 10.2 µs | per elem |
| rateless encode and decode, per difference | binary.127/d=1000,h2c=ti | gf2_127 | per-element | 14.5 µs | 14.5 µs .. 14.5 µs | per elem |
| rateless encode and decode, per difference | binary.127/d=1000,h2c=ti,map=mcg64 | gf2_127 | per-element | 14.5 µs | 14.4 µs .. 14.5 µs | per elem |
| rateless encode and decode, per difference | binary.127/d=10000,h2c=ti,map=chacha8 | gf2_127 | per-element | 20.0 µs | 20.0 µs .. 20.1 µs | per elem |
| rateless encode and decode, per difference | binary.127/d=10000,h2c=ti,map=mcg64 | gf2_127 | per-element | 19.1 µs | 19.0 µs .. 19.2 µs | per elem |
| rateless encode and decode, per difference | binary.127/d=100000,h2c=ti,map=chacha8 | gf2_127 | per-element | 32.2 µs | 32.2 µs .. 32.2 µs | per elem |
| rateless encode and decode, per difference | binary.127/d=100000,h2c=ti,map=mcg64 | gf2_127 | per-element | 28.2 µs | 28.1 µs .. 28.2 µs | per elem |
| rateless encode and decode, per difference | binary.127/d=20,h2c=ti,map=mcg64 | gf2_127 | per-element | 7.36 µs | 7.35 µs .. 7.38 µs | per elem |
| rateless encode and decode, per difference | binary.127/d=40,h2c=ti,map=mcg64 | gf2_127 | per-element | 8.46 µs | 8.37 µs .. 8.53 µs | per elem |
| rateless encode and decode, per difference | binary.127/d=50000,h2c=ti,map=mcg64 | gf2_127 | per-element | 24.2 µs | 24.2 µs .. 24.2 µs | per elem |
| rateless encode and decode, per difference | binary-lambda.127/d=10,h2c=ti-addend | gf2_127-lambda | per-element | 5.16 µs | 5.15 µs .. 5.18 µs | per elem |
| rateless encode and decode, per difference | binary-lambda.127/d=1000,h2c=ti-addend | gf2_127-lambda | per-element | 12.6 µs | 12.6 µs .. 12.6 µs | per elem |
| rateless encode and decode, per difference | binary-lambda.127/d=100000,h2c=ti-addend | gf2_127-lambda | per-element | 25.7 µs | 25.6 µs .. 25.7 µs | per elem |
| rateless encode and decode, per difference | binary-u.127/d=10,h2c=pornin-addend | gf2_127-u | per-element | 4.53 µs | 4.52 µs .. 4.53 µs | per elem |
| rateless encode and decode, per difference | binary-u.127/d=1000,h2c=pornin-addend | gf2_127-u | per-element | 11.2 µs | 11.1 µs .. 11.2 µs | per elem |
| rateless encode and decode, per difference | binary-u.127/d=100000,h2c=pornin-addend | gf2_127-u | per-element | 23.8 µs | 23.7 µs .. 23.8 µs | per elem |
| rateless encode and decode, per difference | binary-w.127/d=10,h2c=pornin-addend | gf2_127-w | per-element | 4.32 µs | 4.31 µs .. 4.33 µs | per elem |
| rateless encode and decode, per difference | binary-w.127/d=1000,h2c=pornin-addend | gf2_127-w | per-element | 11.5 µs | 11.5 µs .. 11.5 µs | per elem |
| rateless encode and decode, per difference | binary-w.127/d=100000,h2c=pornin-addend | gf2_127-w | per-element | 24.4 µs | 24.4 µs .. 24.5 µs | per elem |
| rateless encode and decode, per difference | edwards.127/d=10,h2c=ti | edwards127 | per-element | 4.99 µs | 4.97 µs .. 5.00 µs | per elem |
| rateless encode and decode, per difference | edwards.127/d=100,h2c=ti | edwards127 | per-element | 7.15 µs | 7.12 µs .. 7.18 µs | per elem |
| rateless encode and decode, per difference | edwards.127/d=1000,h2c=ti | edwards127 | per-element | 9.08 µs | 9.06 µs .. 9.10 µs | per elem |
| rateless encode and decode, per difference | edwards.127/d=10000,h2c=ti | edwards127 | per-element | 11.3 µs | 11.3 µs .. 11.4 µs | per elem |
| rateless encode and decode, per difference | edwards.127/d=100000,h2c=ti | edwards127 | per-element | 18.2 µs | 18.2 µs .. 18.3 µs | per elem |
| rateless encode and decode, per difference | edwards.127/d=20,h2c=ti | edwards127 | per-element | 5.71 µs | 5.69 µs .. 5.72 µs | per elem |
| rateless encode and decode, per difference | edwards.127/d=40,h2c=ti | edwards127 | per-element | 6.22 µs | 6.16 µs .. 6.28 µs | per elem |
| rateless encode and decode, per difference | edwards.127/d=50000,h2c=ti | edwards127 | per-element | 14.9 µs | 14.8 µs .. 15.0 µs | per elem |
| rateless encode and decode, per difference | weier.127/d=10,h2c=ti | weier127 | per-element | 4.03 µs | 4.02 µs .. 4.03 µs | per elem |
| rateless encode and decode, per difference | weier.127/d=1000,h2c=ti | weier127 | per-element | 8.46 µs | 8.41 µs .. 8.51 µs | per elem |
| rateless encode and decode, per difference | weier.127/d=100000,h2c=ti | weier127 | per-element | 18.1 µs | 18.1 µs .. 18.1 µs | per elem |
| rateless encode and decode, per difference | weier-jacobian.127/d=10,h2c=ti | weier127-jacobian | per-element | 3.77 µs | 3.76 µs .. 3.78 µs | per elem |
| rateless encode and decode, per difference | weier-jacobian.127/d=100,h2c=ti | weier127-jacobian | per-element | 5.82 µs | 5.80 µs .. 5.84 µs | per elem |
| rateless encode and decode, per difference | weier-jacobian.127/d=1000,h2c=ti | weier127-jacobian | per-element | 7.81 µs | 7.78 µs .. 7.85 µs | per elem |
| rateless encode and decode, per difference | weier-jacobian.127/d=10000,h2c=ti | weier127-jacobian | per-element | 10.3 µs | 10.2 µs .. 10.3 µs | per elem |
| rateless encode and decode, per difference | weier-jacobian.127/d=100000,h2c=ti | weier127-jacobian | per-element | 16.9 µs | 16.9 µs .. 16.9 µs | per elem |
| rateless encode and decode, per difference | weier-jacobian.127/d=20,h2c=ti | weier127-jacobian | per-element | 4.41 µs | 4.39 µs .. 4.42 µs | per elem |
| rateless encode and decode, per difference | weier-jacobian.127/d=40,h2c=ti | weier127-jacobian | per-element | 4.99 µs | 4.98 µs .. 5.01 µs | per elem |
| rateless encode and decode, per difference | weier-jacobian.127/d=50000,h2c=ti | weier127-jacobian | per-element | 13.4 µs | 13.3 µs .. 13.4 µs | per elem |
| mapping, per index | chacha8/next | mapping | per-element | 10.3 ns | 10.3 ns .. 10.3 ns | per elem |
| mapping, per index | mcg64/next | mapping | per-element | 5.67 ns | 5.65 ns .. 5.69 ns | per elem |
| mapping, per index | sha256-ctr/next | mapping | per-element | 8.52 ns | 8.50 ns .. 8.55 ns | per elem |
| mapping, per index | xoshiro256pp/next | mapping | per-element | 5.72 ns | 5.70 ns .. 5.73 ns | per elem |
| mapping, per item | chacha8/item,m=12150 | mapping | per-element | 279 ns | 279 ns .. 279 ns | per elem |
| mapping, per item | chacha8/item,m=1350 | mapping | per-element | 245 ns | 244 ns .. 245 ns | per elem |
| mapping, per item | chacha8/item,m=150 | mapping | per-element | 210 ns | 210 ns .. 210 ns | per elem |
| mapping, per item | chacha8/item,m=20 | mapping | per-element | 177 ns | 177 ns .. 178 ns | per elem |
| mapping, per item | chacha8/item,m=5 | mapping | per-element | 156 ns | 155 ns .. 156 ns | per elem |
| mapping, per item | mcg64/item,m=12150 | mapping | per-element | 42.4 ns | 42.3 ns .. 42.5 ns | per elem |
| mapping, per item | mcg64/item,m=1350 | mapping | per-element | 24.1 ns | 24.0 ns .. 24.2 ns | per elem |
| mapping, per item | mcg64/item,m=150 | mapping | per-element | 13.3 ns | 13.2 ns .. 13.4 ns | per elem |
| mapping, per item | mcg64/item,m=20 | mapping | per-element | 6.50 ns | 6.48 ns .. 6.52 ns | per elem |
| mapping, per item | mcg64/item,m=5 | mapping | per-element | 3.38 ns | 3.34 ns .. 3.43 ns | per elem |
| mapping, per item | sha256-ctr/item,m=12150 | mapping | per-element | 197 ns | 196 ns .. 197 ns | per elem |
| mapping, per item | sha256-ctr/item,m=1350 | mapping | per-element | 159 ns | 159 ns .. 160 ns | per elem |
| mapping, per item | sha256-ctr/item,m=150 | mapping | per-element | 119 ns | 118 ns .. 119 ns | per elem |
| mapping, per item | sha256-ctr/item,m=20 | mapping | per-element | 67.6 ns | 67.2 ns .. 68.0 ns | per elem |
| mapping, per item | sha256-ctr/item,m=5 | mapping | per-element | 35.1 ns | 35.0 ns .. 35.2 ns | per elem |
| mapping, per item | xoshiro256pp/item,m=12150 | mapping | per-element | 57.4 ns | 57.2 ns .. 57.7 ns | per elem |
| mapping, per item | xoshiro256pp/item,m=1350 | mapping | per-element | 36.4 ns | 36.3 ns .. 36.5 ns | per elem |
| mapping, per item | xoshiro256pp/item,m=150 | mapping | per-element | 21.8 ns | 21.7 ns .. 21.8 ns | per elem |
| mapping, per item | xoshiro256pp/item,m=20 | mapping | per-element | 11.1 ns | 11.1 ns .. 11.1 ns | per elem |
| mapping, per item | xoshiro256pp/item,m=5 | mapping | per-element | 5.32 ns | 5.31 ns .. 5.33 ns | per elem |
| map digest of an ID | projection-fp127/digest of id | mapping | per-element | 9.40 ns | 9.37 ns .. 9.43 ns | per elem |
| map digest of an ID | projection-fp130/digest of id | mapping | per-element | 17.3 ns | 17.3 ns .. 17.3 ns | per elem |
| map digest of an ID | projection-gf2_127/digest of id | mapping | per-element | 60.7 ns | 60.6 ns .. 60.8 ns | per elem |
| map digest of an ID | salted-sha256/digest of id | mapping | per-element | 32.9 ns | 32.7 ns .. 33.1 ns | per elem |
| per-salt keys | projection-fp127/keys | mapping | per-element | 261 ns | 260 ns .. 262 ns | per elem |
| per-salt keys | projection-fp130/keys | mapping | per-element | 311 ns | 310 ns .. 312 ns | per elem |
| per-salt keys | projection-gf2_127/keys | mapping | per-element | 363 ns | 362 ns .. 364 ns | per elem |
| per-salt keys | salted-sha256/keys | mapping | per-element | 71.0 ns | 70.8 ns .. 71.2 ns | per elem |
| item ID | sha256/id | xor | per-element | 32.5 ns | 32.4 ns .. 32.6 ns | per elem |
| map digest | salted-sha256/digest | mapping | per-element | 32.7 ns | 32.5 ns .. 32.8 ns | per elem |
digest
Figure
7 benchmarks
| operation | benchmark | family | mode | time | 95% CI | unit |
|---|---|---|---|---|---|---|
| digest | xor-sha256 | xor | per-element | 27.2 ns | 27.1 ns .. 27.3 ns | per elem |
| digest | gf2_109/batch | gf2_109 | batch | 758 ns | 755 ns .. 761 ns | per elem |
| digest | gf2_122/batch | gf2_122 | batch | 555 ns | 552 ns .. 557 ns | per elem |
| digest | gf2_122-gls/batch | gf2_122-gls | batch | 586 ns | 575 ns .. 595 ns | per elem |
| digest | gf2_127/batch | gf2_127 | batch | 283 ns | 281 ns .. 284 ns | per elem |
| digest | edwards127/batch | edwards127 | batch | 1.09 µs | 1.09 µs .. 1.09 µs | per elem |
| digest | weier127/batch | weier127 | batch | 1.07 µs | 1.07 µs .. 1.07 µs | per elem |
Lower bound, every family
One hash plus an addition to each of the cells an item maps to in a sketch of cells (: ; : ; : ; : ; : ), from each family’s fastest hash and addition in any representation, without conversions; the only estimate for families without group-trait benchmarks.
| family | hashing | hash | hash time | add | add time | m=5 | m=20 | m=150 | m=1350 | m=12150 |
|---|---|---|---|---|---|---|---|---|---|---|
| gf2_109 | one at a time | gf2_109/pornin map x1 | 3.39 µs | binary.109/mode=throughput | 403 ns | 4.56 µs | 5.52 µs | 7.09 µs | 8.86 µs | 10.6 µs |
| gf2_109 | batched | binary.109/mode=batch,n=1024 | 518 ns | binary.109/mode=throughput | 403 ns | 1.69 µs | 2.65 µs | 4.22 µs | 5.99 µs | 7.75 µs |
| gf2_109-lambda | one at a time | gf2_109-lambda/pornin map x1 to (x, λ) | 3.28 µs | binary-lambda.109/mode=throughput | 331 ns | 4.24 µs | 5.03 µs | 6.32 µs | 7.77 µs | 9.23 µs |
| gf2_109-lambda | batched | binary-lambda.109/mode=batch,n=1024 | 517 ns | binary-lambda.109/mode=throughput | 331 ns | 1.48 µs | 2.27 µs | 3.56 µs | 5.01 µs | 6.47 µs |
| gf2_109-u | one at a time | gf2_109-u/pornin map x1 to (u, v) | 3.34 µs | binary-u.109/mode=throughput | 289 ns | 4.18 µs | 4.87 µs | 6.00 µs | 7.27 µs | 8.54 µs |
| gf2_109-u | batched | binary-u.109/mode=batch,n=1024 | 592 ns | binary-u.109/mode=throughput | 289 ns | 1.43 µs | 2.12 µs | 3.25 µs | 4.52 µs | 5.79 µs |
| gf2_109-w | one at a time | gf2_109-w/pornin map x1 to (x, λ) | 3.27 µs | binary-w.109/mode=throughput | 332 ns | 4.24 µs | 5.03 µs | 6.33 µs | 7.78 µs | 9.24 µs |
| gf2_109-w | batched | binary-w.109/mode=batch,n=1024 | 516 ns | binary-w.109/mode=throughput | 332 ns | 1.48 µs | 2.27 µs | 3.57 µs | 5.02 µs | 6.48 µs |
| gf2_122 | one at a time | gf2_122/pornin map x1 | 897 ns | binary.122/mode=throughput | 263 ns | 1.66 µs | 2.29 µs | 3.31 µs | 4.47 µs | 5.62 µs |
| gf2_122 | batched | binary.122/mode=batch,n=1024 | 350 ns | binary.122/mode=throughput | 263 ns | 1.11 µs | 1.74 µs | 2.77 µs | 3.92 µs | 5.07 µs |
| gf2_122-gls | one at a time | gf2_122-gls/pornin map x1 | 865 ns | binary.122-gls/mode=latency | 240 ns | 1.56 µs | 2.14 µs | 3.07 µs | 4.12 µs | 5.18 µs |
| gf2_122-gls | batched | binary.122-gls/mode=batch,n=1024 | 309 ns | binary.122-gls/mode=latency | 240 ns | 1.01 µs | 1.58 µs | 2.52 µs | 3.57 µs | 4.62 µs |
| gf2_122-gls-lambda | one at a time | gf2_122-gls-lambda/pornin map x1 to (x, λ) | 788 ns | binary-lambda.122-gls/mode=throughput | 216 ns | 1.42 µs | 1.93 µs | 2.78 µs | 3.72 µs | 4.67 µs |
| gf2_122-gls-lambda | batched | binary-lambda.122-gls/mode=batch,n=1024 | 315 ns | binary-lambda.122-gls/mode=throughput | 216 ns | 942 ns | 1.46 µs | 2.30 µs | 3.25 µs | 4.20 µs |
| gf2_122-gls-u | one at a time | gf2_122-gls-u/pornin map x1 to (u, v) | 843 ns | binary-u.122-gls/mode=throughput | 182 ns | 1.37 µs | 1.81 µs | 2.52 µs | 3.32 µs | 4.12 µs |
| gf2_122-gls-u | batched | binary-u.122-gls/mode=batch,n=1024 | 359 ns | binary-u.122-gls/mode=throughput | 182 ns | 888 ns | 1.32 µs | 2.04 µs | 2.83 µs | 3.64 µs |
| gf2_122-gls-w | one at a time | gf2_122-gls-w/pornin map x1 to (x, λ) | 791 ns | binary-w.122-gls/mode=throughput | 217 ns | 1.42 µs | 1.94 µs | 2.78 µs | 3.73 µs | 4.68 µs |
| gf2_122-gls-w | batched | binary-w.122-gls/mode=batch,n=1024 | 311 ns | binary-w.122-gls/mode=throughput | 217 ns | 939 ns | 1.46 µs | 2.30 µs | 3.25 µs | 4.20 µs |
| gf2_122-lambda | one at a time | gf2_122-lambda/pornin map x1 to (x, λ) | 801 ns | binary-lambda.122/mode=throughput | 217 ns | 1.43 µs | 1.95 µs | 2.80 µs | 3.75 µs | 4.70 µs |
| gf2_122-lambda | batched | binary-lambda.122/mode=batch,n=1024 | 350 ns | binary-lambda.122/mode=throughput | 217 ns | 979 ns | 1.50 µs | 2.35 µs | 3.30 µs | 4.25 µs |
| gf2_122-u | one at a time | gf2_122-u/pornin map x1 to (u, v) | 857 ns | binary-u.122/mode=throughput | 183 ns | 1.39 µs | 1.83 µs | 2.54 µs | 3.34 µs | 4.15 µs |
| gf2_122-u | batched | binary-u.122/mode=batch,n=1024 | 391 ns | binary-u.122/mode=throughput | 183 ns | 922 ns | 1.36 µs | 2.07 µs | 2.88 µs | 3.68 µs |
| gf2_122-w | one at a time | gf2_122-w/pornin map x1 to (x, λ) | 799 ns | binary-w.122/mode=throughput | 211 ns | 1.41 µs | 1.91 µs | 2.74 µs | 3.66 µs | 4.58 µs |
| gf2_122-w | batched | binary-w.122/mode=batch,n=1024 | 328 ns | binary-w.122/mode=throughput | 211 ns | 938 ns | 1.44 µs | 2.26 µs | 3.19 µs | 4.11 µs |
| gf2_127 | one at a time | gf2_127/pornin map x1 | 619 ns | binary.127/mode=throughput | 155 ns | 1.07 µs | 1.44 µs | 2.05 µs | 2.73 µs | 3.41 µs |
| gf2_127 | batched | binary.127/mode=batch,n=1024 | 196 ns | binary.127/mode=throughput | 155 ns | 646 ns | 1.02 µs | 1.62 µs | 2.30 µs | 2.98 µs |
| gf2_127-lambda | one at a time | gf2_127-lambda/pornin map x1 to (x, λ) | 567 ns | binary-lambda.127/mode=throughput | 132 ns | 949 ns | 1.26 µs | 1.78 µs | 2.35 µs | 2.93 µs |
| gf2_127-lambda | batched | gf2_127-lambda/pornin map x1 to (x, λ), batched | 184 ns | binary-lambda.127/mode=throughput | 132 ns | 566 ns | 880 ns | 1.39 µs | 1.97 µs | 2.55 µs |
| gf2_127-u | one at a time | gf2_127-u/pornin map x1 to (u, v) | 598 ns | binary-u.127/mode=throughput | 116 ns | 935 ns | 1.21 µs | 1.67 µs | 2.18 µs | 2.69 µs |
| gf2_127-u | batched | gf2_127-u/pornin map x1 to (u, v), batched | 213 ns | binary-u.127/mode=throughput | 116 ns | 550 ns | 828 ns | 1.28 µs | 1.79 µs | 2.30 µs |
| gf2_127-w | one at a time | gf2_127-w/pornin map x1 to (x, λ) | 569 ns | binary-w.127/mode=throughput | 131 ns | 949 ns | 1.26 µs | 1.77 µs | 2.35 µs | 2.92 µs |
| gf2_127-w | batched | gf2_127-w/pornin map x1 to (x, λ), batched | 184 ns | binary-w.127/mode=throughput | 131 ns | 565 ns | 878 ns | 1.39 µs | 1.96 µs | 2.54 µs |
| edwards127 | one at a time | edwards.127/mode=indep | 1.07 µs | edwards.127/mode=throughput | 19.9 ns | 1.12 µs | 1.17 µs | 1.25 µs | 1.34 µs | 1.42 µs |
| edwards127 | batched | edwards.127/mode=batch,n=1024 | 1.06 µs | edwards.127/mode=throughput | 19.9 ns | 1.12 µs | 1.17 µs | 1.25 µs | 1.33 µs | 1.42 µs |
| weier127 | one at a time | weier.127/mode=indep | 1.03 µs | weier.127/mode=throughput | 44.7 ns | 1.16 µs | 1.27 µs | 1.44 µs | 1.64 µs | 1.83 µs |
| weier127 | batched | weier.127/mode=batch,n=1024 | 1.03 µs | weier.127/mode=throughput | 44.7 ns | 1.16 µs | 1.27 µs | 1.44 µs | 1.64 µs | 1.83 µs |
| weier127-jacobian | one at a time | weier-jacobian.127/mode=indep | 1.03 µs | weier-jacobian.127/mode=throughput | 36.6 ns | 1.14 µs | 1.22 µs | 1.37 µs | 1.53 µs | 1.69 µs |
| weier127-jacobian | batched | weier-jacobian.127/mode=batch,n=1024 | 1.00 µs | weier-jacobian.127/mode=throughput | 36.6 ns | 1.11 µs | 1.20 µs | 1.34 µs | 1.50 µs | 1.66 µs |
Apple M4 · rustc 1.98.1 · RUSTFLAGS=-C target-cpu=generic · ef9e82d39fbf · full profile · 2026-10-08