Benchmark run Intel(R) Xeon(R) W-1390P @ 3.50GHz · generic · full · ef9e82d3
Run Intel(R) Xeon(R) W-1390P @ 3.50GHz · generic · full · ef9e82d3 started 2026-10-09T15:12:32Z on Intel(R) Xeon(R) W-1390P @ 3.50GHz (?, x86_64) and timed commit ef9e82d39fbf06c605e1740360370f0003dc4ca4, built by rustc 1.98.1 (48a229cea 2026-09-01) with RUSTFLAGS -C target-cpu=x86-64, in the full profile.
690 benchmarks from run Intel(R) Xeon(R) W-1390P @ 3.50GHz · 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 95 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 | 307 ns (11.43× the best) | 214 ns (13.42× the best) | 167 ns (1.02× the best) | 402 ns (1.25× the best) | 4.57 µs (2.76× the best) | 418 ms (10.83× the best) | Rust (AGM), PARI | gf2_127-lambda |
| gf2_127-lambdaincompleteλ-projective (X:L:Z) accumulators; hashed straight to : no prepare | 62.8 | 249 ns (9.24× the best) | 172 ns (10.81× the best) | 163 ns (best) | 322 ns (best) | 3.69 µs (2.23× the best) | 338 ms (8.76× 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 | 249 ns (9.24× the best) | 148 ns (9.31× the best) | 170 ns (1.04× the best) | 360 ns (1.12× the best) | 3.73 µs (2.25× the best) | 338 ms (8.76× 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 | 220 ns (8.17× the best) | 150 ns (9.40× the best) | 227 ns (1.39× the best) | 426 ns (1.33× the best) | 3.41 µs (2.06× the best) | 299 ms (7.75× 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 | 390 ns (14.49× the best) | 286 ns (17.91× the best) | 256 ns (1.57× the best) | 572 ns (1.78× the best) | 5.86 µs (3.54× the best) | 530 ms (13.73× 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 | 307 ns (11.42× the best) | 234 ns (14.66× the best) | 256 ns (1.57× the best) | 485 ns (1.51× the best) | 4.65 µs (2.81× the best) | 418 ms (10.83× the best) | Rust (AGM), PARI | gf2_127-lambda, gf2_127-u, gf2_127-w |
| gf2_122-wincompleteλ-projective, w codec | 60.3 | 307 ns (11.42× the best) | 200 ns (12.53× the best) | 216 ns (1.32× the best) | 460 ns (1.43× the best) | 4.62 µs (2.79× the best) | 418 ms (10.82× the best) | Rust (AGM), PARI | gf2_127-lambda, gf2_127-w |
| gf2_122-uunscaled (X:S:Z), w codec | 60.3 | 277 ns (10.31× the best) | 202 ns (12.68× the best) | 309 ns (1.90× the best) | 556 ns (1.73× the best) | 4.32 µs (2.61× the best) | 378 ms (9.78× the best) | Rust (AGM), PARI | 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 | 370 ns (13.76× the best) | 270 ns (16.95× the best) | 229 ns (1.41× the best) | 517 ns (1.61× the best) | 5.54 µs (3.34× the best) | 503 ms (13.04× 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 | 310 ns (11.54× the best) | 242 ns (15.17× the best) | 228 ns (1.40× the best) | 468 ns (1.45× the best) | 4.68 µs (2.82× the best) | 422 ms (10.93× the best) | Rust (AGM), PARI | gf2_122-w, gf2_127, gf2_127-lambda, gf2_127-w |
| gf2_122-gls-wincompleteλ-projective, w codec | 59.8 | 310 ns (11.51× the best) | 198 ns (12.42× the best) | 203 ns (1.25× the best) | 445 ns (1.38× the best) | 4.65 µs (2.81× the best) | 421 ms (10.91× the best) | Rust (AGM), PARI | gf2_127-lambda, gf2_127-w |
| gf2_122-gls-uunscaled (X:S:Z), w codec | 59.8 | 276 ns (10.25× the best) | 200 ns (12.55× the best) | 272 ns (1.67× the best) | 514 ns (1.60× the best) | 4.26 µs (2.57× the best) | 375 ms (9.72× the best) | Rust (AGM), PARI | gf2_127-lambda, gf2_127-u, gf2_127-w |
| GF(2^109), 14 bytes | |||||||||
| gf2_109(X:S:Z:T) extended | 53.8 | 676 ns (25.13× the best) | 500 ns (31.33× the best) | 421 ns (2.58× the best) | 974 ns (3.03× the best) | 10.1 µs (6.12× the best) | 919 ms (23.81× 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 | 545 ns (20.26× the best) | 371 ns (23.29× the best) | 424 ns (2.60× the best) | 834 ns (2.59× the best) | 8.23 µs (4.97× the best) | 741 ms (19.20× 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-wincompleteλ-projective, w codec | 53.8 | 541 ns (20.14× the best) | 343 ns (21.53× the best) | 400 ns (2.46× the best) | 807 ns (2.51× the best) | 8.15 µs (4.92× the best) | 737 ms (19.09× 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 | 53.8 | 488 ns (18.15× the best) | 343 ns (21.53× the best) | 519 ns (3.19× the best) | 928 ns (2.88× the best) | 7.55 µs (4.56× the best) | 664 ms (17.21× 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 | 26.9 ns (best) | 30.1 ns (1.89× the best) | 576 ns (3.54× the best) | 1.29 µs (4.01× the best) | 1.66 µs (best) | 38.6 ms (best) | PARI | none |
| weier127short Weierstrass, projective += affine | 63.3 | 58.1 ns (2.16× the best) | 15.9 ns (best) | 573 ns (3.52× the best) | 1.23 µs (3.81× the best) | 2.01 µs (1.22× the best) | 80.8 ms (2.09× the best) | PARI | none |
| weier127-jacobianincompleteshort Weierstrass, Jacobian += affine | 63.3 | 47.3 ns (1.76× the best) | 22.5 ns (1.41× the best) | 574 ns (3.52× the best) | 1.22 µs (3.80× the best) | 1.86 µs (1.13× the best) | 66.3 ms (1.72× 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
| Intel(R) Xeon(R) W-1390P @ 3.50GHz · generic · full · ef9e82d3 | |
|---|---|
| CPU | Intel(R) Xeon(R) W-1390P @ 3.50GHz, 16 cores, 126 GiB |
| OS | ? (Linux 6.18.48, x86_64) |
| rustc | rustc 1.98.1 (48a229cea 2026-09-01) |
| RUSTFLAGS | -C target-cpu=x86-64 |
| field backend features | none: portable multiplies |
| 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-09T15:12:32Z .. 2026-10-09T17:16:48Z |
Load averages by phase while the run timed (Measurement methodology).
| phase | seconds | 1-minute average, mean | runnable, mean | runnable, most |
|---|---|---|---|---|
| idle before | 25 | 1.17 | 0.00 | 0.0 |
| compare | 545 | 1.44 | 1.22 | 3.0 |
| compare109 | 270 | 1.27 | 1.52 | 5.0 |
| compare122 | 440 | 1.30 | 1.26 | 3.0 |
| group | 2550 | 1.31 | 1.26 | 18.0 |
| group wide | 630 | 1.52 | 1.42 | 21.0 |
| riblt mapping | 340 | 1.37 | 1.13 | 2.0 |
| riblt plan | 75 | 1.06 | 1.13 | 2.0 |
| riblt | 2540 | 1.14 | 1.16 | 18.0 |
| idle after | 30 | 0.92 | 0.17 | 1.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 |
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 | spot | ||
| binary-u.109 | ti | spot | ||
| binary-u.122 | ti | spot | ||
| binary-u.122-gls | ti | spot | ||
| binary-u.127 | pornin-addend | spot | ||
| binary-w.109 | ti | spot | ||
| binary-w.122 | ti | spot | ||
| binary-w.122-gls | ti | spot | ||
| binary-w.127 | pornin-addend | spot | ||
| binary.109 | ti | spot | ||
| binary.122 | ti | spot | ||
| binary.122-gls | ti | spot | ||
| binary.127 | ti | spot | ||
| edwards.127 | ti | full | fp127 | 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): 79.7 ns at , 110 ns at , 156 ns at , 197 ns at , 241 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 | 347 ns (1.08× the best) | 55.2 ns (63.32× the best) | 307 ns (11.43× the best) | 1.37 µs (1.22× the best) | 2.14 µs (1.38× the best) | 3.38 µs (2.00× the best) | 4.77 µs (2.57× the best) | 6.16 µs (3.06× the best) |
| gf2_127compare suitePornin x1: hash to addend; output already an addend | 454 ns (1.41× the best) | in the hash | 307 ns (11.43× the best) | 1.42 µs (1.27× the best) | 2.19 µs (1.42× the best) | 3.43 µs (2.03× the best) | 4.82 µs (2.60× the best) | 6.21 µs (3.08× the best) |
| gf2_127-lambdaincompleteλ-projective (X:L:Z) accumulators | 347 ns (1.08× the best) | 120 ns (137.18× the best) | 249 ns (9.24× the best) | 1.27 µs (1.13× the best) | 1.89 µs (1.23× the best) | 2.91 µs (1.72× the best) | 4.04 µs (2.18× the best) | 5.17 µs (2.57× the best) |
| gf2_127-lambdaincompletecompare suitehashed straight to : no prepare | 322 ns (best) | in the hash | 249 ns (9.24× the best) | 1.12 µs (best) | 1.75 µs (1.13× the best) | 2.76 µs (1.63× the best) | 3.89 µs (2.10× the best) | 5.03 µs (2.49× the best) |
| gf2_127-lambdaincompletecompare suitePornin x1: hash to addend; output already an addend | 365 ns (1.13× the best) | in the hash | 249 ns (9.24× the best) | 1.17 µs (1.04× the best) | 1.79 µs (1.16× the best) | 2.81 µs (1.66× the best) | 3.94 µs (2.12× the best) | 5.07 µs (2.52× the best) |
| gf2_127-wincompleteλ-projective, w codec: hashes and decodes to λ-affine | 391 ns (1.21× the best) | 1.28 ns (1.47× the best) | 249 ns (9.24× the best) | 1.19 µs (1.06× the best) | 1.82 µs (1.18× the best) | 2.83 µs (1.67× the best) | 3.96 µs (2.14× the best) | 5.10 µs (2.53× the best) |
| gf2_127-wincompletecompare suitePornin x1: hash to addend; output already an addend | 360 ns (1.12× the best) | in the hash | 249 ns (9.24× the best) | 1.16 µs (1.03× the best) | 1.79 µs (1.16× the best) | 2.80 µs (1.65× the best) | 3.93 µs (2.12× the best) | 5.07 µs (2.51× the best) |
| gf2_127-uunscaled (X:S:Z), w codec, direct addend hashes | 452 ns (1.40× the best) | 1.32 ns (1.52× the best) | 220 ns (8.17× the best) | 1.17 µs (1.04× the best) | 1.73 µs (1.12× the best) | 2.63 µs (1.55× the best) | 3.63 µs (1.96× the best) | 4.64 µs (2.30× the best) |
| gf2_127-ucompare suitePornin x1: hash to addend; output already an addend | 426 ns (1.33× the best) | in the hash | 220 ns (8.17× the best) | 1.14 µs (1.02× the best) | 1.70 µs (1.10× the best) | 2.60 µs (1.54× the best) | 3.61 µs (1.95× the best) | 4.61 µs (2.29× the best) |
| GF(2^122) = GF(2^61)[u], dense constant, 16 bytes | ||||||||
| gf2_122(X:S:Z:T) extended | 488 ns (1.52× the best) | 84.3 ns (96.68× the best) | 390 ns (14.49× the best) | 1.78 µs (1.59× the best) | 2.74 µs (1.78× the best) | 4.31 µs (2.54× the best) | 6.06 µs (3.27× the best) | 7.81 µs (3.88× the best) |
| gf2_122compare suitePornin x1: hash to addend; output already an addend | 623 ns (1.94× the best) | in the hash | 390 ns (14.49× the best) | 1.83 µs (1.63× the best) | 2.79 µs (1.81× the best) | 4.36 µs (2.57× the best) | 6.11 µs (3.29× the best) | 7.86 µs (3.90× the best) |
| gf2_122-lambdaincompleteλ-projective | 487 ns (1.51× the best) | 152 ns (173.86× the best) | 307 ns (11.42× the best) | 1.61 µs (1.43× the best) | 2.37 µs (1.54× the best) | 3.62 µs (2.14× the best) | 5.00 µs (2.70× the best) | 6.40 µs (3.17× the best) |
| gf2_122-lambdaincompletecompare suitehashed straight to : no prepare | 485 ns (1.51× the best) | in the hash | 307 ns (11.42× the best) | 1.45 µs (1.30× the best) | 2.22 µs (1.44× the best) | 3.46 µs (2.04× the best) | 4.85 µs (2.62× the best) | 6.24 µs (3.10× the best) |
| gf2_122-lambdaincompletecompare suitePornin x1: hash to addend; output already an addend | 498 ns (1.55× the best) | in the hash | 307 ns (11.42× the best) | 1.47 µs (1.31× the best) | 2.23 µs (1.45× the best) | 3.48 µs (2.05× the best) | 4.86 µs (2.62× the best) | 6.26 µs (3.10× the best) |
| gf2_122-wincompleteλ-projective, w codec | 458 ns (1.42× the best) | 1.25 ns (1.43× the best) | 307 ns (11.42× the best) | 1.43 µs (1.27× the best) | 2.19 µs (1.42× the best) | 3.44 µs (2.03× the best) | 4.82 µs (2.60× the best) | 6.21 µs (3.08× the best) |
| gf2_122-wincompletecompare suitePornin x1: hash to addend; output already an addend | 501 ns (1.56× the best) | in the hash | 307 ns (11.42× the best) | 1.47 µs (1.31× the best) | 2.24 µs (1.45× the best) | 3.48 µs (2.05× the best) | 4.86 µs (2.62× the best) | 6.26 µs (3.10× the best) |
| gf2_122-uunscaled (X:S:Z), w codec | 555 ns (1.72× the best) | 1.31 ns (1.51× the best) | 277 ns (10.31× the best) | 1.44 µs (1.28× the best) | 2.13 µs (1.38× the best) | 3.26 µs (1.92× the best) | 4.52 µs (2.44× the best) | 5.78 µs (2.87× the best) |
| gf2_122-ucompare suitePornin x1: hash to addend; output already an addend | 585 ns (1.82× the best) | in the hash | 277 ns (10.31× the best) | 1.47 µs (1.31× the best) | 2.16 µs (1.40× the best) | 3.29 µs (1.94× the best) | 4.55 µs (2.45× the best) | 5.81 µs (2.88× the best) |
| GF(2^122), constant in GF(2^61) (GLS-shaped), 16 bytes | ||||||||
| gf2_122-gls(X:S:Z:T) extended | 456 ns (1.42× the best) | 61.2 ns (70.16× the best) | 370 ns (13.76× the best) | 1.67 µs (1.49× the best) | 2.59 µs (1.67× the best) | 4.07 µs (2.41× the best) | 5.74 µs (3.09× the best) | 7.40 µs (3.67× the best) |
| gf2_122-glscompare suitePornin x1: hash to addend; output already an addend | 599 ns (1.86× the best) | in the hash | 370 ns (13.76× the best) | 1.75 µs (1.56× the best) | 2.67 µs (1.73× the best) | 4.16 µs (2.45× the best) | 5.82 µs (3.14× the best) | 7.49 µs (3.71× the best) |
| gf2_122-gls-lambdaincompleteλ-projective | 455 ns (1.42× the best) | 153 ns (175.74× the best) | 310 ns (11.54× the best) | 1.59 µs (1.41× the best) | 2.36 µs (1.53× the best) | 3.62 µs (2.13× the best) | 5.02 µs (2.71× the best) | 6.42 µs (3.19× the best) |
| gf2_122-gls-lambdaincompletecompare suitehashed straight to : no prepare | 468 ns (1.45× the best) | in the hash | 310 ns (11.54× the best) | 1.45 µs (1.29× the best) | 2.22 µs (1.44× the best) | 3.48 µs (2.05× the best) | 4.87 µs (2.63× the best) | 6.28 µs (3.12× the best) |
| gf2_122-gls-lambdaincompletecompare suitePornin x1: hash to addend; output already an addend | 505 ns (1.57× the best) | in the hash | 310 ns (11.54× the best) | 1.48 µs (1.32× the best) | 2.26 µs (1.46× the best) | 3.51 µs (2.07× the best) | 4.91 µs (2.65× the best) | 6.32 µs (3.13× the best) |
| gf2_122-gls-wincompleteλ-projective, w codec | 444 ns (1.38× the best) | 1.27 ns (1.46× the best) | 310 ns (11.51× the best) | 1.42 µs (1.27× the best) | 2.19 µs (1.42× the best) | 3.45 µs (2.03× the best) | 4.84 µs (2.61× the best) | 6.25 µs (3.10× the best) |
| gf2_122-gls-wincompletecompare suitePornin x1: hash to addend; output already an addend | 509 ns (1.58× the best) | in the hash | 310 ns (11.51× the best) | 1.49 µs (1.32× the best) | 2.26 µs (1.46× the best) | 3.51 µs (2.07× the best) | 4.91 µs (2.65× the best) | 6.31 µs (3.13× the best) |
| gf2_122-gls-uunscaled (X:S:Z), w codec | 513 ns (1.59× the best) | 1.29 ns (1.48× the best) | 276 ns (10.25× the best) | 1.39 µs (1.24× the best) | 2.08 µs (1.35× the best) | 3.20 µs (1.89× the best) | 4.45 µs (2.40× the best) | 5.71 µs (2.83× the best) |
| gf2_122-gls-ucompare suitePornin x1: hash to addend; output already an addend | 580 ns (1.80× the best) | in the hash | 276 ns (10.25× the best) | 1.46 µs (1.30× the best) | 2.15 µs (1.39× the best) | 3.27 µs (1.93× the best) | 4.52 µs (2.44× the best) | 5.77 µs (2.86× the best) |
| GF(2^109), 14 bytes | ||||||||
| gf2_109(X:S:Z:T) extended | 814 ns (2.53× the best) | 160 ns (183.04× the best) | 676 ns (25.13× the best) | 3.01 µs (2.68× the best) | 4.66 µs (3.02× the best) | 7.34 µs (4.33× the best) | 10.3 µs (5.58× the best) | 13.4 µs (6.63× the best) |
| gf2_109compare suitePornin x1: hash to addend; output already an addend | 1.05 µs (3.27× the best) | in the hash | 676 ns (25.13× the best) | 3.09 µs (2.75× the best) | 4.74 µs (3.07× the best) | 7.42 µs (4.38× the best) | 10.4 µs (5.62× the best) | 13.4 µs (6.66× the best) |
| gf2_109-lambdaincompleteλ-projective | 814 ns (2.53× the best) | 245 ns (281.47× the best) | 545 ns (20.26× the best) | 2.72 µs (2.42× the best) | 4.05 µs (2.62× the best) | 6.22 µs (3.67× the best) | 8.65 µs (4.67× the best) | 11.1 µs (5.50× the best) |
| gf2_109-lambdaincompletecompare suitehashed straight to : no prepare | 834 ns (2.59× the best) | in the hash | 545 ns (20.26× the best) | 2.49 µs (2.22× the best) | 3.83 µs (2.48× the best) | 6.00 µs (3.54× the best) | 8.42 µs (4.54× the best) | 10.9 µs (5.39× the best) |
| gf2_109-lambdaincompletecompare suitePornin x1: hash to addend; output already an addend | 854 ns (2.65× the best) | in the hash | 545 ns (20.26× the best) | 2.51 µs (2.24× the best) | 3.85 µs (2.49× the best) | 6.02 µs (3.55× the best) | 8.44 µs (4.56× the best) | 10.9 µs (5.40× the best) |
| gf2_109-wincompleteλ-projective, w codec | 805 ns (2.50× the best) | 1.24 ns (1.42× the best) | 541 ns (20.14× the best) | 2.46 µs (2.19× the best) | 3.78 µs (2.45× the best) | 5.94 µs (3.51× the best) | 8.35 µs (4.51× the best) | 10.8 µs (5.35× the best) |
| gf2_109-wincompletecompare suitePornin x1: hash to addend; output already an addend | 852 ns (2.65× the best) | in the hash | 541 ns (20.14× the best) | 2.50 µs (2.23× the best) | 3.83 µs (2.48× the best) | 5.99 µs (3.53× the best) | 8.40 µs (4.53× the best) | 10.8 µs (5.37× the best) |
| gf2_109-uunscaled (X:S:Z), w codec | 927 ns (2.88× the best) | 1.26 ns (1.44× the best) | 488 ns (18.15× the best) | 2.42 µs (2.16× the best) | 3.62 µs (2.34× the best) | 5.57 µs (3.29× the best) | 7.75 µs (4.18× the best) | 9.93 µs (4.93× the best) |
| gf2_109-ucompare suitePornin x1: hash to addend; output already an addend | 986 ns (3.06× the best) | in the hash | 488 ns (18.15× the best) | 2.48 µs (2.21× the best) | 3.68 µs (2.38× the best) | 5.63 µs (3.32× the best) | 7.81 µs (4.21× the best) | 9.99 µs (4.96× the best) |
| F_p, p = 2^127 − 1, 16 bytes | ||||||||
| edwards127a = 1 Edwards, extended += cached | 1.25 µs (3.90× the best) | 38.0 ns (43.55× the best) | 26.9 ns (best) | 1.45 µs (1.29× the best) | 1.54 µs (best) | 1.69 µs (best) | 1.85 µs (best) | 2.02 µs (best) |
| weier127short Weierstrass, projective += affine | 1.23 µs (3.81× the best) | 0.87 ns (tied for the best, within noise) | 58.1 ns (2.16× the best) | 1.47 µs (1.31× the best) | 1.64 µs (1.06× the best) | 1.92 µs (1.13× the best) | 2.21 µs (1.19× the best) | 2.51 µs (1.25× the best) |
| weier127-jacobianincompleteshort Weierstrass, Jacobian += affine | 1.22 µs (3.79× the best) | 0.88 ns (tied for the best, within noise, 1.01×) | 47.3 ns (1.76× the best) | 1.44 µs (1.28× the best) | 1.58 µs (1.02× the best) | 1.81 µs (1.07× the best) | 2.06 µs (1.11× the best) | 2.31 µs (1.15× 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 | 1.29 µs (1.46× the best) | 57.5 ns (105.07× the best) | 307 ns (11.43× the best) | 2.32 µs (1.62× the best) | 3.09 µs (1.96× the best) | 4.33 µs (2.40× the best) | 5.72 µs (2.78× the best) | 7.11 µs (3.08× the best) |
| gf2_127compare suitePornin x1: hash to addend; output already an addend | 966 ns (1.09× the best) | in the hash | 307 ns (11.43× the best) | 1.94 µs (1.35× the best) | 2.70 µs (1.71× the best) | 3.95 µs (2.18× the best) | 5.33 µs (2.59× the best) | 6.72 µs (2.91× the best) |
| gf2_127compare suitePornin x2: hash to addend; output already an addend | 2.25 µs (2.53× the best) | in the hash | 307 ns (11.43× the best) | 3.22 µs (2.24× the best) | 3.98 µs (2.52× the best) | 5.23 µs (2.89× the best) | 6.61 µs (3.22× the best) | 8.01 µs (3.47× the best) |
| gf2_127-lambdaincompleteλ-projective (X:L:Z) accumulators | 1.30 µs (1.46× the best) | 618 ns (1128.57× the best) | 249 ns (9.24× the best) | 2.72 µs (1.90× the best) | 3.34 µs (2.12× the best) | 4.36 µs (2.41× the best) | 5.49 µs (2.67× the best) | 6.62 µs (2.87× the best) |
| gf2_127-lambdaincompletecompare suitehashed straight to : no prepare | 1.26 µs (1.41× the best) | in the hash | 249 ns (9.24× the best) | 2.06 µs (1.44× the best) | 2.68 µs (1.70× the best) | 3.70 µs (2.05× the best) | 4.83 µs (2.35× the best) | 5.96 µs (2.58× the best) |
| gf2_127-lambdaincompletecompare suitePornin x1: hash to addend; output already an addend | 889 ns (tied for the best, within noise) | in the hash | 249 ns (9.24× the best) | 1.69 µs (1.18× the best) | 2.31 µs (1.47× the best) | 3.33 µs (1.84× the best) | 4.46 µs (2.17× the best) | 5.59 µs (2.42× the best) |
| gf2_127-wincompleteλ-projective, w codec: hashes and decodes to λ-affine | 1.41 µs (1.59× the best) | 0.55 ns (tied for the best, within noise, 1.01×) | 249 ns (9.24× the best) | 2.21 µs (1.54× the best) | 2.84 µs (1.80× the best) | 3.85 µs (2.13× the best) | 4.98 µs (2.42× the best) | 6.12 µs (2.65× the best) |
| gf2_127-wincompletecompare suitePornin x1: hash to addend; output already an addend | 892 ns (tied for the best, within noise, 1.00×) | in the hash | 249 ns (9.24× the best) | 1.69 µs (1.18× the best) | 2.32 µs (1.47× the best) | 3.33 µs (1.84× the best) | 4.46 µs (2.17× the best) | 5.60 µs (2.43× the best) |
| gf2_127-uunscaled (X:S:Z), w codec, direct addend hashes | 1.51 µs (1.69× the best) | 0.56 ns (1.02× the best) | 220 ns (8.17× the best) | 2.22 µs (1.55× the best) | 2.78 µs (1.76× the best) | 3.68 µs (2.04× the best) | 4.69 µs (2.28× the best) | 5.70 µs (2.47× the best) |
| gf2_127-ucompare suitePornin x1: hash to addend; output already an addend | 939 ns (1.06× the best) | in the hash | 220 ns (8.17× the best) | 1.66 µs (1.15× the best) | 2.21 µs (1.40× the best) | 3.11 µs (1.72× the best) | 4.12 µs (2.00× the best) | 5.13 µs (2.22× the best) |
| GF(2^122) = GF(2^61)[u], dense constant, 16 bytes | ||||||||
| gf2_122(X:S:Z:T) extended | 1.27 µs (1.42× the best) | 85.1 ns (155.45× the best) | 390 ns (14.49× the best) | 2.56 µs (1.79× the best) | 3.52 µs (2.23× the best) | 5.09 µs (2.82× the best) | 6.84 µs (3.32× the best) | 8.59 µs (3.72× the best) |
| gf2_122compare suitePornin x1: hash to addend; output already an addend | 1.08 µs (1.22× the best) | in the hash | 390 ns (14.49× the best) | 2.29 µs (1.60× the best) | 3.25 µs (2.06× the best) | 4.82 µs (2.67× the best) | 6.57 µs (3.19× the best) | 8.32 µs (3.61× the best) |
| gf2_122-lambdaincompleteλ-projective | 1.27 µs (1.43× the best) | 542 ns (989.75× the best) | 307 ns (11.42× the best) | 2.78 µs (1.94× the best) | 3.54 µs (2.25× the best) | 4.79 µs (2.65× the best) | 6.17 µs (3.00× the best) | 7.57 µs (3.28× the best) |
| gf2_122-lambdaincompletecompare suitehashed straight to : no prepare | 1.24 µs (1.40× the best) | in the hash | 307 ns (11.42× the best) | 2.21 µs (1.54× the best) | 2.98 µs (1.89× the best) | 4.22 µs (2.34× the best) | 5.61 µs (2.73× the best) | 7.00 µs (3.03× the best) |
| gf2_122-lambdaincompletecompare suitePornin x1: hash to addend; output already an addend | 925 ns (1.04× the best) | in the hash | 307 ns (11.42× the best) | 1.90 µs (1.32× the best) | 2.66 µs (1.69× the best) | 3.90 µs (2.16× the best) | 5.29 µs (2.57× the best) | 6.68 µs (2.90× the best) |
| gf2_122-wincompleteλ-projective, w codec | 1.24 µs (1.39× the best) | 0.55 ns (tied for the best, within noise) | 307 ns (11.42× the best) | 2.21 µs (1.54× the best) | 2.97 µs (1.89× the best) | 4.22 µs (2.33× the best) | 5.60 µs (2.73× the best) | 6.99 µs (3.03× the best) |
| gf2_122-wincompletecompare suitePornin x1: hash to addend; output already an addend | 929 ns (1.04× the best) | in the hash | 307 ns (11.42× the best) | 1.90 µs (1.32× the best) | 2.66 µs (1.69× the best) | 3.91 µs (2.16× the best) | 5.29 µs (2.57× the best) | 6.68 µs (2.90× the best) |
| gf2_122-uunscaled (X:S:Z), w codec | 1.38 µs (1.55× the best) | 0.57 ns (1.04× the best) | 277 ns (10.31× the best) | 2.27 µs (1.58× the best) | 2.96 µs (1.88× the best) | 4.09 µs (2.26× the best) | 5.34 µs (2.60× the best) | 6.60 µs (2.86× the best) |
| gf2_122-ucompare suitePornin x1: hash to addend; output already an addend | 1.00 µs (1.13× the best) | in the hash | 277 ns (10.31× the best) | 1.89 µs (1.32× the best) | 2.58 µs (1.64× the best) | 3.71 µs (2.05× the best) | 4.97 µs (2.41× the best) | 6.23 µs (2.70× the best) |
| GF(2^122), constant in GF(2^61) (GLS-shaped), 16 bytes | ||||||||
| gf2_122-gls(X:S:Z:T) extended | 1.27 µs (1.43× the best) | 60.9 ns (111.27× the best) | 370 ns (13.76× the best) | 2.48 µs (1.73× the best) | 3.40 µs (2.15× the best) | 4.89 µs (2.70× the best) | 6.55 µs (3.18× the best) | 8.22 µs (3.56× the best) |
| gf2_122-glscompare suitePornin x1: hash to addend; output already an addend | 1.02 µs (1.15× the best) | in the hash | 370 ns (13.76× the best) | 2.17 µs (1.52× the best) | 3.09 µs (1.96× the best) | 4.58 µs (2.53× the best) | 6.24 µs (3.03× the best) | 7.91 µs (3.43× the best) |
| gf2_122-gls-lambdaincompleteλ-projective | 1.26 µs (1.42× the best) | 546 ns (997.93× the best) | 310 ns (11.54× the best) | 2.79 µs (1.95× the best) | 3.56 µs (2.26× the best) | 4.82 µs (2.67× the best) | 6.22 µs (3.02× the best) | 7.62 µs (3.30× the best) |
| gf2_122-gls-lambdaincompletecompare suitehashed straight to : no prepare | 1.29 µs (1.45× the best) | in the hash | 310 ns (11.54× the best) | 2.27 µs (1.59× the best) | 3.05 µs (1.93× the best) | 4.30 µs (2.38× the best) | 5.70 µs (2.77× the best) | 7.11 µs (3.08× the best) |
| gf2_122-gls-lambdaincompletecompare suitePornin x1: hash to addend; output already an addend | 941 ns (1.06× the best) | in the hash | 310 ns (11.54× the best) | 1.92 µs (1.34× the best) | 2.69 µs (1.71× the best) | 3.95 µs (2.19× the best) | 5.35 µs (2.60× the best) | 6.75 µs (2.93× the best) |
| gf2_122-gls-wincompleteλ-projective, w codec | 1.24 µs (1.40× the best) | 0.56 ns (1.02× the best) | 310 ns (11.51× the best) | 2.22 µs (1.55× the best) | 2.99 µs (1.90× the best) | 4.24 µs (2.35× the best) | 5.64 µs (2.74× the best) | 7.04 µs (3.05× the best) |
| gf2_122-gls-wincompletecompare suitePornin x1: hash to addend; output already an addend | 949 ns (1.07× the best) | in the hash | 310 ns (11.51× the best) | 1.93 µs (1.34× the best) | 2.70 µs (1.71× the best) | 3.95 µs (2.19× the best) | 5.35 µs (2.60× the best) | 6.75 µs (2.93× the best) |
| gf2_122-gls-uunscaled (X:S:Z), w codec | 1.31 µs (1.47× the best) | 0.55 ns (tied for the best, within noise, 1.01×) | 276 ns (10.25× the best) | 2.19 µs (1.53× the best) | 2.88 µs (1.83× the best) | 4.00 µs (2.21× the best) | 5.25 µs (2.55× the best) | 6.50 µs (2.82× the best) |
| gf2_122-gls-ucompare suitePornin x1: hash to addend; output already an addend | 1.01 µs (1.14× the best) | in the hash | 276 ns (10.25× the best) | 1.89 µs (1.32× the best) | 2.58 µs (1.64× the best) | 3.70 µs (2.05× the best) | 4.95 µs (2.41× the best) | 6.21 µs (2.69× the best) |
| GF(2^109), 14 bytes | ||||||||
| gf2_109(X:S:Z:T) extended | 9.10 µs (10.24× the best) | 162 ns (295.04× the best) | 676 ns (25.13× the best) | 11.3 µs (7.89× the best) | 12.9 µs (8.21× the best) | 15.6 µs (8.65× the best) | 18.6 µs (9.06× the best) | 21.6 µs (9.38× the best) |
| gf2_109compare suitePornin x1: hash to addend; output already an addend | 5.27 µs (5.92× the best) | in the hash | 676 ns (25.13× the best) | 7.30 µs (5.10× the best) | 8.95 µs (5.67× the best) | 11.6 µs (6.44× the best) | 14.6 µs (7.12× the best) | 17.6 µs (7.65× the best) |
| gf2_109-lambdaincompleteλ-projective | 9.08 µs (10.21× the best) | 4.43 µs (8096.43× the best) | 545 ns (20.26× the best) | 15.2 µs (10.58× the best) | 16.5 µs (10.46× the best) | 18.7 µs (10.33× the best) | 21.1 µs (10.26× the best) | 23.5 µs (10.20× the best) |
| gf2_109-lambdaincompletecompare suitehashed straight to : no prepare | 9.10 µs (10.24× the best) | in the hash | 545 ns (20.26× the best) | 10.8 µs (7.51× the best) | 12.1 µs (7.67× the best) | 14.3 µs (7.89× the best) | 16.7 µs (8.12× the best) | 19.1 µs (8.29× the best) |
| gf2_109-lambdaincompletecompare suitePornin x1: hash to addend; output already an addend | 5.09 µs (5.72× the best) | in the hash | 545 ns (20.26× the best) | 6.75 µs (4.71× the best) | 8.08 µs (5.12× the best) | 10.3 µs (5.67× the best) | 12.7 µs (6.17× the best) | 15.1 µs (6.55× the best) |
| gf2_109-wincompleteλ-projective, w codec | 8.98 µs (10.10× the best) | 0.55 ns (tied for the best, within noise) | 541 ns (20.14× the best) | 10.6 µs (7.42× the best) | 12.0 µs (7.58× the best) | 14.1 µs (7.81× the best) | 16.5 µs (8.04× the best) | 18.9 µs (8.21× the best) |
| gf2_109-wincompletecompare suitePornin x1: hash to addend; output already an addend | 5.11 µs (5.75× the best) | in the hash | 541 ns (20.14× the best) | 6.76 µs (4.72× the best) | 8.09 µs (5.13× the best) | 10.2 µs (5.67× the best) | 12.7 µs (6.16× the best) | 15.1 µs (6.53× the best) |
| gf2_109-uunscaled (X:S:Z), w codec | 9.08 µs (10.21× the best) | 0.55 ns (tied for the best, within noise, 1.01×) | 488 ns (18.15× the best) | 10.6 µs (7.38× the best) | 11.8 µs (7.46× the best) | 13.7 µs (7.59× the best) | 15.9 µs (7.73× the best) | 18.1 µs (7.84× the best) |
| gf2_109-ucompare suitePornin x1: hash to addend; output already an addend | 5.19 µs (5.84× the best) | in the hash | 488 ns (18.15× the best) | 6.69 µs (4.67× the best) | 7.89 µs (5.00× the best) | 9.84 µs (5.44× the best) | 12.0 µs (5.84× the best) | 14.2 µs (6.15× the best) |
| F_p, p = 2^127 − 1, 16 bytes | ||||||||
| edwards127a = 1 Edwards, extended += cached | 1.25 µs (1.40× the best) | 635 ns (1160.61× the best) | 26.9 ns (tied for the best, within noise) | 2.04 µs (1.42× the best) | 2.14 µs (1.35× the best) | 2.29 µs (1.26× the best) | 2.45 µs (1.19× the best) | 2.61 µs (1.13× the best) |
| edwards127compare suiteElligator 2 x1: hash + prepare | 1.52 µs (1.71× the best) | 635 ns (1160.61× the best) | 26.9 ns (tied for the best, within noise) | 2.32 µs (1.62× the best) | 2.41 µs (1.53× the best) | 2.56 µs (1.42× the best) | 2.72 µs (1.32× the best) | 2.88 µs (1.25× the best) |
| weier127short Weierstrass, projective += affine | 1.22 µs (1.37× the best) | 0.79 ns (1.45× the best) | 58.1 ns (2.16× the best) | 1.47 µs (1.02× the best) | 1.64 µs (1.04× the best) | 1.91 µs (1.06× the best) | 2.20 µs (1.07× the best) | 2.50 µs (1.08× the best) |
| weier127compare suiteSSWU x1: hash + prepare | 1.33 µs (1.49× the best) | 0.79 ns (1.45× the best) | 58.1 ns (2.16× the best) | 1.58 µs (1.10× the best) | 1.75 µs (1.11× the best) | 2.02 µs (1.12× the best) | 2.31 µs (1.12× the best) | 2.61 µs (1.13× the best) |
| weier127-jacobianincompleteshort Weierstrass, Jacobian += affine | 1.22 µs (1.37× the best) | 0.80 ns (1.46× the best) | 47.3 ns (1.76× the best) | 1.43 µs (best) | 1.58 µs (best) | 1.81 µs (best) | 2.06 µs (best) | 2.31 µ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 | 1.29 µs | 347 ns (best) | 3.7× | 2 | 57.5 ns | 55.2 ns (63.32× the best) | 1.0× | 0 | 709 ns | 214 ns (13.42× the best) | 3.3× | 1 | 659 ns | 167 ns (1.02× the best) | 4.0× | 1 |
| gf2_127-lambdaincompleteλ-projective (X:L:Z) accumulators | 1.30 µs | 347 ns (1.00× the best) | 3.7× | 2 | 618 ns | 120 ns (137.18× the best) | 5.2× | 1 | 671 ns | 172 ns (10.81× the best) | 3.9× | 1 | 678 ns | 163 ns (best) | 4.2× | 1.1 |
| gf2_127-wincompleteλ-projective, w codec: hashes and decodes to λ-affine | 1.41 µs | 391 ns (1.13× the best) | 3.6× | 2.1 | 0.55 ns | 1.28 ns (1.47× the best) | 0.4× | 0 | 655 ns | 148 ns (9.31× the best) | 4.4× | 1.1 | 683 ns | 170 ns (1.04× the best) | 4.0× | 1.1 |
| gf2_127-uunscaled (X:S:Z), w codec, direct addend hashes | 1.51 µs | 452 ns (1.30× the best) | 3.3× | 2.2 | 0.56 ns | 1.32 ns (1.52× the best) | 0.4× | 0 | 638 ns | 150 ns (9.40× the best) | 4.3× | 1 | 731 ns | 227 ns (1.39× the best) | 3.2× | 1.1 |
| GF(2^122) = GF(2^61)[u], dense constant, 16 bytes | ||||||||||||||||
| gf2_122(X:S:Z:T) extended | 1.27 µs | 488 ns (1.41× the best) | 2.6× | 2 | 85.1 ns | 84.3 ns (96.68× the best) | 1.0× | 0 | 672 ns | 286 ns (17.91× the best) | 2.4× | 1 | 645 ns | 256 ns (1.57× the best) | 2.5× | 1 |
| gf2_122-lambdaincompleteλ-projective | 1.27 µs | 487 ns (1.40× the best) | 2.6× | 2 | 542 ns | 152 ns (173.86× the best) | 3.6× | 1 | 624 ns | 234 ns (14.66× the best) | 2.7× | 1 | 644 ns | 256 ns (1.57× the best) | 2.5× | 1 |
| gf2_122-wincompleteλ-projective, w codec | 1.24 µs | 458 ns (1.32× the best) | 2.7× | 2 | 0.55 ns | 1.25 ns (1.43× the best) | 0.4× | 0 | 590 ns | 200 ns (12.53× the best) | 3.0× | 1 | 613 ns | 216 ns (1.32× the best) | 2.8× | 1 |
| gf2_122-uunscaled (X:S:Z), w codec | 1.38 µs | 555 ns (1.60× the best) | 2.5× | 2.1 | 0.57 ns | 1.31 ns (1.51× the best) | 0.4× | 0 | 610 ns | 202 ns (12.68× the best) | 3.0× | 1 | 707 ns | 309 ns (1.90× the best) | 2.3× | 1 |
| GF(2^122), constant in GF(2^61) (GLS-shaped), 16 bytes | ||||||||||||||||
| gf2_122-gls(X:S:Z:T) extended | 1.27 µs | 456 ns (1.32× the best) | 2.8× | 2.1 | 60.9 ns | 61.2 ns (70.16× the best) | 1.0× | 0 | 654 ns | 270 ns (16.95× the best) | 2.4× | 1 | 649 ns | 229 ns (1.41× the best) | 2.8× | 1.1 |
| gf2_122-gls-lambdaincompleteλ-projective | 1.26 µs | 455 ns (1.31× the best) | 2.8× | 2.1 | 546 ns | 153 ns (175.74× the best) | 3.6× | 1 | 639 ns | 242 ns (15.17× the best) | 2.6× | 1 | 633 ns | 228 ns (1.40× the best) | 2.8× | 1 |
| gf2_122-gls-wincompleteλ-projective, w codec | 1.24 µs | 444 ns (1.28× the best) | 2.8× | 2 | 0.56 ns | 1.27 ns (1.46× the best) | 0.4× | 0 | 595 ns | 198 ns (12.42× the best) | 3.0× | 1 | 598 ns | 203 ns (1.25× the best) | 2.9× | 1 |
| gf2_122-gls-uunscaled (X:S:Z), w codec | 1.31 µs | 513 ns (1.48× the best) | 2.6× | 2 | 0.55 ns | 1.29 ns (1.48× the best) | 0.4× | 0 | 598 ns | 200 ns (12.55× the best) | 3.0× | 1 | 673 ns | 272 ns (1.67× the best) | 2.5× | 1 |
| GF(2^109), 14 bytes | ||||||||||||||||
| gf2_109(X:S:Z:T) extended | 9.10 µs | 814 ns (2.35× the best) | 11.2× | 2 | 162 ns | 160 ns (183.04× the best) | 1.0× | 0 | 4.70 µs | 500 ns (31.33× the best) | 9.4× | 1 | 4.60 µs | 421 ns (2.58× the best) | 10.9× | 1 |
| gf2_109-lambdaincompleteλ-projective | 9.08 µs | 814 ns (2.35× the best) | 11.2× | 2 | 4.43 µs | 245 ns (281.47× the best) | 18.1× | 1 | 4.57 µs | 371 ns (23.29× the best) | 12.3× | 1 | 4.61 µs | 424 ns (2.60× the best) | 10.9× | 1 |
| gf2_109-wincompleteλ-projective, w codec | 8.98 µs | 805 ns (2.32× the best) | 11.1× | 1.9 | 0.55 ns | 1.24 ns (1.42× the best) | 0.4× | 0 | 4.57 µs | 343 ns (21.53× the best) | 13.3× | 1 | 4.60 µs | 400 ns (2.46× the best) | 11.5× | 1 |
| gf2_109-uunscaled (X:S:Z), w codec | 9.08 µs | 927 ns (2.67× the best) | 9.8× | 1.9 | 0.55 ns | 1.26 ns (1.44× the best) | 0.4× | 0 | 4.53 µs | 343 ns (21.53× the best) | 13.2× | 1 | 4.74 µs | 519 ns (3.19× the best) | 9.1× | 1 |
| F_p, p = 2^127 − 1, 16 bytes | ||||||||||||||||
| edwards127a = 1 Edwards, extended += cached | 1.25 µs | 1.25 µs (3.62× the best) | 1.0× | 0 | 635 ns | 38.0 ns (43.55× the best) | 16.7× | 1.1 | 602 ns | 30.1 ns (1.89× the best) | 20.0× | 1 | 575 ns | 576 ns (3.54× the best) | 1.0× | 0 |
| weier127short Weierstrass, projective += affine | 1.22 µs | 1.23 µs (3.54× the best) | 1.0× | 0 | 0.79 ns | 0.87 ns (best) | 0.9× | 0 | 587 ns | 15.9 ns (best) | 36.8× | 1 | 574 ns | 573 ns (3.52× the best) | 1.0× | 0 |
| weier127-jacobianincompleteshort Weierstrass, Jacobian += affine | 1.22 µs | 1.22 µs (3.52× the best) | 1.0× | 0 | 0.80 ns | 0.88 ns (1.01× the best) | 0.9× | 0 | 593 ns | 22.5 ns (1.41× the best) | 26.3× | 1 | 574 ns | 574 ns (3.52× 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 | 1.29 µs (1.07× the best) | 347 ns (tied for the best, within noise) | 57.5 ns (105.07× the best) | 55.2 ns (63.32× the best) | 709 ns (1.21× the best) | 214 ns (13.42× the best) | 659 ns (1.15× the best) | 167 ns (1.02× the best) | ||||||||
| gf2_127-lambdaincompleteλ-projective (X:L:Z) accumulators | 1.30 µs (1.07× the best) | 347 ns (tied for the best, within noise, 1.00×) | 618 ns (1128.57× the best) | 120 ns (137.18× the best) | 671 ns (1.14× the best) | 172 ns (10.81× the best) | 678 ns (1.18× the best) | 163 ns (best) | ||||||||
| gf2_127-wincompleteλ-projective, w codec: hashes and decodes to λ-affine | 1.41 µs (1.16× the best) | 391 ns (1.13× the best) | 0.55 ns (tied for the best, within noise, 1.01×) | 1.28 ns (1.47× the best) | 655 ns (1.12× the best) | 148 ns (9.31× the best) | 683 ns (1.19× the best) | 170 ns (1.04× the best) | ||||||||
| gf2_127-uunscaled (X:S:Z), w codec, direct addend hashes | 1.51 µs (1.24× the best) | 452 ns (1.30× the best) | 0.56 ns (1.02× the best) | 1.32 ns (1.52× the best) | 638 ns (1.09× the best) | 150 ns (9.40× the best) | 731 ns (1.27× the best) | 227 ns (1.39× the best) | ||||||||
| GF(2^122) = GF(2^61)[u], dense constant, 16 bytes | ||||||||||||||||
| gf2_122(X:S:Z:T) extended | 1.27 µs (1.04× the best) | 488 ns (1.41× the best) | 85.1 ns (155.45× the best) | 84.3 ns (96.68× the best) | 672 ns (1.15× the best) | 286 ns (17.91× the best) | 645 ns (1.12× the best) | 256 ns (1.57× the best) | ||||||||
| gf2_122-lambdaincompleteλ-projective | 1.27 µs (1.04× the best) | 487 ns (1.40× the best) | 542 ns (989.75× the best) | 152 ns (173.86× the best) | 624 ns (1.06× the best) | 234 ns (14.66× the best) | 644 ns (1.12× the best) | 256 ns (1.57× the best) | ||||||||
| gf2_122-wincompleteλ-projective, w codec | 1.24 µs (1.02× the best) | 458 ns (1.32× the best) | 0.55 ns (tied for the best, within noise) | 1.25 ns (1.43× the best) | 590 ns (1.01× the best) | 200 ns (12.53× the best) | 613 ns (1.07× the best) | 216 ns (1.32× the best) | ||||||||
| gf2_122-uunscaled (X:S:Z), w codec | 1.38 µs (1.14× the best) | 555 ns (1.60× the best) | 0.57 ns (1.04× the best) | 1.31 ns (1.51× the best) | 610 ns (1.04× the best) | 202 ns (12.68× the best) | 707 ns (1.23× the best) | 309 ns (1.90× the best) | ||||||||
| GF(2^122), constant in GF(2^61) (GLS-shaped), 16 bytes | ||||||||||||||||
| gf2_122-gls(X:S:Z:T) extended | 1.27 µs (1.04× the best) | 456 ns (1.32× the best) | 60.9 ns (111.27× the best) | 61.2 ns (70.16× the best) | 654 ns (1.11× the best) | 270 ns (16.95× the best) | 649 ns (1.13× the best) | 229 ns (1.41× the best) | ||||||||
| gf2_122-gls-lambdaincompleteλ-projective | 1.26 µs (1.04× the best) | 455 ns (1.31× the best) | 546 ns (997.93× the best) | 153 ns (175.74× the best) | 639 ns (1.09× the best) | 242 ns (15.17× the best) | 633 ns (1.10× the best) | 228 ns (1.40× the best) | ||||||||
| gf2_122-gls-wincompleteλ-projective, w codec | 1.24 µs (1.02× the best) | 444 ns (1.28× the best) | 0.56 ns (1.02× the best) | 1.27 ns (1.46× the best) | 595 ns (1.01× the best) | 198 ns (12.42× the best) | 598 ns (1.04× the best) | 203 ns (1.25× the best) | ||||||||
| gf2_122-gls-uunscaled (X:S:Z), w codec | 1.31 µs (1.08× the best) | 513 ns (1.48× the best) | 0.55 ns (tied for the best, within noise, 1.01×) | 1.29 ns (1.48× the best) | 598 ns (1.02× the best) | 200 ns (12.55× the best) | 673 ns (1.17× the best) | 272 ns (1.67× the best) | ||||||||
| GF(2^109), 14 bytes | ||||||||||||||||
| gf2_109(X:S:Z:T) extended | 9.10 µs (7.49× the best) | 814 ns (2.35× the best) | 162 ns (295.04× the best) | 160 ns (183.04× the best) | 4.70 µs (8.00× the best) | 500 ns (31.33× the best) | 4.60 µs (8.02× the best) | 421 ns (2.58× the best) | ||||||||
| gf2_109-lambdaincompleteλ-projective | 9.08 µs (7.47× the best) | 814 ns (2.35× the best) | 4.43 µs (8096.43× the best) | 245 ns (281.47× the best) | 4.57 µs (7.79× the best) | 371 ns (23.29× the best) | 4.61 µs (8.04× the best) | 424 ns (2.60× the best) | ||||||||
| gf2_109-wincompleteλ-projective, w codec | 8.98 µs (7.39× the best) | 805 ns (2.32× the best) | 0.55 ns (tied for the best, within noise) | 1.24 ns (1.42× the best) | 4.57 µs (7.78× the best) | 343 ns (21.53× the best) | 4.60 µs (8.02× the best) | 400 ns (2.46× the best) | ||||||||
| gf2_109-uunscaled (X:S:Z), w codec | 9.08 µs (7.47× the best) | 927 ns (2.67× the best) | 0.55 ns (tied for the best, within noise, 1.01×) | 1.26 ns (1.44× the best) | 4.53 µs (7.72× the best) | 343 ns (21.53× the best) | 4.74 µs (8.26× the best) | 519 ns (3.19× the best) | ||||||||
| F_p, p = 2^127 − 1, 16 bytes | ||||||||||||||||
| edwards127a = 1 Edwards, extended += cached | 1.25 µs (1.03× the best) | 1.26 µs (1.03× the best) | 1.26 µs (1.02× the best) | 1.25 µs (3.62× the best) | 635 ns (1160.61× the best) | 124 ns (94.01× the best) | 50.4 ns (44.83× the best) | 38.0 ns (43.55× the best) | 602 ns (1.03× the best) | 114 ns (1.13× the best) | 42.7 ns (1.52× the best) | 30.1 ns (1.89× the best) | 575 ns (tied for the best, within noise, 1.00×) | 575 ns (tied for the best, within noise) | 573 ns (best) | 576 ns (3.54× the best) |
| weier127short Weierstrass, projective += affine | 1.22 µs (tied for the best, within noise, 1.00×) | 1.23 µs (tied for the best, within noise) | 1.28 µs (1.05× the best) | 1.23 µs (3.54× the best) | 0.79 ns (1.45× the best) | 1.33 ns (tied for the best, within noise, 1.01×) | 1.13 ns (1.01× the best) | 0.87 ns (tied for the best, within noise) | 587 ns (best) | 101 ns (best) | 28.0 ns (best) | 15.9 ns (best) | 574 ns (tied for the best, within noise) | 577 ns (1.00× the best) | 576 ns (1.01× the best) | 573 ns (3.52× the best) |
| weier127-jacobianincompleteshort Weierstrass, Jacobian += affine | 1.22 µs (tied for the best, within noise) | 1.23 µs (tied for the best, within noise) | 1.23 µs (best) | 1.22 µs (3.52× the best) | 0.80 ns (1.46× the best) | 1.32 ns (tied for the best, within noise) | 1.12 ns (best) | 0.88 ns (tied for the best, within noise, 1.01×) | 593 ns (1.01× the best) | 107 ns (1.06× the best) | 35.1 ns (1.25× the best) | 22.5 ns (1.41× the best) | 574 ns (tied for the best, within noise, 1.00×) | 576 ns (tied for the best, within noise, 1.00×) | 579 ns (1.01× the best) | 574 ns (3.52× 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).
edwards.127, ti, checksum projected in , mapping in
| lifetime | term | salted SHA-256 | projection |
|---|---|---|---|
| per item | ID, the item’s SHA-256 | 54.2 ns | 54.2 ns |
| per salt | accept the curve | not timed | not timed |
| per salt | checksum keys | 119 ns | 374 ns |
| per salt | mapping keys | 119 ns | 374 ns |
| per salt and item | hash to the addend | 1.31 µs | 1.25 µs |
| per salt and item | mapping seed | 50.2 ns | 14.0 ns |
| per salt and item | mapping walk below m = 1350 | 146 ns | 146 ns |
| per cell | add | 26.9 ns | 26.9 ns |
| per cell | encode | 30.1 ns | 30.1 ns |
| per cell | decode | 576 ns | 576 ns |
| measured | insertion per item, k = 13.57 cells | 1.88 µs | 1.81 µs |
weier.127, ti, checksum projected in , mapping in
| lifetime | term | salted SHA-256 | projection |
|---|---|---|---|
| per item | ID, the item’s SHA-256 | 54.2 ns | 54.2 ns |
| per salt | accept the curve | not timed | not timed |
| per salt | checksum keys | 119 ns | 374 ns |
| per salt | mapping keys | 119 ns | 374 ns |
| per salt and item | hash to the addend | 1.21 µs | 1.18 µs |
| per salt and item | mapping seed | 50.2 ns | 14.0 ns |
| per salt and item | mapping walk below m = 1350 | 146 ns | 146 ns |
| per cell | add | 58.1 ns | 58.1 ns |
| per cell | encode | 15.9 ns | 15.9 ns |
| per cell | decode | 573 ns | 573 ns |
| measured | insertion per item, k = 13.57 cells | 2.24 µs | 2.12 µs |
weier-jacobian.127, ti, checksum projected in , mapping in
| lifetime | term | salted SHA-256 | projection |
|---|---|---|---|
| per item | ID, the item’s SHA-256 | 54.2 ns | 54.2 ns |
| per salt | accept the curve | not timed | not timed |
| per salt | checksum keys | 119 ns | 374 ns |
| per salt | mapping keys | 119 ns | 374 ns |
| per salt and item | hash to the addend | 1.20 µs | 1.18 µs |
| per salt and item | mapping seed | 50.2 ns | 14.0 ns |
| per salt and item | mapping walk below m = 1350 | 146 ns | 146 ns |
| per cell | add | 47.3 ns | 47.3 ns |
| per cell | encode | 22.5 ns | 22.5 ns |
| per cell | decode | 574 ns | 574 ns |
| measured | insertion per item, k = 13.57 cells | 2.03 µs | 1.93 µ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.51 ns | 0.21 ns | |||||||||||||||
| GF(2^127), 16 bytes | |||||||||||||||||
| gf2_127(X:S:Z:T) extended accumulators, Pornin's formulas | 966 ns (best) | 347 ns (tied for the best, within noise) | 57.5 ns (105.07× the best) | 55.2 ns (63.32× the best) | 307 ns (11.43× the best) | 307 ns (9.43× the best) | 0.63 ns (1.14× the best) | 0.87 ns (2.17× the best) | 54.7 ns (17.31× the best) | 709 ns (1.21× the best) | 214 ns (13.42× the best) | 659 ns (1.15× the best) | 167 ns (1.02× the best) | ||||
| gf2_127-lambdaincompleteλ-projective (X:L:Z) accumulators | 1.30 µs (1.35× the best) | 347 ns (tied for the best, within noise, 1.00×) | 889 ns (tied for the best, within noise) | 322 ns (best) | 618 ns (1128.57× the best) | 120 ns (137.18× the best) | 249 ns (9.24× the best) | 253 ns (7.78× the best) | 0.56 ns (1.02× the best) | 0.81 ns (2.04× the best) | 30.6 ns (9.68× the best) | 671 ns (1.14× the best) | 172 ns (10.81× the best) | 678 ns (1.18× the best) | 163 ns (best) | ||
| gf2_127-wincompleteλ-projective, w codec: hashes and decodes to λ-affine | 1.41 µs (1.46× the best) | 391 ns (1.13× the best) | 892 ns (tied for the best, within noise, 1.00×) | 360 ns (1.12× the best) | 0.55 ns (tied for the best, within noise, 1.01×) | 1.28 ns (1.47× the best) | 249 ns (9.24× the best) | 253 ns (7.78× the best) | 0.57 ns (1.02× the best) | 0.80 ns (2.01× the best) | 30.0 ns (9.49× the best) | 655 ns (1.12× the best) | 148 ns (9.31× the best) | 683 ns (1.19× the best) | 170 ns (1.04× the best) | ||
| gf2_127-uunscaled (X:S:Z), w codec, direct addend hashes | 1.51 µs (1.56× the best) | 452 ns (1.30× the best) | 939 ns (1.06× the best) | 426 ns (1.33× the best) | 0.56 ns (1.02× the best) | 1.32 ns (1.52× the best) | 220 ns (8.17× the best) | 222 ns (6.84× the best) | 0.62 ns (1.11× the best) | 0.79 ns (1.97× the best) | 89.9 ns (28.43× the best) | 638 ns (1.09× the best) | 150 ns (9.40× the best) | 731 ns (1.27× the best) | 227 ns (1.39× the best) | ||
| GF(2^122) = GF(2^61)[u], dense constant, 16 bytes | |||||||||||||||||
| gf2_122(X:S:Z:T) extended | 1.08 µs (1.12× the best) | 488 ns (1.41× the best) | 85.1 ns (155.45× the best) | 84.3 ns (96.68× the best) | 390 ns (14.49× the best) | 393 ns (12.08× the best) | 0.63 ns (1.14× the best) | 0.99 ns (2.49× the best) | 76.5 ns (24.17× the best) | 672 ns (1.15× the best) | 286 ns (17.91× the best) | 645 ns (1.12× the best) | 256 ns (1.57× the best) | ||||
| gf2_122-lambdaincompleteλ-projective | 1.27 µs (1.31× the best) | 487 ns (1.40× the best) | 925 ns (1.04× the best) | 485 ns (1.51× the best) | 542 ns (989.75× the best) | 152 ns (173.86× the best) | 307 ns (11.42× the best) | 309 ns (9.49× the best) | 0.55 ns (tied for the best, within noise) | 0.98 ns (2.47× the best) | 42.8 ns (13.53× the best) | 624 ns (1.06× the best) | 234 ns (14.66× the best) | 644 ns (1.12× the best) | 256 ns (1.57× the best) | ||
| gf2_122-wincompleteλ-projective, w codec | 1.24 µs (1.28× the best) | 458 ns (1.32× the best) | 929 ns (1.04× the best) | 501 ns (1.56× the best) | 0.55 ns (tied for the best, within noise) | 1.25 ns (1.43× the best) | 307 ns (11.42× the best) | 310 ns (9.52× the best) | 0.56 ns (tied for the best, within noise, 1.00×) | 0.99 ns (2.49× the best) | 42.9 ns (13.55× the best) | 590 ns (1.01× the best) | 200 ns (12.53× the best) | 613 ns (1.07× the best) | 216 ns (1.32× the best) | ||
| gf2_122-uunscaled (X:S:Z), w codec | 1.38 µs (1.43× the best) | 555 ns (1.60× the best) | 1.00 µs (1.13× the best) | 585 ns (1.82× the best) | 0.57 ns (1.04× the best) | 1.31 ns (1.51× the best) | 277 ns (10.31× the best) | 280 ns (8.61× the best) | 0.62 ns (1.12× the best) | 1.00 ns (2.52× the best) | 119 ns (37.62× the best) | 610 ns (1.04× the best) | 202 ns (12.68× the best) | 707 ns (1.23× the best) | 309 ns (1.90× the best) | ||
| GF(2^122), constant in GF(2^61) (GLS-shaped), 16 bytes | |||||||||||||||||
| gf2_122-gls(X:S:Z:T) extended | 1.02 µs (1.06× the best) | 456 ns (1.32× the best) | 60.9 ns (111.27× the best) | 61.2 ns (70.16× the best) | 370 ns (13.76× the best) | 373 ns (11.45× the best) | 1.24 ns (2.23× the best) | 0.99 ns (2.49× the best) | 77.1 ns (24.37× the best) | 654 ns (1.11× the best) | 270 ns (16.95× the best) | 649 ns (1.13× the best) | 229 ns (1.41× the best) | ||||
| gf2_122-gls-lambdaincompleteλ-projective | 1.26 µs (1.31× the best) | 455 ns (1.31× the best) | 941 ns (1.06× the best) | 468 ns (1.45× the best) | 546 ns (997.93× the best) | 153 ns (175.74× the best) | 310 ns (11.54× the best) | 313 ns (9.61× the best) | 0.58 ns (1.04× the best) | 1.02 ns (2.57× the best) | 43.8 ns (13.84× the best) | 639 ns (1.09× the best) | 242 ns (15.17× the best) | 633 ns (1.10× the best) | 228 ns (1.40× the best) | ||
| gf2_122-gls-wincompleteλ-projective, w codec | 1.24 µs (1.29× the best) | 444 ns (1.28× the best) | 949 ns (1.07× the best) | 509 ns (1.58× the best) | 0.56 ns (1.02× the best) | 1.27 ns (1.46× the best) | 310 ns (11.51× the best) | 313 ns (9.62× the best) | 0.56 ns (1.02× the best) | 0.99 ns (2.48× the best) | 43.0 ns (13.59× the best) | 595 ns (1.01× the best) | 198 ns (12.42× the best) | 598 ns (1.04× the best) | 203 ns (1.25× the best) | ||
| gf2_122-gls-uunscaled (X:S:Z), w codec | 1.31 µs (1.36× the best) | 513 ns (1.48× the best) | 1.01 µs (1.14× the best) | 580 ns (1.80× the best) | 0.55 ns (tied for the best, within noise, 1.01×) | 1.29 ns (1.48× the best) | 276 ns (10.25× the best) | 281 ns (8.65× the best) | 0.62 ns (1.12× the best) | 1.01 ns (2.54× the best) | 116 ns (36.77× the best) | 598 ns (1.02× the best) | 200 ns (12.55× the best) | 673 ns (1.17× the best) | 272 ns (1.67× the best) | ||
| GF(2^109), 14 bytes | |||||||||||||||||
| gf2_109(X:S:Z:T) extended | 5.27 µs (5.45× the best) | 814 ns (2.35× the best) | 162 ns (295.04× the best) | 160 ns (183.04× the best) | 676 ns (25.13× the best) | 676 ns (20.78× the best) | 0.63 ns (1.13× the best) | 0.95 ns (2.39× the best) | 122 ns (38.42× the best) | 4.70 µs (8.00× the best) | 500 ns (31.33× the best) | 4.60 µs (8.02× the best) | 421 ns (2.58× the best) | ||||
| gf2_109-lambdaincompleteλ-projective | 9.08 µs (9.40× the best) | 814 ns (2.35× the best) | 5.09 µs (5.72× the best) | 834 ns (2.59× the best) | 4.43 µs (8096.43× the best) | 245 ns (281.47× the best) | 545 ns (20.26× the best) | 549 ns (16.88× the best) | 0.56 ns (tied for the best, within noise, 1.01×) | 0.89 ns (2.23× the best) | 62.5 ns (19.77× the best) | 4.57 µs (7.79× the best) | 371 ns (23.29× the best) | 4.61 µs (8.04× the best) | 424 ns (2.60× the best) | ||
| gf2_109-wincompleteλ-projective, w codec | 8.98 µs (9.30× the best) | 805 ns (2.32× the best) | 5.11 µs (5.75× the best) | 852 ns (2.65× the best) | 0.55 ns (tied for the best, within noise) | 1.24 ns (1.42× the best) | 541 ns (20.14× the best) | 550 ns (16.90× the best) | 0.56 ns (tied for the best, within noise, 1.00×) | 0.89 ns (2.24× the best) | 62.4 ns (19.73× the best) | 4.57 µs (7.78× the best) | 343 ns (21.53× the best) | 4.60 µs (8.02× the best) | 400 ns (2.46× the best) | ||
| gf2_109-uunscaled (X:S:Z), w codec | 9.08 µs (9.40× the best) | 927 ns (2.67× the best) | 5.19 µs (5.84× the best) | 986 ns (3.06× the best) | 0.55 ns (tied for the best, within noise, 1.01×) | 1.26 ns (1.44× the best) | 488 ns (18.15× the best) | 494 ns (15.19× the best) | 0.62 ns (1.11× the best) | 0.89 ns (2.23× the best) | 184 ns (58.01× the best) | 4.53 µs (7.72× the best) | 343 ns (21.53× the best) | 4.74 µs (8.26× the best) | 519 ns (3.19× the best) | ||
| F_p, p = 2^127 − 1, 16 bytes | |||||||||||||||||
| edwards127a = 1 Edwards, extended += cached | 1.25 µs (1.29× the best) | 1.25 µs (3.62× the best) | 635 ns (1160.61× the best) | 38.0 ns (43.55× the best) | 26.9 ns (best) | 32.5 ns (best) | 28.8 ns (best) | 2.16 ns (3.91× the best) | 1.12 ns (2.82× the best) | 5.59 ns (best) | 3.16 ns (best) | 602 ns (1.03× the best) | 30.1 ns (1.89× the best) | 575 ns (tied for the best, within noise, 1.00×) | 576 ns (3.54× the best) | ||
| weier127short Weierstrass, projective += affine | 1.22 µs (1.26× the best) | 1.23 µs (3.54× the best) | 0.79 ns (1.45× the best) | 0.87 ns (tied for the best, within noise) | 58.1 ns (2.16× the best) | 63.2 ns (1.94× the best) | 58.8 ns (2.04× the best) | 1.18 ns (2.13× the best) | 0.40 ns (tied for the best, within noise) | 5.93 ns (1.06× the best) | 3.35 ns (1.06× the best) | 587 ns (best) | 15.9 ns (best) | 574 ns (tied for the best, within noise) | 573 ns (3.52× the best) | ||
| weier127-jacobianincompleteshort Weierstrass, Jacobian += affine | 1.22 µs (1.26× the best) | 1.22 µs (3.52× the best) | 0.80 ns (1.46× the best) | 0.88 ns (tied for the best, within noise, 1.01×) | 47.3 ns (1.76× the best) | 55.3 ns (1.70× the best) | 48.6 ns (1.69× the best) | 1.18 ns (2.13× the best) | 0.40 ns (tied for the best, within noise) | 13.3 ns (2.39× the best) | 6.62 ns (2.09× the best) | 593 ns (1.01× the best) | 22.5 ns (1.41× the best) | 574 ns (tied for the best, within noise, 1.00×) | 574 ns (3.52× 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) | 29.5 ns (11.54× the best) | 25.4 ns (6.03× the best) | 4.10 ns (1.84× the best) | 4.91 ns (1.15× the best) | xor | 5.49 ns (1.35× the best) | 4.14 ns (1.06× the best) | 559 ns (1.11× the best) | 83.6 ns (8.80× the best) | |||
| gf2_122GF(2^61)[u]/(u^2 + u + 1) | 37.9 ns (14.82× the best) | 39.9 ns (9.45× the best) | 4.98 ns (2.24× the best) | 9.06 ns (2.12× the best) | xor | 4.07 ns (best) | 3.89 ns (tied for the best, within noise) | 504 ns (best) | 113 ns (11.84× the best) | |||
| gf2_109F_2[z]/(z^109 + z^5 + z^4 + z^2 + 1) | 61.0 ns (23.81× the best) | 64.6 ns (15.32× the best) | 37.9 ns (17.00× the best) | 41.6 ns (9.71× the best) | xor | 35.2 ns (8.67× the best) | 3.90 ns (tied for the best, within noise, 1.00×) | 4.39 µs (8.71× the best) | 185 ns (19.44× the best) | |||
| prime | ||||||||||||
| fp127p = 2^127 − 1 | 2.56 ns (best) | 4.22 ns (best) | 2.23 ns (best) | 4.28 ns (best) | 0.98 ns (best) | 560 ns (137.67× the best) | 587 ns (best) | 576 ns (1.14× the best) | 9.51 ns (best) | 0.37 ns (best) | 0.74 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) | 29.5 ns | 29.5 ns .. 29.6 ns |
| field mul, throughput | gf2_109 | field/gf2_109/mul throughput (8 chains) | 61.0 ns | 60.6 ns .. 61.3 ns |
| field mul, throughput | gf2_122 | field/gf2_122/mul throughput (8 chains) | 37.9 ns | 37.8 ns .. 38.0 ns |
| field mul, throughput | fp127 | field/fp127/mul throughput (8 chains) | 2.56 ns | 2.55 ns .. 2.57 ns |
| field mul, latency | gf2_127 | field/gf2_127/mul latency (dependent chain) | 25.4 ns | 25.2 ns .. 25.7 ns |
| field mul, latency | gf2_109 | field/gf2_109/mul latency (dependent chain) | 64.6 ns | 64.4 ns .. 64.9 ns |
| field mul, latency | gf2_122 | field/gf2_122/mul latency (dependent chain) | 39.9 ns | 39.8 ns .. 40.0 ns |
| field mul, latency | fp127 | field/fp127/mul latency (dependent chain) | 4.22 ns | 4.20 ns .. 4.24 ns |
| field square, throughput | gf2_127 | field/gf2_127/square throughput (8 chains) | 4.10 ns | 4.09 ns .. 4.12 ns |
| field square, throughput | gf2_109 | field/gf2_109/square throughput (8 chains) | 37.9 ns | 37.6 ns .. 38.1 ns |
| field square, throughput | gf2_122 | field/gf2_122/square throughput (8 chains) | 4.98 ns | 4.97 ns .. 4.99 ns |
| field square, throughput | fp127 | field/fp127/square throughput (8 chains) | 2.23 ns | 2.22 ns .. 2.24 ns |
| field square, latency | gf2_127 | field/gf2_127/square latency (dependent chain) | 4.91 ns | 4.87 ns .. 4.94 ns |
| field square, latency | gf2_109 | field/gf2_109/square latency (dependent chain) | 41.6 ns | 41.3 ns .. 41.8 ns |
| field square, latency | gf2_122 | field/gf2_122/square latency (dependent chain) | 9.06 ns | 9.03 ns .. 9.08 ns |
| field square, latency | fp127 | field/fp127/square latency (dependent chain) | 4.28 ns | 4.26 ns .. 4.31 ns |
| field add | fp127 | field/fp127/add | 0.98 ns | 0.98 ns .. 0.99 ns |
| field sqrt | gf2_127 | field/gf2_127/sqrt | 5.49 ns | 5.48 ns .. 5.50 ns |
| field sqrt | gf2_109 | field/gf2_109/sqrt | 35.2 ns | 35.1 ns .. 35.3 ns |
| field sqrt | gf2_122 | field/gf2_122/sqrt | 4.07 ns | 4.06 ns .. 4.08 ns |
| field sqrt | fp127 | field/fp127/sqrt (x^(2^125)) | 560 ns | 559 ns .. 561 ns |
| field sqrt ratio | fp127 | field/fp127/sqrt_ratio | 587 ns | 586 ns .. 589 ns |
| field halftrace | gf2_127 | field/gf2_127/halftrace (byte tables) | 4.14 ns | 4.13 ns .. 4.14 ns |
| field halftrace | gf2_109 | field/gf2_109/halftrace (byte tables) | 3.90 ns | 3.89 ns .. 3.92 ns |
| field halftrace | gf2_122 | field/gf2_122/qsolve (z^2 + z = c, 2 base halftraces) | 3.89 ns | 3.88 ns .. 3.90 ns |
| field invert, one at a time | gf2_127 | field/gf2_127/invert | 559 ns | 558 ns .. 560 ns |
| field invert, one at a time | gf2_109 | field/gf2_109/invert | 4.39 µs | 4.38 µs .. 4.40 µs |
| field invert, one at a time | gf2_122 | field/gf2_122/invert | 504 ns | 503 ns .. 505 ns |
| field invert, one at a time | fp127 | field/fp127/invert | 576 ns | 575 ns .. 577 ns |
| field invert, batched | gf2_127 | field/gf2_127/batch invert (product tree) | 83.6 ns | 83.5 ns .. 83.8 ns |
| field invert, batched | gf2_109 | field/gf2_109/batch invert (product tree) | 185 ns | 184 ns .. 186 ns |
| field invert, batched | gf2_122 | field/gf2_122/batch invert (product tree) | 113 ns | 112 ns .. 113 ns |
| field invert, batched | fp127 | field/fp127/batch invert (product tree) | 9.51 ns | 9.45 ns .. 9.57 ns |
| field pack | fp127 | field/fp127/pack | 0.37 ns | 0.36 ns .. 0.38 ns |
| field unpack | fp127 | field/fp127/unpack | 0.74 ns | 0.73 ns .. 0.75 ns |
| point add, throughput | xor | add/xor-sha256/xor 32B, 8 accumulators | 0.51 ns | 0.50 ns .. 0.51 ns |
| point add, throughput | gf2_127 | group.add/binary.127/mode=throughput | 307 ns | 307 ns .. 308 ns |
| point add, throughput | gf2_127-lambda | group.add/binary-lambda.127/mode=throughput | 249 ns | 247 ns .. 250 ns |
| point add, throughput | gf2_127-w | group.add/binary-w.127/mode=throughput | 249 ns | 247 ns .. 250 ns |
| point add, throughput | gf2_127-u | group.add/binary-u.127/mode=throughput | 220 ns | 219 ns .. 220 ns |
| point add, throughput | gf2_109 | group.add/binary.109/mode=throughput | 676 ns | 675 ns .. 677 ns |
| point add, throughput | gf2_109-lambda | group.add/binary-lambda.109/mode=throughput | 545 ns | 543 ns .. 546 ns |
| point add, throughput | gf2_109-w | group.add/binary-w.109/mode=throughput | 541 ns | 541 ns .. 542 ns |
| point add, throughput | gf2_109-u | group.add/binary-u.109/mode=throughput | 488 ns | 487 ns .. 489 ns |
| point add, throughput | gf2_122 | group.add/binary.122/mode=throughput | 390 ns | 389 ns .. 390 ns |
| point add, throughput | gf2_122-lambda | group.add/binary-lambda.122/mode=throughput | 307 ns | 306 ns .. 308 ns |
| point add, throughput | gf2_122-w | group.add/binary-w.122/mode=throughput | 307 ns | 307 ns .. 307 ns |
| point add, throughput | gf2_122-u | group.add/binary-u.122/mode=throughput | 277 ns | 276 ns .. 278 ns |
| point add, throughput | gf2_122-gls | group.add/binary.122-gls/mode=throughput | 370 ns | 369 ns .. 371 ns |
| point add, throughput | gf2_122-gls-lambda | group.add/binary-lambda.122-gls/mode=throughput | 310 ns | 309 ns .. 311 ns |
| point add, throughput | gf2_122-gls-w | group.add/binary-w.122-gls/mode=throughput | 310 ns | 309 ns .. 311 ns |
| point add, throughput | gf2_122-gls-u | group.add/binary-u.122-gls/mode=throughput | 276 ns | 275 ns .. 277 ns |
| point add, throughput | edwards127 | group.add/edwards.127/mode=throughput | 26.9 ns | 26.8 ns .. 27.0 ns |
| point add, throughput | weier127 | group.add/weier.127/mode=throughput | 58.1 ns | 57.9 ns .. 58.2 ns |
| point add, throughput | weier127-jacobian | group.add/weier-jacobian.127/mode=throughput | 47.3 ns | 47.3 ns .. 47.4 ns |
| point add, latency | xor | add/xor-sha256/xor 32B, 1 accumulator | 0.21 ns | 0.20 ns .. 0.21 ns |
| point add, latency | gf2_127 | group.add/binary.127/mode=latency | 307 ns | 306 ns .. 307 ns |
| point add, latency | gf2_127-lambda | group.add/binary-lambda.127/mode=latency | 253 ns | 251 ns .. 256 ns |
| point add, latency | gf2_127-w | group.add/binary-w.127/mode=latency | 253 ns | 252 ns .. 255 ns |
| point add, latency | gf2_127-u | group.add/binary-u.127/mode=latency | 222 ns | 222 ns .. 223 ns |
| point add, latency | gf2_109 | group.add/binary.109/mode=latency | 676 ns | 675 ns .. 677 ns |
| point add, latency | gf2_109-lambda | group.add/binary-lambda.109/mode=latency | 549 ns | 549 ns .. 550 ns |
| point add, latency | gf2_109-w | group.add/binary-w.109/mode=latency | 550 ns | 549 ns .. 551 ns |
| point add, latency | gf2_109-u | group.add/binary-u.109/mode=latency | 494 ns | 494 ns .. 495 ns |
| point add, latency | gf2_122 | group.add/binary.122/mode=latency | 393 ns | 393 ns .. 394 ns |
| point add, latency | gf2_122-lambda | group.add/binary-lambda.122/mode=latency | 309 ns | 308 ns .. 309 ns |
| point add, latency | gf2_122-w | group.add/binary-w.122/mode=latency | 310 ns | 309 ns .. 311 ns |
| point add, latency | gf2_122-u | group.add/binary-u.122/mode=latency | 280 ns | 279 ns .. 281 ns |
| point add, latency | gf2_122-gls | group.add/binary.122-gls/mode=latency | 373 ns | 372 ns .. 374 ns |
| point add, latency | gf2_122-gls-lambda | group.add/binary-lambda.122-gls/mode=latency | 313 ns | 312 ns .. 314 ns |
| point add, latency | gf2_122-gls-w | group.add/binary-w.122-gls/mode=latency | 313 ns | 312 ns .. 314 ns |
| point add, latency | gf2_122-gls-u | group.add/binary-u.122-gls/mode=latency | 281 ns | 279 ns .. 284 ns |
| point add, latency | edwards127 | group.add/edwards.127/mode=latency | 32.5 ns | 32.4 ns .. 32.7 ns |
| point add, latency | weier127 | group.add/weier.127/mode=latency | 63.2 ns | 63.0 ns .. 63.5 ns |
| point add, latency | weier127-jacobian | group.add/weier-jacobian.127/mode=latency | 55.3 ns | 55.2 ns .. 55.4 ns |
| point subtract | edwards127 | group.sub/edwards.127/mode=throughput | 28.8 ns | 28.8 ns .. 28.9 ns |
| point subtract | weier127 | group.sub/weier.127/mode=throughput | 58.8 ns | 58.6 ns .. 58.9 ns |
| point subtract | weier127-jacobian | group.sub/weier-jacobian.127/mode=throughput | 48.6 ns | 48.5 ns .. 48.7 ns |
| point negate | gf2_127 | negate/gf2_127/affine (y += x) | 0.63 ns | 0.62 ns .. 0.63 ns |
| point negate | gf2_127-lambda | group.neg/binary-lambda.127 | 0.56 ns | 0.56 ns .. 0.57 ns |
| point negate | gf2_127-w | group.neg/binary-w.127 | 0.57 ns | 0.56 ns .. 0.57 ns |
| point negate | gf2_127-u | group.neg/binary-u.127 | 0.62 ns | 0.61 ns .. 0.62 ns |
| point negate | gf2_109 | negate/gf2_109/affine (y += x) | 0.63 ns | 0.62 ns .. 0.63 ns |
| point negate | gf2_109-lambda | group.neg/binary-lambda.109 | 0.56 ns | 0.55 ns .. 0.56 ns |
| point negate | gf2_109-w | group.neg/binary-w.109 | 0.56 ns | 0.55 ns .. 0.56 ns |
| point negate | gf2_109-u | group.neg/binary-u.109 | 0.62 ns | 0.62 ns .. 0.62 ns |
| point negate | gf2_122 | negate/gf2_122/affine (y += x) | 0.63 ns | 0.63 ns .. 0.64 ns |
| point negate | gf2_122-lambda | group.neg/binary-lambda.122 | 0.55 ns | 0.55 ns .. 0.56 ns |
| point negate | gf2_122-w | group.neg/binary-w.122 | 0.56 ns | 0.55 ns .. 0.56 ns |
| point negate | gf2_122-u | group.neg/binary-u.122 | 0.62 ns | 0.62 ns .. 0.62 ns |
| point negate | gf2_122-gls | group.neg/binary.122-gls | 1.24 ns | 1.23 ns .. 1.24 ns |
| point negate | gf2_122-gls-lambda | group.neg/binary-lambda.122-gls | 0.58 ns | 0.57 ns .. 0.58 ns |
| point negate | gf2_122-gls-w | group.neg/binary-w.122-gls | 0.56 ns | 0.56 ns .. 0.57 ns |
| point negate | gf2_122-gls-u | group.neg/binary-u.122-gls | 0.62 ns | 0.62 ns .. 0.62 ns |
| point negate | edwards127 | group.neg/edwards.127 | 2.16 ns | 2.16 ns .. 2.17 ns |
| point negate | weier127 | group.neg/weier.127 | 1.18 ns | 1.18 ns .. 1.18 ns |
| point negate | weier127-jacobian | group.neg/weier-jacobian.127 | 1.18 ns | 1.18 ns .. 1.18 ns |
| point prepare, one at a time | gf2_127 | group.prepare/binary.127/mode=indep | 57.5 ns | 57.2 ns .. 57.9 ns |
| point prepare, one at a time | gf2_127-lambda | group.prepare/binary-lambda.127/mode=indep | 618 ns | 614 ns .. 622 ns |
| point prepare, one at a time | gf2_127-w | group.prepare/binary-w.127/mode=indep | 0.55 ns | 0.55 ns .. 0.56 ns |
| point prepare, one at a time | gf2_127-u | group.prepare/binary-u.127/mode=indep | 0.56 ns | 0.55 ns .. 0.56 ns |
| point prepare, one at a time | gf2_109 | group.prepare/binary.109/mode=indep | 162 ns | 161 ns .. 162 ns |
| point prepare, one at a time | gf2_109-lambda | group.prepare/binary-lambda.109/mode=indep | 4.43 µs | 4.43 µs .. 4.44 µs |
| point prepare, one at a time | gf2_109-w | group.prepare/binary-w.109/mode=indep | 0.55 ns | 0.54 ns .. 0.55 ns |
| point prepare, one at a time | gf2_109-u | group.prepare/binary-u.109/mode=indep | 0.55 ns | 0.55 ns .. 0.56 ns |
| point prepare, one at a time | gf2_122 | group.prepare/binary.122/mode=indep | 85.1 ns | 85.0 ns .. 85.3 ns |
| point prepare, one at a time | gf2_122-lambda | group.prepare/binary-lambda.122/mode=indep | 542 ns | 541 ns .. 543 ns |
| point prepare, one at a time | gf2_122-w | group.prepare/binary-w.122/mode=indep | 0.55 ns | 0.54 ns .. 0.55 ns |
| point prepare, one at a time | gf2_122-u | group.prepare/binary-u.122/mode=indep | 0.57 ns | 0.56 ns .. 0.58 ns |
| point prepare, one at a time | gf2_122-gls | group.prepare/binary.122-gls/mode=indep | 60.9 ns | 60.7 ns .. 61.1 ns |
| point prepare, one at a time | gf2_122-gls-lambda | group.prepare/binary-lambda.122-gls/mode=indep | 546 ns | 545 ns .. 548 ns |
| point prepare, one at a time | gf2_122-gls-w | group.prepare/binary-w.122-gls/mode=indep | 0.56 ns | 0.56 ns .. 0.56 ns |
| point prepare, one at a time | gf2_122-gls-u | group.prepare/binary-u.122-gls/mode=indep | 0.55 ns | 0.55 ns .. 0.56 ns |
| point prepare, one at a time | edwards127 | group.prepare/edwards.127/mode=indep | 635 ns | 634 ns .. 637 ns |
| point prepare, one at a time | weier127 | group.prepare/weier.127/mode=indep | 0.79 ns | 0.79 ns .. 0.80 ns |
| point prepare, one at a time | weier127-jacobian | group.prepare/weier-jacobian.127/mode=indep | 0.80 ns | 0.79 ns .. 0.80 ns |
| point prepare, batched | gf2_127 | group.prepare/binary.127/mode=batch,n=1024 | 55.2 ns | 55.1 ns .. 55.3 ns |
| point prepare, batched | gf2_127-lambda | group.prepare/binary-lambda.127/mode=batch,n=1024 | 120 ns | 119 ns .. 120 ns |
| point prepare, batched | gf2_127-w | group.prepare/binary-w.127/mode=batch,n=1024 | 1.28 ns | 1.27 ns .. 1.30 ns |
| point prepare, batched | gf2_127-u | group.prepare/binary-u.127/mode=batch,n=1024 | 1.32 ns | 1.31 ns .. 1.33 ns |
| point prepare, batched | gf2_109 | group.prepare/binary.109/mode=batch,n=1024 | 160 ns | 159 ns .. 160 ns |
| point prepare, batched | gf2_109-lambda | group.prepare/binary-lambda.109/mode=batch,n=1024 | 245 ns | 245 ns .. 246 ns |
| point prepare, batched | gf2_109-w | group.prepare/binary-w.109/mode=batch,n=1024 | 1.24 ns | 1.23 ns .. 1.26 ns |
| point prepare, batched | gf2_109-u | group.prepare/binary-u.109/mode=batch,n=1024 | 1.26 ns | 1.24 ns .. 1.28 ns |
| point prepare, batched | gf2_122 | group.prepare/binary.122/mode=batch,n=1024 | 84.3 ns | 84.2 ns .. 84.4 ns |
| point prepare, batched | gf2_122-lambda | group.prepare/binary-lambda.122/mode=batch,n=1024 | 152 ns | 151 ns .. 152 ns |
| point prepare, batched | gf2_122-w | group.prepare/binary-w.122/mode=batch,n=1024 | 1.25 ns | 1.23 ns .. 1.27 ns |
| point prepare, batched | gf2_122-u | group.prepare/binary-u.122/mode=batch,n=1024 | 1.31 ns | 1.29 ns .. 1.34 ns |
| point prepare, batched | gf2_122-gls | group.prepare/binary.122-gls/mode=batch,n=1024 | 61.2 ns | 61.0 ns .. 61.4 ns |
| point prepare, batched | gf2_122-gls-lambda | group.prepare/binary-lambda.122-gls/mode=batch,n=1024 | 153 ns | 153 ns .. 154 ns |
| point prepare, batched | gf2_122-gls-w | group.prepare/binary-w.122-gls/mode=batch,n=1024 | 1.27 ns | 1.26 ns .. 1.28 ns |
| point prepare, batched | gf2_122-gls-u | group.prepare/binary-u.122-gls/mode=batch,n=1024 | 1.29 ns | 1.28 ns .. 1.30 ns |
| point prepare, batched | edwards127 | group.prepare/edwards.127/mode=batch,n=1024 | 38.0 ns | 37.9 ns .. 38.1 ns |
| point prepare, batched | weier127 | group.prepare/weier.127/mode=batch,n=1024 | 0.87 ns | 0.87 ns .. 0.87 ns |
| point prepare, batched | weier127-jacobian | group.prepare/weier-jacobian.127/mode=batch,n=1024 | 0.88 ns | 0.87 ns .. 0.88 ns |
| is identity | gf2_127 | group.is_identity/binary.127 | 0.87 ns | 0.86 ns .. 0.87 ns |
| is identity | gf2_127-lambda | group.is_identity/binary-lambda.127 | 0.81 ns | 0.81 ns .. 0.82 ns |
| is identity | gf2_127-w | group.is_identity/binary-w.127 | 0.80 ns | 0.80 ns .. 0.80 ns |
| is identity | gf2_127-u | group.is_identity/binary-u.127 | 0.79 ns | 0.78 ns .. 0.79 ns |
| is identity | gf2_109 | group.is_identity/binary.109 | 0.95 ns | 0.95 ns .. 0.95 ns |
| is identity | gf2_109-lambda | group.is_identity/binary-lambda.109 | 0.89 ns | 0.89 ns .. 0.89 ns |
| is identity | gf2_109-w | group.is_identity/binary-w.109 | 0.89 ns | 0.89 ns .. 0.89 ns |
| is identity | gf2_109-u | group.is_identity/binary-u.109 | 0.89 ns | 0.89 ns .. 0.89 ns |
| is identity | gf2_122 | group.is_identity/binary.122 | 0.99 ns | 0.99 ns .. 0.99 ns |
| is identity | gf2_122-lambda | group.is_identity/binary-lambda.122 | 0.98 ns | 0.98 ns .. 0.98 ns |
| is identity | gf2_122-w | group.is_identity/binary-w.122 | 0.99 ns | 0.99 ns .. 1.00 ns |
| is identity | gf2_122-u | group.is_identity/binary-u.122 | 1.00 ns | 1.00 ns .. 1.01 ns |
| is identity | gf2_122-gls | group.is_identity/binary.122-gls | 0.99 ns | 0.99 ns .. 1.00 ns |
| is identity | gf2_122-gls-lambda | group.is_identity/binary-lambda.122-gls | 1.02 ns | 1.02 ns .. 1.03 ns |
| is identity | gf2_122-gls-w | group.is_identity/binary-w.122-gls | 0.99 ns | 0.99 ns .. 0.99 ns |
| is identity | gf2_122-gls-u | group.is_identity/binary-u.122-gls | 1.01 ns | 1.00 ns .. 1.02 ns |
| is identity | edwards127 | group.is_identity/edwards.127 | 1.12 ns | 1.12 ns .. 1.12 ns |
| is identity | weier127 | group.is_identity/weier.127 | 0.40 ns | 0.40 ns .. 0.40 ns |
| is identity | weier127-jacobian | group.is_identity/weier-jacobian.127 | 0.40 ns | 0.40 ns .. 0.40 ns |
| equals addend, match | edwards127 | group.equals/edwards.127/mode=match | 5.59 ns | 5.56 ns .. 5.63 ns |
| equals addend, match | weier127 | group.equals/weier.127/mode=match | 5.93 ns | 5.91 ns .. 5.95 ns |
| equals addend, match | weier127-jacobian | group.equals/weier-jacobian.127/mode=match | 13.3 ns | 13.3 ns .. 13.4 ns |
| equals addend, mismatch | gf2_127 | group.equals/binary.127/mode=mismatch | 54.7 ns | 54.6 ns .. 55.0 ns |
| equals addend, mismatch | gf2_127-lambda | group.equals/binary-lambda.127/mode=mismatch | 30.6 ns | 30.4 ns .. 30.8 ns |
| equals addend, mismatch | gf2_127-w | group.equals/binary-w.127/mode=mismatch | 30.0 ns | 29.9 ns .. 30.2 ns |
| equals addend, mismatch | gf2_127-u | group.equals/binary-u.127/mode=mismatch | 89.9 ns | 89.6 ns .. 90.3 ns |
| equals addend, mismatch | gf2_109 | group.equals/binary.109/mode=mismatch | 122 ns | 121 ns .. 122 ns |
| equals addend, mismatch | gf2_109-lambda | group.equals/binary-lambda.109/mode=mismatch | 62.5 ns | 62.4 ns .. 62.6 ns |
| equals addend, mismatch | gf2_109-w | group.equals/binary-w.109/mode=mismatch | 62.4 ns | 62.3 ns .. 62.5 ns |
| equals addend, mismatch | gf2_109-u | group.equals/binary-u.109/mode=mismatch | 184 ns | 183 ns .. 184 ns |
| equals addend, mismatch | gf2_122 | group.equals/binary.122/mode=mismatch | 76.5 ns | 76.4 ns .. 76.6 ns |
| equals addend, mismatch | gf2_122-lambda | group.equals/binary-lambda.122/mode=mismatch | 42.8 ns | 42.7 ns .. 42.8 ns |
| equals addend, mismatch | gf2_122-w | group.equals/binary-w.122/mode=mismatch | 42.9 ns | 42.8 ns .. 42.9 ns |
| equals addend, mismatch | gf2_122-u | group.equals/binary-u.122/mode=mismatch | 119 ns | 119 ns .. 119 ns |
| equals addend, mismatch | gf2_122-gls | group.equals/binary.122-gls/mode=mismatch | 77.1 ns | 76.9 ns .. 77.3 ns |
| equals addend, mismatch | gf2_122-gls-lambda | group.equals/binary-lambda.122-gls/mode=mismatch | 43.8 ns | 43.6 ns .. 43.9 ns |
| equals addend, mismatch | gf2_122-gls-w | group.equals/binary-w.122-gls/mode=mismatch | 43.0 ns | 42.9 ns .. 43.1 ns |
| equals addend, mismatch | gf2_122-gls-u | group.equals/binary-u.122-gls/mode=mismatch | 116 ns | 116 ns .. 117 ns |
| equals addend, mismatch | edwards127 | group.equals/edwards.127/mode=mismatch | 3.16 ns | 3.16 ns .. 3.17 ns |
| equals addend, mismatch | weier127 | group.equals/weier.127/mode=mismatch | 3.35 ns | 3.34 ns .. 3.36 ns |
| equals addend, mismatch | weier127-jacobian | group.equals/weier-jacobian.127/mode=mismatch | 6.62 ns | 6.60 ns .. 6.63 ns |
| encode, one at a time | gf2_127 | group.encode/binary.127/mode=indep | 709 ns | 707 ns .. 711 ns |
| encode, one at a time | gf2_127-lambda | group.encode/binary-lambda.127/mode=indep | 671 ns | 667 ns .. 674 ns |
| encode, one at a time | gf2_127-w | group.encode/binary-w.127/mode=indep | 655 ns | 650 ns .. 661 ns |
| encode, one at a time | gf2_127-u | group.encode/binary-u.127/mode=indep | 638 ns | 637 ns .. 639 ns |
| encode, one at a time | gf2_109 | group.encode/binary.109/mode=indep | 4.70 µs | 4.69 µs .. 4.71 µs |
| encode, one at a time | gf2_109-lambda | group.encode/binary-lambda.109/mode=indep | 4.57 µs | 4.57 µs .. 4.58 µs |
| encode, one at a time | gf2_109-w | group.encode/binary-w.109/mode=indep | 4.57 µs | 4.56 µs .. 4.57 µs |
| encode, one at a time | gf2_109-u | group.encode/binary-u.109/mode=indep | 4.53 µs | 4.52 µs .. 4.53 µs |
| encode, one at a time | gf2_122 | group.encode/binary.122/mode=indep | 672 ns | 671 ns .. 673 ns |
| encode, one at a time | gf2_122-lambda | group.encode/binary-lambda.122/mode=indep | 624 ns | 623 ns .. 625 ns |
| encode, one at a time | gf2_122-w | group.encode/binary-w.122/mode=indep | 590 ns | 589 ns .. 591 ns |
| encode, one at a time | gf2_122-u | group.encode/binary-u.122/mode=indep | 610 ns | 607 ns .. 613 ns |
| encode, one at a time | gf2_122-gls | group.encode/binary.122-gls/mode=indep | 654 ns | 653 ns .. 655 ns |
| encode, one at a time | gf2_122-gls-lambda | group.encode/binary-lambda.122-gls/mode=indep | 639 ns | 636 ns .. 643 ns |
| encode, one at a time | gf2_122-gls-w | group.encode/binary-w.122-gls/mode=indep | 595 ns | 592 ns .. 597 ns |
| encode, one at a time | gf2_122-gls-u | group.encode/binary-u.122-gls/mode=indep | 598 ns | 596 ns .. 600 ns |
| encode, one at a time | edwards127 | group.encode/edwards.127/mode=indep | 602 ns | 600 ns .. 603 ns |
| encode, one at a time | weier127 | group.encode/weier.127/mode=indep | 587 ns | 586 ns .. 587 ns |
| encode, one at a time | weier127-jacobian | group.encode/weier-jacobian.127/mode=indep | 593 ns | 592 ns .. 594 ns |
| encode, batched | gf2_127 | group.encode/binary.127/mode=batch,n=1024 | 214 ns | 213 ns .. 215 ns |
| encode, batched | gf2_127-lambda | group.encode/binary-lambda.127/mode=batch,n=1024 | 172 ns | 171 ns .. 174 ns |
| encode, batched | gf2_127-w | group.encode/binary-w.127/mode=batch,n=1024 | 148 ns | 148 ns .. 149 ns |
| encode, batched | gf2_127-u | group.encode/binary-u.127/mode=batch,n=1024 | 150 ns | 150 ns .. 150 ns |
| encode, batched | gf2_109 | group.encode/binary.109/mode=batch,n=1024 | 500 ns | 499 ns .. 500 ns |
| encode, batched | gf2_109-lambda | group.encode/binary-lambda.109/mode=batch,n=1024 | 371 ns | 370 ns .. 372 ns |
| encode, batched | gf2_109-w | group.encode/binary-w.109/mode=batch,n=1024 | 343 ns | 343 ns .. 344 ns |
| encode, batched | gf2_109-u | group.encode/binary-u.109/mode=batch,n=1024 | 343 ns | 343 ns .. 344 ns |
| encode, batched | gf2_122 | group.encode/binary.122/mode=batch,n=1024 | 286 ns | 285 ns .. 286 ns |
| encode, batched | gf2_122-lambda | group.encode/binary-lambda.122/mode=batch,n=1024 | 234 ns | 233 ns .. 234 ns |
| encode, batched | gf2_122-w | group.encode/binary-w.122/mode=batch,n=1024 | 200 ns | 198 ns .. 201 ns |
| encode, batched | gf2_122-u | group.encode/binary-u.122/mode=batch,n=1024 | 202 ns | 201 ns .. 203 ns |
| encode, batched | gf2_122-gls | group.encode/binary.122-gls/mode=batch,n=1024 | 270 ns | 269 ns .. 272 ns |
| encode, batched | gf2_122-gls-lambda | group.encode/binary-lambda.122-gls/mode=batch,n=1024 | 242 ns | 241 ns .. 243 ns |
| encode, batched | gf2_122-gls-w | group.encode/binary-w.122-gls/mode=batch,n=1024 | 198 ns | 197 ns .. 199 ns |
| encode, batched | gf2_122-gls-u | group.encode/binary-u.122-gls/mode=batch,n=1024 | 200 ns | 200 ns .. 201 ns |
| encode, batched | edwards127 | group.encode/edwards.127/mode=batch,n=1024 | 30.1 ns | 30.1 ns .. 30.2 ns |
| encode, batched | weier127 | group.encode/weier.127/mode=batch,n=1024 | 15.9 ns | 15.9 ns .. 16.0 ns |
| encode, batched | weier127-jacobian | group.encode/weier-jacobian.127/mode=batch,n=1024 | 22.5 ns | 22.5 ns .. 22.6 ns |
| decode, one at a time | gf2_127 | group.decode/binary.127/mode=indep | 659 ns | 656 ns .. 662 ns |
| decode, one at a time | gf2_127-lambda | group.decode/binary-lambda.127/mode=indep | 678 ns | 675 ns .. 682 ns |
| decode, one at a time | gf2_127-w | group.decode/binary-w.127/mode=indep | 683 ns | 680 ns .. 686 ns |
| decode, one at a time | gf2_127-u | group.decode/binary-u.127/mode=indep | 731 ns | 730 ns .. 732 ns |
| decode, one at a time | gf2_109 | group.decode/binary.109/mode=indep | 4.60 µs | 4.59 µs .. 4.60 µs |
| decode, one at a time | gf2_109-lambda | group.decode/binary-lambda.109/mode=indep | 4.61 µs | 4.60 µs .. 4.62 µs |
| decode, one at a time | gf2_109-w | group.decode/binary-w.109/mode=indep | 4.60 µs | 4.60 µs .. 4.61 µs |
| decode, one at a time | gf2_109-u | group.decode/binary-u.109/mode=indep | 4.74 µs | 4.73 µs .. 4.75 µs |
| decode, one at a time | gf2_122 | group.decode/binary.122/mode=indep | 645 ns | 645 ns .. 646 ns |
| decode, one at a time | gf2_122-lambda | group.decode/binary-lambda.122/mode=indep | 644 ns | 643 ns .. 645 ns |
| decode, one at a time | gf2_122-w | group.decode/binary-w.122/mode=indep | 613 ns | 612 ns .. 614 ns |
| decode, one at a time | gf2_122-u | group.decode/binary-u.122/mode=indep | 707 ns | 705 ns .. 710 ns |
| decode, one at a time | gf2_122-gls | group.decode/binary.122-gls/mode=indep | 649 ns | 645 ns .. 653 ns |
| decode, one at a time | gf2_122-gls-lambda | group.decode/binary-lambda.122-gls/mode=indep | 633 ns | 632 ns .. 635 ns |
| decode, one at a time | gf2_122-gls-w | group.decode/binary-w.122-gls/mode=indep | 598 ns | 596 ns .. 599 ns |
| decode, one at a time | gf2_122-gls-u | group.decode/binary-u.122-gls/mode=indep | 673 ns | 672 ns .. 675 ns |
| decode, one at a time | edwards127 | group.decode/edwards.127/mode=indep | 575 ns | 573 ns .. 577 ns |
| decode, one at a time | weier127 | group.decode/weier.127/mode=indep | 574 ns | 573 ns .. 575 ns |
| decode, one at a time | weier127-jacobian | group.decode/weier-jacobian.127/mode=indep | 574 ns | 573 ns .. 575 ns |
| decode, batched | gf2_127 | group.decode/binary.127/mode=batch,n=1024 | 167 ns | 165 ns .. 168 ns |
| decode, batched | gf2_127-lambda | group.decode/binary-lambda.127/mode=batch,n=1024 | 163 ns | 162 ns .. 164 ns |
| decode, batched | gf2_127-w | group.decode/binary-w.127/mode=batch,n=1024 | 170 ns | 169 ns .. 170 ns |
| decode, batched | gf2_127-u | group.decode/binary-u.127/mode=batch,n=1024 | 227 ns | 227 ns .. 227 ns |
| decode, batched | gf2_109 | group.decode/binary.109/mode=batch,n=1024 | 421 ns | 420 ns .. 422 ns |
| decode, batched | gf2_109-lambda | group.decode/binary-lambda.109/mode=batch,n=1024 | 424 ns | 422 ns .. 426 ns |
| decode, batched | gf2_109-w | group.decode/binary-w.109/mode=batch,n=1024 | 400 ns | 400 ns .. 401 ns |
| decode, batched | gf2_109-u | group.decode/binary-u.109/mode=batch,n=1024 | 519 ns | 519 ns .. 520 ns |
| decode, batched | gf2_122 | group.decode/binary.122/mode=batch,n=1024 | 256 ns | 256 ns .. 256 ns |
| decode, batched | gf2_122-lambda | group.decode/binary-lambda.122/mode=batch,n=1024 | 256 ns | 255 ns .. 257 ns |
| decode, batched | gf2_122-w | group.decode/binary-w.122/mode=batch,n=1024 | 216 ns | 214 ns .. 218 ns |
| decode, batched | gf2_122-u | group.decode/binary-u.122/mode=batch,n=1024 | 309 ns | 308 ns .. 310 ns |
| decode, batched | gf2_122-gls | group.decode/binary.122-gls/mode=batch,n=1024 | 229 ns | 228 ns .. 230 ns |
| decode, batched | gf2_122-gls-lambda | group.decode/binary-lambda.122-gls/mode=batch,n=1024 | 228 ns | 227 ns .. 228 ns |
| decode, batched | gf2_122-gls-w | group.decode/binary-w.122-gls/mode=batch,n=1024 | 203 ns | 202 ns .. 204 ns |
| decode, batched | gf2_122-gls-u | group.decode/binary-u.122-gls/mode=batch,n=1024 | 272 ns | 271 ns .. 273 ns |
| decode, batched | edwards127 | group.decode/edwards.127/mode=batch,n=1024 | 576 ns | 575 ns .. 578 ns |
| decode, batched | weier127 | group.decode/weier.127/mode=batch,n=1024 | 573 ns | 572 ns .. 574 ns |
| decode, batched | weier127-jacobian | group.decode/weier-jacobian.127/mode=batch,n=1024 | 574 ns | 573 ns .. 575 ns |
| hash to curve, one at a time | gf2_127 | hash_to_curve/gf2_127/pornin map x1 | 966 ns | 958 ns .. 974 ns |
| hash to curve, one at a time | gf2_127-lambda | h2c/binary-lambda.127/mode=indep | 1.30 µs | 1.29 µs .. 1.31 µs |
| hash to curve, one at a time | gf2_127-w | h2c/binary-w.127/mode=indep | 1.41 µs | 1.40 µs .. 1.42 µs |
| hash to curve, one at a time | gf2_127-u | h2c/binary-u.127/mode=indep | 1.51 µs | 1.50 µs .. 1.51 µs |
| hash to curve, one at a time | gf2_109 | hash_to_curve/gf2_109/pornin map x1 | 5.27 µs | 5.25 µs .. 5.28 µs |
| hash to curve, one at a time | gf2_109-lambda | h2c/binary-lambda.109/mode=indep | 9.08 µs | 9.07 µs .. 9.09 µs |
| hash to curve, one at a time | gf2_109-w | h2c/binary-w.109/mode=indep | 8.98 µs | 8.96 µs .. 9.00 µs |
| hash to curve, one at a time | gf2_109-u | h2c/binary-u.109/mode=indep | 9.08 µs | 9.07 µs .. 9.10 µs |
| hash to curve, one at a time | gf2_122 | hash_to_curve/gf2_122/pornin map x1 | 1.08 µs | 1.07 µs .. 1.09 µs |
| hash to curve, one at a time | gf2_122-lambda | h2c/binary-lambda.122/mode=indep | 1.27 µs | 1.27 µs .. 1.27 µs |
| hash to curve, one at a time | gf2_122-w | h2c/binary-w.122/mode=indep | 1.24 µs | 1.24 µs .. 1.24 µs |
| hash to curve, one at a time | gf2_122-u | h2c/binary-u.122/mode=indep | 1.38 µs | 1.36 µs .. 1.40 µs |
| hash to curve, one at a time | gf2_122-gls | hash_to_curve/gf2_122-gls/pornin map x1 | 1.02 µs | 1.01 µs .. 1.03 µs |
| hash to curve, one at a time | gf2_122-gls-lambda | h2c/binary-lambda.122-gls/mode=indep | 1.26 µs | 1.26 µs .. 1.27 µs |
| hash to curve, one at a time | gf2_122-gls-w | h2c/binary-w.122-gls/mode=indep | 1.24 µs | 1.24 µs .. 1.24 µs |
| hash to curve, one at a time | gf2_122-gls-u | h2c/binary-u.122-gls/mode=indep | 1.31 µs | 1.31 µs .. 1.31 µs |
| hash to curve, one at a time | edwards127 | h2c/edwards.127/mode=indep | 1.25 µs | 1.25 µs .. 1.25 µs |
| hash to curve, one at a time | weier127 | h2c/weier.127/mode=indep | 1.22 µs | 1.22 µs .. 1.22 µs |
| hash to curve, one at a time | weier127-jacobian | h2c/weier-jacobian.127/mode=indep | 1.22 µs | 1.21 µs .. 1.22 µs |
| hash to curve, batched | gf2_127 | h2c/binary.127/mode=batch,n=1024 | 347 ns | 345 ns .. 348 ns |
| hash to curve, batched | gf2_127-lambda | h2c/binary-lambda.127/mode=batch,n=1024 | 347 ns | 345 ns .. 349 ns |
| hash to curve, batched | gf2_127-w | h2c/binary-w.127/mode=batch,n=1024 | 391 ns | 389 ns .. 393 ns |
| hash to curve, batched | gf2_127-u | h2c/binary-u.127/mode=batch,n=1024 | 452 ns | 450 ns .. 453 ns |
| hash to curve, batched | gf2_109 | h2c/binary.109/mode=batch,n=1024 | 814 ns | 813 ns .. 816 ns |
| hash to curve, batched | gf2_109-lambda | h2c/binary-lambda.109/mode=batch,n=1024 | 814 ns | 813 ns .. 815 ns |
| hash to curve, batched | gf2_109-w | h2c/binary-w.109/mode=batch,n=1024 | 805 ns | 804 ns .. 807 ns |
| hash to curve, batched | gf2_109-u | h2c/binary-u.109/mode=batch,n=1024 | 927 ns | 926 ns .. 928 ns |
| hash to curve, batched | gf2_122 | h2c/binary.122/mode=batch,n=1024 | 488 ns | 487 ns .. 489 ns |
| hash to curve, batched | gf2_122-lambda | h2c/binary-lambda.122/mode=batch,n=1024 | 487 ns | 486 ns .. 488 ns |
| hash to curve, batched | gf2_122-w | h2c/binary-w.122/mode=batch,n=1024 | 458 ns | 457 ns .. 460 ns |
| hash to curve, batched | gf2_122-u | h2c/binary-u.122/mode=batch,n=1024 | 555 ns | 550 ns .. 560 ns |
| hash to curve, batched | gf2_122-gls | h2c/binary.122-gls/mode=batch,n=1024 | 456 ns | 455 ns .. 458 ns |
| hash to curve, batched | gf2_122-gls-lambda | h2c/binary-lambda.122-gls/mode=batch,n=1024 | 455 ns | 453 ns .. 457 ns |
| hash to curve, batched | gf2_122-gls-w | h2c/binary-w.122-gls/mode=batch,n=1024 | 444 ns | 442 ns .. 446 ns |
| hash to curve, batched | gf2_122-gls-u | h2c/binary-u.122-gls/mode=batch,n=1024 | 513 ns | 511 ns .. 515 ns |
| hash to curve, batched | edwards127 | h2c/edwards.127/mode=batch,n=1024 | 1.25 µs | 1.25 µs .. 1.26 µs |
| hash to curve, batched | weier127 | h2c/weier.127/mode=batch,n=1024 | 1.23 µs | 1.22 µs .. 1.23 µs |
| hash to curve, batched | weier127-jacobian | h2c/weier-jacobian.127/mode=batch,n=1024 | 1.22 µs | 1.22 µs .. 1.22 µs |
| hash to addend, one at a time | gf2_127-lambda | hash_to_curve/gf2_127-lambda/pornin map x1 to (x, λ) | 889 ns | 885 ns .. 894 ns |
| hash to addend, one at a time | gf2_127-w | hash_to_curve/gf2_127-w/pornin map x1 to (x, λ) | 892 ns | 889 ns .. 897 ns |
| hash to addend, one at a time | gf2_127-u | hash_to_curve/gf2_127-u/pornin map x1 to (u, v) | 939 ns | 934 ns .. 944 ns |
| hash to addend, one at a time | gf2_109-lambda | hash_to_curve/gf2_109-lambda/pornin map x1 to (x, λ) | 5.09 µs | 5.07 µs .. 5.11 µs |
| hash to addend, one at a time | gf2_109-w | hash_to_curve/gf2_109-w/pornin map x1 to (x, λ) | 5.11 µs | 5.08 µs .. 5.15 µs |
| hash to addend, one at a time | gf2_109-u | hash_to_curve/gf2_109-u/pornin map x1 to (u, v) | 5.19 µs | 5.18 µs .. 5.21 µs |
| hash to addend, one at a time | gf2_122-lambda | hash_to_curve/gf2_122-lambda/pornin map x1 to (x, λ) | 925 ns | 924 ns .. 926 ns |
| hash to addend, one at a time | gf2_122-w | hash_to_curve/gf2_122-w/pornin map x1 to (x, λ) | 929 ns | 925 ns .. 935 ns |
| hash to addend, one at a time | gf2_122-u | hash_to_curve/gf2_122-u/pornin map x1 to (u, v) | 1.00 µs | 1.00 µs .. 1.01 µs |
| hash to addend, one at a time | gf2_122-gls-lambda | hash_to_curve/gf2_122-gls-lambda/pornin map x1 to (x, λ) | 941 ns | 937 ns .. 946 ns |
| hash to addend, one at a time | gf2_122-gls-w | hash_to_curve/gf2_122-gls-w/pornin map x1 to (x, λ) | 949 ns | 944 ns .. 953 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) | 1.01 µs | 1.01 µs .. 1.02 µs |
| hash to addend, batched | gf2_127-lambda | hash_to_curve/gf2_127-lambda/try-and-increment to (x, λ), batched | 322 ns | 320 ns .. 323 ns |
| hash to addend, batched | gf2_127-w | hash_to_curve/gf2_127-w/pornin map x1 to (x, λ), batched | 360 ns | 358 ns .. 363 ns |
| hash to addend, batched | gf2_127-u | hash_to_curve/gf2_127-u/pornin map x1 to (u, v), batched | 426 ns | 425 ns .. 428 ns |
| hash to addend, batched | gf2_109-lambda | hash_to_curve/gf2_109-lambda/try-and-increment to (x, λ), batched | 834 ns | 826 ns .. 842 ns |
| hash to addend, batched | gf2_109-w | hash_to_curve/gf2_109-w/pornin map x1 to (x, λ), batched | 852 ns | 850 ns .. 855 ns |
| hash to addend, batched | gf2_109-u | hash_to_curve/gf2_109-u/pornin map x1 to (u, v), batched | 986 ns | 983 ns .. 988 ns |
| hash to addend, batched | gf2_122-lambda | hash_to_curve/gf2_122-lambda/try-and-increment to (x, λ), batched | 485 ns | 484 ns .. 485 ns |
| hash to addend, batched | gf2_122-w | hash_to_curve/gf2_122-w/pornin map x1 to (x, λ), batched | 501 ns | 500 ns .. 502 ns |
| hash to addend, batched | gf2_122-u | hash_to_curve/gf2_122-u/pornin map x1 to (u, v), batched | 585 ns | 584 ns .. 586 ns |
| hash to addend, batched | gf2_122-gls-lambda | hash_to_curve/gf2_122-gls-lambda/try-and-increment to (x, λ), batched | 468 ns | 465 ns .. 472 ns |
| hash to addend, batched | gf2_122-gls-w | hash_to_curve/gf2_122-gls-w/pornin map x1 to (x, λ), batched | 509 ns | 505 ns .. 514 ns |
| hash to addend, batched | gf2_122-gls-u | hash_to_curve/gf2_122-gls-u/pornin map x1 to (u, v), batched | 580 ns | 578 ns .. 583 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 | 2 | 2 | 2 | 1 | 1 | 1 | 2 | 2 | 1 | 1 | 1 | |
| gf2_127-wincompleteλ-projective, w codec: hashes and decodes to λ-affine | 2 | 2 | 2 | 1 | 1 | 1 | 2 | 2 | 1 | 1 | 1 | |
| gf2_127-uunscaled (X:S:Z), w codec, direct addend hashes | 2 | 2 | 2 | 1 | 1 | 1 | 2 | 2 | 1 | 1 | 1 | |
| 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 | 185 ns | 184 ns .. 186 ns | per elem |
| batch invert | gf2_122/batch invert (product tree) | gf2_122 | batch | 113 ns | 112 ns .. 113 ns | per elem |
| batch invert | gf2_127/batch invert (product tree) | gf2_127 | batch | 83.6 ns | 83.5 ns .. 83.8 ns | per elem |
| batch invert | fp127/batch invert (product tree) | fp127 | batch | 9.51 ns | 9.45 ns .. 9.57 ns | per elem |
| halftrace | gf2_109/halftrace | gf2_109 | per-element | 59.2 ns | 59.0 ns .. 59.4 ns | per elem |
| halftrace | gf2_109/halftrace (byte tables) | gf2_109 | per-element | 3.90 ns | 3.89 ns .. 3.92 ns | per elem |
| halftrace | gf2_122/qsolve (z^2 + z = c, 2 base halftraces) | gf2_122 | per-element | 3.89 ns | 3.88 ns .. 3.90 ns | per elem |
| halftrace | gf2_127/halftrace | gf2_127 | per-element | 35.6 ns | 35.5 ns .. 35.7 ns | per elem |
| halftrace | gf2_127/halftrace (byte tables) | gf2_127 | per-element | 4.14 ns | 4.13 ns .. 4.14 ns | per elem |
| halftrace | gf2_127/halftrace (nibble tables) | gf2_127 | per-element | 24.9 ns | 24.9 ns .. 25.0 ns | per elem |
| mul_u2 | gf2_122/mul_u2 (by a^2 = 1 + a) latency (dependent chain) | gf2_122 | latency | 0.04 ns | 0.04 ns .. 0.04 ns | per elem |
| mul_u2 | gf2_122/mul_u2 (by a^2 = 1 + a) throughput (8 chains) | gf2_122 | throughput | 0.12 ns | 0.12 ns .. 0.12 ns | per elem |
| pack | fp127/pack | fp127 | per-element | 0.37 ns | 0.36 ns .. 0.38 ns | per elem |
| trace | gf2_109/trace | gf2_109 | per-element | 0.60 ns | 0.59 ns .. 0.60 ns | per elem |
| trace | gf2_122/trace | gf2_122 | per-element | 0.40 ns | 0.40 ns .. 0.40 ns | per elem |
| trace | gf2_127/trace | gf2_127 | per-element | 0.40 ns | 0.40 ns .. 0.40 ns | per elem |
| unpack | fp127/unpack | fp127 | per-element | 0.74 ns | 0.73 ns .. 0.75 ns | per elem |
| normalize | gf2_109/normalize (to_u128) | gf2_109 | per-element | 0.79 ns | 0.79 ns .. 0.79 ns | per elem |
| normalize | gf2_122/normalize (to_u128) | gf2_122 | per-element | 1.39 ns | 1.38 ns .. 1.40 ns | per elem |
| normalize | gf2_127/normalize (to_u128) | gf2_127 | per-element | 0.59 ns | 0.59 ns .. 0.59 ns | per elem |
| neg | fp127/neg | fp127 | per-element | 0.98 ns | 0.98 ns .. 0.99 ns | per elem |
| add | fp127/add | fp127 | per-element | 0.98 ns | 0.98 ns .. 0.99 ns | per elem |
| square | gf2_109/square latency (dependent chain) | gf2_109 | latency | 41.6 ns | 41.3 ns .. 41.8 ns | per elem |
| square | gf2_109/square throughput (8 chains) | gf2_109 | throughput | 37.9 ns | 37.6 ns .. 38.1 ns | per elem |
| square | gf2_122/square latency (dependent chain) | gf2_122 | latency | 9.06 ns | 9.03 ns .. 9.08 ns | per elem |
| square | gf2_122/square throughput (8 chains) | gf2_122 | throughput | 4.98 ns | 4.97 ns .. 4.99 ns | per elem |
| square | gf2_127/square latency (dependent chain) | gf2_127 | latency | 4.91 ns | 4.87 ns .. 4.94 ns | per elem |
| square | gf2_127/square throughput (8 chains) | gf2_127 | throughput | 4.10 ns | 4.09 ns .. 4.12 ns | per elem |
| square | fp127/square latency (dependent chain) | fp127 | latency | 4.28 ns | 4.26 ns .. 4.31 ns | per elem |
| square | fp127/square throughput (8 chains) | fp127 | throughput | 2.23 ns | 2.22 ns .. 2.24 ns | per elem |
| sqrt | gf2_109/sqrt | gf2_109 | per-element | 35.2 ns | 35.1 ns .. 35.3 ns | per elem |
| sqrt | gf2_122/sqrt | gf2_122 | per-element | 4.07 ns | 4.06 ns .. 4.08 ns | per elem |
| sqrt | gf2_127/sqrt | gf2_127 | per-element | 5.49 ns | 5.48 ns .. 5.50 ns | per elem |
| sqrt | fp127/sqrt (x^(2^125)) | fp127 | per-element | 560 ns | 559 ns .. 561 ns | per elem |
| mul_base | gf2_122/mul_base (by a GF(2^61) constant) latency (dependent chain) | gf2_122 | latency | 27.9 ns | 27.8 ns .. 27.9 ns | per elem |
| mul_base | gf2_122/mul_base (by a GF(2^61) constant) throughput (8 chains) | gf2_122 | throughput | 24.2 ns | 24.2 ns .. 24.3 ns | per elem |
| mul | gf2_109/mul latency (dependent chain) | gf2_109 | latency | 64.6 ns | 64.4 ns .. 64.9 ns | per elem |
| mul | gf2_109/mul throughput (8 chains) | gf2_109 | throughput | 61.0 ns | 60.6 ns .. 61.3 ns | per elem |
| mul | gf2_122/mul latency (dependent chain) | gf2_122 | latency | 39.9 ns | 39.8 ns .. 40.0 ns | per elem |
| mul | gf2_122/mul throughput (8 chains) | gf2_122 | throughput | 37.9 ns | 37.8 ns .. 38.0 ns | per elem |
| mul | gf2_127/mul latency (dependent chain) | gf2_127 | latency | 25.4 ns | 25.2 ns .. 25.7 ns | per elem |
| mul | gf2_127/mul throughput (8 chains) | gf2_127 | throughput | 29.5 ns | 29.5 ns .. 29.6 ns | per elem |
| mul | fp127/mul latency (dependent chain) | fp127 | latency | 4.22 ns | 4.20 ns .. 4.24 ns | per elem |
| mul | fp127/mul throughput (8 chains) | fp127 | throughput | 2.56 ns | 2.55 ns .. 2.57 ns | per elem |
| invert | gf2_109/invert | gf2_109 | per-element | 4.39 µs | 4.38 µs .. 4.40 µs | per elem |
| invert | gf2_122/invert | gf2_122 | per-element | 504 ns | 503 ns .. 505 ns | per elem |
| invert | gf2_127/invert | gf2_127 | per-element | 559 ns | 558 ns .. 560 ns | per elem |
| invert | fp127/invert | fp127 | per-element | 576 ns | 575 ns .. 577 ns | per elem |
| pow_p34 | fp127/pow_p34 (x^(2^125-1)) | fp127 | per-element | 579 ns | 575 ns .. 583 ns | per elem |
| sqrt_ratio | fp127/sqrt_ratio | fp127 | per-element | 587 ns | 586 ns .. 589 ns | per elem |
group ops
253 benchmarks
| operation | benchmark | family | mode | time | 95% CI | unit |
|---|---|---|---|---|---|---|
| prepare | binary.109/mode=batch,n=1024 | gf2_109 | batch | 160 ns | 159 ns .. 160 ns | per elem |
| prepare | binary.109/mode=indep | gf2_109 | per-element | 162 ns | 161 ns .. 162 ns | per elem |
| prepare | binary-lambda.109/mode=batch,n=1024 | gf2_109-lambda | batch | 245 ns | 245 ns .. 246 ns | per elem |
| prepare | binary-lambda.109/mode=indep | gf2_109-lambda | per-element | 4.43 µs | 4.43 µs .. 4.44 µs | per elem |
| prepare | binary-u.109/mode=batch,n=1024 | gf2_109-u | batch | 1.26 ns | 1.24 ns .. 1.28 ns | per elem |
| prepare | binary-u.109/mode=indep | gf2_109-u | per-element | 0.55 ns | 0.55 ns .. 0.56 ns | per elem |
| prepare | binary-w.109/mode=batch,n=1024 | gf2_109-w | batch | 1.24 ns | 1.23 ns .. 1.26 ns | per elem |
| prepare | binary-w.109/mode=indep | gf2_109-w | per-element | 0.55 ns | 0.54 ns .. 0.55 ns | per elem |
| prepare | binary.122/mode=batch,n=1024 | gf2_122 | batch | 84.3 ns | 84.2 ns .. 84.4 ns | per elem |
| prepare | binary.122/mode=indep | gf2_122 | per-element | 85.1 ns | 85.0 ns .. 85.3 ns | per elem |
| prepare | binary.122-gls/mode=batch,n=1024 | gf2_122-gls | batch | 61.2 ns | 61.0 ns .. 61.4 ns | per elem |
| prepare | binary.122-gls/mode=indep | gf2_122-gls | per-element | 60.9 ns | 60.7 ns .. 61.1 ns | per elem |
| prepare | binary-lambda.122-gls/mode=batch,n=1024 | gf2_122-gls-lambda | batch | 153 ns | 153 ns .. 154 ns | per elem |
| prepare | binary-lambda.122-gls/mode=indep | gf2_122-gls-lambda | per-element | 546 ns | 545 ns .. 548 ns | per elem |
| prepare | binary-u.122-gls/mode=batch,n=1024 | gf2_122-gls-u | batch | 1.29 ns | 1.28 ns .. 1.30 ns | per elem |
| prepare | binary-u.122-gls/mode=indep | gf2_122-gls-u | per-element | 0.55 ns | 0.55 ns .. 0.56 ns | per elem |
| prepare | binary-w.122-gls/mode=batch,n=1024 | gf2_122-gls-w | batch | 1.27 ns | 1.26 ns .. 1.28 ns | per elem |
| prepare | binary-w.122-gls/mode=indep | gf2_122-gls-w | per-element | 0.56 ns | 0.56 ns .. 0.56 ns | per elem |
| prepare | binary-lambda.122/mode=batch,n=1024 | gf2_122-lambda | batch | 152 ns | 151 ns .. 152 ns | per elem |
| prepare | binary-lambda.122/mode=indep | gf2_122-lambda | per-element | 542 ns | 541 ns .. 543 ns | per elem |
| prepare | binary-u.122/mode=batch,n=1024 | gf2_122-u | batch | 1.31 ns | 1.29 ns .. 1.34 ns | per elem |
| prepare | binary-u.122/mode=indep | gf2_122-u | per-element | 0.57 ns | 0.56 ns .. 0.58 ns | per elem |
| prepare | binary-w.122/mode=batch,n=1024 | gf2_122-w | batch | 1.25 ns | 1.23 ns .. 1.27 ns | per elem |
| prepare | binary-w.122/mode=indep | gf2_122-w | per-element | 0.55 ns | 0.54 ns .. 0.55 ns | per elem |
| prepare | binary.127/mode=batch,n=1024 | gf2_127 | batch | 55.2 ns | 55.1 ns .. 55.3 ns | per elem |
| prepare | binary.127/mode=indep | gf2_127 | per-element | 57.5 ns | 57.2 ns .. 57.9 ns | per elem |
| prepare | binary-lambda.127/mode=batch,n=1024 | gf2_127-lambda | batch | 120 ns | 119 ns .. 120 ns | per elem |
| prepare | binary-lambda.127/mode=indep | gf2_127-lambda | per-element | 618 ns | 614 ns .. 622 ns | per elem |
| prepare | binary-u.127/mode=batch,n=1024 | gf2_127-u | batch | 1.32 ns | 1.31 ns .. 1.33 ns | per elem |
| prepare | binary-u.127/mode=indep | gf2_127-u | per-element | 0.56 ns | 0.55 ns .. 0.56 ns | per elem |
| prepare | binary-w.127/mode=batch,n=1024 | gf2_127-w | batch | 1.28 ns | 1.27 ns .. 1.30 ns | per elem |
| prepare | binary-w.127/mode=indep | gf2_127-w | per-element | 0.55 ns | 0.55 ns .. 0.56 ns | per elem |
| prepare | edwards.127/mode=batch,n=1024 | edwards127 | batch | 38.0 ns | 37.9 ns .. 38.1 ns | per elem |
| prepare | edwards.127/mode=batch,n=64 | edwards127 | batch | 50.4 ns | 50.3 ns .. 50.5 ns | per elem |
| prepare | edwards.127/mode=batch,n=8 | edwards127 | batch | 124 ns | 124 ns .. 124 ns | per elem |
| prepare | edwards.127/mode=indep | edwards127 | per-element | 635 ns | 634 ns .. 637 ns | per elem |
| prepare | weier.127/mode=batch,n=1024 | weier127 | batch | 0.87 ns | 0.87 ns .. 0.87 ns | per elem |
| prepare | weier.127/mode=batch,n=64 | weier127 | batch | 1.13 ns | 1.13 ns .. 1.14 ns | per elem |
| prepare | weier.127/mode=batch,n=8 | weier127 | batch | 1.33 ns | 1.32 ns .. 1.34 ns | per elem |
| prepare | weier.127/mode=indep | weier127 | per-element | 0.79 ns | 0.79 ns .. 0.80 ns | per elem |
| prepare | weier-jacobian.127/mode=batch,n=1024 | weier127-jacobian | batch | 0.88 ns | 0.87 ns .. 0.88 ns | per elem |
| prepare | weier-jacobian.127/mode=batch,n=64 | weier127-jacobian | batch | 1.12 ns | 1.12 ns .. 1.13 ns | per elem |
| prepare | weier-jacobian.127/mode=batch,n=8 | weier127-jacobian | batch | 1.32 ns | 1.32 ns .. 1.33 ns | per elem |
| prepare | weier-jacobian.127/mode=indep | weier127-jacobian | per-element | 0.80 ns | 0.79 ns .. 0.80 ns | per elem |
| add | xor-sha256/xor 32B, 1 accumulator | xor | latency | 0.21 ns | 0.20 ns .. 0.21 ns | per elem |
| add | xor-sha256/xor 32B, 8 accumulators | xor | throughput | 0.51 ns | 0.50 ns .. 0.51 ns | per elem |
| add | binary.109/mode=latency | gf2_109 | latency | 676 ns | 675 ns .. 677 ns | per elem |
| add | binary.109/mode=throughput | gf2_109 | throughput | 676 ns | 675 ns .. 677 ns | per elem |
| add | gf2_109/extended += affine, 8 accumulators | gf2_109 | throughput | 833 ns | 832 ns .. 835 ns | per elem |
| add | binary-lambda.109/mode=latency | gf2_109-lambda | latency | 549 ns | 549 ns .. 550 ns | per elem |
| add | binary-lambda.109/mode=throughput | gf2_109-lambda | throughput | 545 ns | 543 ns .. 546 ns | per elem |
| add | binary-u.109/mode=latency | gf2_109-u | latency | 494 ns | 494 ns .. 495 ns | per elem |
| add | binary-u.109/mode=throughput | gf2_109-u | throughput | 488 ns | 487 ns .. 489 ns | per elem |
| add | binary-w.109/mode=latency | gf2_109-w | latency | 550 ns | 549 ns .. 551 ns | per elem |
| add | binary-w.109/mode=throughput | gf2_109-w | throughput | 541 ns | 541 ns .. 542 ns | per elem |
| add | binary.122/mode=latency | gf2_122 | latency | 393 ns | 393 ns .. 394 ns | per elem |
| add | binary.122/mode=throughput | gf2_122 | throughput | 390 ns | 389 ns .. 390 ns | per elem |
| add | gf2_122/extended += affine, 8 accumulators | gf2_122 | throughput | 485 ns | 483 ns .. 488 ns | per elem |
| add | binary.122-gls/mode=latency | gf2_122-gls | latency | 373 ns | 372 ns .. 374 ns | per elem |
| add | binary.122-gls/mode=throughput | gf2_122-gls | throughput | 370 ns | 369 ns .. 371 ns | per elem |
| add | gf2_122-gls/extended += affine, 8 accumulators | gf2_122-gls | throughput | 435 ns | 433 ns .. 436 ns | per elem |
| add | binary-lambda.122-gls/mode=latency | gf2_122-gls-lambda | latency | 313 ns | 312 ns .. 314 ns | per elem |
| add | binary-lambda.122-gls/mode=throughput | gf2_122-gls-lambda | throughput | 310 ns | 309 ns .. 311 ns | per elem |
| add | binary-u.122-gls/mode=latency | gf2_122-gls-u | latency | 281 ns | 279 ns .. 284 ns | per elem |
| add | binary-u.122-gls/mode=throughput | gf2_122-gls-u | throughput | 276 ns | 275 ns .. 277 ns | per elem |
| add | binary-w.122-gls/mode=latency | gf2_122-gls-w | latency | 313 ns | 312 ns .. 314 ns | per elem |
| add | binary-w.122-gls/mode=throughput | gf2_122-gls-w | throughput | 310 ns | 309 ns .. 311 ns | per elem |
| add | binary-lambda.122/mode=latency | gf2_122-lambda | latency | 309 ns | 308 ns .. 309 ns | per elem |
| add | binary-lambda.122/mode=throughput | gf2_122-lambda | throughput | 307 ns | 306 ns .. 308 ns | per elem |
| add | binary-u.122/mode=latency | gf2_122-u | latency | 280 ns | 279 ns .. 281 ns | per elem |
| add | binary-u.122/mode=throughput | gf2_122-u | throughput | 277 ns | 276 ns .. 278 ns | per elem |
| add | binary-w.122/mode=latency | gf2_122-w | latency | 310 ns | 309 ns .. 311 ns | per elem |
| add | binary-w.122/mode=throughput | gf2_122-w | throughput | 307 ns | 307 ns .. 307 ns | per elem |
| add | binary.127/mode=latency | gf2_127 | latency | 307 ns | 306 ns .. 307 ns | per elem |
| add | binary.127/mode=throughput | gf2_127 | throughput | 307 ns | 307 ns .. 308 ns | per elem |
| add | gf2_127/extended += affine, 8 accumulators | gf2_127 | throughput | 385 ns | 383 ns .. 387 ns | per elem |
| add | binary-lambda.127/mode=latency | gf2_127-lambda | latency | 253 ns | 251 ns .. 256 ns | per elem |
| add | binary-lambda.127/mode=throughput | gf2_127-lambda | throughput | 249 ns | 247 ns .. 250 ns | per elem |
| add | binary-u.127/mode=latency | gf2_127-u | latency | 222 ns | 222 ns .. 223 ns | per elem |
| add | binary-u.127/mode=throughput | gf2_127-u | throughput | 220 ns | 219 ns .. 220 ns | per elem |
| add | binary-w.127/mode=latency | gf2_127-w | latency | 253 ns | 252 ns .. 255 ns | per elem |
| add | binary-w.127/mode=throughput | gf2_127-w | throughput | 249 ns | 247 ns .. 250 ns | per elem |
| add | edwards.127/mode=latency | edwards127 | latency | 32.5 ns | 32.4 ns .. 32.7 ns | per elem |
| add | edwards.127/mode=throughput | edwards127 | throughput | 26.9 ns | 26.8 ns .. 27.0 ns | per elem |
| add | edwards127/+= montgomery affine, 8 accumulators | edwards127 | throughput | 48.2 ns | 48.1 ns .. 48.4 ns | per elem |
| add | weier.127/mode=latency | weier127 | latency | 63.2 ns | 63.0 ns .. 63.5 ns | per elem |
| add | weier.127/mode=throughput | weier127 | throughput | 58.1 ns | 57.9 ns .. 58.2 ns | per elem |
| add | weier-jacobian.127/mode=latency | weier127-jacobian | latency | 55.3 ns | 55.2 ns .. 55.4 ns | per elem |
| add | weier-jacobian.127/mode=throughput | weier127-jacobian | throughput | 47.3 ns | 47.3 ns .. 47.4 ns | per elem |
| subtract | edwards.127/mode=throughput | edwards127 | throughput | 28.8 ns | 28.8 ns .. 28.9 ns | per elem |
| subtract | weier.127/mode=throughput | weier127 | throughput | 58.8 ns | 58.6 ns .. 58.9 ns | per elem |
| subtract | weier-jacobian.127/mode=throughput | weier127-jacobian | throughput | 48.6 ns | 48.5 ns .. 48.7 ns | per elem |
| negate | binary.109 | gf2_109 | per-element | 1.23 ns | 1.22 ns .. 1.23 ns | per elem |
| negate | gf2_109/affine (y += x) | gf2_109 | per-element | 0.63 ns | 0.62 ns .. 0.63 ns | per elem |
| negate | binary-lambda.109 | gf2_109-lambda | per-element | 0.56 ns | 0.55 ns .. 0.56 ns | per elem |
| negate | binary-u.109 | gf2_109-u | per-element | 0.62 ns | 0.62 ns .. 0.62 ns | per elem |
| negate | binary-w.109 | gf2_109-w | per-element | 0.56 ns | 0.55 ns .. 0.56 ns | per elem |
| negate | binary.122 | gf2_122 | per-element | 1.23 ns | 1.23 ns .. 1.23 ns | per elem |
| negate | gf2_122/affine (y += x) | gf2_122 | per-element | 0.63 ns | 0.63 ns .. 0.64 ns | per elem |
| negate | binary.122-gls | gf2_122-gls | per-element | 1.24 ns | 1.23 ns .. 1.24 ns | per elem |
| negate | binary-lambda.122-gls | gf2_122-gls-lambda | per-element | 0.58 ns | 0.57 ns .. 0.58 ns | per elem |
| negate | binary-u.122-gls | gf2_122-gls-u | per-element | 0.62 ns | 0.62 ns .. 0.62 ns | per elem |
| negate | binary-w.122-gls | gf2_122-gls-w | per-element | 0.56 ns | 0.56 ns .. 0.57 ns | per elem |
| negate | binary-lambda.122 | gf2_122-lambda | per-element | 0.55 ns | 0.55 ns .. 0.56 ns | per elem |
| negate | binary-u.122 | gf2_122-u | per-element | 0.62 ns | 0.62 ns .. 0.62 ns | per elem |
| negate | binary-w.122 | gf2_122-w | per-element | 0.56 ns | 0.55 ns .. 0.56 ns | per elem |
| negate | binary.127 | gf2_127 | per-element | 1.24 ns | 1.24 ns .. 1.24 ns | per elem |
| negate | gf2_127/affine (y += x) | gf2_127 | per-element | 0.63 ns | 0.62 ns .. 0.63 ns | per elem |
| negate | binary-lambda.127 | gf2_127-lambda | per-element | 0.56 ns | 0.56 ns .. 0.57 ns | per elem |
| negate | binary-u.127 | gf2_127-u | per-element | 0.62 ns | 0.61 ns .. 0.62 ns | per elem |
| negate | binary-w.127 | gf2_127-w | per-element | 0.57 ns | 0.56 ns .. 0.57 ns | per elem |
| negate | edwards.127 | edwards127 | per-element | 2.16 ns | 2.16 ns .. 2.17 ns | per elem |
| negate | edwards127/extended (-X, -T) | edwards127 | per-element | 2.41 ns | 2.39 ns .. 2.43 ns | per elem |
| negate | weier.127 | weier127 | per-element | 1.18 ns | 1.18 ns .. 1.18 ns | per elem |
| negate | weier127/projective (-Y) | weier127 | per-element | 1.39 ns | 1.38 ns .. 1.39 ns | per elem |
| negate | weier-jacobian.127 | weier127-jacobian | per-element | 1.18 ns | 1.18 ns .. 1.18 ns | per elem |
| is identity | binary.109 | gf2_109 | per-element | 0.95 ns | 0.95 ns .. 0.95 ns | per elem |
| is identity | binary-lambda.109 | gf2_109-lambda | per-element | 0.89 ns | 0.89 ns .. 0.89 ns | per elem |
| is identity | binary-u.109 | gf2_109-u | per-element | 0.89 ns | 0.89 ns .. 0.89 ns | per elem |
| is identity | binary-w.109 | gf2_109-w | per-element | 0.89 ns | 0.89 ns .. 0.89 ns | per elem |
| is identity | binary.122 | gf2_122 | per-element | 0.99 ns | 0.99 ns .. 0.99 ns | per elem |
| is identity | binary.122-gls | gf2_122-gls | per-element | 0.99 ns | 0.99 ns .. 1.00 ns | per elem |
| is identity | binary-lambda.122-gls | gf2_122-gls-lambda | per-element | 1.02 ns | 1.02 ns .. 1.03 ns | per elem |
| is identity | binary-u.122-gls | gf2_122-gls-u | per-element | 1.01 ns | 1.00 ns .. 1.02 ns | per elem |
| is identity | binary-w.122-gls | gf2_122-gls-w | per-element | 0.99 ns | 0.99 ns .. 0.99 ns | per elem |
| is identity | binary-lambda.122 | gf2_122-lambda | per-element | 0.98 ns | 0.98 ns .. 0.98 ns | per elem |
| is identity | binary-u.122 | gf2_122-u | per-element | 1.00 ns | 1.00 ns .. 1.01 ns | per elem |
| is identity | binary-w.122 | gf2_122-w | per-element | 0.99 ns | 0.99 ns .. 1.00 ns | per elem |
| is identity | binary.127 | gf2_127 | per-element | 0.87 ns | 0.86 ns .. 0.87 ns | per elem |
| is identity | binary-lambda.127 | gf2_127-lambda | per-element | 0.81 ns | 0.81 ns .. 0.82 ns | per elem |
| is identity | binary-u.127 | gf2_127-u | per-element | 0.79 ns | 0.78 ns .. 0.79 ns | per elem |
| is identity | binary-w.127 | gf2_127-w | per-element | 0.80 ns | 0.80 ns .. 0.80 ns | per elem |
| is identity | edwards.127 | edwards127 | per-element | 1.12 ns | 1.12 ns .. 1.12 ns | per elem |
| is identity | weier.127 | weier127 | per-element | 0.40 ns | 0.40 ns .. 0.40 ns | per elem |
| is identity | weier-jacobian.127 | weier127-jacobian | per-element | 0.40 ns | 0.40 ns .. 0.40 ns | per elem |
| equals addend | binary.109/mode=mismatch | gf2_109 | mismatch | 122 ns | 121 ns .. 122 ns | per elem |
| equals addend | binary-lambda.109/mode=mismatch | gf2_109-lambda | mismatch | 62.5 ns | 62.4 ns .. 62.6 ns | per elem |
| equals addend | binary-u.109/mode=mismatch | gf2_109-u | mismatch | 184 ns | 183 ns .. 184 ns | per elem |
| equals addend | binary-w.109/mode=mismatch | gf2_109-w | mismatch | 62.4 ns | 62.3 ns .. 62.5 ns | per elem |
| equals addend | binary.122/mode=mismatch | gf2_122 | mismatch | 76.5 ns | 76.4 ns .. 76.6 ns | per elem |
| equals addend | binary.122-gls/mode=mismatch | gf2_122-gls | mismatch | 77.1 ns | 76.9 ns .. 77.3 ns | per elem |
| equals addend | binary-lambda.122-gls/mode=mismatch | gf2_122-gls-lambda | mismatch | 43.8 ns | 43.6 ns .. 43.9 ns | per elem |
| equals addend | binary-u.122-gls/mode=mismatch | gf2_122-gls-u | mismatch | 116 ns | 116 ns .. 117 ns | per elem |
| equals addend | binary-w.122-gls/mode=mismatch | gf2_122-gls-w | mismatch | 43.0 ns | 42.9 ns .. 43.1 ns | per elem |
| equals addend | binary-lambda.122/mode=mismatch | gf2_122-lambda | mismatch | 42.8 ns | 42.7 ns .. 42.8 ns | per elem |
| equals addend | binary-u.122/mode=mismatch | gf2_122-u | mismatch | 119 ns | 119 ns .. 119 ns | per elem |
| equals addend | binary-w.122/mode=mismatch | gf2_122-w | mismatch | 42.9 ns | 42.8 ns .. 42.9 ns | per elem |
| equals addend | binary.127/mode=mismatch | gf2_127 | mismatch | 54.7 ns | 54.6 ns .. 55.0 ns | per elem |
| equals addend | binary-lambda.127/mode=mismatch | gf2_127-lambda | mismatch | 30.6 ns | 30.4 ns .. 30.8 ns | per elem |
| equals addend | binary-u.127/mode=mismatch | gf2_127-u | mismatch | 89.9 ns | 89.6 ns .. 90.3 ns | per elem |
| equals addend | binary-w.127/mode=mismatch | gf2_127-w | mismatch | 30.0 ns | 29.9 ns .. 30.2 ns | per elem |
| equals addend | edwards.127/mode=match | edwards127 | match | 5.59 ns | 5.56 ns .. 5.63 ns | per elem |
| equals addend | edwards.127/mode=mismatch | edwards127 | mismatch | 3.16 ns | 3.16 ns .. 3.17 ns | per elem |
| equals addend | weier.127/mode=match | weier127 | match | 5.93 ns | 5.91 ns .. 5.95 ns | per elem |
| equals addend | weier.127/mode=mismatch | weier127 | mismatch | 3.35 ns | 3.34 ns .. 3.36 ns | per elem |
| equals addend | weier-jacobian.127/mode=match | weier127-jacobian | match | 13.3 ns | 13.3 ns .. 13.4 ns | per elem |
| equals addend | weier-jacobian.127/mode=mismatch | weier127-jacobian | mismatch | 6.62 ns | 6.60 ns .. 6.63 ns | per elem |
| encode | binary.109/mode=batch,n=1024 | gf2_109 | batch | 500 ns | 499 ns .. 500 ns | per elem |
| encode | binary.109/mode=indep | gf2_109 | per-element | 4.70 µs | 4.69 µs .. 4.71 µs | per elem |
| encode | binary-lambda.109/mode=batch,n=1024 | gf2_109-lambda | batch | 371 ns | 370 ns .. 372 ns | per elem |
| encode | binary-lambda.109/mode=indep | gf2_109-lambda | per-element | 4.57 µs | 4.57 µs .. 4.58 µs | per elem |
| encode | binary-u.109/mode=batch,n=1024 | gf2_109-u | batch | 343 ns | 343 ns .. 344 ns | per elem |
| encode | binary-u.109/mode=indep | gf2_109-u | per-element | 4.53 µs | 4.52 µs .. 4.53 µs | per elem |
| encode | binary-w.109/mode=batch,n=1024 | gf2_109-w | batch | 343 ns | 343 ns .. 344 ns | per elem |
| encode | binary-w.109/mode=indep | gf2_109-w | per-element | 4.57 µs | 4.56 µs .. 4.57 µs | per elem |
| encode | binary.122/mode=batch,n=1024 | gf2_122 | batch | 286 ns | 285 ns .. 286 ns | per elem |
| encode | binary.122/mode=indep | gf2_122 | per-element | 672 ns | 671 ns .. 673 ns | per elem |
| encode | binary.122-gls/mode=batch,n=1024 | gf2_122-gls | batch | 270 ns | 269 ns .. 272 ns | per elem |
| encode | binary.122-gls/mode=indep | gf2_122-gls | per-element | 654 ns | 653 ns .. 655 ns | per elem |
| encode | binary-lambda.122-gls/mode=batch,n=1024 | gf2_122-gls-lambda | batch | 242 ns | 241 ns .. 243 ns | per elem |
| encode | binary-lambda.122-gls/mode=indep | gf2_122-gls-lambda | per-element | 639 ns | 636 ns .. 643 ns | per elem |
| encode | binary-u.122-gls/mode=batch,n=1024 | gf2_122-gls-u | batch | 200 ns | 200 ns .. 201 ns | per elem |
| encode | binary-u.122-gls/mode=indep | gf2_122-gls-u | per-element | 598 ns | 596 ns .. 600 ns | per elem |
| encode | binary-w.122-gls/mode=batch,n=1024 | gf2_122-gls-w | batch | 198 ns | 197 ns .. 199 ns | per elem |
| encode | binary-w.122-gls/mode=indep | gf2_122-gls-w | per-element | 595 ns | 592 ns .. 597 ns | per elem |
| encode | binary-lambda.122/mode=batch,n=1024 | gf2_122-lambda | batch | 234 ns | 233 ns .. 234 ns | per elem |
| encode | binary-lambda.122/mode=indep | gf2_122-lambda | per-element | 624 ns | 623 ns .. 625 ns | per elem |
| encode | binary-u.122/mode=batch,n=1024 | gf2_122-u | batch | 202 ns | 201 ns .. 203 ns | per elem |
| encode | binary-u.122/mode=indep | gf2_122-u | per-element | 610 ns | 607 ns .. 613 ns | per elem |
| encode | binary-w.122/mode=batch,n=1024 | gf2_122-w | batch | 200 ns | 198 ns .. 201 ns | per elem |
| encode | binary-w.122/mode=indep | gf2_122-w | per-element | 590 ns | 589 ns .. 591 ns | per elem |
| encode | binary.127/mode=batch,n=1024 | gf2_127 | batch | 214 ns | 213 ns .. 215 ns | per elem |
| encode | binary.127/mode=indep | gf2_127 | per-element | 709 ns | 707 ns .. 711 ns | per elem |
| encode | binary-lambda.127/mode=batch,n=1024 | gf2_127-lambda | batch | 172 ns | 171 ns .. 174 ns | per elem |
| encode | binary-lambda.127/mode=indep | gf2_127-lambda | per-element | 671 ns | 667 ns .. 674 ns | per elem |
| encode | binary-u.127/mode=batch,n=1024 | gf2_127-u | batch | 150 ns | 150 ns .. 150 ns | per elem |
| encode | binary-u.127/mode=indep | gf2_127-u | per-element | 638 ns | 637 ns .. 639 ns | per elem |
| encode | binary-w.127/mode=batch,n=1024 | gf2_127-w | batch | 148 ns | 148 ns .. 149 ns | per elem |
| encode | binary-w.127/mode=indep | gf2_127-w | per-element | 655 ns | 650 ns .. 661 ns | per elem |
| encode | edwards.127/mode=batch,n=1024 | edwards127 | batch | 30.1 ns | 30.1 ns .. 30.2 ns | per elem |
| encode | edwards.127/mode=batch,n=64 | edwards127 | batch | 42.7 ns | 42.5 ns .. 42.9 ns | per elem |
| encode | edwards.127/mode=batch,n=8 | edwards127 | batch | 114 ns | 114 ns .. 114 ns | per elem |
| encode | edwards.127/mode=indep | edwards127 | per-element | 602 ns | 600 ns .. 603 ns | per elem |
| encode | weier.127/mode=batch,n=1024 | weier127 | batch | 15.9 ns | 15.9 ns .. 16.0 ns | per elem |
| encode | weier.127/mode=batch,n=64 | weier127 | batch | 28.0 ns | 27.9 ns .. 28.1 ns | per elem |
| encode | weier.127/mode=batch,n=8 | weier127 | batch | 101 ns | 101 ns .. 101 ns | per elem |
| encode | weier.127/mode=indep | weier127 | per-element | 587 ns | 586 ns .. 587 ns | per elem |
| encode | weier-jacobian.127/mode=batch,n=1024 | weier127-jacobian | batch | 22.5 ns | 22.5 ns .. 22.6 ns | per elem |
| encode | weier-jacobian.127/mode=batch,n=64 | weier127-jacobian | batch | 35.1 ns | 35.0 ns .. 35.2 ns | per elem |
| encode | weier-jacobian.127/mode=batch,n=8 | weier127-jacobian | batch | 107 ns | 107 ns .. 107 ns | per elem |
| encode | weier-jacobian.127/mode=indep | weier127-jacobian | per-element | 593 ns | 592 ns .. 594 ns | per elem |
| decode | binary.109/mode=batch,n=1024 | gf2_109 | batch | 421 ns | 420 ns .. 422 ns | per elem |
| decode | binary.109/mode=indep | gf2_109 | per-element | 4.60 µs | 4.59 µs .. 4.60 µs | per elem |
| decode | binary-lambda.109/mode=batch,n=1024 | gf2_109-lambda | batch | 424 ns | 422 ns .. 426 ns | per elem |
| decode | binary-lambda.109/mode=indep | gf2_109-lambda | per-element | 4.61 µs | 4.60 µs .. 4.62 µs | per elem |
| decode | binary-u.109/mode=batch,n=1024 | gf2_109-u | batch | 519 ns | 519 ns .. 520 ns | per elem |
| decode | binary-u.109/mode=indep | gf2_109-u | per-element | 4.74 µs | 4.73 µs .. 4.75 µs | per elem |
| decode | binary-w.109/mode=batch,n=1024 | gf2_109-w | batch | 400 ns | 400 ns .. 401 ns | per elem |
| decode | binary-w.109/mode=indep | gf2_109-w | per-element | 4.60 µs | 4.60 µs .. 4.61 µs | per elem |
| decode | binary.122/mode=batch,n=1024 | gf2_122 | batch | 256 ns | 256 ns .. 256 ns | per elem |
| decode | binary.122/mode=indep | gf2_122 | per-element | 645 ns | 645 ns .. 646 ns | per elem |
| decode | binary.122-gls/mode=batch,n=1024 | gf2_122-gls | batch | 229 ns | 228 ns .. 230 ns | per elem |
| decode | binary.122-gls/mode=indep | gf2_122-gls | per-element | 649 ns | 645 ns .. 653 ns | per elem |
| decode | binary-lambda.122-gls/mode=batch,n=1024 | gf2_122-gls-lambda | batch | 228 ns | 227 ns .. 228 ns | per elem |
| decode | binary-lambda.122-gls/mode=indep | gf2_122-gls-lambda | per-element | 633 ns | 632 ns .. 635 ns | per elem |
| decode | binary-u.122-gls/mode=batch,n=1024 | gf2_122-gls-u | batch | 272 ns | 271 ns .. 273 ns | per elem |
| decode | binary-u.122-gls/mode=indep | gf2_122-gls-u | per-element | 673 ns | 672 ns .. 675 ns | per elem |
| decode | binary-w.122-gls/mode=batch,n=1024 | gf2_122-gls-w | batch | 203 ns | 202 ns .. 204 ns | per elem |
| decode | binary-w.122-gls/mode=indep | gf2_122-gls-w | per-element | 598 ns | 596 ns .. 599 ns | per elem |
| decode | binary-lambda.122/mode=batch,n=1024 | gf2_122-lambda | batch | 256 ns | 255 ns .. 257 ns | per elem |
| decode | binary-lambda.122/mode=indep | gf2_122-lambda | per-element | 644 ns | 643 ns .. 645 ns | per elem |
| decode | binary-u.122/mode=batch,n=1024 | gf2_122-u | batch | 309 ns | 308 ns .. 310 ns | per elem |
| decode | binary-u.122/mode=indep | gf2_122-u | per-element | 707 ns | 705 ns .. 710 ns | per elem |
| decode | binary-w.122/mode=batch,n=1024 | gf2_122-w | batch | 216 ns | 214 ns .. 218 ns | per elem |
| decode | binary-w.122/mode=indep | gf2_122-w | per-element | 613 ns | 612 ns .. 614 ns | per elem |
| decode | binary.127/mode=batch,n=1024 | gf2_127 | batch | 167 ns | 165 ns .. 168 ns | per elem |
| decode | binary.127/mode=indep | gf2_127 | per-element | 659 ns | 656 ns .. 662 ns | per elem |
| decode | binary-lambda.127/mode=batch,n=1024 | gf2_127-lambda | batch | 163 ns | 162 ns .. 164 ns | per elem |
| decode | binary-lambda.127/mode=indep | gf2_127-lambda | per-element | 678 ns | 675 ns .. 682 ns | per elem |
| decode | binary-u.127/mode=batch,n=1024 | gf2_127-u | batch | 227 ns | 227 ns .. 227 ns | per elem |
| decode | binary-u.127/mode=indep | gf2_127-u | per-element | 731 ns | 730 ns .. 732 ns | per elem |
| decode | binary-w.127/mode=batch,n=1024 | gf2_127-w | batch | 170 ns | 169 ns .. 170 ns | per elem |
| decode | binary-w.127/mode=indep | gf2_127-w | per-element | 683 ns | 680 ns .. 686 ns | per elem |
| decode | edwards.127/mode=batch,n=1024 | edwards127 | batch | 576 ns | 575 ns .. 578 ns | per elem |
| decode | edwards.127/mode=batch,n=64 | edwards127 | batch | 573 ns | 572 ns .. 574 ns | per elem |
| decode | edwards.127/mode=batch,n=8 | edwards127 | batch | 575 ns | 574 ns .. 575 ns | per elem |
| decode | edwards.127/mode=indep | edwards127 | per-element | 575 ns | 573 ns .. 577 ns | per elem |
| decode | weier.127/mode=batch,n=1024 | weier127 | batch | 573 ns | 572 ns .. 574 ns | per elem |
| decode | weier.127/mode=batch,n=64 | weier127 | batch | 576 ns | 574 ns .. 577 ns | per elem |
| decode | weier.127/mode=batch,n=8 | weier127 | batch | 577 ns | 575 ns .. 578 ns | per elem |
| decode | weier.127/mode=indep | weier127 | per-element | 574 ns | 573 ns .. 575 ns | per elem |
| decode | weier-jacobian.127/mode=batch,n=1024 | weier127-jacobian | batch | 574 ns | 573 ns .. 575 ns | per elem |
| decode | weier-jacobian.127/mode=batch,n=64 | weier127-jacobian | batch | 579 ns | 577 ns .. 581 ns | per elem |
| decode | weier-jacobian.127/mode=batch,n=8 | weier127-jacobian | batch | 576 ns | 574 ns .. 577 ns | per elem |
| decode | weier-jacobian.127/mode=indep | weier127-jacobian | per-element | 574 ns | 573 ns .. 575 ns | per elem |
| normalize | gf2_109/normalize, batched | gf2_109 | batch | 500 ns | 499 ns .. 502 ns | per elem |
| normalize | gf2_122/normalize, batched | gf2_122 | batch | 286 ns | 284 ns .. 288 ns | per elem |
| normalize | gf2_122-gls/normalize, batched | gf2_122-gls | batch | 265 ns | 264 ns .. 266 ns | per elem |
| batch sum | gf2_109/batch affine (tree sum) | gf2_109 | batch | 393 ns | 391 ns .. 394 ns | per elem |
| batch sum | gf2_122/batch affine (tree sum) | gf2_122 | batch | 215 ns | 214 ns .. 216 ns | per elem |
| batch sum | gf2_127/batch affine (tree sum) | gf2_127 | batch | 169 ns | 168 ns .. 169 ns | per elem |
| batch sum | edwards127/batch montgomery affine (tree sum) | edwards127 | batch | 40.0 ns | 39.9 ns .. 40.1 ns | per elem |
| batch sum | weier127/batch affine (tree sum) | weier127 | batch | 39.3 ns | 39.0 ns .. 39.5 ns | per elem |
hash to curve
Figure
81 benchmarks
| operation | benchmark | family | mode | time | 95% CI | unit |
|---|---|---|---|---|---|---|
| hash to curve | binary.109/mode=batch,n=1024 | gf2_109 | batch | 814 ns | 813 ns .. 816 ns | per elem |
| hash to curve | binary.109/mode=indep | gf2_109 | per-element | 9.10 µs | 9.09 µs .. 9.12 µs | per elem |
| hash to curve | binary-lambda.109/mode=batch,n=1024 | gf2_109-lambda | batch | 814 ns | 813 ns .. 815 ns | per elem |
| hash to curve | binary-lambda.109/mode=indep | gf2_109-lambda | per-element | 9.08 µs | 9.07 µs .. 9.09 µs | per elem |
| hash to curve | binary-u.109/mode=batch,n=1024 | gf2_109-u | batch | 927 ns | 926 ns .. 928 ns | per elem |
| hash to curve | binary-u.109/mode=indep | gf2_109-u | per-element | 9.08 µs | 9.07 µs .. 9.10 µs | per elem |
| hash to curve | binary-w.109/mode=batch,n=1024 | gf2_109-w | batch | 805 ns | 804 ns .. 807 ns | per elem |
| hash to curve | binary-w.109/mode=indep | gf2_109-w | per-element | 8.98 µs | 8.96 µs .. 9.00 µs | per elem |
| hash to curve | binary.122/mode=batch,n=1024 | gf2_122 | batch | 488 ns | 487 ns .. 489 ns | per elem |
| hash to curve | binary.122/mode=indep | gf2_122 | per-element | 1.27 µs | 1.27 µs .. 1.27 µs | per elem |
| hash to curve | binary.122-gls/mode=batch,n=1024 | gf2_122-gls | batch | 456 ns | 455 ns .. 458 ns | per elem |
| hash to curve | binary.122-gls/mode=indep | gf2_122-gls | per-element | 1.27 µs | 1.27 µs .. 1.27 µs | per elem |
| hash to curve | binary-lambda.122-gls/mode=batch,n=1024 | gf2_122-gls-lambda | batch | 455 ns | 453 ns .. 457 ns | per elem |
| hash to curve | binary-lambda.122-gls/mode=indep | gf2_122-gls-lambda | per-element | 1.26 µs | 1.26 µs .. 1.27 µs | per elem |
| hash to curve | binary-u.122-gls/mode=batch,n=1024 | gf2_122-gls-u | batch | 513 ns | 511 ns .. 515 ns | per elem |
| hash to curve | binary-u.122-gls/mode=indep | gf2_122-gls-u | per-element | 1.31 µs | 1.31 µs .. 1.31 µs | per elem |
| hash to curve | binary-w.122-gls/mode=batch,n=1024 | gf2_122-gls-w | batch | 444 ns | 442 ns .. 446 ns | per elem |
| hash to curve | binary-w.122-gls/mode=indep | gf2_122-gls-w | per-element | 1.24 µs | 1.24 µs .. 1.24 µs | per elem |
| hash to curve | binary-lambda.122/mode=batch,n=1024 | gf2_122-lambda | batch | 487 ns | 486 ns .. 488 ns | per elem |
| hash to curve | binary-lambda.122/mode=indep | gf2_122-lambda | per-element | 1.27 µs | 1.27 µs .. 1.27 µs | per elem |
| hash to curve | binary-u.122/mode=batch,n=1024 | gf2_122-u | batch | 555 ns | 550 ns .. 560 ns | per elem |
| hash to curve | binary-u.122/mode=indep | gf2_122-u | per-element | 1.38 µs | 1.36 µs .. 1.40 µs | per elem |
| hash to curve | binary-w.122/mode=batch,n=1024 | gf2_122-w | batch | 458 ns | 457 ns .. 460 ns | per elem |
| hash to curve | binary-w.122/mode=indep | gf2_122-w | per-element | 1.24 µs | 1.24 µs .. 1.24 µs | per elem |
| hash to curve | binary.127/mode=batch,n=1024 | gf2_127 | batch | 347 ns | 345 ns .. 348 ns | per elem |
| hash to curve | binary.127/mode=indep | gf2_127 | per-element | 1.29 µs | 1.29 µs .. 1.30 µs | per elem |
| hash to curve | binary-lambda.127/mode=batch,n=1024 | gf2_127-lambda | batch | 347 ns | 345 ns .. 349 ns | per elem |
| hash to curve | binary-lambda.127/mode=indep | gf2_127-lambda | per-element | 1.30 µs | 1.29 µs .. 1.31 µs | per elem |
| hash to curve | binary-u.127/mode=batch,n=1024 | gf2_127-u | batch | 452 ns | 450 ns .. 453 ns | per elem |
| hash to curve | binary-u.127/mode=indep | gf2_127-u | per-element | 1.51 µs | 1.50 µs .. 1.51 µs | per elem |
| hash to curve | binary-w.127/mode=batch,n=1024 | gf2_127-w | batch | 391 ns | 389 ns .. 393 ns | per elem |
| hash to curve | binary-w.127/mode=indep | gf2_127-w | per-element | 1.41 µs | 1.40 µs .. 1.42 µs | per elem |
| hash to curve | edwards.127/mode=batch,n=1024 | edwards127 | batch | 1.25 µs | 1.25 µs .. 1.26 µs | per elem |
| hash to curve | edwards.127/mode=batch,n=64 | edwards127 | batch | 1.26 µs | 1.25 µs .. 1.26 µs | per elem |
| hash to curve | edwards.127/mode=batch,n=8 | edwards127 | batch | 1.26 µs | 1.26 µs .. 1.27 µs | per elem |
| hash to curve | edwards.127/mode=indep | edwards127 | per-element | 1.25 µs | 1.25 µs .. 1.25 µs | per elem |
| hash to curve | edwards127/edwards-native try-and-increment | edwards127 | per-element | 1.30 µs | 1.30 µs .. 1.30 µs | per elem |
| hash to curve | weier.127/mode=batch,n=1024 | weier127 | batch | 1.23 µs | 1.22 µs .. 1.23 µs | per elem |
| hash to curve | weier.127/mode=batch,n=64 | weier127 | batch | 1.28 µs | 1.27 µs .. 1.29 µs | per elem |
| hash to curve | weier.127/mode=batch,n=8 | weier127 | batch | 1.23 µs | 1.22 µs .. 1.23 µs | per elem |
| hash to curve | weier.127/mode=indep | weier127 | per-element | 1.22 µs | 1.22 µs .. 1.22 µs | per elem |
| hash to curve | weier-jacobian.127/mode=batch,n=1024 | weier127-jacobian | batch | 1.22 µs | 1.22 µs .. 1.22 µs | per elem |
| hash to curve | weier-jacobian.127/mode=batch,n=64 | weier127-jacobian | batch | 1.23 µs | 1.22 µs .. 1.23 µs | per elem |
| hash to curve | weier-jacobian.127/mode=batch,n=8 | weier127-jacobian | batch | 1.23 µs | 1.22 µs .. 1.23 µs | per elem |
| hash to curve | weier-jacobian.127/mode=indep | weier127-jacobian | per-element | 1.22 µs | 1.21 µs .. 1.22 µs | per elem |
| ID to addend | edwards.127/proj=fp127,h2c=elligator2,mode=batch,n=1024 | edwards127 | batch | 2.08 µs | 2.07 µs .. 2.08 µs | per elem |
| ID to addend | edwards.127/proj=fp127,h2c=ti,mode=batch,n=1024 | edwards127 | batch | 1.25 µs | 1.25 µs .. 1.25 µs | per elem |
| ID to addend | edwards.127/proj=fp127,h2c=ti-addend,mode=batch,n=1024 | edwards127 | batch | 1.28 µs | 1.28 µs .. 1.29 µs | per elem |
| ID to addend | edwards.127/proj=fp130,h2c=elligator2,mode=batch,n=1024 | edwards127 | batch | 2.08 µs | 2.07 µs .. 2.08 µs | per elem |
| ID to addend | edwards.127/proj=fp130,h2c=ti,mode=batch,n=1024 | edwards127 | batch | 1.25 µs | 1.25 µs .. 1.25 µs | per elem |
| ID to addend | edwards.127/proj=fp130,h2c=ti-addend,mode=batch,n=1024 | edwards127 | batch | 1.27 µs | 1.27 µs .. 1.28 µs | per elem |
| ID to addend | edwards.127/proj=gf2_127,h2c=elligator2,mode=batch,n=1024 | edwards127 | batch | 2.11 µs | 2.11 µs .. 2.12 µs | per elem |
| ID to addend | edwards.127/proj=gf2_127,h2c=ti,mode=batch,n=1024 | edwards127 | batch | 1.38 µs | 1.37 µs .. 1.38 µs | per elem |
| ID to addend | edwards.127/proj=gf2_127,h2c=ti-addend,mode=batch,n=1024 | edwards127 | batch | 1.39 µs | 1.39 µs .. 1.40 µs | per elem |
| ID to addend | edwards.127/proj=none,h2c=elligator2,mode=batch,n=1024 | edwards127 | batch | 2.12 µs | 2.11 µs .. 2.12 µs | per elem |
| ID to addend | edwards.127/proj=none,h2c=ti,mode=batch,n=1024 | edwards127 | batch | 1.31 µs | 1.30 µs .. 1.31 µs | per elem |
| ID to addend | edwards.127/proj=none,h2c=ti-addend,mode=batch,n=1024 | edwards127 | batch | 1.33 µs | 1.32 µs .. 1.33 µs | per elem |
| ID to addend | weier.127/proj=fp127,h2c=sswu,mode=batch,n=1024 | weier127 | batch | 1.24 µs | 1.23 µs .. 1.24 µs | per elem |
| ID to addend | weier.127/proj=fp127,h2c=ti,mode=batch,n=1024 | weier127 | batch | 1.18 µs | 1.17 µs .. 1.18 µs | per elem |
| ID to addend | weier.127/proj=fp130,h2c=sswu,mode=batch,n=1024 | weier127 | batch | 1.25 µs | 1.24 µs .. 1.25 µs | per elem |
| ID to addend | weier.127/proj=fp130,h2c=ti,mode=batch,n=1024 | weier127 | batch | 1.23 µs | 1.23 µs .. 1.23 µs | per elem |
| ID to addend | weier.127/proj=gf2_127,h2c=sswu,mode=batch,n=1024 | weier127 | batch | 1.29 µs | 1.29 µs .. 1.29 µs | per elem |
| ID to addend | weier.127/proj=gf2_127,h2c=ti,mode=batch,n=1024 | weier127 | batch | 1.34 µs | 1.33 µs .. 1.34 µs | per elem |
| ID to addend | weier.127/proj=none,h2c=sswu,mode=batch,n=1024 | weier127 | batch | 1.31 µs | 1.31 µs .. 1.31 µs | per elem |
| ID to addend | weier.127/proj=none,h2c=ti,mode=batch,n=1024 | weier127 | batch | 1.21 µs | 1.20 µs .. 1.22 µs | per elem |
| ID to addend | weier-jacobian.127/proj=fp127,h2c=sswu,mode=batch,n=1024 | weier127-jacobian | batch | 1.24 µs | 1.23 µs .. 1.24 µs | per elem |
| ID to addend | weier-jacobian.127/proj=fp127,h2c=ti,mode=batch,n=1024 | weier127-jacobian | batch | 1.18 µs | 1.18 µs .. 1.19 µs | per elem |
| ID to addend | weier-jacobian.127/proj=fp130,h2c=sswu,mode=batch,n=1024 | weier127-jacobian | batch | 1.25 µs | 1.24 µs .. 1.26 µs | per elem |
| ID to addend | weier-jacobian.127/proj=fp130,h2c=ti,mode=batch,n=1024 | weier127-jacobian | batch | 1.23 µs | 1.23 µs .. 1.23 µs | per elem |
| ID to addend | weier-jacobian.127/proj=gf2_127,h2c=sswu,mode=batch,n=1024 | weier127-jacobian | batch | 1.29 µs | 1.29 µs .. 1.30 µs | per elem |
| ID to addend | weier-jacobian.127/proj=gf2_127,h2c=ti,mode=batch,n=1024 | weier127-jacobian | batch | 1.34 µs | 1.33 µs .. 1.34 µs | per elem |
| ID to addend | weier-jacobian.127/proj=none,h2c=sswu,mode=batch,n=1024 | weier127-jacobian | batch | 1.31 µs | 1.30 µs .. 1.31 µs | per elem |
| ID to addend | weier-jacobian.127/proj=none,h2c=ti,mode=batch,n=1024 | weier127-jacobian | batch | 1.20 µs | 1.20 µs .. 1.21 µs | per elem |
| hash to addend | gf2_109-lambda/try-and-increment to (x, λ) | gf2_109-lambda | per-element | 9.10 µs | 9.08 µs .. 9.13 µs | per elem |
| hash to addend | gf2_109-lambda/try-and-increment to (x, λ), batched | gf2_109-lambda | batch | 834 ns | 826 ns .. 842 ns | per elem |
| hash to addend | gf2_122-gls-lambda/try-and-increment to (x, λ) | gf2_122-gls-lambda | per-element | 1.29 µs | 1.29 µs .. 1.30 µs | per elem |
| hash to addend | gf2_122-gls-lambda/try-and-increment to (x, λ), batched | gf2_122-gls-lambda | batch | 468 ns | 465 ns .. 472 ns | per elem |
| hash to addend | gf2_122-lambda/try-and-increment to (x, λ) | gf2_122-lambda | per-element | 1.24 µs | 1.24 µs .. 1.25 µs | per elem |
| hash to addend | gf2_122-lambda/try-and-increment to (x, λ), batched | gf2_122-lambda | batch | 485 ns | 484 ns .. 485 ns | per elem |
| hash to addend | gf2_127-lambda/try-and-increment to (x, λ) | gf2_127-lambda | per-element | 1.26 µs | 1.25 µs .. 1.27 µs | per elem |
| hash to addend | gf2_127-lambda/try-and-increment to (x, λ), batched | gf2_127-lambda | batch | 322 ns | 320 ns .. 323 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 | 5.09 µs | 5.07 µs .. 5.11 µs | per elem |
| one map to addend | gf2_109-lambda/pornin map x1 to (x, λ), batched | gf2_109-lambda | batch | 854 ns | 852 ns .. 856 ns | per elem |
| one map to addend | gf2_109-u/pornin map x1 to (u, v) | gf2_109-u | per-element | 5.19 µs | 5.18 µs .. 5.21 µs | per elem |
| one map to addend | gf2_109-u/pornin map x1 to (u, v), batched | gf2_109-u | batch | 986 ns | 983 ns .. 988 ns | per elem |
| one map to addend | gf2_109-w/pornin map x1 to (x, λ) | gf2_109-w | per-element | 5.11 µs | 5.08 µs .. 5.15 µs | per elem |
| one map to addend | gf2_109-w/pornin map x1 to (x, λ), batched | gf2_109-w | batch | 852 ns | 850 ns .. 855 ns | per elem |
| one map to addend | gf2_122-gls-lambda/pornin map x1 to (x, λ) | gf2_122-gls-lambda | per-element | 941 ns | 937 ns .. 946 ns | per elem |
| one map to addend | gf2_122-gls-lambda/pornin map x1 to (x, λ), batched | gf2_122-gls-lambda | batch | 505 ns | 502 ns .. 508 ns | per elem |
| one map to addend | gf2_122-gls-u/pornin map x1 to (u, v) | gf2_122-gls-u | per-element | 1.01 µs | 1.01 µs .. 1.02 µs | per elem |
| one map to addend | gf2_122-gls-u/pornin map x1 to (u, v), batched | gf2_122-gls-u | batch | 580 ns | 578 ns .. 583 ns | per elem |
| one map to addend | gf2_122-gls-w/pornin map x1 to (x, λ) | gf2_122-gls-w | per-element | 949 ns | 944 ns .. 953 ns | per elem |
| one map to addend | gf2_122-gls-w/pornin map x1 to (x, λ), batched | gf2_122-gls-w | batch | 509 ns | 505 ns .. 514 ns | per elem |
| one map to addend | gf2_122-lambda/pornin map x1 to (x, λ) | gf2_122-lambda | per-element | 925 ns | 924 ns .. 926 ns | per elem |
| one map to addend | gf2_122-lambda/pornin map x1 to (x, λ), batched | gf2_122-lambda | batch | 498 ns | 497 ns .. 499 ns | per elem |
| one map to addend | gf2_122-u/pornin map x1 to (u, v) | gf2_122-u | per-element | 1.00 µs | 1.00 µs .. 1.01 µs | per elem |
| one map to addend | gf2_122-u/pornin map x1 to (u, v), batched | gf2_122-u | batch | 585 ns | 584 ns .. 586 ns | per elem |
| one map to addend | gf2_122-w/pornin map x1 to (x, λ) | gf2_122-w | per-element | 929 ns | 925 ns .. 935 ns | per elem |
| one map to addend | gf2_122-w/pornin map x1 to (x, λ), batched | gf2_122-w | batch | 501 ns | 500 ns .. 502 ns | per elem |
| one map to addend | gf2_127-lambda/pornin map x1 to (x, λ) | gf2_127-lambda | per-element | 889 ns | 885 ns .. 894 ns | per elem |
| one map to addend | gf2_127-lambda/pornin map x1 to (x, λ), batched | gf2_127-lambda | batch | 365 ns | 363 ns .. 367 ns | per elem |
| one map to addend | gf2_127-u/pornin map x1 to (u, v) | gf2_127-u | per-element | 939 ns | 934 ns .. 944 ns | per elem |
| one map to addend | gf2_127-u/pornin map x1 to (u, v), batched | gf2_127-u | batch | 426 ns | 425 ns .. 428 ns | per elem |
| one map to addend | gf2_127-w/pornin map x1 to (x, λ) | gf2_127-w | per-element | 892 ns | 889 ns .. 897 ns | per elem |
| one map to addend | gf2_127-w/pornin map x1 to (x, λ), batched | gf2_127-w | batch | 360 ns | 358 ns .. 363 ns | per elem |
| one map | gf2_109/pornin map x1 | gf2_109 | per-element | 5.27 µs | 5.25 µs .. 5.28 µs | per elem |
| one map | gf2_109/pornin map x1, batched | gf2_109 | batch | 1.05 µs | 1.05 µs .. 1.05 µs | per elem |
| one map | gf2_122/pornin map x1 | gf2_122 | per-element | 1.08 µs | 1.07 µs .. 1.09 µs | per elem |
| one map | gf2_122/pornin map x1, batched | gf2_122 | batch | 623 ns | 622 ns .. 624 ns | per elem |
| one map | gf2_122-gls/pornin map x1 | gf2_122-gls | per-element | 1.02 µs | 1.01 µs .. 1.03 µs | per elem |
| one map | gf2_122-gls/pornin map x1, batched | gf2_122-gls | batch | 599 ns | 595 ns .. 603 ns | per elem |
| one map | gf2_127/pornin map x1 | gf2_127 | per-element | 966 ns | 958 ns .. 974 ns | per elem |
| one map | gf2_127/pornin map x1, batched | gf2_127 | batch | 454 ns | 452 ns .. 457 ns | per elem |
| one map | edwards127/elligator2 x1 | edwards127 | per-element | 1.52 µs | 1.52 µs .. 1.53 µs | per elem |
| one map | weier127/sswu x1 | weier127 | per-element | 1.33 µs | 1.32 µs .. 1.33 µs | per elem |
| two maps summed | gf2_127/pornin map x2 | gf2_127 | per-element | 2.25 µs | 2.23 µs .. 2.26 µ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
264 benchmarks
| operation | benchmark | family | mode | time | 95% CI | unit |
|---|---|---|---|---|---|---|
| encode (hash + cells) | xor-sha256.64/m=12150,n=3500 | xor | per-element | 301 ns | 300 ns .. 302 ns | per elem |
| encode (hash + cells) | xor-sha256.64/m=1350,n=3500 | xor | per-element | 251 ns | 251 ns .. 252 ns | per elem |
| encode (hash + cells) | xor-sha256.64/m=150,n=3500 | xor | per-element | 213 ns | 213 ns .. 214 ns | per elem |
| encode (hash + cells) | xor-sha256.64/m=20,n=3500 | xor | per-element | 176 ns | 175 ns .. 176 ns | per elem |
| encode (hash + cells) | xor-sha256.64/m=5,n=3500 | xor | per-element | 146 ns | 146 ns .. 147 ns | per elem |
| encode (hash + cells) | xor-siphash.64/m=12150,n=3500 | xor-siphash | per-element | 269 ns | 269 ns .. 270 ns | per elem |
| encode (hash + cells) | xor-siphash.64/m=12150,n=3500,map=mcg64 | xor-siphash | per-element | 261 ns | 261 ns .. 262 ns | per elem |
| encode (hash + cells) | xor-siphash.64/m=1350,n=3500 | xor-siphash | per-element | 221 ns | 220 ns .. 221 ns | per elem |
| encode (hash + cells) | xor-siphash.64/m=1350,n=3500,map=mcg64 | xor-siphash | per-element | 215 ns | 214 ns .. 215 ns | per elem |
| encode (hash + cells) | xor-siphash.64/m=150,n=3500 | xor-siphash | per-element | 181 ns | 181 ns .. 182 ns | per elem |
| encode (hash + cells) | xor-siphash.64/m=150,n=3500,map=mcg64 | xor-siphash | per-element | 179 ns | 179 ns .. 180 ns | per elem |
| encode (hash + cells) | xor-siphash.64/m=20,n=3500 | xor-siphash | per-element | 142 ns | 141 ns .. 142 ns | per elem |
| encode (hash + cells) | xor-siphash.64/m=20,n=3500,map=mcg64 | xor-siphash | per-element | 139 ns | 139 ns .. 140 ns | per elem |
| encode (hash + cells) | xor-siphash.64/m=5,n=3500 | xor-siphash | per-element | 112 ns | 111 ns .. 112 ns | per elem |
| encode (hash + cells) | xor-siphash.64/m=5,n=3500,map=mcg64 | xor-siphash | per-element | 109 ns | 108 ns .. 109 ns | per elem |
| encode (hash + cells) | binary.109/m=1350,n=3500,h2c=ti | gf2_109 | per-element | 10.2 µs | 10.1 µs .. 10.2 µs | per elem |
| encode (hash + cells) | binary-lambda.109/m=1350,n=3500,h2c=ti-addend | gf2_109-lambda | per-element | 8.11 µs | 8.09 µs .. 8.14 µs | per elem |
| encode (hash + cells) | binary-u.109/m=1350,n=3500,h2c=ti | gf2_109-u | per-element | 7.69 µs | 7.67 µs .. 7.71 µs | per elem |
| encode (hash + cells) | binary-w.109/m=1350,n=3500,h2c=ti | gf2_109-w | per-element | 8.14 µs | 8.12 µs .. 8.16 µs | per elem |
| encode (hash + cells) | binary.122/m=1350,n=3500,h2c=ti | gf2_122 | per-element | 6.11 µs | 6.10 µs .. 6.13 µs | per elem |
| encode (hash + cells) | binary.122-gls/m=1350,n=3500,h2c=ti | gf2_122-gls | per-element | 5.68 µs | 5.67 µs .. 5.69 µs | per elem |
| encode (hash + cells) | binary-lambda.122-gls/m=1350,n=3500,h2c=ti-addend | gf2_122-gls-lambda | per-element | 4.72 µs | 4.72 µs .. 4.73 µs | per elem |
| encode (hash + cells) | binary-u.122-gls/m=1350,n=3500,h2c=ti | gf2_122-gls-u | per-element | 4.46 µs | 4.45 µs .. 4.47 µs | per elem |
| encode (hash + cells) | binary-w.122-gls/m=1350,n=3500,h2c=ti | gf2_122-gls-w | per-element | 4.79 µs | 4.79 µs .. 4.80 µs | per elem |
| encode (hash + cells) | binary-lambda.122/m=1350,n=3500,h2c=ti-addend | gf2_122-lambda | per-element | 4.88 µs | 4.87 µs .. 4.90 µs | per elem |
| encode (hash + cells) | binary-u.122/m=1350,n=3500,h2c=ti | gf2_122-u | per-element | 4.45 µs | 4.44 µs .. 4.45 µs | per elem |
| encode (hash + cells) | binary-w.122/m=1350,n=3500,h2c=ti | gf2_122-w | per-element | 4.80 µs | 4.78 µs .. 4.81 µs | per elem |
| encode (hash + cells) | binary.127/m=12150,n=3500,h2c=ti,map=mcg64 | gf2_127 | per-element | 6.22 µs | 6.21 µs .. 6.23 µs | per elem |
| encode (hash + cells) | binary.127/m=1350,n=3500,h2c=ti | gf2_127 | per-element | 4.73 µs | 4.72 µs .. 4.73 µs | per elem |
| encode (hash + cells) | binary.127/m=1350,n=3500,h2c=ti,map=mcg64 | gf2_127 | per-element | 4.76 µs | 4.75 µs .. 4.76 µs | per elem |
| encode (hash + cells) | binary.127/m=150,n=3500,h2c=ti,map=mcg64 | gf2_127 | per-element | 3.36 µs | 3.35 µs .. 3.36 µs | per elem |
| encode (hash + cells) | binary.127/m=20,n=3500,h2c=ti,map=mcg64 | gf2_127 | per-element | 2.14 µs | 2.14 µs .. 2.14 µs | per elem |
| encode (hash + cells) | binary.127/m=5,n=3500,h2c=ti,map=mcg64 | gf2_127 | per-element | 1.37 µs | 1.37 µs .. 1.38 µs | per elem |
| encode (hash + cells) | binary-lambda.127/m=1350,n=3500,h2c=ti-addend | gf2_127-lambda | per-element | 3.70 µs | 3.70 µs .. 3.71 µs | per elem |
| encode (hash + cells) | binary-u.127/m=1350,n=3500,h2c=pornin-addend | gf2_127-u | per-element | 3.60 µs | 3.59 µs .. 3.60 µs | per elem |
| encode (hash + cells) | binary-w.127/m=1350,n=3500,h2c=pornin-addend | gf2_127-w | per-element | 3.75 µs | 3.74 µs .. 3.76 µs | per elem |
| encode (hash + cells) | edwards.127/m=12150,n=3500,h2c=ti | edwards127 | per-element | 2.06 µs | 2.06 µs .. 2.07 µs | per elem |
| encode (hash + cells) | edwards.127/m=12150,n=3500,h2c=ti,proj=fp127,mapproj=fp127 | edwards127 | per-element | 1.96 µs | 1.95 µs .. 1.96 µs | per elem |
| encode (hash + cells) | edwards.127/m=1350,n=3500,h2c=ti | edwards127 | per-element | 1.88 µs | 1.87 µs .. 1.89 µs | per elem |
| encode (hash + cells) | edwards.127/m=1350,n=3500,h2c=ti,proj=fp127,mapproj=fp127 | edwards127 | per-element | 1.81 µs | 1.80 µs .. 1.82 µs | per elem |
| encode (hash + cells) | edwards.127/m=150,n=3500,h2c=ti | edwards127 | per-element | 1.77 µs | 1.75 µs .. 1.78 µs | per elem |
| encode (hash + cells) | edwards.127/m=20,n=3500,h2c=ti | edwards127 | per-element | 1.60 µs | 1.59 µs .. 1.61 µs | per elem |
| encode (hash + cells) | edwards.127/m=5,n=3500,h2c=ti | edwards127 | per-element | 1.47 µs | 1.47 µs .. 1.48 µs | per elem |
| encode (hash + cells) | edwards.127/m=5,n=3500,h2c=ti,proj=fp127,mapproj=fp127 | edwards127 | per-element | 1.37 µs | 1.37 µs .. 1.38 µs | per elem |
| encode (hash + cells) | weier.127/m=12150,n=3500,h2c=ti | weier127 | per-element | 2.56 µs | 2.54 µs .. 2.57 µs | per elem |
| encode (hash + cells) | weier.127/m=12150,n=3500,h2c=ti,proj=fp127,mapproj=fp127 | weier127 | per-element | 2.44 µs | 2.44 µs .. 2.45 µs | per elem |
| encode (hash + cells) | weier.127/m=1350,n=3500,h2c=ti | weier127 | per-element | 2.24 µs | 2.23 µs .. 2.24 µs | per elem |
| encode (hash + cells) | weier.127/m=1350,n=3500,h2c=ti,proj=fp127,mapproj=fp127 | weier127 | per-element | 2.12 µs | 2.12 µs .. 2.13 µs | per elem |
| encode (hash + cells) | weier.127/m=5,n=3500,h2c=ti | weier127 | per-element | 1.53 µs | 1.52 µs .. 1.54 µs | per elem |
| encode (hash + cells) | weier.127/m=5,n=3500,h2c=ti,proj=fp127,mapproj=fp127 | weier127 | per-element | 1.39 µs | 1.39 µs .. 1.40 µs | per elem |
| encode (hash + cells) | weier-jacobian.127/m=12150,n=3500,h2c=ti | weier127-jacobian | per-element | 2.24 µs | 2.23 µs .. 2.24 µs | per elem |
| encode (hash + cells) | weier-jacobian.127/m=12150,n=3500,h2c=ti,proj=fp127,mapproj=fp127 | weier127-jacobian | per-element | 2.12 µs | 2.11 µs .. 2.12 µs | per elem |
| encode (hash + cells) | weier-jacobian.127/m=1350,n=3500,h2c=ti | weier127-jacobian | per-element | 2.03 µs | 2.03 µs .. 2.04 µs | per elem |
| encode (hash + cells) | weier-jacobian.127/m=1350,n=3500,h2c=ti,proj=fp127,mapproj=fp127 | weier127-jacobian | per-element | 1.93 µs | 1.93 µs .. 1.94 µs | per elem |
| encode (hash + cells) | weier-jacobian.127/m=150,n=3500,h2c=ti | weier127-jacobian | per-element | 1.82 µs | 1.82 µs .. 1.83 µs | per elem |
| encode (hash + cells) | weier-jacobian.127/m=20,n=3500,h2c=ti | weier127-jacobian | per-element | 1.60 µs | 1.59 µs .. 1.60 µs | per elem |
| encode (hash + cells) | weier-jacobian.127/m=5,n=3500,h2c=ti | weier127-jacobian | per-element | 1.46 µs | 1.46 µs .. 1.46 µs | per elem |
| encode (hash + cells) | weier-jacobian.127/m=5,n=3500,h2c=ti,proj=fp127,mapproj=fp127 | weier127-jacobian | per-element | 1.35 µs | 1.34 µs .. 1.35 µs | per elem |
| cell updates | xor-sha256.64/m=1350,n=3500 | xor | per-element | 199 ns | 198 ns .. 200 ns | per elem |
| cell updates | xor-siphash.64/m=1350,n=3500 | xor-siphash | per-element | 202 ns | 202 ns .. 203 ns | per elem |
| cell updates | binary.109/m=1350,n=3500 | gf2_109 | per-element | 9.19 µs | 9.17 µs .. 9.21 µs | per elem |
| cell updates | binary-lambda.109/m=1350,n=3500 | gf2_109-lambda | per-element | 7.27 µs | 7.26 µs .. 7.28 µs | per elem |
| cell updates | binary-u.109/m=1350,n=3500 | gf2_109-u | per-element | 6.72 µs | 6.71 µs .. 6.73 µs | per elem |
| cell updates | binary-w.109/m=1350,n=3500 | gf2_109-w | per-element | 7.30 µs | 7.29 µs .. 7.31 µs | per elem |
| cell updates | binary.122/m=1350,n=3500 | gf2_122 | per-element | 5.47 µs | 5.46 µs .. 5.48 µs | per elem |
| cell updates | binary.122-gls/m=1350,n=3500 | gf2_122-gls | per-element | 5.19 µs | 5.18 µs .. 5.20 µs | per elem |
| cell updates | binary-lambda.122-gls/m=1350,n=3500 | gf2_122-gls-lambda | per-element | 4.29 µs | 4.28 µs .. 4.30 µs | per elem |
| cell updates | binary-u.122-gls/m=1350,n=3500 | gf2_122-gls-u | per-element | 3.94 µs | 3.93 µs .. 3.94 µs | per elem |
| cell updates | binary-w.122-gls/m=1350,n=3500 | gf2_122-gls-w | per-element | 4.35 µs | 4.34 µs .. 4.35 µs | per elem |
| cell updates | binary-lambda.122/m=1350,n=3500 | gf2_122-lambda | per-element | 4.34 µs | 4.34 µs .. 4.35 µs | per elem |
| cell updates | binary-u.122/m=1350,n=3500 | gf2_122-u | per-element | 3.90 µs | 3.90 µs .. 3.91 µs | per elem |
| cell updates | binary-w.122/m=1350,n=3500 | gf2_122-w | per-element | 4.32 µs | 4.31 µs .. 4.33 µs | per elem |
| cell updates | binary.127/m=1350,n=3500 | gf2_127 | per-element | 4.31 µs | 4.31 µs .. 4.32 µs | per elem |
| cell updates | binary-lambda.127/m=1350,n=3500 | gf2_127-lambda | per-element | 3.37 µs | 3.37 µs .. 3.38 µs | per elem |
| cell updates | binary-u.127/m=1350,n=3500 | gf2_127-u | per-element | 3.18 µs | 3.18 µs .. 3.19 µs | per elem |
| cell updates | binary-w.127/m=1350,n=3500 | gf2_127-w | per-element | 3.37 µs | 3.37 µs .. 3.38 µs | per elem |
| cell updates | edwards.127/m=12150,n=3500 | edwards127 | per-element | 720 ns | 719 ns .. 721 ns | per elem |
| cell updates | edwards.127/m=1350,n=3500 | edwards127 | per-element | 540 ns | 540 ns .. 541 ns | per elem |
| cell updates | edwards.127/m=150,n=3500 | edwards127 | per-element | 390 ns | 389 ns .. 391 ns | per elem |
| cell updates | edwards.127/m=20,n=3500 | edwards127 | per-element | 259 ns | 258 ns .. 261 ns | per elem |
| cell updates | edwards.127/m=5,n=3500 | edwards127 | per-element | 171 ns | 170 ns .. 171 ns | per elem |
| cell updates | weier.127/m=12150,n=3500 | weier127 | per-element | 1.26 µs | 1.26 µs .. 1.26 µs | per elem |
| cell updates | weier.127/m=1350,n=3500 | weier127 | per-element | 949 ns | 948 ns .. 951 ns | per elem |
| cell updates | weier.127/m=5,n=3500 | weier127 | per-element | 260 ns | 258 ns .. 262 ns | per elem |
| cell updates | weier-jacobian.127/m=12150,n=3500 | weier127-jacobian | per-element | 969 ns | 968 ns .. 970 ns | per elem |
| cell updates | weier-jacobian.127/m=1350,n=3500 | weier127-jacobian | per-element | 789 ns | 787 ns .. 790 ns | per elem |
| cell updates | weier-jacobian.127/m=150,n=3500 | weier127-jacobian | per-element | 567 ns | 566 ns .. 568 ns | per elem |
| cell updates | weier-jacobian.127/m=20,n=3500 | weier127-jacobian | per-element | 360 ns | 359 ns .. 361 ns | per elem |
| cell updates | weier-jacobian.127/m=5,n=3500 | weier127-jacobian | per-element | 226 ns | 225 ns .. 226 ns | per elem |
| peel, per difference | xor-sha256.64/d=1350,m=2700,prefilter=true,batch=true | xor | batch | 1.17 µs | 1.17 µs .. 1.17 µs | per elem |
| peel, per difference | xor-siphash.64/d=1350,m=2700,prefilter=true,batch=true | xor-siphash | batch | 1.13 µs | 1.13 µs .. 1.13 µs | per elem |
| peel, per difference | binary.109/d=1350,m=2700,prefilter=true,batch=true,h2c=ti | gf2_109 | batch | 12.4 µs | 12.4 µs .. 12.4 µs | per elem |
| peel, per difference | binary-lambda.109/d=1350,m=2700,prefilter=true,batch=true,h2c=ti-addend | gf2_109-lambda | batch | 9.59 µs | 9.58 µs .. 9.60 µs | per elem |
| peel, per difference | binary-u.109/d=1350,m=2700,prefilter=true,batch=true,h2c=ti | gf2_109-u | batch | 9.72 µs | 9.71 µs .. 9.74 µs | per elem |
| peel, per difference | binary-w.109/d=1350,m=2700,prefilter=true,batch=true,h2c=ti | gf2_109-w | batch | 9.66 µs | 9.64 µs .. 9.67 µs | per elem |
| peel, per difference | binary.122/d=1350,m=2700,prefilter=true,batch=true,h2c=ti | gf2_122 | batch | 7.76 µs | 7.74 µs .. 7.77 µs | per elem |
| peel, per difference | binary.122-gls/d=1350,m=2700,prefilter=true,batch=true,h2c=ti | gf2_122-gls | batch | 7.35 µs | 7.34 µs .. 7.37 µ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 | 6.00 µs | 5.99 µs .. 6.01 µ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 | 5.98 µs | 5.98 µs .. 5.99 µ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 | 6.05 µs | 6.05 µs .. 6.06 µs | per elem |
| peel, per difference | binary-lambda.122/d=1350,m=2700,prefilter=true,batch=true,h2c=ti-addend | gf2_122-lambda | batch | 6.09 µs | 6.08 µs .. 6.10 µs | per elem |
| peel, per difference | binary-u.122/d=1350,m=2700,prefilter=true,batch=true,h2c=ti | gf2_122-u | batch | 6.00 µs | 5.99 µs .. 6.01 µs | per elem |
| peel, per difference | binary-w.122/d=1350,m=2700,prefilter=true,batch=true,h2c=ti | gf2_122-w | batch | 6.04 µs | 6.02 µs .. 6.06 µs | per elem |
| peel, per difference | binary.127/d=1350,m=2700,prefilter=true,batch=true,h2c=ti | gf2_127 | batch | 6.25 µs | 6.24 µs .. 6.26 µs | per elem |
| peel, per difference | binary-lambda.127/d=1350,m=2700,prefilter=true,batch=true,h2c=ti-addend | gf2_127-lambda | batch | 4.90 µs | 4.90 µs .. 4.91 µs | per elem |
| peel, per difference | binary-u.127/d=1350,m=2700,prefilter=true,batch=true,h2c=pornin-addend | gf2_127-u | batch | 5.07 µs | 5.04 µs .. 5.12 µs | per elem |
| peel, per difference | binary-w.127/d=1350,m=2700,prefilter=true,batch=true,h2c=pornin-addend | gf2_127-w | batch | 4.93 µs | 4.92 µs .. 4.93 µs | per elem |
| peel, per difference | edwards.127/d=10000,m=20000,prefilter=false,batch=false,h2c=ti | edwards127 | per-element | 4.75 µs | 4.74 µs .. 4.76 µs | per elem |
| peel, per difference | edwards.127/d=10000,m=20000,prefilter=false,batch=true,h2c=ti | edwards127 | batch | 3.78 µs | 3.78 µs .. 3.79 µs | per elem |
| peel, per difference | edwards.127/d=10000,m=20000,prefilter=true,batch=false,h2c=ti | edwards127 | per-element | 3.76 µs | 3.76 µs .. 3.77 µs | per elem |
| peel, per difference | edwards.127/d=10000,m=20000,prefilter=true,batch=true,h2c=ti | edwards127 | batch | 3.20 µs | 3.20 µs .. 3.20 µs | per elem |
| peel, per difference | edwards.127/d=10000,m=20000,prefilter=true,batch=true,h2c=ti,proj=fp127,mapproj=fp127 | edwards127 | batch | 2.97 µs | 2.97 µs .. 2.97 µs | per elem |
| peel, per difference | edwards.127/d=1350,m=2700,prefilter=false,batch=false,h2c=ti | edwards127 | per-element | 4.39 µs | 4.39 µs .. 4.40 µs | per elem |
| peel, per difference | edwards.127/d=1350,m=2700,prefilter=false,batch=true,h2c=ti | edwards127 | batch | 3.43 µs | 3.42 µs .. 3.43 µs | per elem |
| peel, per difference | edwards.127/d=1350,m=2700,prefilter=true,batch=false,h2c=ti | edwards127 | per-element | 3.42 µs | 3.41 µs .. 3.43 µs | per elem |
| peel, per difference | edwards.127/d=1350,m=2700,prefilter=true,batch=true,h2c=ti | edwards127 | batch | 2.86 µs | 2.85 µs .. 2.86 µs | per elem |
| peel, per difference | edwards.127/d=1350,m=2700,prefilter=true,batch=true,h2c=ti,proj=fp127,mapproj=fp127 | edwards127 | batch | 2.61 µs | 2.60 µs .. 2.61 µs | per elem |
| peel, per difference | edwards.127/d=150,m=300,prefilter=false,batch=false,h2c=ti | edwards127 | per-element | 4.29 µs | 4.29 µs .. 4.30 µs | per elem |
| peel, per difference | edwards.127/d=150,m=300,prefilter=false,batch=true,h2c=ti | edwards127 | batch | 3.32 µs | 3.32 µs .. 3.33 µs | per elem |
| peel, per difference | edwards.127/d=150,m=300,prefilter=true,batch=false,h2c=ti | edwards127 | per-element | 3.07 µs | 3.07 µs .. 3.07 µs | per elem |
| peel, per difference | edwards.127/d=150,m=300,prefilter=true,batch=true,h2c=ti | edwards127 | batch | 2.53 µs | 2.53 µs .. 2.54 µs | per elem |
| peel, per difference | edwards.127/d=20,m=40,prefilter=false,batch=false,h2c=ti | edwards127 | per-element | 3.23 µs | 3.22 µs .. 3.23 µs | per elem |
| peel, per difference | edwards.127/d=20,m=40,prefilter=false,batch=true,h2c=ti | edwards127 | batch | 2.46 µs | 2.46 µs .. 2.47 µs | per elem |
| peel, per difference | edwards.127/d=20,m=40,prefilter=true,batch=false,h2c=ti | edwards127 | per-element | 2.60 µs | 2.59 µs .. 2.60 µs | per elem |
| peel, per difference | edwards.127/d=20,m=40,prefilter=true,batch=true,h2c=ti | edwards127 | batch | 2.15 µs | 2.15 µs .. 2.15 µs | per elem |
| peel, per difference | edwards.127/d=4,m=8,prefilter=false,batch=false,h2c=ti | edwards127 | per-element | 2.03 µs | 2.03 µs .. 2.03 µs | per elem |
| peel, per difference | edwards.127/d=4,m=8,prefilter=false,batch=true,h2c=ti | edwards127 | batch | 1.79 µs | 1.78 µs .. 1.80 µs | per elem |
| peel, per difference | edwards.127/d=4,m=8,prefilter=true,batch=false,h2c=ti | edwards127 | per-element | 2.12 µs | 2.11 µs .. 2.12 µs | per elem |
| peel, per difference | edwards.127/d=4,m=8,prefilter=true,batch=true,h2c=ti | edwards127 | batch | 1.87 µs | 1.86 µs .. 1.87 µs | per elem |
| peel, per difference | edwards.127/d=4,m=8,prefilter=true,batch=true,h2c=ti,proj=fp127,mapproj=fp127 | edwards127 | batch | 1.45 µs | 1.45 µs .. 1.45 µs | per elem |
| peel, per difference | weier.127/d=10000,m=20000,prefilter=true,batch=true,h2c=ti | weier127 | batch | 3.70 µs | 3.69 µs .. 3.72 µs | per elem |
| peel, per difference | weier.127/d=10000,m=20000,prefilter=true,batch=true,h2c=ti,proj=fp127,mapproj=fp127 | weier127 | batch | 3.51 µs | 3.50 µs .. 3.51 µs | per elem |
| peel, per difference | weier.127/d=1350,m=2700,prefilter=true,batch=true,h2c=ti | weier127 | batch | 3.21 µs | 3.21 µs .. 3.22 µs | per elem |
| peel, per difference | weier.127/d=1350,m=2700,prefilter=true,batch=true,h2c=ti,proj=fp127,mapproj=fp127 | weier127 | batch | 3.07 µs | 3.06 µs .. 3.07 µs | per elem |
| peel, per difference | weier.127/d=4,m=8,prefilter=true,batch=true,h2c=ti | weier127 | batch | 1.35 µs | 1.34 µs .. 1.35 µ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.36 µs | 1.36 µs .. 1.36 µs | per elem |
| peel, per difference | weier-jacobian.127/d=10000,m=20000,prefilter=false,batch=false,h2c=ti | weier127-jacobian | per-element | 4.00 µs | 3.99 µs .. 4.00 µs | per elem |
| peel, per difference | weier-jacobian.127/d=10000,m=20000,prefilter=false,batch=true,h2c=ti | weier127-jacobian | batch | 4.01 µs | 4.00 µs .. 4.02 µs | per elem |
| peel, per difference | weier-jacobian.127/d=10000,m=20000,prefilter=true,batch=false,h2c=ti | weier127-jacobian | per-element | 3.46 µs | 3.45 µs .. 3.46 µs | per elem |
| peel, per difference | weier-jacobian.127/d=10000,m=20000,prefilter=true,batch=true,h2c=ti | weier127-jacobian | batch | 3.51 µs | 3.49 µs .. 3.53 µ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 | 3.26 µs | 3.25 µs .. 3.27 µs | per elem |
| peel, per difference | weier-jacobian.127/d=1350,m=2700,prefilter=false,batch=false,h2c=ti | weier127-jacobian | per-element | 3.57 µs | 3.57 µs .. 3.58 µs | per elem |
| peel, per difference | weier-jacobian.127/d=1350,m=2700,prefilter=false,batch=true,h2c=ti | weier127-jacobian | batch | 3.60 µs | 3.60 µs .. 3.61 µs | per elem |
| peel, per difference | weier-jacobian.127/d=1350,m=2700,prefilter=true,batch=false,h2c=ti | weier127-jacobian | per-element | 3.01 µs | 3.01 µs .. 3.02 µs | per elem |
| peel, per difference | weier-jacobian.127/d=1350,m=2700,prefilter=true,batch=true,h2c=ti | weier127-jacobian | batch | 3.02 µs | 3.01 µs .. 3.02 µ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 | 2.86 µs | 2.86 µs .. 2.86 µs | per elem |
| peel, per difference | weier-jacobian.127/d=150,m=300,prefilter=false,batch=false,h2c=ti | weier127-jacobian | per-element | 3.21 µs | 3.21 µs .. 3.22 µs | per elem |
| peel, per difference | weier-jacobian.127/d=150,m=300,prefilter=false,batch=true,h2c=ti | weier127-jacobian | batch | 3.24 µs | 3.23 µs .. 3.24 µs | per elem |
| peel, per difference | weier-jacobian.127/d=150,m=300,prefilter=true,batch=false,h2c=ti | weier127-jacobian | per-element | 2.56 µs | 2.56 µs .. 2.57 µs | per elem |
| peel, per difference | weier-jacobian.127/d=150,m=300,prefilter=true,batch=true,h2c=ti | weier127-jacobian | batch | 2.56 µs | 2.55 µs .. 2.56 µs | per elem |
| peel, per difference | weier-jacobian.127/d=20,m=40,prefilter=false,batch=false,h2c=ti | weier127-jacobian | per-element | 2.56 µs | 2.56 µs .. 2.57 µs | per elem |
| peel, per difference | weier-jacobian.127/d=20,m=40,prefilter=false,batch=true,h2c=ti | weier127-jacobian | batch | 2.58 µs | 2.57 µs .. 2.58 µs | per elem |
| peel, per difference | weier-jacobian.127/d=20,m=40,prefilter=true,batch=false,h2c=ti | weier127-jacobian | per-element | 1.99 µs | 1.99 µs .. 2.00 µs | per elem |
| peel, per difference | weier-jacobian.127/d=20,m=40,prefilter=true,batch=true,h2c=ti | weier127-jacobian | batch | 1.99 µs | 1.99 µs .. 1.99 µs | per elem |
| peel, per difference | weier-jacobian.127/d=4,m=8,prefilter=false,batch=false,h2c=ti | weier127-jacobian | per-element | 1.14 µs | 1.13 µs .. 1.15 µs | per elem |
| peel, per difference | weier-jacobian.127/d=4,m=8,prefilter=false,batch=true,h2c=ti | weier127-jacobian | batch | 1.16 µs | 1.16 µs .. 1.16 µs | per elem |
| peel, per difference | weier-jacobian.127/d=4,m=8,prefilter=true,batch=false,h2c=ti | weier127-jacobian | per-element | 1.21 µs | 1.21 µs .. 1.22 µs | per elem |
| peel, per difference | weier-jacobian.127/d=4,m=8,prefilter=true,batch=true,h2c=ti | weier127-jacobian | batch | 1.24 µs | 1.24 µs .. 1.24 µs | 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.28 µs | 1.28 µs .. 1.28 µs | per elem |
| rateless encode and decode, per difference | xor-sha256.64/d=10 | xor | per-element | 831 ns | 830 ns .. 832 ns | per elem |
| rateless encode and decode, per difference | xor-sha256.64/d=100 | xor | per-element | 1.45 µs | 1.44 µs .. 1.45 µs | per elem |
| rateless encode and decode, per difference | xor-sha256.64/d=1000 | xor | per-element | 2.41 µs | 2.41 µs .. 2.41 µs | per elem |
| rateless encode and decode, per difference | xor-sha256.64/d=10000 | xor | per-element | 4.34 µs | 4.32 µs .. 4.36 µs | per elem |
| rateless encode and decode, per difference | xor-sha256.64/d=100000 | xor | per-element | 11.2 µs | 11.1 µs .. 11.2 µs | per elem |
| rateless encode and decode, per difference | xor-sha256.64/d=20 | xor | per-element | 1.01 µs | 1.00 µs .. 1.01 µs | per elem |
| rateless encode and decode, per difference | xor-sha256.64/d=40 | xor | per-element | 1.17 µs | 1.17 µs .. 1.18 µs | per elem |
| rateless encode and decode, per difference | xor-sha256.64/d=50000 | xor | per-element | 8.05 µs | 8.02 µs .. 8.10 µs | per elem |
| rateless encode and decode, per difference | xor-siphash.64/d=10 | xor-siphash | per-element | 711 ns | 709 ns .. 713 ns | per elem |
| rateless encode and decode, per difference | xor-siphash.64/d=10,map=mcg64 | xor-siphash | per-element | 695 ns | 694 ns .. 696 ns | per elem |
| rateless encode and decode, per difference | xor-siphash.64/d=100 | xor-siphash | per-element | 1.29 µs | 1.29 µs .. 1.30 µs | per elem |
| rateless encode and decode, per difference | xor-siphash.64/d=100,map=mcg64 | xor-siphash | per-element | 1.27 µs | 1.26 µs .. 1.27 µs | per elem |
| rateless encode and decode, per difference | xor-siphash.64/d=1000 | xor-siphash | per-element | 2.26 µs | 2.25 µs .. 2.26 µs | per elem |
| rateless encode and decode, per difference | xor-siphash.64/d=1000,map=mcg64 | xor-siphash | per-element | 2.19 µs | 2.18 µs .. 2.19 µs | per elem |
| rateless encode and decode, per difference | xor-siphash.64/d=10000 | xor-siphash | per-element | 4.19 µs | 4.16 µs .. 4.25 µs | per elem |
| rateless encode and decode, per difference | xor-siphash.64/d=10000,map=chacha8 | xor-siphash | per-element | 4.88 µs | 4.87 µs .. 4.90 µs | per elem |
| rateless encode and decode, per difference | xor-siphash.64/d=10000,map=mcg64 | xor-siphash | per-element | 4.05 µs | 4.04 µs .. 4.06 µs | per elem |
| rateless encode and decode, per difference | xor-siphash.64/d=100000 | xor-siphash | per-element | 11.0 µs | 10.9 µs .. 11.0 µs | per elem |
| rateless encode and decode, per difference | xor-siphash.64/d=100000,map=chacha8 | xor-siphash | per-element | 16.8 µs | 16.7 µs .. 16.8 µs | per elem |
| rateless encode and decode, per difference | xor-siphash.64/d=100000,map=mcg64 | xor-siphash | per-element | 10.9 µs | 10.8 µs .. 11.1 µs | per elem |
| rateless encode and decode, per difference | xor-siphash.64/d=20 | xor-siphash | per-element | 867 ns | 866 ns .. 869 ns | per elem |
| rateless encode and decode, per difference | xor-siphash.64/d=20,map=mcg64 | xor-siphash | per-element | 861 ns | 860 ns .. 862 ns | per elem |
| rateless encode and decode, per difference | xor-siphash.64/d=40 | xor-siphash | per-element | 1.03 µs | 1.03 µs .. 1.03 µs | per elem |
| rateless encode and decode, per difference | xor-siphash.64/d=40,map=mcg64 | xor-siphash | per-element | 1.00 µs | 999 ns .. 1.01 µs | per elem |
| rateless encode and decode, per difference | xor-siphash.64/d=50000 | xor-siphash | per-element | 7.90 µs | 7.86 µs .. 7.94 µs | per elem |
| rateless encode and decode, per difference | xor-siphash.64/d=50000,map=mcg64 | xor-siphash | per-element | 7.18 µs | 7.15 µs .. 7.23 µs | per elem |
| rateless encode and decode, per difference | binary.109/d=1000,h2c=ti | gf2_109 | per-element | 71.0 µs | 70.7 µs .. 71.2 µs | per elem |
| rateless encode and decode, per difference | binary-lambda.109/d=1000,h2c=ti-addend | gf2_109-lambda | per-element | 62.0 µs | 61.5 µs .. 62.7 µs | per elem |
| rateless encode and decode, per difference | binary-u.109/d=1000,h2c=ti | gf2_109-u | per-element | 61.4 µs | 61.0 µs .. 61.9 µs | per elem |
| rateless encode and decode, per difference | binary-w.109/d=1000,h2c=ti | gf2_109-w | per-element | 62.2 µs | 61.9 µs .. 62.4 µs | per elem |
| rateless encode and decode, per difference | binary.122/d=1000,h2c=ti | gf2_122 | per-element | 30.9 µs | 30.7 µs .. 31.1 µs | per elem |
| rateless encode and decode, per difference | binary.122-gls/d=1000,h2c=ti | gf2_122-gls | per-element | 28.1 µs | 28.0 µs .. 28.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 | 23.7 µs | 23.6 µs .. 23.9 µs | per elem |
| rateless encode and decode, per difference | binary-u.122-gls/d=1000,h2c=ti | gf2_122-gls-u | per-element | 22.8 µs | 22.7 µs .. 22.9 µs | per elem |
| rateless encode and decode, per difference | binary-w.122-gls/d=1000,h2c=ti | gf2_122-gls-w | per-element | 23.8 µs | 23.7 µs .. 23.8 µs | per elem |
| rateless encode and decode, per difference | binary-lambda.122/d=1000,h2c=ti-addend | gf2_122-lambda | per-element | 23.8 µs | 23.6 µs .. 24.1 µs | per elem |
| rateless encode and decode, per difference | binary-u.122/d=1000,h2c=ti | gf2_122-u | per-element | 22.8 µs | 22.7 µs .. 22.9 µs | per elem |
| rateless encode and decode, per difference | binary-w.122/d=1000,h2c=ti | gf2_122-w | per-element | 23.7 µs | 23.6 µs .. 23.8 µs | per elem |
| rateless encode and decode, per difference | binary.127/d=10,h2c=ti,map=mcg64 | gf2_127 | per-element | 10.5 µs | 10.5 µs .. 10.5 µs | per elem |
| rateless encode and decode, per difference | binary.127/d=100,h2c=ti,map=mcg64 | gf2_127 | per-element | 17.1 µs | 17.1 µs .. 17.2 µs | per elem |
| rateless encode and decode, per difference | binary.127/d=1000,h2c=ti | gf2_127 | per-element | 24.1 µs | 24.1 µs .. 24.2 µs | per elem |
| rateless encode and decode, per difference | binary.127/d=1000,h2c=ti,map=mcg64 | gf2_127 | per-element | 24.2 µs | 24.1 µs .. 24.3 µs | per elem |
| rateless encode and decode, per difference | binary.127/d=10000,h2c=ti,map=chacha8 | gf2_127 | per-element | 34.1 µs | 33.9 µs .. 34.3 µs | per elem |
| rateless encode and decode, per difference | binary.127/d=10000,h2c=ti,map=mcg64 | gf2_127 | per-element | 32.2 µs | 32.1 µs .. 32.3 µs | per elem |
| rateless encode and decode, per difference | binary.127/d=100000,h2c=ti,map=chacha8 | gf2_127 | per-element | 55.2 µs | 55.0 µs .. 55.3 µs | per elem |
| rateless encode and decode, per difference | binary.127/d=100000,h2c=ti,map=mcg64 | gf2_127 | per-element | 49.7 µs | 49.6 µs .. 49.9 µs | per elem |
| rateless encode and decode, per difference | binary.127/d=20,h2c=ti,map=mcg64 | gf2_127 | per-element | 12.6 µs | 12.6 µs .. 12.6 µs | per elem |
| rateless encode and decode, per difference | binary.127/d=40,h2c=ti,map=mcg64 | gf2_127 | per-element | 14.5 µs | 14.4 µs .. 14.6 µs | per elem |
| rateless encode and decode, per difference | binary.127/d=50000,h2c=ti,map=mcg64 | gf2_127 | per-element | 43.1 µs | 43.0 µs .. 43.2 µs | per elem |
| rateless encode and decode, per difference | binary-lambda.127/d=1000,h2c=ti-addend | gf2_127-lambda | per-element | 19.8 µs | 19.7 µs .. 19.8 µs | per elem |
| rateless encode and decode, per difference | binary-u.127/d=1000,h2c=pornin-addend | gf2_127-u | per-element | 18.1 µs | 18.0 µs .. 18.2 µs | per elem |
| rateless encode and decode, per difference | binary-w.127/d=1000,h2c=pornin-addend | gf2_127-w | per-element | 18.3 µs | 18.2 µs .. 18.3 µs | per elem |
| rateless encode and decode, per difference | edwards.127/d=10,h2c=ti | edwards127 | per-element | 5.95 µs | 5.90 µs .. 6.03 µs | per elem |
| rateless encode and decode, per difference | edwards.127/d=100,h2c=ti | edwards127 | per-element | 8.21 µs | 8.19 µs .. 8.22 µs | per elem |
| rateless encode and decode, per difference | edwards.127/d=1000,h2c=ti | edwards127 | per-element | 10.1 µs | 10.0 µs .. 10.1 µs | per elem |
| rateless encode and decode, per difference | edwards.127/d=10000,h2c=ti | edwards127 | per-element | 13.0 µs | 12.9 µs .. 13.0 µs | per elem |
| rateless encode and decode, per difference | edwards.127/d=100000,h2c=ti | edwards127 | per-element | 24.3 µs | 24.2 µs .. 24.3 µs | per elem |
| rateless encode and decode, per difference | edwards.127/d=20,h2c=ti | edwards127 | per-element | 6.74 µs | 6.72 µs .. 6.76 µs | per elem |
| rateless encode and decode, per difference | edwards.127/d=40,h2c=ti | edwards127 | per-element | 7.38 µs | 7.36 µs .. 7.40 µs | per elem |
| rateless encode and decode, per difference | edwards.127/d=50000,h2c=ti | edwards127 | per-element | 19.7 µs | 19.6 µs .. 19.8 µs | per elem |
| rateless encode and decode, per difference | weier.127/d=10,h2c=ti | weier127 | per-element | 5.02 µs | 5.00 µs .. 5.03 µs | per elem |
| rateless encode and decode, per difference | weier.127/d=1000,h2c=ti | weier127 | per-element | 9.73 µs | 9.70 µs .. 9.76 µs | per elem |
| rateless encode and decode, per difference | weier.127/d=100000,h2c=ti | weier127 | per-element | 25.4 µs | 25.3 µs .. 25.6 µs | per elem |
| rateless encode and decode, per difference | weier-jacobian.127/d=10,h2c=ti | weier127-jacobian | per-element | 4.70 µs | 4.69 µs .. 4.71 µs | per elem |
| rateless encode and decode, per difference | weier-jacobian.127/d=100,h2c=ti | weier127-jacobian | per-element | 6.84 µs | 6.81 µs .. 6.87 µs | per elem |
| rateless encode and decode, per difference | weier-jacobian.127/d=1000,h2c=ti | weier127-jacobian | per-element | 9.06 µs | 9.00 µs .. 9.11 µs | per elem |
| rateless encode and decode, per difference | weier-jacobian.127/d=10000,h2c=ti | weier127-jacobian | per-element | 12.2 µs | 12.1 µs .. 12.2 µs | per elem |
| rateless encode and decode, per difference | weier-jacobian.127/d=100000,h2c=ti | weier127-jacobian | per-element | 23.5 µs | 23.5 µs .. 23.5 µs | per elem |
| rateless encode and decode, per difference | weier-jacobian.127/d=20,h2c=ti | weier127-jacobian | per-element | 5.38 µs | 5.37 µs .. 5.40 µs | per elem |
| rateless encode and decode, per difference | weier-jacobian.127/d=40,h2c=ti | weier127-jacobian | per-element | 6.08 µs | 6.06 µs .. 6.10 µs | per elem |
| rateless encode and decode, per difference | weier-jacobian.127/d=50000,h2c=ti | weier127-jacobian | per-element | 18.6 µs | 18.4 µs .. 18.7 µs | per elem |
| mapping, per index | chacha8/next | mapping | per-element | 9.68 ns | 9.67 ns .. 9.70 ns | per elem |
| mapping, per index | mcg64/next | mapping | per-element | 4.32 ns | 4.31 ns .. 4.33 ns | per elem |
| mapping, per index | sha256-ctr/next | mapping | per-element | 20.0 ns | 19.9 ns .. 20.0 ns | per elem |
| mapping, per index | xoshiro256pp/next | mapping | per-element | 4.80 ns | 4.79 ns .. 4.81 ns | per elem |
| mapping, per item | chacha8/item,m=12150 | mapping | per-element | 289 ns | 289 ns .. 290 ns | per elem |
| mapping, per item | chacha8/item,m=1350 | mapping | per-element | 244 ns | 244 ns .. 244 ns | per elem |
| mapping, per item | chacha8/item,m=150 | mapping | per-element | 196 ns | 196 ns .. 197 ns | per elem |
| mapping, per item | chacha8/item,m=20 | mapping | per-element | 150 ns | 150 ns .. 150 ns | per elem |
| mapping, per item | chacha8/item,m=5 | mapping | per-element | 116 ns | 116 ns .. 116 ns | per elem |
| mapping, per item | mcg64/item,m=12150 | mapping | per-element | 189 ns | 188 ns .. 189 ns | per elem |
| mapping, per item | mcg64/item,m=1350 | mapping | per-element | 149 ns | 149 ns .. 149 ns | per elem |
| mapping, per item | mcg64/item,m=150 | mapping | per-element | 106 ns | 106 ns .. 106 ns | per elem |
| mapping, per item | mcg64/item,m=20 | mapping | per-element | 62.2 ns | 62.1 ns .. 62.4 ns | per elem |
| mapping, per item | mcg64/item,m=5 | mapping | per-element | 28.2 ns | 28.1 ns .. 28.3 ns | per elem |
| mapping, per item | sha256-ctr/item,m=12150 | mapping | per-element | 439 ns | 438 ns .. 439 ns | per elem |
| mapping, per item | sha256-ctr/item,m=1350 | mapping | per-element | 342 ns | 341 ns .. 343 ns | per elem |
| mapping, per item | sha256-ctr/item,m=150 | mapping | per-element | 240 ns | 240 ns .. 241 ns | per elem |
| mapping, per item | sha256-ctr/item,m=20 | mapping | per-element | 147 ns | 146 ns .. 147 ns | per elem |
| mapping, per item | sha256-ctr/item,m=5 | mapping | per-element | 81.2 ns | 81.0 ns .. 81.3 ns | per elem |
| mapping, per item | xoshiro256pp/item,m=12150 | mapping | per-element | 190 ns | 190 ns .. 190 ns | per elem |
| mapping, per item | xoshiro256pp/item,m=1350 | mapping | per-element | 146 ns | 146 ns .. 147 ns | per elem |
| mapping, per item | xoshiro256pp/item,m=150 | mapping | per-element | 105 ns | 105 ns .. 105 ns | per elem |
| mapping, per item | xoshiro256pp/item,m=20 | mapping | per-element | 59.7 ns | 59.5 ns .. 59.8 ns | per elem |
| mapping, per item | xoshiro256pp/item,m=5 | mapping | per-element | 28.9 ns | 28.8 ns .. 28.9 ns | per elem |
| map digest of an ID | projection-fp127/digest of id | mapping | per-element | 14.0 ns | 14.0 ns .. 14.1 ns | per elem |
| map digest of an ID | projection-fp130/digest of id | mapping | per-element | 26.1 ns | 26.1 ns .. 26.2 ns | per elem |
| map digest of an ID | projection-gf2_127/digest of id | mapping | per-element | 114 ns | 114 ns .. 114 ns | per elem |
| map digest of an ID | salted-sha256/digest of id | mapping | per-element | 50.2 ns | 50.1 ns .. 50.3 ns | per elem |
| per-salt keys | projection-fp127/keys | mapping | per-element | 374 ns | 373 ns .. 374 ns | per elem |
| per-salt keys | projection-fp130/keys | mapping | per-element | 388 ns | 387 ns .. 388 ns | per elem |
| per-salt keys | projection-gf2_127/keys | mapping | per-element | 473 ns | 473 ns .. 474 ns | per elem |
| per-salt keys | salted-sha256/keys | mapping | per-element | 119 ns | 119 ns .. 119 ns | per elem |
| item ID | sha256/id | xor | per-element | 54.2 ns | 53.3 ns .. 55.2 ns | per elem |
| map digest | salted-sha256/digest | mapping | per-element | 50.8 ns | 50.7 ns .. 51.0 ns | per elem |
digest
Figure
7 benchmarks
| operation | benchmark | family | mode | time | 95% CI | unit |
|---|---|---|---|---|---|---|
| digest | xor-sha256 | xor | per-element | 52.1 ns | 51.8 ns .. 52.3 ns | per elem |
| digest | gf2_109/batch | gf2_109 | batch | 1.21 µs | 1.20 µs .. 1.21 µs | per elem |
| digest | gf2_122/batch | gf2_122 | batch | 717 ns | 713 ns .. 721 ns | per elem |
| digest | gf2_122-gls/batch | gf2_122-gls | batch | 688 ns | 684 ns .. 692 ns | per elem |
| digest | gf2_127/batch | gf2_127 | batch | 514 ns | 511 ns .. 517 ns | per elem |
| digest | edwards127/batch | edwards127 | batch | 1.34 µs | 1.34 µs .. 1.34 µs | per elem |
| digest | weier127/batch | weier127 | batch | 1.28 µs | 1.28 µs .. 1.29 µ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 | 5.27 µs | binary.109/mode=throughput | 676 ns | 7.22 µs | 8.84 µs | 11.5 µs | 14.4 µs | 17.4 µs |
| gf2_109 | batched | binary.109/mode=batch,n=1024 | 814 ns | binary.109/mode=throughput | 676 ns | 2.77 µs | 4.39 µs | 7.03 µs | 9.98 µs | 13.0 µs |
| gf2_109-lambda | one at a time | gf2_109-lambda/pornin map x1 to (x, λ) | 5.09 µs | binary-lambda.109/mode=throughput | 545 ns | 6.67 µs | 7.97 µs | 10.1 µs | 12.5 µs | 14.9 µs |
| gf2_109-lambda | batched | binary-lambda.109/mode=batch,n=1024 | 814 ns | binary-lambda.109/mode=throughput | 545 ns | 2.39 µs | 3.70 µs | 5.82 µs | 8.21 µs | 10.6 µs |
| gf2_109-u | one at a time | gf2_109-u/pornin map x1 to (u, v) | 5.19 µs | binary-u.109/mode=throughput | 488 ns | 6.61 µs | 7.78 µs | 9.68 µs | 11.8 µs | 14.0 µs |
| gf2_109-u | batched | binary-u.109/mode=batch,n=1024 | 927 ns | binary-u.109/mode=throughput | 488 ns | 2.34 µs | 3.51 µs | 5.41 µs | 7.55 µs | 9.69 µs |
| gf2_109-w | one at a time | gf2_109-w/pornin map x1 to (x, λ) | 5.11 µs | binary-w.109/mode=throughput | 541 ns | 6.68 µs | 7.98 µs | 10.1 µs | 12.5 µs | 14.8 µs |
| gf2_109-w | batched | binary-w.109/mode=batch,n=1024 | 805 ns | binary-w.109/mode=throughput | 541 ns | 2.38 µs | 3.67 µs | 5.78 µs | 8.15 µs | 10.5 µs |
| gf2_122 | one at a time | gf2_122/pornin map x1 | 1.08 µs | binary.122/mode=throughput | 390 ns | 2.21 µs | 3.14 µs | 4.67 µs | 6.37 µs | 8.08 µs |
| gf2_122 | batched | binary.122/mode=batch,n=1024 | 488 ns | binary.122/mode=throughput | 390 ns | 1.62 µs | 2.55 µs | 4.07 µs | 5.78 µs | 7.49 µs |
| gf2_122-gls | one at a time | gf2_122-gls/pornin map x1 | 1.02 µs | binary.122-gls/mode=throughput | 370 ns | 2.09 µs | 2.98 µs | 4.42 µs | 6.04 µs | 7.67 µs |
| gf2_122-gls | batched | binary.122-gls/mode=batch,n=1024 | 456 ns | binary.122-gls/mode=throughput | 370 ns | 1.53 µs | 2.41 µs | 3.86 µs | 5.48 µs | 7.10 µs |
| gf2_122-gls-lambda | one at a time | gf2_122-gls-lambda/pornin map x1 to (x, λ) | 941 ns | binary-lambda.122-gls/mode=throughput | 310 ns | 1.84 µs | 2.58 µs | 3.79 µs | 5.15 µs | 6.51 µs |
| gf2_122-gls-lambda | batched | binary-lambda.122-gls/mode=batch,n=1024 | 455 ns | binary-lambda.122-gls/mode=throughput | 310 ns | 1.35 µs | 2.10 µs | 3.31 µs | 4.66 µs | 6.03 µs |
| gf2_122-gls-u | one at a time | gf2_122-gls-u/pornin map x1 to (u, v) | 1.01 µs | binary-u.122-gls/mode=throughput | 276 ns | 1.81 µs | 2.47 µs | 3.55 µs | 4.75 µs | 5.96 µs |
| gf2_122-gls-u | batched | binary-u.122-gls/mode=batch,n=1024 | 513 ns | binary-u.122-gls/mode=throughput | 276 ns | 1.31 µs | 1.97 µs | 3.05 µs | 4.25 µs | 5.46 µs |
| gf2_122-gls-w | one at a time | gf2_122-gls-w/pornin map x1 to (x, λ) | 949 ns | binary-w.122-gls/mode=throughput | 310 ns | 1.85 µs | 2.59 µs | 3.80 µs | 5.15 µs | 6.51 µs |
| gf2_122-gls-w | batched | binary-w.122-gls/mode=batch,n=1024 | 444 ns | binary-w.122-gls/mode=throughput | 310 ns | 1.34 µs | 2.08 µs | 3.29 µs | 4.64 µs | 6.00 µs |
| gf2_122-lambda | one at a time | gf2_122-lambda/pornin map x1 to (x, λ) | 925 ns | binary-lambda.122/mode=throughput | 307 ns | 1.82 µs | 2.55 µs | 3.75 µs | 5.09 µs | 6.44 µs |
| gf2_122-lambda | batched | binary-lambda.122/mode=batch,n=1024 | 487 ns | binary-lambda.122/mode=throughput | 307 ns | 1.38 µs | 2.11 µs | 3.31 µs | 4.65 µs | 6.00 µs |
| gf2_122-u | one at a time | gf2_122-u/pornin map x1 to (u, v) | 1.00 µs | binary-u.122/mode=throughput | 277 ns | 1.81 µs | 2.47 µs | 3.55 µs | 4.77 µs | 5.99 µs |
| gf2_122-u | batched | binary-u.122/mode=batch,n=1024 | 555 ns | binary-u.122/mode=throughput | 277 ns | 1.36 µs | 2.02 µs | 3.10 µs | 4.32 µs | 5.54 µs |
| gf2_122-w | one at a time | gf2_122-w/pornin map x1 to (x, λ) | 929 ns | binary-w.122/mode=throughput | 307 ns | 1.82 µs | 2.55 µs | 3.75 µs | 5.09 µs | 6.44 µs |
| gf2_122-w | batched | binary-w.122/mode=batch,n=1024 | 458 ns | binary-w.122/mode=throughput | 307 ns | 1.35 µs | 2.08 µs | 3.28 µs | 4.62 µs | 5.97 µs |
| gf2_127 | one at a time | gf2_127/pornin map x1 | 966 ns | binary.127/mode=latency | 307 ns | 1.86 µs | 2.59 µs | 3.79 µs | 5.13 µs | 6.48 µs |
| gf2_127 | batched | binary.127/mode=batch,n=1024 | 347 ns | binary.127/mode=latency | 307 ns | 1.24 µs | 1.97 µs | 3.17 µs | 4.51 µs | 5.86 µs |
| gf2_127-lambda | one at a time | gf2_127-lambda/pornin map x1 to (x, λ) | 889 ns | binary-lambda.127/mode=throughput | 249 ns | 1.61 µs | 2.20 µs | 3.17 µs | 4.26 µs | 5.35 µs |
| gf2_127-lambda | batched | binary-lambda.127/mode=batch,n=1024 | 347 ns | binary-lambda.127/mode=throughput | 249 ns | 1.07 µs | 1.66 µs | 2.63 µs | 3.72 µs | 4.81 µs |
| gf2_127-u | one at a time | gf2_127-u/pornin map x1 to (u, v) | 939 ns | binary-u.127/mode=throughput | 220 ns | 1.58 µs | 2.10 µs | 2.96 µs | 3.92 µs | 4.89 µs |
| gf2_127-u | batched | gf2_127-u/pornin map x1 to (u, v), batched | 426 ns | binary-u.127/mode=throughput | 220 ns | 1.06 µs | 1.59 µs | 2.45 µs | 3.41 µs | 4.37 µs |
| gf2_127-w | one at a time | gf2_127-w/pornin map x1 to (x, λ) | 892 ns | binary-w.127/mode=throughput | 249 ns | 1.61 µs | 2.21 µs | 3.18 µs | 4.27 µs | 5.36 µs |
| gf2_127-w | batched | gf2_127-w/pornin map x1 to (x, λ), batched | 360 ns | binary-w.127/mode=throughput | 249 ns | 1.08 µs | 1.68 µs | 2.65 µs | 3.73 µs | 4.82 µs |
| edwards127 | one at a time | edwards.127/mode=indep | 1.25 µs | edwards.127/mode=throughput | 26.9 ns | 1.33 µs | 1.39 µs | 1.50 µs | 1.61 µs | 1.73 µs |
| edwards127 | batched | edwards.127/mode=batch,n=1024 | 1.25 µs | edwards.127/mode=throughput | 26.9 ns | 1.33 µs | 1.40 µs | 1.50 µs | 1.62 µs | 1.74 µs |
| weier127 | one at a time | weier.127/mode=indep | 1.22 µs | weier.127/mode=throughput | 58.1 ns | 1.39 µs | 1.53 µs | 1.75 µs | 2.01 µs | 2.26 µs |
| weier127 | batched | weier.127/mode=batch,n=1024 | 1.23 µs | weier.127/mode=throughput | 58.1 ns | 1.39 µs | 1.53 µs | 1.76 µs | 2.01 µs | 2.27 µs |
| weier127-jacobian | one at a time | weier-jacobian.127/mode=indep | 1.22 µs | weier-jacobian.127/mode=throughput | 47.3 ns | 1.35 µs | 1.47 µs | 1.65 µs | 1.86 µs | 2.07 µs |
| weier127-jacobian | batched | weier-jacobian.127/mode=batch,n=1024 | 1.22 µs | weier-jacobian.127/mode=throughput | 47.3 ns | 1.36 µs | 1.47 µs | 1.66 µs | 1.86 µs | 2.07 µs |
Intel(R) Xeon(R) W-1390P @ 3.50GHz · rustc 1.98.1 · RUSTFLAGS=-C target-cpu=x86-64 · ef9e82d39fbf · full profile · 2026-10-09