Ephemeral ECMH
Authorship and disclaimer
The author formulated the research question, defined the threat model (Adversary) and security arguments not related to curve selection, and directed the language models that carried out the work. The implementation and evaluation were carried out almost entirely by Claude Opus 5.5, with review and contributions from Codex Astra 6 and Claude Fable 5.1.
The author is not an expert in elliptic curve cryptography and has only a vague familiarity with binary elliptic curves. This report was written for the author as much as under his direction: the models assembled most of the security arguments for curve selection and the literature they rest on, with most of the cited works being new to the author. It is shared before the author is able to verify it fully, and has not been reviewed by a specialist.
Synopsis
This repository evaluates elliptic-curve multiset hashes (ECMH) [maitin-shepard-et-al-2016] over small curves as the cell checksum of rateless invertible Bloom lookup tables (RIBLTs) [yang-gilad-alizadeh-2024].
When the sets being reconciled contain potentially adversarial inputs, RIBLT can be susceptible to collisions. This can be addressed using a secret shared by the peers engaging in reconciliation, or by utilizing ECMH.
The aim is to relax the requirement for a shared secret and mitigate collisions caused by adversarial inputs, using only a public beacon value as a salt, but without paying the full cost of ECMH on standard curves.
Weaker curves can be randomly selected periodically based on the public randomness beacon, and this project investigates the suitability and performance of such curves (and their underlying fields) in the context of RIBLT over sets with potentially adversarial items. The question is whether such a checksum attains a work factor between and group operations for each curve, and which field, curve model, and representation minimize its cost per item.
Motivation
Set reconciliation lets two peers that hold similar sets exchange only their difference. In peer-to-peer networks the sets often accept items from any party: Erlay proposes set reconciliation for the transaction relay of Bitcoin nodes [naumenko-et-al-2019], and IBLT-based reconciliation has been evaluated for the channel and node announcements of Lightning gossip [bolt-7, chen-et-al-2026]; neither is deployed, and both networks relay by flooding. Their items may be adversarial inputs. The adversary considered here is a third party that authors items and places them in the sets of honest peers, for instance by broadcasting them, aiming to make two honest peers fail to reconcile or obtain a wrong difference; resistance to it is what Meyer and Scherer call censorship resistance [meyer-scherer-2024]. A participating peer can always disrupt reconciliation by sending corrupt data or misrepresenting its set; that is unavoidable and not considered (Adversary).
A RIBLT [yang-gilad-alizadeh-2024] recognizes a coded symbol that holds a single item by a checksum. In the reference implementation the checksum is the XOR of item hashes. An adversary who can evaluate the item hash constructs two distinct sets with equal checksums by linear algebra over , at negligible cost and with any hash function (yangl1996/riblt#3). Addition modulo in place of XOR has the same weakness, by lattice reduction and Wagner’s algorithm [wagner-2002].
A secret key defeats the attack when the adversary cannot evaluate the keyed hash. This is the model of short keyed hashes such as SipHash [aumasson-bernstein-2012], designed against hash flooding of hash tables. Bitcoin’s compact block relay keys the 48-bit short identifiers of a block’s transactions with a hash of the block header and a nonce [corallo-2016]: the header commits to the transactions, so the set is fixed before the key is revealed and no transaction can be chosen against it. Open sets have no such ordering. Items keep arriving after a key shared by all peers is published, and the attack on the XOR checksum applies whatever the hash. A key kept per connection, as Erlay’s salts are [naumenko-et-al-2019], or a secret key coordinated by the two peers, as the Rateless IBLT paper proposes against injected items, repeats the hashing of every item for each key, and the checksums of coded symbols no longer serve every peer, though their sums do [yang-gilad-alizadeh-2024, Section 4.3]. Meyer and Scherer count that cost against randomizing per session [meyer-scherer-2024].
The hashing can instead be shared within an epoch. In a namespace salted by a beacon value, such as a key derived from a block hash, an adversary who can neither predict nor influence that value cannot search for collisions before the namespace begins. Unlike in compact block relay, it can still author items afterwards, so the checksum must resist relation finding without a secret until the next beacon value; with a block hash as the beacon, new blocks determine how long that is.
An ECMH sums hashed points in an elliptic-curve group. For maps to the curve that satisfy the hypotheses of the known reductions, its collision resistance reduces to the discrete-logarithm problem in that group [maitin-shepard-et-al-2016]; whether the maps used here satisfy them is open (Known weaknesses). The curves in use for this purpose have about points and about 128-bit security, and hashing an item to them costs about 110 to 195 times the SHA-256 hash of the XOR checksum (see Findings). A shorter horizon and a failure confined to one namespace suggest that a work factor of to suffices, provided the application detects a sketch collision by other means and recovers, for example by re-keying or by another reconciliation method. This is an application assumption.
A small fixed curve is exposed to precomputation [bernstein-lange-2012]. With the discrete logarithms of the item hashes, the checksum becomes AdHash modulo the group order, and the attack on the XOR checksum carries over through Wagner’s algorithm or lattice reduction; without them, the group does not expose the residues modulo its order that these algorithms need. Hoyte reports such collisions modulo in about 28 hours on eight cores [hoyte-2023]. The group orders here are below , where the leading-order estimate for Wagner’s algorithm is smaller by a factor of to , so a discrete-logarithm break makes the attack practical. The curve is therefore derived from the beacon value as well, deterministically, by a public candidate-selection procedure. A participant must be able to derive and check the curve for each new beacon value.
Design
The checksum uses hashing to the curve, point addition, and negation; scalar multiplication occurs only in curve selection. The items are public, so the arithmetic may run in variable time and items may be hashed by try-and-increment; the map from an item’s SHA-256 digest to the group need not be uniform, only such that relations are hard to find within the subset it reaches (Adversary). Over binary fields, the complete formulas of Pornin [pornin-2022, pornin-2023] have an operation count for addition independent of the extension degree , negation is one field addition, and a dense curve constant enters Pornin’s extended coordinates only through two multiplications by per addition. Scaling the addends by the inverse of when they are decoded removes these, leaving seven field multiplications and two squarings () per mixed addition.
The curve of a namespace is the first candidate derived from the beacon value whose group order is an admissible cofactor times a prime . A participant can check that choice without counting points: a certificate gives and a nonidentity point with for the accepted candidate, and a witness of an inadmissible order for each earlier candidate. Its conclusion is conditional on the primality of , which is tested to 24 fixed Miller–Rabin bases, not proven (Parameter selection and verification).
Random short Weierstrass and Edwards curves over prime fields are the conservative alternatives: their field multiplication uses the integer multiplier of every target, and a prime field has no subfield over which a Weil descent applies.
With , admits Galbraith–Lin–Scott (GLS) curves, whose constants range over about values and whose automorphism lowers the rho cost by a factor beyond that of the negation map. A coordinate fits one 64-bit word, and points have 16-byte encodings; the 107-bit and 109-bit families have 14-byte encodings. Weil descent constrains the choice of binary field. Candidate constructions lists the constructions compared and their operation counts.
In a RIBLT, an item’s point is added to about of the first coded symbols, and the item is hashed once per namespace, so additions outnumber hashes (Workload). The simulator reproduces the forgery of yangl1996/riblt#3 against the XOR checksum, and every curve group rejects the forged cells.
Findings
The figures below are from runs of source revision ef9e82d3 in the full profile:
on an Apple M4, run 01a1196a-88e4-7cdd-97ef-f46747dd8ab0, unless they are
given for an Intel Xeon W-1390P, run 01a11cd2-6ca3-73a7-8501-245c98af23fc,
built for x86-64-v3 with PCLMULQDQ. Those of the portable build are from run
01a11a5b-9046-7637-b5af-cfa347a1a47d on the M4, built for
-C target-cpu=generic, and run 01a12137-de75-762e-8d58-604336dcc781 on the
Xeon, built for -C target-cpu=x86-64. Batched hashing processes 1024 items per
batch, addition costs are throughput figures, and RIBLT encoding is per item,
for items into a sketch of cells.
Gains from the Go-to-Rust port or the mapping-generator change (xoshiro256++ in place of ChaCha8) are not attributed to this project; matched comparisons in the Rust harness measure checksum substitution (comparison conditions).
- The binary families over and lead. Their fastest representation, unscaled accumulators with Pornin’s complete formulas, encodes into a RIBLT sketch at 282 and 288 ns per item and adds in 9.8 and 10.7 ns, against 165 ns per item for the XOR baseline and 5.84 µs for ristretto255. The incomplete λ-projective variants add in 12.0 and 14.9 ns and encode at 303 and 326 ns; the extended coordinates, also complete, at 324 and 329 ns.
- encodes a point in 14 bytes, against 16 for , so each coded symbol’s checksum is two bytes shorter, at a nominal rho cost of against . Both fields occupy two 64-bit limbs, and the smaller one is only slightly faster on the M4 and slightly slower on the Xeon; Code generation (section 4) compares their reductions, which differ by modulus.
- Pornin’s map is the faster hash, batched or not. To the unscaled addend, in batches, it takes 60.7 and 57.2 ns per item over and , against 81.2 and 85.8 ns for try-and-increment; one item at a time, 533 and 461 ns against 874 and 869 ns, mainly for the field inversion. The RIBLT benchmarks therefore hash every binary family by Pornin’s map, as the plan derived from the group operations selects (The RIBLT plan). Summing two maps costs 916 ns over .
- Over the GLS-shaped and dense families encode at 306 and 308 ns; with extended coordinates the GLS family adds about 6% faster (16.8 against 17.8 ns), at a nominal rho cost 0.5 bits lower ( against ).
- The prime-field families hash an item in 0.62 to 1.92 µs, mainly for the square root, which batching does not share, and add in 12.5 to 45.4 ns across the implemented formulas. The fastest of them in RIBLT encoding, twisted Edwards over with , takes 900 ns per item.
- XOR of SHA-256 digests, the insecure baseline, costs 24.2 ns per item and 0.38 ns per cell. ristretto255 hashes an item in 4.72 µs and secp256k1 in 4.49 µs, 185 to 195 times the baseline.
- The binary-field figures require carry-less multiplication (PMULL or PCLMULQDQ) to be enabled in the build; the portable backend executes 13 to 19 times the instructions (Code generation). Built without it, stays in the class of the prime-field curves: its families encode into the sketch at 1.90 to 2.43 µs per item, against 1.42 to 1.68 µs for those over . The families over take 2.90 to 4.12 µs and those over 4.53 to 6.06 µs, up to about four times the prime-field curves. On the Xeon takes 3.60 to 4.73 µs, about twice the 1.88 to 2.24 µs over , 4.45 to 6.11 µs and 7.69 to 10.15 µs.
- Hashing an item anew in each namespace need not repeat SHA-256 (Adversary): projecting its 32-byte identifier, the item’s SHA-256 at 33.1 ns, to 128 bits under the namespace’s key costs 5.1 ns over , 9.6 ns over and 16.5 ns over , against 33.0 ns for the salted SHA-256 of the identifier. Keyed by projections of identifiers computed beforehand, the unscaled accumulators over and encode at 222 and 227 ns per item, against 282 and 288 ns by salted SHA-256 of the items (Costs by lifetime). Without carry-less multiplication the projection over costs 60.7 ns on the M4 and 114 ns on the Xeon, more than the salted hash, and the portable build’s RIBLT plan projects over instead.
- Over four seeds, finding a curve took 2.4 to 23.6 ms and certifying it, search included, 2.4 to 23.8 ms. Verifying a certificate counts no points and takes 55 to 68 µs across the families, 45 to 55% of it in the embedding-degree bound, or up to 0.59 ms when it also checks every rejected candidate. For the prime-field families the implemented prover counts points with PARI.
- On the Xeon the unscaled accumulators over and encode at 422 and 414 ns per item and add in 13.5 and 13.2 ns, against 218 ns per item for the XOR baseline and 7.69 µs for ristretto255. Pornin’s map remains the faster hash: in batches it takes 110 and 98.0 ns per item against 125 ns for try-and-increment, and one item at a time 657 and 249 ns against 1154 and 401 ns, over about half the M4’s cost. The prime-field families hash an item in 0.70 to 2.21 µs, and the fastest of them encodes at 1.18 µs. SHA-256 takes 53.4 ns, so ristretto255 and secp256k1, at 6.03 and 6.17 µs, hash at 113 to 116 times the baseline. Projecting an identifier costs 9.7 to 26.0 ns by field, against 51.4 ns for its salted SHA-256, and keyed by projections the unscaled accumulators encode at 331 and 320 ns. Verifying a certificate takes 70 to 91 µs.
- The nominal rho costs of the families range from to . The documented attacks obtain discrete logarithms and then solve additive relations; their costs and limitations are given in Known weaknesses.
License
Contents
Study
- Background - The RIBLT checksum, its linearity over (yangl1996/riblt#3), why AdHash does not repair it, and keyed and group-based alternatives.
- Problem statement - The adversary, the beacon-salted setting and its reference work factor, per-namespace curves against precomputation, curve selection and certificates, design criteria and scope.
- Workload - The multiset digest, the operations a RIBLT performs on it, and their counts in repeated reconciliation.
- Candidate constructions - The fields, curve models, accumulators, encodings and hash maps compared, and the models excluded.
- Security considerations - Nominal rho costs per family, extension-field attacks, the limits of the security evidence, and the known weaknesses.
- Measurement methodology - What the benchmarks measure, the decision table and dominance rule, how to run checks, benchmarks and reports, and how results are published.
Evidence
- Field and curve code generation - Static instruction counts of field and point operations across 24 compiler targets and CPU models, from the asm-report run at revision 2d6c7e3c.
- Summary across runs - Measurements, batching, build comparisons and selection cost.
- Benchmark run Apple M4 · apple-m4 · full · ef9e82d3 - Apple M4 · rustc 1.98.1 · RUSTFLAGS=-C target-cpu=apple-m4 · ef9e82d39fbf · full profile · 2026-10-08
- Benchmark run Apple M4 · generic · full · ef9e82d3 - Apple M4 · rustc 1.98.1 · RUSTFLAGS=-C target-cpu=generic · ef9e82d39fbf · full profile · 2026-10-08
- Benchmark run Intel(R) Xeon(R) W-1390P @ 3.50GHz · x86-64-v3 · full · ef9e82d3 - Intel(R) Xeon(R) W-1390P @ 3.50GHz · rustc 1.98.1 · RUSTFLAGS=-C target-cpu=x86-64-v3 -C target-feature=+pclmulqdq · ef9e82d39fbf · full profile · 2026-10-08
- Benchmark run Intel(R) Xeon(R) W-1390P @ 3.50GHz · generic · full · ef9e82d3 - Intel(R) Xeon(R) W-1390P @ 3.50GHz · rustc 1.98.1 · RUSTFLAGS=-C target-cpu=x86-64 · ef9e82d39fbf · full profile · 2026-10-09
Reference
- Annotated literature - For each key of references.bib, what the work contributes to the evaluation of ECMH-based RIBLT checksums over per-namespace curves; in the book, headed by the formatted entry.
- Repository organization - Where the field arithmetic, curves, group capabilities, benchmarks, reports, published results and reference programs live.
Background
The RIBLT checksum
A RIBLT reconciles two sets: the decoder recovers their symmetric difference rather than reading back stored values. A coded symbol holds three sums over the items mapped to it: the XOR of the items, an item count, and a checksum. The checksum is the XOR of fixed-width item hashes. Decoding peels a pure symbol, which holds exactly one item, and uses the checksum to recognize purity.
In the construction studied here the checksum is an ECMH: a coded symbol holds the signed sum of the items’ salted hashes to an elliptic curve, in place of the XOR of fixed-width hashes. The item field remains the XOR of the item bytes (Workload). A variant in which each item is itself a curve point, a 128-bit identifier recovered from the point sum, is not implemented.
Linearity of the checksum
yangl1996/riblt#3 observes that this checksum is linear over . An adversary who can evaluate the item hash can find a set of distinct, non-colliding items whose hashes XOR to a target value. Gaussian elimination over slightly more candidates than the hash width suffices, at negligible cost. The weakness lies in the XOR combination (XHASH [bellare-micciancio-1997]) rather than in the hash function, so it persists with SHA-256. The issue demonstrates two constructed sets that the decoder wrongly reports as equal. Whether such relations can also suppress one chosen item across every coded symbol it maps to is left open there. In either case the checksum provides no resistance to relation finding.
Replacing XOR with addition modulo (AdHash [bellare-micciancio-1997]) does not remove the weakness. Relations with small integer coefficients among hash values modulo a 64-bit integer are found efficiently by lattice reduction [maitin-shepard-et-al-2016, Appendix B]. Given an unrestricted number of terms, Wagner’s generalized birthday algorithm [wagner-2002] finds them in time subexponential in the size of the modulus. The security of AdHash rests on the hardness of a weighted knapsack problem, which requires a modulus of thousands of bits [bellare-micciancio-1997, wagner-2002]; a variant of one incremental hash of this kind was proposed with its modulus raised from to in response to Wagner’s algorithm [phan-wagner-2006, Section 2] (Known weaknesses).
Keyed and group-based checksums
Keying the item hash with a secret prevents the attack by parties that cannot evaluate the keyed hash. Short keyed hashes such as SipHash [aumasson-bernstein-2012] serve this purpose against hash flooding of hash tables, where the key does not leave one process: the adversary neither holds the key nor obtains keyed hashes of candidates of its choosing. Under such a key a RIBLT gives up universality: coded symbols computed under one key cannot serve peers that do not share it. This repository assumes less. The salt and the set are public, the set accepts items from anyone, the adversary included, and the salt is a value of a randomness beacon outside the adversary’s control, renewed often enough that discrete logarithms in the checksum group cannot be computed while it is in use (Setting and reference work factor).
The issue discussion proposes computing the checksum in a finite abelian group in which relations with small coefficients among hash outputs are hard to find. ECMH is such a construction. An implementation over ristretto255 [riblt-ecmh] reports 256-bit checksums in place of 64-bit ones and a higher end-to-end cost. It also replaces the pseudorandom generator that maps items to coded symbols, so its timings do not isolate the cost of the group.
Problem statement
Adversary
The sets considered accept items from any party, and the peers that hold them reconcile with one another. The mempools of Bitcoin nodes, for whose transaction relay Erlay proposes set reconciliation [naumenko-et-al-2019], and the channel and node announcements of Lightning gossip [bolt-7], for which IBLT-based reconciliation has been evaluated [chen-et-al-2026], are such sets: their items are adversarial inputs. Neither proposal is deployed; both networks relay by flooding. Meyer and Scherer call the property required of reconciliation censorship resistance: a malicious party cannot generate sets that two honest nodes fail to reconcile [meyer-scherer-2024]. Hoyte states the same adversary for the fingerprints of range-based reconciliation: a third party inserts crafted elements so that innocent ones fail to synchronize [hoyte-2023].
The adversary is a third party. It can evaluate the item hash once the salt is published, and it can place items of its choosing in the sets of honest peers, for instance by broadcasting them. It authors items whose hashes satisfy a relation, aiming to make two honest peers fail to reconcile, or obtain a wrong difference, when the items lie in the symmetric difference of their sets; items common to both sets cancel. The RIBLT’s mapping of items to coded symbols admits a similar attack that does not involve the checksum (Known weaknesses).
The items, the salt and the curve are public, so the timing of the computation reveals nothing that the adversary could not compute itself, and implementations may run in variable time. Hashing may therefore use try-and-increment [boneh-lynn-shacham-2001], whose number of attempts depends on the item. RFC 9380 specifies deterministic maps instead and recommends against rejection sampling because its timing has leaked secret inputs [rfc9380, Section 1]; it requires constant-time hashing when the inputs to an encoding are secret [rfc9380, Section 10.3], which they are not here.
The item hash assumes secure hash functions of three kinds, which differ in what they bind and in how long their outputs live. An item is identified by a 256-bit digest that does not depend on the salt: tagged SHA-256 of its encoding, or an identifier the application already holds, such as a transaction’s txid. The identifier is computed once and serves every namespace. The adversary chooses it, through the preimage, and only its collision resistance, about , binds an item to it.
Hashing to the curve and the RIBLT’s mapping depend on the salt, although the curve already changes with the beacon value. Each map starts from a field element and a sign, taken from at most 128 bits of a digest, before the curve enters, and two items whose elements and signs agree hash to the same point on every curve that accepts that element. Without the salt, such a pair would cost about digests once and serve in every namespace; with it, the search is repeated for each namespace. An unsalted mapping would likewise let colliding schedules be searched for before the beacon (Known weaknesses). The two keys serve different ends. The hash to the curve keeps the public salt, under which an item’s point identifies it, and resists collisions, in every session of the namespace. The schedule is better keyed by a secret that each pair of peers shares, where one is available: no third party can then search for colliding schedules, and a peer whose neighbours have converged receives independent streams from them rather than one stream repeated. The benchmarks derive both keys from one salt, which changes no cost.
Neither use needs a salted 256-bit digest of each item. Once per namespace,
salted SHA-256, modelled as a random oracle, derives keys from the beacon value,
or the schedule’s from a secret, under a tag for each use; once per item and
namespace, a universal hash under these keys projects the identifier to 128 bits
[wegman-carter-1981]. With the identifier read as two elements of a
field of about elements and a nonzero key , the projection
is Poly1305’s polynomial on a two-block
message, without its clamping or one-time pad [bernstein-2005]. Two identifiers
fixed before the salt collide for at most two keys, with probability about
. Once the salt is published, the adversary can evaluate the
projection, but its inputs are SHA-256 outputs, which it does not choose: a
random oracle followed by a fixed function whose fibres are of nearly equal size
is a random oracle into the field, and a colliding pair costs a generic search
over about identifiers, as for a salted 128-bit digest. The
projection’s linearity gives no shortcut. Items are mapped to the curve
independently and added only as points, so a relation among projections is a
relation among points only through a symmetry of the map, such as
for simplified SWU and Elligator 2
[rfc9380, bernstein-et-al-2013]; to exploit one before the salt, two identifiers
must agree up to sign as field elements in both halves, about 254 bits. The
field is therefore chosen by cost: where the target has
carry-less multiplication, where it does not, with
Poly1305’s measured as a comparison
(hash). The attempts of a try-and-increment map after the
first use further keys over the same identifier, so their candidates are linear
in the first attempt’s rather than independent; the deterministic maps, Pornin’s
[pornin-2023], Elligator 2 and simplified SWU, use only the first. For the
mapping, 128 bits suffice as well: two items stall a rateless decoder
indefinitely only if their schedules agree entirely, which after the salt
requires equal seeds, about identifiers. Schedules that agree on a
prefix only delay decoding, at a cost that does not depend on the seed’s width;
that is a property of the sketch, not of its checksum. The implementation
digests items with salted SHA-256 for both uses by default.
Riblt::projected keys cells by the items’ identifiers and
replaces both digests by projections, each under keys of its own and in a field
chosen for its cost; both are benched (Costs by
lifetime).
What need not be uniform on the group, or indifferentiable from a random oracle, is the map from digests to points: relations must be hard to find within the subset of the group that it reaches. Maitin-Shepard et al. give a sufficient condition. Let the group have a direct factor of prime order whose complement can be sampled efficiently, and let the output of a random oracle be mapped to the group by an -weak encoding: one whose preimages can be counted efficiently and sampled uniformly, of which no point has more than , and of which a uniformly random point has on average at least . Then finding a multiset collision with multiplicities below is as hard as computing discrete logarithms, at a cost of simulating the oracle of about scalar multiplications per query and half the success probability [maitin-shepard-et-al-2016, Section 4.1, Theorem 1, and Appendix A]. An encoding that misses a fixed fraction of the points can qualify: their characteristic-2 Shallue–van de Woestijne encoding misses about of them and has close to 3 [maitin-shepard-et-al-2016, Section 4.2]. Whether the maps used here meet these hypotheses is open (Known weaknesses).
A participating peer can always prevent reconciliation by misrepresenting its set; no checksum prevents this, and it is not considered. Corrupt coded symbols are the pollution attack of network coding, in which forwarded packets are linear combinations of a source’s packets, and there the source authenticates the space that the combinations must lie in. Homomorphic hashes of a publisher’s blocks let a receiver verify each encoded block of a rateless erasure code as it arrives [krohn-freedman-mazieres-2004], authenticated LT codes such as Falcon codes verify each symbol with a message authentication code under a key shared by sender and receiver [juels-et-al-2015], and signatures on the linear subspace spanned by a source’s packets let any node derive and verify signatures on their combinations in random linear network coding [boneh-freeman-katz-waters-2009]. A coded symbol of a RIBLT is likewise a sum, and its checksum a homomorphic hash of the items it holds, but none of these schemes applies: each authenticates data against a source or a key from which every legitimate symbol derives, whereas the items of a reconciled set are authored by any party, the adversary included, and carry no signature or key that distinguishes an honest item from an adversarial one. Whoever supplies a curve certificate stands in a separate relation to its verifier (Parameter selection and verification).
Setting and reference work factor
In the universal setting the item hash is public, and the checksum must resist relation finding without a secret. Keying the hash with a secret the peers coordinate, as the Rateless IBLT paper proposes [yang-gilad-alizadeh-2024, Section 4.3], defeats the precomputation of relations among item hashes but repeats the hashing of every item for each key; randomized for each reconciliation session, it does so in every session [meyer-scherer-2024, Section II]. This repository considers namespaces whose salt is published by a randomness beacon, such as a block hash [bonneau-clark-goldfeder-2015], and whose checksums are shared by all sessions within a bounded epoch. Bitcoin’s compact block relay keys the short identifiers of a block’s transactions with a hash of the block header and a nonce [corallo-2016]. The header commits to those transactions, so they cannot have been chosen in relation to the key: as in the keyed model, the set is fixed before the key is revealed, and a short keyed hash serves. Items reconciled within an epoch carry no such guarantee: the adversary may author them after the salt is published, so the checksum must resist relation finding for the duration of the epoch, which the regular publication of new blocks bounds. A forgery affects reconciliation within one namespace only. This study assumes that the protocol validates the items it obtains independently of reconciliation, as Bitcoin nodes validate transactions, so that a failed or wrong decoding costs a repeated reconciliation and admits no invalid item. A failure of soundness for one curve, even a discrete logarithm computed in its group, is then a failure of liveness, and a transient one: the next beacon value selects a new curve. The short horizon and the limited scope of failure motivate a reference work factor between and group operations, with the upper part of the range preferred; the families compared here lie between and (Security considerations). This range is an application assumption under evaluation; salting does not by itself imply it.
Maitin-Shepard et al. [maitin-shepard-et-al-2016, Section 4.1] reduce collision finding with bounded multiplicities to the discrete-logarithm problem in a large prime-order component of the checksum group, under the random-oracle and encoding assumptions stated there. For a prime component of order , group operations serve here as the generic reference cost. An order near gives a reference cost near . Several curve models over fields of about 127 bits admit 16-byte encodings of such groups. The security assessment must also cover the hash maps and parameter selection actually used.
Precomputation and per-namespace curves
A public salt over a fixed checksum group serves here as a point of comparison, not as a design under consideration: the salt changes the item-to-point map, but the group, and any precomputation against it, serves every epoch. Bernstein and Lange [bernstein-lange-2012] give a discrete-logarithm algorithm that, after about operations of precomputation, uses a table of about entries and about group operations per logarithm; [bernstein-lange-2013] discusses the cost model for such precomputation. For near these scales are , , and respectively. They are leading-order estimates for a time–memory tradeoff, not measured costs and not the cost of a RIBLT forgery. Their significance depends on offline resources, storage, and the number of targets.
Each beacon value therefore determines both the salt and the curve. Subject to the entropy of the beacon and to the parameter-selection procedure, this prevents direct reuse of tables computed for earlier curves. It does not exclude all useful precomputation, nor does it guarantee the generic work factor in every namespace.
Parameter selection and verification
Candidate curves are derived from the beacon value by hashing, and a namespace uses the first candidate whose group order is an admissible cofactor times a prime . Deriving curves from public randomness has precedent in verifiably random seeds [ansi-x9-62-1998, rfc5639], lottery draws [baigneres-et-al-2015], and a beacon whose outputs seed a stream of curves [lenstra-wesolowski-2017]; those curves serve general use at the 128-bit level, whereas here each beacon value selects a smaller one for its namespace. A participant may determine that curve by counting points itself, or may check a certificate: for the accepted candidate, and a hashed point whose cofactor multiple is not and satisfies , and for each earlier candidate a witness that its order is inadmissible, as trx proposes for its own enumeration. The verifier accepts any witness that satisfies the certificate rules. This repository’s prover derives its witnesses from hashed points, so its certificate is determined by the seed and the rejection policy (how labels are chosen, and whether by factoring). Checking a certificate requires scalar multiplications, a probable-prime test, and an embedding-degree bound, but no point counting.
The probable-prime test is Miller–Rabin to 24 fixed bases, so the primality of is probable, not proven. A candidate with the required prime-order structure has no valid rejection witness, so a certificate cannot skip it. The prover supplies for the accepted candidate; the verifier checks its admissible interval, the condition with not , and the 24 Miller–Rabin bases. The second condition establishes that the order of divides . If is prime, has order , and the family’s cofactor and the Hasse bound then establish . The fixed-base test does not prove that is prime.
The direct checker and certificate verifier share the order-parameter predicates: the probable-prime test, the Hasse interval at the required cofactor, exclusion of , and the embedding-degree bound. Direct checking takes the full order from a trusted point counter. Certificate verification uses the nonidentity point and Hasse argument above instead; its order conclusion remains conditional on being prime.
These formats do not certify every possible outcome of direct checking. An order-admissible candidate can fail the fixed certificate-point check, and the formats have no rejection witness for an anomalous order or a failed embedding bound. A family without a full-order rejection witness also needs a factor for a rejected composite. Direct selection can proceed without those witnesses; the prover reports failure rather than skipping an uncertifiable candidate. Whenever certification succeeds, its selected index agrees with direct selection under the same candidate criteria and filters that reject only candidates failing those criteria.
The families differ in the cost of point counting. Two implementations count
points here. PARI/GP [pari-gp] is a computer algebra system for number theory: a
C library, PARI, with an interpreter, GP. The optional pari feature links the
library and calls it for point counting and integer factorization
(curvegen::pari). SageMath (Sage) [sagemath], in
which the reference programs are written, also counts points through PARI. The
other implementation is this repository’s own, in Rust, for binary fields only;
it has no dependency on PARI.
Over binary fields, Satoh’s canonical lift [satoh-2000] and Mestre’s
arithmetic–geometric mean, in the form compared and combined by Gaudry
[gaudry-2002], count points in polynomial time using 2-adic arithmetic alone.
The repository implements this for ,
and
(curvegen::agm), counting the dense 122-bit
curves in a pentanomial basis and the Galbraith–Lin–Scott (GLS) curves
[galbraith-lin-scott-2009] through their subfield curve over
. A GLS constant is for in
, so GLS candidates are drawn from about
constants, against about for the dense family; the accepted curves are
a subset of each. For all three fields the Rust prover produces certificates
without PARI: a candidate whose odd part is composite with no prime factor below
the trial-division bound ( for ,
otherwise) is rejected by its full order rather than by a factor.
The known-answer certificates were produced with Sage, which derives its
witnesses as the Rust prover does, from hashed points
(sage/kat_common.sage). For the 109- and 122-bit
families it labels a rejection by the smallest prime factor of its odd part
(below in the 122-bit scripts, without a bound in the 109-bit one).
Without PARI, the Rust prover reproduces the indices and orders of these
certificates and the 122-bit certificates byte for byte; with PARI supplying the
factors, it reproduces the 109-bit certificates byte for byte as well.
Over prime fields, the corresponding method is the Schoof–Elkies–Atkin algorithm [schoof-1995], which requires modular polynomials. The repository does not implement it: prime-field and curves are counted by PARI, which handles curves with complex multiplication by a small discriminant separately before falling back to it. A participant in a prime-field namespace who does not run PARI or an equivalent system must therefore rely on another party’s certificate to establish which curve is in use, whereas a binary curve can be derived and checked independently by a small, self-contained program. In a setting where every participant derives the curve from a public beacon, this is an advantage of binary curves, separate from their arithmetic cost.
The cost of selection is paid once per namespace. Each run report’s Curve
selection section gives, per family and seed of curvegen.csv, the wall-clock
time to find a curve from a seed, to find and certify it, and to verify the
certificate, and how the prover’s time divides among the phases of the search.
The number of candidates before an admissible order is geometric, so the time to
find varies severalfold between seeds. On an Apple M4 the Rust implementation
finds a curve in about 20 ms on average, an order of
magnitude faster than PARI on the same seeds; PARI finds the prime-field and
curves in 0.25 to 2 s on average; and certificates verify in
under a millisecond on average.
Binary fields add a structural check that prime fields do not need: Weil descent
through subfields. For the prime extension degrees 127 and 109 the only proper
subfield is [menezes-qu-2001]. For , 2 has order 36
modulo 109 and every descent has genus at least . For , 2 has
order 7, and the generalized Gaudry–Hess–Smart (GHS) descent
[gaudry-hess-smart-2002, hess-2003], which extends to isogenous curves
[galbraith-hess-smart-2002], reaches curves of admissible order with heuristic
probability about per epoch: 65 isogeny classes of order , against
none among the 36 classes the basic descent reaches
(sage/ghs.sage). No check is made; a descent compromises
only the epoch whose curve it reaches. The composite degree 122 is assessed in
curvegen::select122.
Design criteria
These assumptions differ from those of fixed-curve design:
- The operations that dominate the cost are one hash-to-curve per item, followed by one point addition or subtraction per coded symbol the item maps to, plus encoding and equality tests during peeling. Scalar multiplication is not among them; only curve selection and certification use it.
- Curve parameters vary by namespace. An optimization tied to particular parameters must include its setup cost and its amortization within one namespace. Constants fixed by the field or the curve model remain available.
- The arithmetic processes public data, so variable-time implementations are acceptable (Adversary).
- Point counting and parameter certification occur once per namespace and are amortized, but must remain tractable for each new beacon value (Parameter selection and verification).
- Field and curve structure require separate analysis for attacks below the reference work factor, including applicable Weil-descent methods [gaudry-hess-smart-2002, hess-2005, gaudry-2009, diem-2011, joux-vitse-2012]. The existence of a descent does not by itself establish such an attack.
Candidate constructions lists the constructions compared, at 128-bit and shorter encodings. Their arithmetic costs are measured here; their security conditions are assessed separately.
Questions outside this study
Which beacon value salts which data, and the interval in which a participant can withhold or delay a value it has observed, are questions for the protocol that uses the checksum; they are not addressed here. Whether the checksum covers sets or multisets changes the bounds on relation finding of Setting and reference work factor but not the constructions compared. Targets without carry-less multiplication, WebAssembly among them, are represented only by the portable build described in Measurement methodology. How the RIBLT performs when a peer reconciles with several others, and how far a third party can delay decoding with items whose schedules agree, are questions for the sketch rather than for its checksum.
Workload
For a namespace , let map an item to a group element. The digest of a multiset is
D_N(S) = sum of H_N(x), with multiplicity, over x in S.
Insertion and removal add or subtract a hashed point. A prepared representation of is reused for every coded symbol the item maps to. The measured costs are hashing to a reusable addend, signed accumulation, and encoding or decoding accumulated points.
The encoding must represent the additive closure of the hash outputs, including the identity, negatives, and sums, because coded symbols hold arbitrary sums. Prime order is not required. A subgroup or quotient group is sufficient if hashing, equality, accumulation, and canonical encoding all refer to the same group. Not every bit string needs to be a valid encoding.
The RIBLT workload implements encoding and peeling with an XOR item field, an integer count, and an ECMH checksum. It is a cost model for these operations, not a specification of a wire protocol.
Cost in repeated reconciliation
The RIBLT mapping includes an item in coded symbol with probability , so an item enters , about , of the first symbols, and symbol holds about of items: the first symbols are dense. Reconciling a difference of items takes of about symbols [yang-gilad-alizadeh-2024]. Under three assumptions,
- weights are expected weights,
- every round reconciles the same number of new items, and
- each round rebuilds its symbols from the full set,
one round over a set of items costs additions, about . Hashing is per item and its result can be kept, so a set that grows to items by rounds of new items costs hashes in all, but
sum over rounds of n_j k(1.35d), about (N^2 / d) ln(1.35d) additions.
Under this model the number of additions grows quadratically in and the number of hashes linearly: a round performs hashes against additions. Which dominates the elapsed time also depends on their measured unit costs. Decoding adds about subtractions per round, and one equality test per examined symbol, lower order than rebuilding when is much larger than . If instead each party keeps its symbol sums between rounds and adds only new items (assumption 3 dropped), encoding falls to about additions, linear in , with one hash per additions; decoding is then of the same order. Kept hashes and sums are valid only within one namespace: a new beacon value changes the salt, the curve and the mapping, and everything is recomputed.
Comparison with the reference implementations
The Go benchmarks of
yangl1996/riblt#3 run at pinned
revisions of [riblt-ecmh]: the upstream XOR checksum, the ristretto255 ECMH with
the reference 64-bit mapping, and the same with a ChaCha8 mapping. All three are
run by nix run .#riblt-go-bench. riblt.stream follows their
BenchmarkEncodeAndDecode. The decoder holds items of its own and the
common ones, and the encoder holds of its own and the common ones;
symbols are 64 bytes, and insertion is outside the timed routine. riblt.encode
per item corresponds to BenchmarkSketchAddSymbol at smaller . ristretto255
runs as a family of the RIBLT suites, so that a small curve and the fixed group
are measured in one harness.
The implementations differ in ways that affect the comparison:
- Items are hashed with tagged, salted SHA-256 (two digests for ristretto255),
where riblt-ecmh hashes the bare symbol with SHA-512. The upstream XOR
checksum is SipHash-2-4 under a fixed key;
xor-siphash.64keys it with the salt. - The rateless decoder recovers an item with the addend its purity check prepared; the ristretto255 version of riblt-ecmh hashes the item to the curve again when it recovers it.
- The ristretto255 addend is the point itself, since curve25519-dalek does not expose its cached form.
- The Rust default mapping uses xoshiro256++ seeded by the whole 32-byte map
digest. Rows marked
map=chacha8use ChaCha8, andmap=mcg64rows use the reference 64-bit generator. The Go ChaCha8 version of riblt-ecmh replaced that generator because two items with equal 64-bit seeds have equal mappings, and the decoder cannot separate them (yangl1996/riblt#3; Known weaknesses). Even Rust’s ChaCha8 comparison uses different output from Go’s ChaCha8Rand, so their cells differ. An unmarked mapping row uses the default of its recorded source revision; historical runs are not relabelled when the default changes.
The checksum work is hashing items to addends, adding addends to cells, checking
purity while peeling, and encoding or decoding points. Rows that differ only in
the group, in the same Rust harness with the same mapping, workload, batching
and build, measure checksum substitution, including the choice of hash and
point representation. A time ratio against Go riblt-ecmh also includes the
mapping generator, the reuse policies above and the port from Go to Rust;
these implementation gains are not attributed to this project. Replacing
ChaCha8 with xoshiro256++ is of the same kind: it is chosen to make the
checksum’s cost clearer in the end-to-end figures. Matched map=chacha8 rows
provide a comparison of the generator’s effect once the new clean runs are
measured; historical timings do not quantify this change.
Candidate constructions
| Construction | Field | Representation choices | Sources |
|---|---|---|---|
| Ordinary binary curves | , | Extended, unscaled or lambda-projective accumulation; subgroup encodings, by or by Pornin’s | [pornin-2022, oliveira-et-al-2013, crrl, pornin-2024] |
| Binary curves over a quadratic tower | Dense or subfield (GLS) curve constants; the same accumulators and encodings | [galbraith-lin-scott-2009, pornin-2023, oliveira-et-al-2013] | |
| Complete Edwards curves, | , or ; , | Montgomery affine points, Edwards accumulators, cached addends | [bernstein-lange-2007, hisil-et-al-2008, montgomery-1987] |
| Short Weierstrass curves, | The same three fields | Complete projective or Jacobian accumulation | [renes-costello-batina-2016, efd] |
| Complete twisted Edwards curves, | , ; , , or | Quotient by the rational 2-torsion subgroup, a construction related to Decaf; canonical 16-byte encoding | [bernstein-et-al-2008, hisil-et-al-2008, hamburg-2015, pornin-2024] |
| ristretto255 (reference) | , | Upstream implementation | [rfc9496, bernstein-2006, curve25519-dalek] |
| secp256k1 (reference) | , | Upstream implementation | [certicom-2010, libsecp256k1] |
The 107- and 109-bit families give 14-byte encodings. Their nominal rho costs range from to group operations (Security considerations). They show the cost of trading security margin for width. The two 256-bit groups are fixed-curve references at conventional security levels.
Binary Edwards curves [bernstein-lange-farashahi-2008] are excluded on inspected operation counts under equal field arithmetic; they are not implemented or measured. Every ordinary binary curve is birationally equivalent to a complete binary Edwards curve [bernstein-lange-farashahi-2008, Theorem 4.3], so the exclusion is one of cost, not availability. Their complete mixed addition costs , and with the formulas of Kim, Lee and Negre [kim-lee-negre-2014]; the complete unscaled formulas used here [pornin-2022] cost . , and denote a field multiplication, a squaring and a multiplication by a curve constant, counted as a full multiplication for generic dense parameters. Mixed addition is the most frequent operation of the workload (Workload). The binary Edwards formulas with lower operation counts [bernstein-2009] are differential: they compute from , and , as a Montgomery ladder supplies them, and a coded-symbol update adds an independent hashed point with no known difference.
The quadratic extensions fit 16-byte encodings with one-word base arithmetic. Goldilocks [polygon-zero-2022] uses Plonky3’s implementation [plonky3]; its 2-adicity of 32 makes square roots, and so decoding and hashing, slower than over ; the benchmark report’s Goldilocks rows measure the difference. The 31-bit primes of current proof systems, M31 [haboeck-levit-papini-2024] and BabyBear [bruestle-gafni-2023], would need extensions of degree 4 to reach the same group size. Degree-4 extensions admit the heuristic index-calculus asymptotic [gaudry-2009], below the generic , so group size alone does not justify the target security there; these fields are excluded from the comparison.
The variable-curve families hash by try-and-increment [boneh-lynn-shacham-2001].
Alternatives are Elligator 2 [bernstein-et-al-2013] on every Edwards and twisted
Edwards family, simplified SWU [rfc9380] on every Weierstrass family, and
Pornin’s map [pornin-2023, crrl] on every binary family, each wherever its
preconditions hold; curve::h2c tabulates the cells
and the reason for each empty one. These are map-level alternatives. A single
map is not indifferentiable from a random oracle, which the checksum does not
require; the Adversary section states what it does
require, and a sufficient condition that is not established for these maps or
for try-and-increment. The fixed-curve references use the maps named by their
benchmarks. The RIBLT benchmarks hash each family by the construction its run
measured cheapest (The RIBLT plan).
Security considerations
Encoded width, group order, and attack cost are distinct quantities. A 128-bit encoding does not imply 128-bit collision resistance. Generic estimates must be read together with extension-field structure, endomorphisms, the parameter selection procedure, and the distribution of the hash map. A discrete-logarithm estimate is not by itself a proof of hardness for every multiset relation problem.
The table gives the nominal cost of rho with the negation map, group operations [pollard-1978, wiener-zuccherato-1998], divided by a further for the GLS automorphism group of order 4 [duursma-gaudry-morain-1999], for the largest prime dividing each family’s group order. The “Families compared” table of each run report computes the same quantity from the recorded by that run’s group suite:
| Family | Group order | of rho cost |
|---|---|---|
| Binary, | , near | 62.8 |
| Binary, , dense constant | , near | 60.3 |
| Binary, , GLS | , near | 59.8 (automorphism group of order 4) |
| Binary, | , near | 53.8 |
| Weierstrass, , | 63.3 | |
| Edwards, , | 62.3 | |
| Twisted Edwards, , ; , or Goldilocks | 62.8 | |
| Weierstrass, , | 60.8 | |
| Edwards and twisted Edwards, , | 59.8 | |
| Weierstrass, , | 53.3 | |
| Edwards, , | 52.3 |
For curves over , index calculus over the extension [gaudry-2009] costs about group operations up to logarithmic factors, the same as rho; the GHS descent for [hankerson-karabina-menezes-2009] likewise gives no gain over rho. Candidates over whose -invariant lies in are excluded as a conservative policy.
The setting is an ephemeral public namespace, with salt and curve derived from a beacon value. It is distinct from a secret-keyed namespace, in which keyed XOR checksums suffice under the adversary assumptions of Keyed and group-based checksums. Conclusions for one setting do not transfer to the other. The implementation provides tagged, salted hashing.
The parameter-selection code and the reference programs state the acceptance conditions for each family. Tests combine field reference computations, independent affine group laws, Sage/PARI fixtures, canonical-encoding checks, signed accumulation, and complete workload checks. Sampled tests are evidence, not proof, and probable-prime tests do not certify primality.
Known weaknesses
Each weakness below is accepted at the reference work factor, stated as an assumption on the application, or left open, as indicated.
Discrete logarithms reduce the checksum to an insecure AdHash. Write for a generator of the prime-order component and for the discrete logarithm of the hash of item , so that its prime-order part is . An adversary who knows for a collection of items converts a relation into the congruence , with a further condition modulo the cofactor, which is at most 4. The checksum is then AdHash [bellare-micciancio-1997] with modulus [maitin-shepard-et-al-2016, Section 8], the group order and not a modulus chosen for AdHash: for the families compared, lies between about and , where AdHash’s security requires thousands of bits (below). The following are leading-order estimates of the resulting attacks:
- A nonzero relation with coefficients in gives two distinct sets with equal checksums. Wagner’s algorithm [wagner-2002] finds one in about operations on about as many hashed items, to here, for a relation of about terms; list sizes and sorting contribute further factors. A relation with coefficients in and right side the logarithm of a target checksum gives one set with checksum ; with coefficients in it gives two sets whose checksums differ by .
- Relations with small integer coefficients give the corresponding multiset relations. The estimate of [maitin-shepard-et-al-2016, Appendix B] gives a coefficient vector of Euclidean norm about from items, for a lattice reduction algorithm of Hermite factor constant . With LLL ( about 1.021), this is a heuristically expected norm of 12 to 15 from 59 to 65 items, and so no coefficient larger in magnitude. Such relations are forgeries only where the application admits multiplicities; they are not in general set relations.
For comparison, additive hashes with 128-bit security against Wagner’s algorithm need 2688 bits of output when a relation may have at most terms, and 4160 bits without that bound [mihajloska-gligoroski-samardjiska-2015, Section 4; meyer-2022, Section V-B]. Against lattice reduction on multisets, at the Hermite factor constant of about 1.007 that 128-bit security requires, AdHash needs a modulus of over 400,000 bits [maitin-shepard-et-al-2016, Appendix B]. For an additive fingerprint modulo , where the leading-order estimate above is about operations, Hoyte reports a -dimensional birthday solver that finds collisions in about 28 hours on eight cores, with 60 GB of memory and 1.5 TB of storage [hoyte-2023]. The checksum does not expose the residues modulo that these algorithms need until the logarithms are known. Once they are, the modulus is , at most , and the estimate falls by a factor of to , low enough that a relation among the residues can be found in practice.
In these attacks the cost is dominated by computing the logarithms; this bounds the cost of a forgery from above, not from below. For logarithms in one group, with well below , rho with retained distinguished points costs on the order of times one logarithm [bernstein-lange-2012, Section 1, after Kuhn and Struik]: about times the tabulated cost for the multiset relation above, and to times for Wagner’s algorithm, as order-of-magnitude estimates. Whether lattice methods find set relations from fewer logarithms is not assessed. The attack of yangl1996/riblt#3 on the XOR checksum is the case of this structure in which the relation is found by linear algebra over at negligible cost. The step from a relation to a decoding failure, which depends on the cells the items map to, is not assessed here (Linearity of the checksum).
Generic work factor. The 107- and 109-bit families have rho costs of to , in the lower part of the reference range. Curve-specific precomputation is limited, not excluded, by deriving a curve per beacon value (Precomputation and per-namespace curves).
Weil descent. A curve is reachable by the generalized GHS descent with heuristic probability about per beacon value, and no check excludes it (Parameter selection and verification).
Probable primality. The verifier tests with Miller–Rabin to 24 fixed bases. Composites passing all of them can be constructed, so no error bound holds against a prover who chooses . The conclusion that the group order is the cofactor times is conditional on the primality of .
Pairing reductions. The embedding degree of is checked to exceed
, which excludes the reductions of Menezes–Okamoto–Vanstone and
Frey–Rück to that bound; the degree is not otherwise determined. The check, a
baby-step giant-step search for , takes about products
modulo , which the curve-generation benchmarks time alone
(curvegen/embedding). Anomalous curves, of order , are rejected.
Hash to curve. Items are hashed with tagged, salted SHA-256 and a counter
(hash). A deterministic map takes one 128-bit half of the
first digest (hash_to_curve_map1) or sums the images of both halves
(hash_to_curve_map2); try-and-increment takes the two halves of each digest in
order and increments the counter when both fail. The reduction of a candidate to
the field and the sign convention are defined per map. No RFC 9380 hash-to-curve
suite is implemented. Uniformity on the group is not required
(Adversary), but the weak-encoding hypotheses of the
reduction of [maitin-shepard-et-al-2016] are not established for these maps.
Mapping-seed collisions in the RIBLT. This weakness belongs to the RIBLT’s
mapping, not to the checksum, and lies outside the research question; it is
stated because the RIBLT comparison rows use both mappings. The cells an item
maps to are determined by its digest under the mapping tag
(riblt), through the gap law of the reference
implementation [yang-gilad-alizadeh-2024]. Two items whose generators start in
the same state map to the same cells in the same order for every prefix of the
coded symbols. If both lie in the symmetric difference, every cell they map to
holds both: after the other items are peeled, its count is even and its checksum
is the sum or difference of their two points, so no cell containing them becomes
pure and neither item is recovered, unless a checksum collision or false
singleton occurs independently. A finite peel returns failure; a rateless
decoder that requests coded symbols until decoding succeeds does not terminate.
No checksum collision is required, and the group’s work factor does not enter.
The reference implementation seeds a 64-bit multiplicative generator with the
item’s 64-bit hash. If the mapping input is public, two items with equal seeds
are found by a birthday search over about digests, below the rho cost
of every curve family compared, and an item sharing a chosen item’s seed costs
about . Between honest items, a coincidence has probability about
for items in the difference. Buchanan’s implementation
[riblt-ecmh] replaces the generator with ChaCha8, citing this case
(yangl1996/riblt#3, comment of
2026-02-24). The implemented default seeds xoshiro256++ with the whole 256-bit
map digest. Its state is the digest itself, so equal generator states require
equal digests, at a cost of about for a pair, with one exception in
: the all-zero digest is reseeded from SplitMix64 and shares a state
with the one digest that encodes that state. Since the generator runs through
its nonzero states in one cycle, distinct states yield distinct
sample streams; whether two streams place their items in the same cells of a
given table is the gap recurrence’s matter, as for any generator. The generator
need not be cryptographic: the digest is already a salted hash, and the mapping
is public. The gap law is unchanged, and ChaCha8 (ChaCha8) and the 64-bit
generator (Mcg64) remain as comparisons. Nor does the seed need 256 bits: a
128-bit seed puts equal seeds at about identifiers after the salt.
Riblt::projected seeds the generator with the whole projection of the item’s
identifier under keys of the mapping’s own (Adversary),
in a field chosen for its cost apart from the checksum’s. Its halves are a
linear map of the identifier’s halves under two keys, invertible unless a key
is zero or the two are equal, so equal seeds require equal identifiers; under
, whose halves are truncated to 128 bits, they
require a coincidence of 256 bits. Either costs about . The
projection’s cost is benched, but it is not the default. The mapping need not
depend only on the public salt
of the checksum: a schedule keyed by a secret shared between the peers prevents
a third party from searching offline for equal seeds, even with a 64-bit
generator, while the checksum’s namespace remains public. The coincidence
between honest items is unchanged by the key, since it does not depend on who
can compute seeds. Schedules that agree only on a prefix delay a rateless
decoder without stalling it; that delay, and any other a third party induces
through the schedule, concerns the sketch rather than its checksum and is not
assessed (Questions outside this
study).
Side channels. Hashing, field inversion, and batched inversion run in variable time. This is acceptable only because the hashed items are public in the setting considered (Adversary); the code is unsuitable for secret inputs. Power and electromagnetic leakage are not considered.
Assumptions on the application. The beacon value is assumed unpredictable until the epoch begins; withholding, delay, and grinding by its producer, whose cost Bonneau, Clark and Goldfeder bound for block hashes [bonneau-clark-goldfeder-2015], are outside this study (Questions outside this study). A checksum collision causes a decoding error within one namespace. The protocol is assumed to validate the items it obtains independently, so that such an error, or a curve whose discrete logarithms are computed, is a failure of liveness until the next beacon value selects a new curve (Setting and reference work factor); recovery is left to the protocol.
Measurement methodology
The benchmarks report operation latency, throughput with independent accumulators, and batch costs. Batch size and representation conversion are part of the workload. A component estimate such as
hash + prepare + k * add
where is the number of coded symbols an item maps to, is a sum of separately measured operations. The RIBLT workload measures complete executions for comparison.
The benchmark report opens with a decision table. For each family it gives the nominal rho of Security considerations; the measured cost of addition, of hashing and preparation, and of encoding and decoding; the two estimates of Cost in repeated reconciliation at and ; and the cost of curve selection. One family dominates another if its rho is at least as large and, for each of the four operations, it either reads the same measurement or is faster beyond both confidence intervals, and it is faster on at least one. Families that no other dominates are not thereby ranked against each other.
Code-generation inspection identifies implementation effects. Static instruction
counts are not timings. Binary-field performance depends on the build’s
carry-less multiplication: without PMULL or PCLMULQDQ the field product falls
back to a portable routine, and the binary families’ measurements do not carry
over to such a build. bench-bins-generic measures that backend. Each result is
bound to its source revision, compiler, target features, machine, and
measurement method. The code-generation report records
observations for the revisions and configurations it names.
With Nix installed, the checks run from the repository root:
nix flake check
The book builds with:
nix build .#site
A group and reconciliation measurement run:
nix run .#bench-run -- group riblt
Each run is identified by a fresh UUIDv7, which sorts by start time and needs no
coordination between machines. The executables come from a Nix derivation built
for a named target CPU: bench-bins is the architecture’s default (apple-m4 on
aarch64, x86-64-v3 with PCLMULQDQ on x86_64), and bench-bins-generic is the
baseline without carry-less multiplication. BENCH_BINS selects another such
build. The runner refuses executables that need a feature the host lacks, times
the suites serially, and records metadata and raw Criterion output under
bench-runs/<id>/, together with a report. Other builds and measurements should
not run during timing. To show whether they did, the runner samples the load
averages every 5 seconds, the interval at which the kernel updates them, into
load.tsv, beginning and ending with 30 seconds idle that measure the machine’s
own load; the report gives each phase’s mean and recovers the threads runnable
from successive 1-minute averages where the kernel does not report them.
The Go benchmarks of the reference implementations run separately (Comparison with the reference implementations):
nix run .#riblt-go-bench
A report can be regenerated from an existing run whose benchmark identifiers the reporter recognizes; runs recorded under an earlier schema need the reporter of their revision:
nix run .#bench-report -- bench-runs/ID report-output
Published runs are kept in the repository in a compact form, one directory
results/<id>/ per run. benchmarks.csv has one row per benchmark:
Criterion’s group, function and parameter, the estimate the report reads (the
slope where Criterion fits one, otherwise the mean), its 95% confidence
interval, and the declared throughput. meta.json is the run’s metadata without
the host name, curvegen.csv, present when the run timed curve selection, the
searches per seed, and load.tsv the load samples. Criterion’s output, the
figures and the report are not kept; the classification into layers, families
and operations is not stored either, and is applied by the reporter of the
revision that renders the run. Only a run of a committed source is exported,
since no published revision reproduces one with uncommitted edits. Each run is
exported into its own directory under results/, which must not exist yet:
nix run .#bench-report -- --export bench-runs/ID results/ID
The reporter renders the directory as it renders the run’s Criterion output,
to the same tables and figures, except that only the default estimate is
available. The site build renders each run under results/ as a chapter of
the book’s evidence, whose first paragraph states the commit, machine, build
and start time recorded in meta.json.
The group plan
The group suite times each family in two passes. The first times what the
insertion model and the RIBLT plan read: hashing, preparation, encoding and
decoding in batches of 1024, addition, negation, the identity test, and
equality on impure cells. The second times, for the families the first pass
singles out, batches of 8 and 64, subtraction, equality on pure cells, and the
hash of 32-byte IDs to addends under salted SHA-256 and under each projection
(Adversary). A family is singled out when its modeled
insertion at (below) is within 50% of the least of any family; if
none of these is over a field of odd characteristic, the cheapest such family
is added as a contrast. The plan is recorded in group-plan.tsv and
meta.json; GROUP_PLAN reuses another run’s.
The RIBLT plan
The RIBLT suite times a family under one hash construction and at a scope
chosen from the group operations of the same run, which the suites before it
time. For each family, the construction is the one whose modeled insertion,
hash + prepare + k * add or a fused hash to the addend, costs least at
among the constructions the RIBLT benchmarks implement for it. The
scope follows that cost’s ratio to the least of any family: within 15% every
sweep, within 50% a reduced sweep of each axis’s endpoints and middle, and
otherwise a single point of each benchmark. A new construction therefore enters
the RIBLT measurements through its group benchmark, without a change of any
family’s default hash. A family timed beyond a single point also gets the field
whose projection hashes its IDs to the addend cheapest under its construction,
and its encoding and peeling are timed again, at the reduced sweep’s points,
with cells keyed by IDs under that projection. Their mappings are seeded by the
projection that digests IDs cheapest, which does not depend on the family; the
RIBLT suite times its mapping rows first to choose it. The XOR checksums and
ristretto255 reproduce the Go reference implementations and are timed in full
regardless. The plan is recorded in riblt-plan.tsv and meta.json;
RIBLT_PLAN reuses another run’s.
Reading a run report
Values are Criterion’s estimate and 95% confidence interval, per element where the benchmark declares an element count and otherwise per iteration. A table colours each value by its ratio to its column’s minimum on matplotlib’s inferno scale, from pale yellow at the minimum to purple at 16 times or more. The minimum is bold when no other interval overlaps its own; otherwise the values that overlap it are tied, in italics. Overlap leaves an order unresolved. A tag after a row’s name marks work unlike the rest of its column: addition formulas that are not complete (they branch on the identity and on doubling), or a term another suite timed. The XOR baseline is excluded from column minima. Tooltips name the benchmark each value reads.
A modeled cost sums separately measured operations, and its interval combines their half-widths in quadrature; it has no independently measured coverage, and neither has a range over curve-selection seeds, which spans their point estimates. The insertion model uses of Workload and compatible representations: a recipe either hashes, prepares the hash’s output, and adds the prepared addend, or hashes straight to the addend and skips the preparation. Pornin’s map returns the extended binary addend, and its variants to and the λ and addends; Elligator 2 and SSWU return affine points, which the measured preparation takes. Preparation and addition are timed on try-and-increment inputs, so a recipe with another map is a model, not an end-to-end measurement. Every recipe also adds the salted map digest and the walk of the mapping’s indices below , timed alone by riblt.mapping and the same for every family, which is why the model’s ratios between families are smaller than those of their hashes and additions. The model omits cell allocation, the key XOR and the counts; the measured RIBLT encoding includes them.
Preparation occurs once per source item, addition once per cell update, and subtraction negates an addend before adding it. Encoding and decoding occur per transmitted and received cell. Throughput runs eight independent accumulators, latency one dependent chain. A batched operation reports time per element at its batch size, 1024 unless a sweep states another. Batch inversion (Montgomery’s trick) replaces inversions with one and multiplications; binary hashing shares them across the pending candidates of each round, and preparation, normalization and decoding where the representation needs an inversion. The prime-field hashes are bound by a square root per item, which batching does not share. An encoder can batch all its source items, a decoder only the cells of the current peeling wave. The binary w-codec families hash to reusable addends, so their preparation is a copy.
Costs by lifetime
An insertion into cells keyed by IDs is reported by how long each of its terms remains valid. The ID, an item’s SHA-256, is computed once and outlives every salt. Once per salt, a curve is accepted and each hash’s keys are derived. Once per salt and item, the ID is hashed to the addend and to the mapping’s seed, and the seed’s indices are walked below . Once per cell update an addend is added, and once per transmitted cell a sum is encoded and decoded. Each term is given under salted SHA-256 of the ID and under the projections, followed by two measured encodings: by salted SHA-256 of the items themselves, and by projections of IDs computed before the timed routine. A per-salt term is amortized over the items inserted under that salt, a number the benchmarks do not fix.
Contributing a run
A run on another machine is added to results/ by pull request. The runner
records the commit of the checkout it runs in, and only a run of a committed
source is exported, so the run happens in a clean clone of a published commit:
git clone https://github.com/nothingmuch/ephemeral-ecmh
cd ephemeral-ecmh
nix build --no-link .#bench-bins
nix run .#bench-run -- --profile full
The run’s directory, bench-runs/ID, is named by its UUIDv7; the report
describes the machine and build from meta.json. Building beforehand keeps
compilation out of the timed window. The full profile (3 s warm-up, 5 s
measurement and 100 samples per benchmark) takes several hours over all suites;
runs under the default quick profile are preliminary. On x86_64 the native build
needs AVX2 and PCLMULQDQ; BENCH_BINS and suite arguments select another build
or a subset, as above. The run is then exported:
nix run .#bench-report -- --export bench-runs/ID results/ID
The Go benchmarks of the reference implementations, timed on the same machine,
can accompany the run as results/ID/riblt-go.txt, which the reporter does
not read:
nix run .#riblt-go-bench | tee results/ID/riblt-go.txt
The export is committed on a branch, whose pull request adds only
results/ID/:
git switch -c runs/ID
git add results/ID
git commit -m "runs: ID"
Field and curve code generation
This report examines optimized field arithmetic and curve operations for implementation effects that could confound the ECMH and RIBLT comparison. It records observations from the source revision and target configurations below. Instruction counts identify code for inspection; they do not measure execution time or establish a ranking of fields. Branch counts are static branch sites, not executed branches. Native timing evidence is reported separately in the benchmark results.
Run:
nix run .#asm-reportat 2d6c7e3c (rustc 1.98.1, LLVM 22.1.8, release profile,--features asm-probes).- 24 configurations × 239 probes. Each probe is an
#[inline(never)]wrapper insrc/asm_probes.rsaround one field operation, or one group add, sub, equals, prepare or decode, for each of 29 group representations. - “Closure” is the probe plus every crate-local function it reaches. Calls out
of the crate are listed but not counted: crrl’s
set_invert, Plonky3’stry_inverse, the allocator. Merged functions are reported as aliases. - The listings,
meta.json,summary.mdandprobes.tsvare archived outside the repository, inephemeral-ecmh-archive/asm-runs/matrix-20261003. nix build .#asm-listingsbuilds the same matrix from the flake source and records the source revision in place of the host and date. A listing at any revision can therefore be rebuilt without the archive.- Probe and row names use the benchmark report’s family identifiers: the curve
model (
binary,weier,edwards,twisted) followed by the field,127for or for with ,61x2for with ,goldilocks2for over the Goldilocks prime, and so on. Candidate constructions describes each family. All counts are of static instructions.
Interpretation
The inspected instruction sequences are consistent with the stated arithmetic counts. The following implementation and target effects qualify the corresponding measurements. This inspection does not establish that each implementation is optimal, or that the measured ordering generalizes to other processors.
| finding | rows affected | status |
|---|---|---|
| Binary fields get carry-less multiply only from build flags | every row off the carry-less targets | the binary-field timings hold only for builds with PMULL/PCLMULQDQ; bench-bins-generic measures the other backend |
The single-item Edwards prepare performs an inversion | group/*/prepare for edwards127/107/61x2 | intended; the comparison uses the batched rows |
Other observations explained by the inspected code:
- The unscaled binary form has the fewest carry-less products per add and the most per equality test (§4).
- ’s multiply needs more carry-less products than ’s, from its representation (§3).
- fp127’s short sqrt is a loop (§6).
- The Goldilocks panic stubs are unreachable bounds checks, and the Goldilocks² add’s branches are upstream’s rare-carry paths (§5, §6).
- The merged adds follow from the formulas (§4).
1. Binary-field backend selection
| configuration | PMULL/PCLMULQDQ in gf2_127::mul | binary127::add closure |
|---|---|---|
Apple, every model, default (apple-m1) included | 4 | 239 |
Apple generic | 0 | 4707 |
Android default, cortex-x4 | 0 | 4707, 3324 |
Android cortex-{a55,a78,a720,x4,x925}+aes, oryon-1 | 4 | 243–255 |
x86-64 default, v3, v4 | 0 | 5951, 5885, 5176 |
x86-64 v3+pclmulqdq | 4 | 225 |
znver4, znver5, sapphirerapids, arrowlake | 4 | 193–225 |
- Android: In the inspected LLVM configurations, the Cortex models leave out
the optional crypto extension. Without it, the binary-field implementations
compile to their portable backends, carry-less products from integer
multiplications of masked operands (crrl’s
gfb254_m64for ,soft.rsfor and ): 13 to 19 times the instruction count. Among the inspected Android models, onlyoryon-1enables it by default. A deployment using the carry-less backend must establish hardware support and enable+aes, either as a baseline requirement or through runtime detection and dispatch. - x86-64: none of the distribution baselines (v1–v4) includes PCLMULQDQ.
Adding
+pclmulqdqalone to v3 changes only the binary-field probes: the multiplies use PCLMULQDQ with the counts of the named cores, andbinary127::addfalls from 5885 to 225 instructions. The feature, not the CPU model, selects the backend. - Benchmarks:
bench-binscompiles forapple-m4and forx86-64-v3+pclmulqdq,bench-bins-genericforgenericandx86-64; all four are in this matrix. A portable build uses the path of the last two.
For comparison, edwards127::add is 361–370 on every Android model, 362 on M4
and 524 on Zen 4. These are code sizes on two different paths, not speeds.
2. Apple: the configurations compiled are byte-identical through M4
Compiled: aarch64-apple-darwin at default (apple-m1), apple-a14, a15, a16,
a17, m4 and m5, and generic. No iOS target was built: the A-series models were
compiled for macOS. These are compiler-tuning probes, not iOS ABI coverage or
phone measurements.
- default through apple-m4: the whole listings are byte-identical.
- apple-m5: 14 of the 239 probe closures differ: the binary127 equals in
every representation, and the decode, equals or prepare of the Edwards and
Weierstrass families. In each, LLVM uses
umin/umaxwhere the others usecmp+cset/csel, with the neighboring instructions rescheduled. - generic: no crypto extension, so the binary fields take the portable path
(
binary127::add4707, as on Androiddefault). The CPU model also changes the prime-curve code: 149 probes differ from apple-m4 in their closure metrics, among them the Edwards, and Jacobian adds, by a few percent (edwards127::add 373 against 362). The generic benchmark subset therefore carries prime-field control rows.
Identical code removes the need to review each configuration’s code separately, not the need to measure each machine.
3. Multiplies per binary field (M4; PCLMULQDQ counts on x86 are the same)
| field | PMULL per mul / square | where the products go | mul closure |
|---|---|---|---|
| , crrl | 4 / 2 | schoolbook ; the trinomial folds with shifts | 21 |
| , local | 6 / 4 | 4 products; two PMULL folds (pentanomial, elements kept unreduced in 128 bits) | 23 |
| tower, local | 7 / 6 | 3 Karatsuba products; 2 folds per half, paired in one vector | 30 |
| , local | 3 / 3 | 1 product, 2 folds | 15 |
- The code matches
src/field/gf2_122/pmull.rs. The standalone probe uses 4 instructions to materialize the reduction constant; the inspected inlined callers hoist them. - Critical path: ’s is three dependent PMULLs (product, then two folds); ’s is one PMULL plus shifts.
- Per extended point add: 44 PMULLs over , 68 over , 82 over . Pentanomial reduction requires more PMULL instructions than Karatsuba saves in the multiplication step.
These counts arise from this representation and reduction schedule; they do not establish a lower bound for arithmetic in the field, and they are not timings.
4. Binary fields and representations: against , dense against GLS over
and both hold an element in two 64-bit words and differ in the modulus. Degree 109 has no irreducible trinomial, so the pentanomial folds with two PMULLs where the trinomial folds with shifts (§3), and its is dense, so a square root costs a multiplication where costs two shifts. The PMULL counts do not order the timings: in the M4 native run at 7d4c6aa1 the add, at 68 PMULLs against 44, took 12.8 against 14.6 ns at throughput, while its square root took 2.89 against 1.26 ns.
PMULLs per operation’s closure, M4 (x86 carry-less targets equal):
| operation | coordinates | GLS | |||
|---|---|---|---|---|---|
| add | extended | 44 | 68 | 82 | 80 |
| add | (and encoding) | 46 | 74 | 93 | 93 |
| add | unscaled | 32 | 50 | 61 | 61 |
| equals | extended | 8 | 12 | 14 | 14 |
| equals | (and encoding) | 4 | 6 | 7 | 7 |
| equals | unscaled | 12 | 18 | 21 | 21 |
| prepare | extended | 10 | 16 | 20 | 18 |
| prepare | encoding, unscaled | 0 | 0 | 0 | 0 |
- Formulas: the add counts equal the formulas’ costs at the per-field counts of §3: extended (Pornin’s complete addition) , unscaled (the same formula with cancelled) . Equality is in coordinates, extended and unscaled, which compares with ().
- Unscaled: the fewest products per add and the most per equality test. RIBLT adds once per item and cell (the cost model’s adds per item); equality tests are paid per difference during peeling, which the decision model leaves out. The counts therefore point toward the unscaled form for this workload; the timing rows decide.
- Prepare: the encoding and unscaled addends are the decoded affine
point itself, so preparation is a copy (3–6 instructions). The
form’s prepare computes : one inversion (crrl’s
set_invert, uncounted, over ; 170–220 PMULLs in the crate over and ). - Merged: rustc merges
binary122_lambda::add,subandequals(Curve<Gf>) with thebinary122_gls_wones (Curve<Gf61>).Curve<K>selects the representation of and its derived constants and ; mixed addition uses none of them, so identical code is expected. - GLS: only the extended add and prepare differ, by the multiplication by : 82 versus 80 PMULLs, 20 versus 18. These counts do not imply a corresponding speedup; the GLS endomorphism concerns scalar multiplication, outside the primary RIBLT workload.
5. Point adds: branches and stack
Static counts over the add’s closure; ranges are over the configurations of each architecture.
- Branches:
- Extended and unscaled binary adds, and the Edwards and adds over fp127, fp107, for and , are branch-free.
- adds have 4–5 branches: and the identity, exceptional cases of the formulas.
- Weierstrass projective adds (Renes–Costello–Batina) have one branch, the test for an addend, which has no affine representation (two over fp107 and on x86 over ). Jacobian adds have 4–7 and include the inlined doubling (746–880 instructions on M4, against 528–670 for the complete projective form), so only timings can compare them.
- twisted128’s add has 4 branches on M4, from fp128’s carry handling, which its source documents as variable-time; its inputs are public.
- twisted-goldilocks2’s add has 61 branch sites on aarch64 and 20 on x86. They
are Plonky3’s Goldilocks reductions, which branch on carries and borrows
that upstream marks rare (
branch_hint). They are not exceptional cases of the point formulas, and a static count does not say how often they are taken.
- Stack:
- The binary addition probes on carry-less targets have at most two stack accesses (on aarch64, none outside the adds; on x86, a push and pop of one callee-saved register); their field elements use vector registers. The portable path spills: 111–767 accesses on x86 without PCLMULQDQ.
- The prime-curve additions spill on x86: 34–110 stack accesses, against 8–31 on aarch64 apart from weier61x2 (22–55). Register pressure from the multi-limb representations is a platform-dependent implementation effect in this comparison.
6. Prime fields and extensions
- Multiplication: the M4 prime multiply rows have no calls out of the crate. Their reduction sequences differ; counts alone do not determine which field is faster.
- fp127 sqrt: the 71-instruction body includes a loop initialized to 125. The 26× difference in static closure size relative to fp128 (1878) does not give the ratio of executed instructions or timings.
- Goldilocks:
- Inversion is an external call to Plonky3’s
try_inverse, so closure counts omit its body. - The base field’s and Goldilocks²’s
panic_bounds_checkpaths come from the upstream Tonelli–Shanks table indexing, which Goldilocks²’s square root reaches through the base field’s. The source establishesi < m <= 32, so they are unreachable, not a runtime cost.
- Inversion is an external call to Plonky3’s
- Extensions: for and , and Goldilocks², each carry an Edwards or group and, for , a Weierstrass group; their decode closures (1.1–1.6k on M4) include the square root in .
7. Hash-to-curve side
prepare:- Preparation for the variants whose affine representation is already the addend consists of copying it: 3–6 instructions (binary encoding and unscaled, Weierstrass).
- For extended binary forms it costs 73–100 on M4 (computing ).
- For Edwards, the single-item probe is 1.7–3.6k instructions and allocates.
It delegates to
to_cached_batchon one item. The inversion is intrinsic to the coordinate conversion (the affine is the Montgomery point); the Vec is an implementation choice. RIBLT’s encode and batched peel useprepare_batch, which amortizes the inversion.
decode:- ’s is 193–274 with PMULL; its inversion is crrl’s
set_invert, uncounted here. - ’s and ’s are 640–950 on carry-less targets, all in the crate (half-trace and inversion). On x86 without PCLMULQDQ they are 1900–2210 and 1340–1490.
- ’s is 193–274 with PMULL; its inversion is crrl’s
8. Coverage limitations
- The inspected matrix has no probes for sqrt_ratio or the whole hash-to-addend batch path.
- No iOS targets, and no measured phones: core-model names do not identify a Snapdragon or Dimensity device.
- Out-of-crate callees are not counted (Run, above).
Summary across runs
Each run’s measurements stay separate; boxes span recorded 95% intervals, with a line at the estimate, read as in Reading a run report. The displayed measurements keep their benchmark identifiers.
Coverage: Apple M4 · generic · full · ef9e82d3 appears in Insertion, Scaling, Batching, Native and generic builds, Hash to curve, Insertion cost model, Curve selection time, Cost per item with selection. Intel(R) Xeon(R) W-1390P @ 3.50GHz · x86-64-v3 · full · ef9e82d3 appears in Insertion, Scaling, Batching, Hash to curve, Insertion cost model, Curve selection, Curve selection time, Cost per item with selection. Intel(R) Xeon(R) W-1390P @ 3.50GHz · generic · full · ef9e82d3 appears in Insertion, Scaling, Batching, Hash to curve, Insertion cost model, Curve selection time, Cost per item with selection.
-
Apple M4 · apple-m4 · full · ef9e82d3: The run started 2026-10-08T02:49:59Z on Apple M4 (macOS 27.0.1, arm64) and timed commit ef9e82d39fbf06c605e1740360370f0003dc4ca4, built by rustc 1.98.1 (48a229cea 2026-09-01) with RUSTFLAGS -C target-cpu=apple-m4, in the full profile.
-
Apple M4 · generic · full · ef9e82d3: The run started 2026-10-08T07:13:46Z on Apple M4 (macOS 27.0.1, arm64) and timed commit ef9e82d39fbf06c605e1740360370f0003dc4ca4, built by rustc 1.98.1 (48a229cea 2026-09-01) with RUSTFLAGS -C target-cpu=generic, in the full profile.
-
Intel(R) Xeon(R) W-1390P @ 3.50GHz · x86-64-v3 · full · ef9e82d3: The run started 2026-10-08T18:42:23Z on Intel(R) Xeon(R) W-1390P @ 3.50GHz (?, x86_64) and timed commit ef9e82d39fbf06c605e1740360370f0003dc4ca4, built by rustc 1.98.1 (48a229cea 2026-09-01) with RUSTFLAGS -C target-cpu=x86-64-v3 -C target-feature=+pclmulqdq, in the full profile.
-
Intel(R) Xeon(R) W-1390P @ 3.50GHz · generic · full · ef9e82d3: The run 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.
Insertion
RIBLT encoding per item: items into a sketch of cells, the coded symbols that decode differences, under each family’s cheapest measured hash; each run’s three fastest curves, those whose intervals overlap the third, and the representative families, ristretto255 among them. The first row is the insecure XOR baseline, SHA-256 digests XORed into 32-byte cells; the dashed line carries its estimate across the families.
Apple M4 · apple-m4 · full · ef9e82d3: binary 109-u 281.8 ns (281.4–282.2); binary 127-u 287.6 ns (287.0–288.1); binary 109-w 302.2 ns (301.6–302.8). The first two recorded intervals are separated. The third estimate takes 7.2% more time than the first. Also overlapping the third interval: binary 109 λ.
Apple M4 · generic · full · ef9e82d3: edwards127 1415.2 ns (1412.4–1418.1); weier127-jacobian 1562.7 ns (1559.9–1565.6); weier127 1683.2 ns (1679.6–1686.8). The first two recorded intervals are separated. The third estimate takes 18.9% more time than the first.
Intel(R) Xeon(R) W-1390P @ 3.50GHz · x86-64-v3 · full · ef9e82d3: binary 127-u 414.3 ns (413.8–414.9); binary 109-u 422.3 ns (421.7–422.9); binary 122 GLS-u 432.0 ns (431.1–432.9). The first two recorded intervals are separated. The third estimate takes 4.3% more time than the first.
Intel(R) Xeon(R) W-1390P @ 3.50GHz · generic · full · ef9e82d3: edwards127 1879.9 ns (1873.4–1887.5); weier127-jacobian 2034.9 ns (2030.2–2039.9); weier127 2235.7 ns (2227.7–2245.0). The first two recorded intervals are separated. The third estimate takes 18.9% more time than the first.
Coverage: Apple M4 · apple-m4 · full · ef9e82d3: 12 displayed curves of 32 measured rows (including baselines); Apple M4 · generic · full · ef9e82d3: 11 displayed curves of 21 measured rows (including baselines); Intel(R) Xeon(R) W-1390P @ 3.50GHz · x86-64-v3 · full · ef9e82d3: 12 displayed curves of 32 measured rows (including baselines); Intel(R) Xeon(R) W-1390P @ 3.50GHz · generic · full · ef9e82d3: 11 displayed curves of 21 measured rows (including baselines).
Scaling
Encoding per item against the sketch’s cells , items; peeling per difference against the set difference , in a sketch of cells with the prefilter and batched hashes; hashing per item against the batch size, try-and-increment filled and the comparison maps open; the hashes of ristretto255 and of the XOR baseline, a SHA-256 digest, have no batched form and are a single mark at batch size 1. Bands are recorded intervals; line style tells the runs apart.
Batching
Hashing per item by construction, one item at a time and in batches of 1024; a grey line joins a construction’s two estimates. Batching shares the field inversion; the prime-field hashes are bound by a square root per item, which it does not share. ristretto255’s hash and the XOR baseline’s SHA-256 digest have no batched form: each is a single hollow box, labelled one at a time only. The table gives the time saved, .
| Run | Family | Hash | Batch time change |
|---|---|---|---|
| Apple M4 · apple-m4 · full · ef9e82d3 | xor (baseline) | SHA-256 digest, no curve | individual only; the digest is timed one at a time |
| Apple M4 · apple-m4 · full · ef9e82d3 | binary 109 | try-and-increment | 90.6% saved |
| Apple M4 · apple-m4 · full · ef9e82d3 | binary 109 | Pornin’s map | 88.6% saved |
| Apple M4 · apple-m4 · full · ef9e82d3 | binary 127 | try-and-increment | 90.6% saved |
| Apple M4 · apple-m4 · full · ef9e82d3 | binary 127 | Pornin’s map | 87.3% saved |
| Apple M4 · apple-m4 · full · ef9e82d3 | binary 122 GLS | try-and-increment | 86.0% saved |
| Apple M4 · apple-m4 · full · ef9e82d3 | binary 122 GLS | Pornin’s map | 83.2% saved |
| Apple M4 · apple-m4 · full · ef9e82d3 | edwards127 | try-and-increment | 0.0% more time |
| Apple M4 · apple-m4 · full · ef9e82d3 | edwards127 | Elligator 2 | only one mode measured |
| Apple M4 · apple-m4 · full · ef9e82d3 | weier127 | try-and-increment | 0.9% more time |
| Apple M4 · apple-m4 · full · ef9e82d3 | weier127 | simplified SWU | only one mode measured |
| Apple M4 · apple-m4 · full · ef9e82d3 | ristretto255 | upstream map | individual only; comparison harness has no batched entrypoint |
| Apple M4 · apple-m4 · full · ef9e82d3 | secp256k1 | upstream map | individual only; comparison harness has no batched entrypoint |
| Apple M4 · generic · full · ef9e82d3 | binary 109 | try-and-increment | 91.2% saved |
| Apple M4 · generic · full · ef9e82d3 | binary 109 | Pornin’s map | 81.3% saved |
| Apple M4 · generic · full · ef9e82d3 | binary 127 | try-and-increment | 78.0% saved |
| Apple M4 · generic · full · ef9e82d3 | binary 127 | Pornin’s map | 62.6% saved |
| Apple M4 · generic · full · ef9e82d3 | binary 122 GLS | try-and-increment | 74.4% saved |
| Apple M4 · generic · full · ef9e82d3 | binary 122 GLS | Pornin’s map | 52.7% saved |
| Apple M4 · generic · full · ef9e82d3 | edwards127 | try-and-increment | 0.1% saved |
| Apple M4 · generic · full · ef9e82d3 | edwards127 | Elligator 2 | only one mode measured |
| Apple M4 · generic · full · ef9e82d3 | weier127 | try-and-increment | 0.1% saved |
| Apple M4 · generic · full · ef9e82d3 | weier127 | simplified SWU | only one mode measured |
| Intel(R) Xeon(R) W-1390P @ 3.50GHz · x86-64-v3 · full · ef9e82d3 | xor (baseline) | SHA-256 digest, no curve | individual only; the digest is timed one at a time |
| Intel(R) Xeon(R) W-1390P @ 3.50GHz · x86-64-v3 · full · ef9e82d3 | binary 109 | try-and-increment | 89.2% saved |
| Intel(R) Xeon(R) W-1390P @ 3.50GHz · x86-64-v3 · full · ef9e82d3 | binary 109 | Pornin’s map | 83.2% saved |
| Intel(R) Xeon(R) W-1390P @ 3.50GHz · x86-64-v3 · full · ef9e82d3 | binary 127 | try-and-increment | 69.2% saved |
| Intel(R) Xeon(R) W-1390P @ 3.50GHz · x86-64-v3 · full · ef9e82d3 | binary 127 | Pornin’s map | 60.0% saved |
| Intel(R) Xeon(R) W-1390P @ 3.50GHz · x86-64-v3 · full · ef9e82d3 | binary 122 GLS | try-and-increment | 83.3% saved |
| Intel(R) Xeon(R) W-1390P @ 3.50GHz · x86-64-v3 · full · ef9e82d3 | binary 122 GLS | Pornin’s map | 74.3% saved |
| Intel(R) Xeon(R) W-1390P @ 3.50GHz · x86-64-v3 · full · ef9e82d3 | edwards127 | try-and-increment | 1.1% more time |
| Intel(R) Xeon(R) W-1390P @ 3.50GHz · x86-64-v3 · full · ef9e82d3 | edwards127 | Elligator 2 | only one mode measured |
| Intel(R) Xeon(R) W-1390P @ 3.50GHz · x86-64-v3 · full · ef9e82d3 | weier127 | try-and-increment | 0.4% more time |
| Intel(R) Xeon(R) W-1390P @ 3.50GHz · x86-64-v3 · full · ef9e82d3 | weier127 | simplified SWU | only one mode measured |
| Intel(R) Xeon(R) W-1390P @ 3.50GHz · x86-64-v3 · full · ef9e82d3 | ristretto255 | upstream map | individual only; comparison harness has no batched entrypoint |
| Intel(R) Xeon(R) W-1390P @ 3.50GHz · x86-64-v3 · full · ef9e82d3 | secp256k1 | upstream map | individual only; comparison harness has no batched entrypoint |
| Intel(R) Xeon(R) W-1390P @ 3.50GHz · generic · full · ef9e82d3 | binary 109 | try-and-increment | 91.1% saved |
| Intel(R) Xeon(R) W-1390P @ 3.50GHz · generic · full · ef9e82d3 | binary 109 | Pornin’s map | 80.0% saved |
| Intel(R) Xeon(R) W-1390P @ 3.50GHz · generic · full · ef9e82d3 | binary 127 | try-and-increment | 73.2% saved |
| Intel(R) Xeon(R) W-1390P @ 3.50GHz · generic · full · ef9e82d3 | binary 127 | Pornin’s map | 53.0% saved |
| Intel(R) Xeon(R) W-1390P @ 3.50GHz · generic · full · ef9e82d3 | binary 122 GLS | try-and-increment | 64.0% saved |
| Intel(R) Xeon(R) W-1390P @ 3.50GHz · generic · full · ef9e82d3 | binary 122 GLS | Pornin’s map | 41.3% saved |
| Intel(R) Xeon(R) W-1390P @ 3.50GHz · generic · full · ef9e82d3 | edwards127 | try-and-increment | 0.5% more time |
| Intel(R) Xeon(R) W-1390P @ 3.50GHz · generic · full · ef9e82d3 | edwards127 | Elligator 2 | only one mode measured |
| Intel(R) Xeon(R) W-1390P @ 3.50GHz · generic · full · ef9e82d3 | weier127 | try-and-increment | 0.6% more time |
| Intel(R) Xeon(R) W-1390P @ 3.50GHz · generic · full · ef9e82d3 | weier127 | simplified SWU | only one mode measured |
Native and generic builds
Generic over native time for benchmarks matched on one CPU, source and compiler; the dashed line is parity, boxes the propagated ranges. ristretto255’s point addition and the XOR baseline’s addition of 32-byte digests, both at throughput, are matched as references where both runs timed them.
Matched group models in Apple M4 · generic · full · ef9e82d3: edwards127, binary 109, binary 109 λ, binary 109-u, binary 109-w, binary 122 GLS, binary 122 GLS λ, binary 122 GLS-u, binary 122 GLS-w, binary 127, binary 127 λ, binary 127-u, binary 127-w. Other models need corresponding generic measurements.
Hash to curve
Hashing per item by construction for the representative families, one item at a time and in batches of 1024; a grey line joins a construction’s two estimates. Constructions differ in the representation they return, as the benchmark identifiers in the data state. The XOR baseline’s row is its SHA-256 digest, which maps to no curve, and the dashed line carries its estimate across the families; ristretto255’s and secp256k1’s hashes are their libraries’ maps, timed one at a time only.
Insertion cost model
Modeled insertion per item under each family’s cheapest compatible recipe, a fused hash to the addend counting as hash and prepare, and additions at throughput. A sketch of cells, the coded symbols that decode differences, maps an item to cells on average (Workload). The measured insertion includes what the model omits. ristretto255 and the XOR baseline have no batched hash: they hash one item at a time and add the hash output as is, with nothing to prepare. The XOR baseline is absent from Apple M4 · generic · full · ef9e82d3, Intel(R) Xeon(R) W-1390P @ 3.50GHz · generic · full · ef9e82d3: its addition was not timed at throughput, with eight accumulators, there. The time axis is logarithmic, as the totals span more than a factor of ten: a segment’s boundaries read as cumulative times, its length not as its share.
Curve selection
Selection work per salt as a percentage of the insertion work it is amortised over, , against the items inserted per salt, with the measured insertion per item ( items into a sketch of cells, as in Insertion). The band spans the seeds, the fastest thick and the slowest thin; dashed curves are partial stages, lower bounds on . Normalised by each family’s own , the figure reads as the volume that amortises selection, but it credits a family that is slow to insert with a smaller ratio for the same ; the next two figures give and the cost per item in absolute time. The baselines, XOR and ristretto255, select no curve: their ratio is zero, which a log axis cannot show, and they appear in the absolute figures.
Curve selection time
The time per salt of each selection stage, on a log scale: a tick at each seed’s estimate, or at the single candidate fixture of a point count, and a band from the fastest seed to the slowest; dashed marks are partial stages, lower bounds on . Unlike the ratio above, these times compare across families whatever their insertion cost. XOR has no curve and ristretto255 is a fixed group: neither selects a curve, as their rows state.
Cost per item with selection
Insertion and amortised selection per item, , against the items inserted per salt, with the measured insertion per item ( items into a sketch of cells) and the selection time per salt above. As grows each curve falls to its family’s . The band spans the seeds, the fastest thick and the slowest thin; dashed curves are partial stages, lower bounds on . The dotted flat lines are the insertion of the baselines, XOR and ristretto255, which select no curve, so that is their whole cost per item.
Benchmark run Apple M4 · apple-m4 · full · ef9e82d3
Run Apple M4 · apple-m4 · full · ef9e82d3 started 2026-10-08T02:49:59Z on Apple M4 (macOS 27.0.1, arm64) and timed commit ef9e82d39fbf06c605e1740360370f0003dc4ca4, built by rustc 1.98.1 (48a229cea 2026-09-01) with RUSTFLAGS -C target-cpu=apple-m4, in the full profile.
1523 benchmarks from run Apple M4 · apple-m4 · full · ef9e82d3. Reading a run report explains the values, colours and tags.
Families compared
Each family’s nominal rho, this run’s costs (addition at throughput; hashing, preparation, encoding and decoding batched), the two regimes of Cost in repeated reconciliation for a set of items, a set difference of and a sketch of cells, in which a new item updates cells on average, and the mean time over seeds to find a curve and verify its certificate. Dominance is as defined in Measurement methodology. Additions are 84 to 100% of each rebuilt estimate.
| curve | security | per cell | per new item | per party and round | curve selection | dominated by | ||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| rho | add | encode | decode | hash + prepare | sums retained, | sums rebuilt, , | find | verify | measured method | available tools | ||
| GF(2^127), 16 bytes | ||||||||||||
| gf2_127(X:S:Z:T) extended accumulators, Pornin's formulas; Pornin x1: hash to addend; output already an addend | 62.8 | 14.1 ns (1.44× the best) | 13.1 ns (1.62× the best) | 14.0 ns (1.06× the best) | 61.5 ns (1.15× the best) | 252 ns (1.31× the best) | 19.2 ms (1.44× the best) | 14.6 ms | 150 µs | agm+sieve | Rust (AGM), PARI | none |
| gf2_127-lambdaincompleteλ-projective (X:L:Z) accumulators; Pornin x1: hash to addend; output already an addend | 62.8 | 14.9 ns (1.53× the best) | 10.1 ns (1.25× the best) | 14.0 ns (1.06× the best) | 53.5 ns (tied for the best, within noise) | 256 ns (1.33× the best) | 20.3 ms (1.52× the best) | 14.6 ms | 150 µs | agm+sieve | Rust (AGM), PARI | none |
| gf2_127-wincompleteλ-projective, w codec: hashes and decodes to λ-affine; Pornin x1: hash to addend; output already an addend | 62.8 | 14.9 ns (1.53× the best) | 10.3 ns (1.28× the best) | 15.1 ns (1.14× the best) | 53.5 ns (tied for the best, within noise) | 256 ns (1.32× the best) | 20.3 ms (1.52× the best) | 14.6 ms | 150 µs | agm+sieve | Rust (AGM), PARI | none |
| gf2_127-uunscaled (X:S:Z), w codec, direct addend hashes; Pornin x1: hash to addend; output already an addend | 62.8 | 10.7 ns (1.09× the best) | 9.17 ns (1.14× the best) | 18.3 ns (1.39× the best) | 57.2 ns (1.07× the best) | 202 ns (1.05× the best) | 14.6 ms (1.09× the best) | 14.6 ms | 150 µs | agm+sieve | Rust (AGM), PARI | none |
| GF(2^122) = GF(2^61)[u], dense constant, 16 bytes | ||||||||||||
| gf2_122(X:S:Z:T) extended; Pornin x1: hash to addend; output already an addend | 60.3 | 17.8 ns (1.83× the best) | 15.7 ns (1.94× the best) | 13.5 ns (1.02× the best) | 62.8 ns (1.17× the best) | 305 ns (1.58× the best) | 24.3 ms (1.82× the best) | 17.6 ms | 86.8 µs | agm | Rust (AGM), PARI | none |
| gf2_122-lambdaincompleteλ-projective; Pornin x1: hash to addend; output already an addend | 60.3 | 16.6 ns (1.70× the best) | 11.9 ns (1.48× the best) | 13.5 ns (1.02× the best) | 53.9 ns (1.01× the best) | 279 ns (1.44× the best) | 22.6 ms (1.69× the best) | 17.6 ms | 86.8 µs | agm | Rust (AGM), PARI | none |
| gf2_122-wincompleteλ-projective, w codec; Pornin x1: hash to addend; output already an addend | 60.3 | 16.6 ns (1.70× the best) | 14.4 ns (1.79× the best) | 14.4 ns (1.09× the best) | 54.0 ns (1.01× the best) | 279 ns (1.44× the best) | 22.6 ms (1.69× the best) | 17.6 ms | 86.8 µs | agm | Rust (AGM), PARI | gf2_127-lambda |
| gf2_122-uunscaled (X:S:Z), w codec; Pornin x1: hash to addend; output already an addend | 60.3 | 13.1 ns (1.34× the best) | 12.1 ns (1.49× the best) | 18.7 ns (1.42× the best) | 57.1 ns (1.07× the best) | 234 ns (1.21× the best) | 17.8 ms (1.34× the best) | 17.6 ms | 86.8 µs | agm | Rust (AGM), PARI | none |
| GF(2^122), constant in GF(2^61) (GLS-shaped), 16 bytes | ||||||||||||
| gf2_122-gls(X:S:Z:T) extended; Pornin x1: hash to addend; output already an addend | 59.8 | 16.8 ns (1.72× the best) | 15.2 ns (1.88× the best) | 13.2 ns (tied for the best, within noise) | 62.0 ns (1.16× the best) | 290 ns (1.50× the best) | 22.9 ms (1.71× the best) | 5.48 ms | 107 µs | agm | Rust (AGM), PARI | none |
| gf2_122-gls-lambdaincompleteλ-projective; Pornin x1: hash to addend; output already an addend | 59.8 | 16.6 ns (1.70× the best) | 11.6 ns (1.44× the best) | 13.2 ns (tied for the best, within noise, 1.00×) | 55.4 ns (1.04× the best) | 280 ns (1.45× the best) | 22.6 ms (1.69× the best) | 5.48 ms | 107 µs | agm | Rust (AGM), PARI | none |
| gf2_122-gls-wincompleteλ-projective, w codec; Pornin x1: hash to addend; output already an addend | 59.8 | 16.6 ns (1.70× the best) | 14.4 ns (1.79× the best) | 14.3 ns (1.08× the best) | 55.4 ns (1.04× the best) | 280 ns (1.45× the best) | 22.6 ms (1.69× the best) | 5.48 ms | 107 µs | agm | Rust (AGM), PARI | gf2_127-lambda |
| gf2_122-gls-uunscaled (X:S:Z), w codec; Pornin x1: hash to addend; output already an addend | 59.8 | 13.1 ns (1.34× the best) | 12.3 ns (1.52× the best) | 16.8 ns (1.27× the best) | 55.7 ns (1.04× the best) | 233 ns (1.21× the best) | 17.9 ms (1.34× the best) | 5.48 ms | 107 µs | agm | Rust (AGM), PARI | none |
| GF(2^109), 14 bytes | ||||||||||||
| gf2_109(X:S:Z:T) extended; Pornin x1: hash to addend; output already an addend | 53.8 | 12.8 ns (1.32× the best) | 10.9 ns (1.36× the best) | 14.2 ns (1.08× the best) | 63.7 ns (1.19× the best) | 238 ns (1.23× the best) | 17.5 ms (1.31× the best) | 17.8 ms | 93.6 µs | agm+factor | Rust (AGM), PARI | none |
| gf2_109-lambdaincompleteλ-projective; Pornin x1: hash to addend; output already an addend | 53.8 | 12.0 ns (1.23× the best) | 8.13 ns (1.01× the best) | 14.1 ns (1.07× the best) | 55.2 ns (1.03× the best) | 218 ns (1.13× the best) | 16.4 ms (1.23× the best) | 17.8 ms | 93.6 µs | agm+factor | Rust (AGM), PARI | none |
| gf2_109-wincompleteλ-projective, w codec; Pornin x1: hash to addend; output already an addend | 53.8 | 12.0 ns (1.23× the best) | 10.4 ns (1.28× the best) | 15.5 ns (1.17× the best) | 54.5 ns (1.02× the best) | 217 ns (1.12× the best) | 16.3 ms (1.22× the best) | 17.8 ms | 93.6 µs | agm+factor | Rust (AGM), PARI | none |
| gf2_109-uunscaled (X:S:Z), w codec; Pornin x1: hash to addend; output already an addend | 53.8 | 9.76 ns (best) | 9.88 ns (1.22× the best) | 18.4 ns (1.39× the best) | 60.7 ns (1.13× the best) | 193 ns (best) | 13.3 ms (best) | 17.8 ms | 93.6 µs | agm+factor | Rust (AGM), PARI | none |
| F_p, p = 2^127 − 1, 16 bytes | ||||||||||||
| edwards127a = 1 Edwards, extended += cached | 62.3 | 20.1 ns (2.06× the best) | 22.0 ns (2.72× the best) | 486 ns (36.80× the best) | 1.10 µs (20.50× the best) | 1.37 µs (7.09× the best) | 29.0 ms (2.17× the best) | 760 ms | 435 µs | pari+sieve | PARI | gf2_127, gf2_127-lambda, gf2_127-u, gf2_127-w |
| weier127short Weierstrass, projective += affine | 63.3 | 45.4 ns (4.65× the best) | 10.1 ns (1.25× the best) | 485 ns (36.73× the best) | 1.04 µs (19.37× the best) | 1.65 µs (8.56× the best) | 63.3 ms (4.74× the best) | 888 ms | 210 µs | pari+sieve | PARI | none |
| weier127-jacobianincompleteshort Weierstrass, Jacobian += affine | 63.3 | 37.5 ns (3.84× the best) | 15.7 ns (1.94× the best) | 485 ns (36.77× the best) | 1.04 µs (19.42× the best) | 1.55 µs (8.01× the best) | 52.6 ms (3.94× the best) | 888 ms | 210 µs | pari+sieve | PARI | none |
| F_p, p = 2^107 − 1, 14 bytes | ||||||||||||
| edwards107a = 1 Edwards, extended += cached | 52.3 | 15.5 ns (1.59× the best) | 20.3 ns (2.51× the best) | 354 ns (26.79× the best) | 828 ns (15.47× the best) | 1.04 µs (5.37× the best) | 22.3 ms (1.67× the best) | Sage | gf2_109, gf2_109-lambda, gf2_109-u, gf2_109-w, gf2_122-gls-u, gf2_122-u, gf2_127, gf2_127-lambda, gf2_127-u, gf2_127-w | |||
| weier107short Weierstrass, projective += affine | 53.3 | 30.5 ns (3.12× the best) | 11.5 ns (1.42× the best) | 352 ns (26.66× the best) | 749 ns (13.99× the best) | 1.16 µs (6.02× the best) | 42.6 ms (3.19× the best) | Sage | gf2_109, gf2_109-lambda, gf2_109-u, gf2_109-w, gf2_127-lambda, gf2_127-u, gf2_127-w | |||
| weier107-jacobianincompleteshort Weierstrass, Jacobian += affine | 53.3 | 28.7 ns (2.94× the best) | 15.3 ns (1.90× the best) | 352 ns (26.63× the best) | 746 ns (13.94× the best) | 1.13 µs (5.88× the best) | 40.2 ms (3.01× the best) | Sage | gf2_109, gf2_109-lambda, gf2_109-u, gf2_109-w, gf2_122-gls, gf2_122-gls-lambda, gf2_122-gls-u, gf2_122-gls-w, gf2_122-lambda, gf2_122-u, gf2_122-w, gf2_127, gf2_127-lambda, gf2_127-u, gf2_127-w | |||
| F_p, p = 2^128 − 275, 16 bytes | ||||||||||||
| twisted128a = −1 twisted Edwards modulo 2-torsion, extended += cached | 62.8 | 23.9 ns (2.45× the best) | 16.0 ns (1.98× the best) | 952 ns (72.09× the best) | 1.93 µs (36.08× the best) | 2.25 µs (11.68× the best) | 35.7 ms (2.67× the best) | Sage | gf2_127, gf2_127-lambda, gf2_127-u, gf2_127-w, twisted64x2 | |||
| F_{p²}, p = 2^61 − 1, 16 bytes | ||||||||||||
| edwards61x2a = 1 Edwards, signed-x codec, extended += cached | 59.8 | 13.3 ns (1.37× the best) | 16.2 ns (2.01× the best) | 404 ns (30.63× the best) | 639 ns (11.94× the best) | 820 ns (4.25× the best) | 19.3 ms (1.45× the best) | 360 ms | 200 µs | pari+sieve | PARI | gf2_122-gls-u, gf2_122-u, gf2_127-u |
| weier61x2short Weierstrass, signed-x codec, projective += affine | 60.8 | 26.8 ns (2.74× the best) | 8.11 ns (tied for the best, within noise, 1.00×) | 412 ns (31.22× the best) | 637 ns (11.91× the best) | 1.00 µs (5.18× the best) | 37.5 ms (2.81× the best) | 401 ms | 132 µs | pari+sieve | PARI | none |
| weier61x2-jacobianincompleteshort Weierstrass, signed-x codec, Jacobian += affine | 60.8 | 31.6 ns (3.24× the best) | 11.7 ns (1.45× the best) | 413 ns (31.25× the best) | 638 ns (11.92× the best) | 1.07 µs (5.53× the best) | 44.2 ms (3.31× the best) | 401 ms | 132 µs | pari+sieve | PARI | gf2_127-lambda, gf2_127-u, gf2_127-w |
| twisted61x2a = −1 Edwards modulo 2-torsion, extended += cached | 59.8 | 12.5 ns (1.28× the best) | 8.07 ns (tied for the best, within noise) | 420 ns (31.80× the best) | 636 ns (11.88× the best) | 805 ns (4.17× the best) | 18.2 ms (1.36× the best) | 803 ms | 272 µs | pari+sieve | PARI | none |
| F_{p²}, p = 2^64 − 59, 16 bytes | ||||||||||||
| twisted64x2a = −1 Edwards modulo 2-torsion, extended += cached | 62.8 | 17.2 ns (1.77× the best) | 10.3 ns (1.28× the best) | 718 ns (54.39× the best) | 1.11 µs (20.66× the best) | 1.34 µs (6.94× the best) | 25.5 ms (1.91× the best) | 1.33 s | 545 µs | pari+sieve | PARI | gf2_127-lambda, gf2_127-u |
| F_{p²}, p = 2^64 − 2^32 + 1, 16 bytes | ||||||||||||
| twisted-goldilocks2a = −1 Edwards modulo 2-torsion, extended += cached | 62.8 | 15.0 ns (1.54× the best) | 11.3 ns (1.40× the best) | 1.52 µs (114.99× the best) | 1.76 µs (32.80× the best) | 1.96 µs (10.14× the best) | 24.2 ms (1.81× the best) | 1.19 s | 596 µs | pari+sieve | PARI | gf2_127-lambda, gf2_127-u, gf2_127-w |
bold: the best of its column; italic, dotted: tied with the best within the confidence intervals; shading: ratio to the best, pale yellow at 1× to purple at 16× or more; grey: baseline, not compared.
Machine
| Apple M4 · apple-m4 · full · ef9e82d3 | |
|---|---|
| CPU | Apple M4, 10 cores, 24 GiB |
| OS | macOS 27.0.1 (Darwin 27.0.0, arm64) |
| rustc | rustc 1.98.1 (48a229cea 2026-09-01) |
| RUSTFLAGS | -C target-cpu=apple-m4 |
| field backend features | aes, neon |
| commit | ef9e82d39fbf06c605e1740360370f0003dc4ca4 |
| suites | compare compare107 compare109 compare122 compare_fp2 group riblt agm sieve curvegen |
| profile | full |
| criterion arguments | –warm-up-time 3 –measurement-time 5 –sample-size 100 –nresamples 100000 |
| run | 2026-10-08T02:49:59Z .. 2026-10-08T07:06:13Z |
Load averages by phase while the run timed (Measurement methodology).
| phase | seconds | 1-minute average, mean | runnable, mean | runnable, most |
|---|---|---|---|---|
| idle before | 25 | 3.47 | 1.87 | 4.0 |
| compare | 670 | 3.86 | 3.95 | 26.0 |
| compare107 | 245 | 3.89 | 3.72 | 14.0 |
| compare109 | 250 | 4.58 | 5.03 | 11.0 |
| compare122 | 410 | 5.07 | 4.72 | 15.0 |
| compare_fp2 | 565 | 3.41 | 3.43 | 6.0 |
| group | 3660 | 1.99 | 1.99 | 18.0 |
| group wide | 2740 | 2.28 | 2.25 | 59.1 |
| riblt mapping | 310 | 1.78 | 1.87 | 10.1 |
| riblt plan | 20 | 2.52 | 2.75 | 4.0 |
| riblt | 5680 | 2.02 | 2.01 | 50.1 |
| agm | 85 | 2.25 | 2.75 | 12.0 |
| sieve | 225 | 2.00 | 1.91 | 4.1 |
| curvegen | 90 | 2.00 | 2.06 | 6.2 |
| curvegen searches | 235 | 2.19 | 2.35 | 7.9 |
| idle after | 25 | 2.66 | 2.39 | 3.0 |
Group benchmark plan
Which families the group suite’s second pass timed. Its first pass timed every family’s core rows; from them and the comparison maps, bench-run chose the families whose modeled insertion at was within 50% of the cheapest (lead) and, if none of them was over a field of odd characteristic, the cheapest that was (contrast). The second pass added the batch sweep, subtraction, equality on pure cells and the hashes of IDs (The group plan).
| family | role |
|---|---|
| binary-u.109 | lead |
| binary-u.127 | lead |
| binary-w.109 | lead |
| binary-lambda.109 | lead |
| binary-u.122-gls | lead |
| binary-u.122 | lead |
| binary.109 | lead |
| binary.127 | lead |
| binary-w.127 | lead |
| binary-lambda.127 | lead |
| binary-lambda.122 | lead |
| binary-w.122 | lead |
| binary-w.122-gls | lead |
| binary-lambda.122-gls | lead |
| twisted.61x2 | contrast |
RIBLT benchmark plan
Which RIBLT benchmarks this run generated. Before the RIBLT suite ran, bench-run chose from this run’s group and hash-to-curve results, for each family below, the hash its RIBLT benchmarks use and their scope: every sweep (full), each axis’s endpoints and middle (buffer), or one point of each benchmark (spot); and for full and buffer scope, the field whose projection hashes the family’s IDs cheapest and the one whose projection seeds mappings cheapest, under which it also encodes and peels cells keyed by IDs. The plan records what was measured, not a result; the XOR checksums and ristretto255 are timed in full regardless (The RIBLT plan).
| family | hash | scope | projection | mapping projection |
|---|---|---|---|---|
| binary-lambda.109 | pornin-addend | full | gf2_127 | gf2_127 |
| binary-lambda.122 | pornin-addend | buffer | gf2_127 | gf2_127 |
| binary-lambda.122-gls | pornin-addend | buffer | gf2_127 | gf2_127 |
| binary-lambda.127 | pornin-addend | buffer | gf2_127 | gf2_127 |
| binary-u.109 | pornin-addend | full | gf2_127 | gf2_127 |
| binary-u.122 | pornin-addend | buffer | gf2_127 | gf2_127 |
| binary-u.122-gls | pornin-addend | buffer | gf2_127 | gf2_127 |
| binary-u.127 | pornin-addend | full | gf2_127 | gf2_127 |
| binary-w.109 | pornin-addend | full | gf2_127 | gf2_127 |
| binary-w.122 | pornin-addend | buffer | gf2_127 | gf2_127 |
| binary-w.122-gls | pornin-addend | buffer | gf2_127 | gf2_127 |
| binary-w.127 | pornin-addend | buffer | gf2_127 | gf2_127 |
| binary.109 | pornin | buffer | gf2_127 | gf2_127 |
| binary.122 | pornin | buffer | ||
| binary.122-gls | pornin | buffer | ||
| binary.127 | pornin | buffer | gf2_127 | gf2_127 |
| edwards.107 | ti | spot | ||
| edwards.127 | ti | spot | ||
| edwards.61x2 | ti | spot | ||
| twisted.128 | ti | spot | ||
| twisted.61x2 | ti | spot | ||
| twisted.64x2 | ti | spot | ||
| twisted.goldilocks2 | ti | spot | ||
| weier-jacobian.107 | ti | spot | ||
| weier-jacobian.127 | ti | spot | ||
| weier-jacobian.61x2 | ti | spot | ||
| weier.107 | ti | spot | ||
| weier.127 | ti | spot | ||
| weier.61x2 | ti | spot |
Insertion
Modeled insertion per item into a sketch of cells: a hash, a prepare, and an addition to each of the cells the item maps to on average (: ; : ; : ; : ; : ), by compatible recipes (Reading a run report). The references (xor, ristretto255) have no batched hash: they hash one item at a time, add the hash output as is, and are in the figure and the second grid. Each total also counts, the same for every family, the salted SHA-256 map digest and the xoshiro256pp walk through the item’s indices below (riblt.mapping): 39.4 ns at , 44.6 ns at , 54.4 ns at , 68.8 ns at , 90.0 ns at . The key XOR and count of each cell are not modelled; riblt.cells measures them with the rest of the cell updates.
| curve | per item, once | per cell | per item, into k cells | |||||
|---|---|---|---|---|---|---|---|---|
| hash (batched) | prepare (batched) | add (throughput) | : | : | : | : | : | |
| GF(2^127), 16 bytes | ||||||||
| gf2_127(X:S:Z:T) extended accumulators, Pornin's formulas | 72.9 ns (1.36× the best) | 3.54 ns (7.69× the best) | 14.1 ns (1.44× the best) | 157 ns (1.23× the best) | 195 ns (1.25× the best) | 260 ns (1.27× the best) | 336 ns (1.28× the best) | 419 ns (1.29× the best) |
| gf2_127compare suitePornin x1: hash to addend; output already an addend | 61.5 ns (1.15× the best) | in the hash | 14.1 ns (1.44× the best) | 142 ns (1.11× the best) | 180 ns (1.15× the best) | 245 ns (1.20× the best) | 321 ns (1.23× the best) | 404 ns (1.24× the best) |
| gf2_127-lambdaincompleteλ-projective (X:L:Z) accumulators | 75.6 ns (1.41× the best) | 6.33 ns (13.74× the best) | 14.9 ns (1.53× the best) | 165 ns (1.29× the best) | 205 ns (1.31× the best) | 274 ns (1.34× the best) | 353 ns (1.35× the best) | 440 ns (1.35× the best) |
| gf2_127-lambdaincompletecompare suitehashed straight to : no prepare | 72.8 ns (1.36× the best) | in the hash | 14.9 ns (1.53× the best) | 156 ns (1.22× the best) | 196 ns (1.25× the best) | 264 ns (1.29× the best) | 344 ns (1.31× the best) | 431 ns (1.32× the best) |
| gf2_127-lambdaincompletecompare suitePornin x1: hash to addend; output already an addend | 53.5 ns (tied for the best, within noise) | in the hash | 14.9 ns (1.53× the best) | 136 ns (1.07× the best) | 177 ns (1.13× the best) | 245 ns (1.20× the best) | 325 ns (1.24× the best) | 412 ns (1.26× the best) |
| gf2_127-wincompleteλ-projective, w codec: hashes and decodes to λ-affine | 83.3 ns (1.56× the best) | 0.48 ns (1.05× the best) | 14.9 ns (1.53× the best) | 166 ns (1.30× the best) | 207 ns (1.32× the best) | 275 ns (1.34× the best) | 355 ns (1.35× the best) | 441 ns (1.35× the best) |
| gf2_127-wincompletecompare suitePornin x1: hash to addend; output already an addend | 53.5 ns (tied for the best, within noise) | in the hash | 14.9 ns (1.53× the best) | 136 ns (1.07× the best) | 177 ns (1.13× the best) | 245 ns (1.20× the best) | 324 ns (1.24× the best) | 411 ns (1.26× the best) |
| gf2_127-uunscaled (X:S:Z), w codec, direct addend hashes | 85.8 ns (1.60× the best) | 0.49 ns (1.06× the best) | 10.7 ns (1.09× the best) | 157 ns (1.23× the best) | 187 ns (1.19× the best) | 239 ns (1.17× the best) | 300 ns (1.14× the best) | 368 ns (1.13× the best) |
| gf2_127-ucompare suitePornin x1: hash to addend; output already an addend | 57.2 ns (1.07× the best) | in the hash | 10.7 ns (1.09× the best) | 128 ns (tied for the best, within noise) | 158 ns (tied for the best, within noise, 1.01×) | 210 ns (1.02× the best) | 271 ns (1.03× the best) | 339 ns (1.04× the best) |
| GF(2^122) = GF(2^61)[u], dense constant, 16 bytes | ||||||||
| gf2_122(X:S:Z:T) extended | 74.9 ns (1.40× the best) | 5.02 ns (10.91× the best) | 17.8 ns (1.83× the best) | 171 ns (1.34× the best) | 219 ns (1.40× the best) | 298 ns (1.46× the best) | 391 ns (1.49× the best) | 490 ns (1.50× the best) |
| gf2_122compare suitePornin x1: hash to addend; output already an addend | 62.8 ns (1.17× the best) | in the hash | 17.8 ns (1.83× the best) | 154 ns (1.21× the best) | 202 ns (1.29× the best) | 281 ns (1.37× the best) | 374 ns (1.43× the best) | 473 ns (1.45× the best) |
| gf2_122-lambdaincompleteλ-projective | 74.9 ns (1.40× the best) | 7.55 ns (16.38× the best) | 16.6 ns (1.70× the best) | 170 ns (1.33× the best) | 215 ns (1.37× the best) | 289 ns (1.41× the best) | 376 ns (1.44× the best) | 470 ns (1.44× the best) |
| gf2_122-lambdaincompletecompare suitehashed straight to : no prepare | 72.3 ns (1.35× the best) | in the hash | 16.6 ns (1.70× the best) | 160 ns (1.25× the best) | 204 ns (1.30× the best) | 279 ns (1.36× the best) | 366 ns (1.40× the best) | 460 ns (1.41× the best) |
| gf2_122-lambdaincompletecompare suitePornin x1: hash to addend; output already an addend | 53.9 ns (1.01× the best) | in the hash | 16.6 ns (1.70× the best) | 141 ns (1.11× the best) | 186 ns (1.19× the best) | 261 ns (1.27× the best) | 347 ns (1.33× the best) | 441 ns (1.35× the best) |
| gf2_122-wincompleteλ-projective, w codec | 76.8 ns (1.43× the best) | 0.46 ns (tied for the best, within noise) | 16.6 ns (1.70× the best) | 165 ns (1.29× the best) | 209 ns (1.34× the best) | 284 ns (1.39× the best) | 371 ns (1.42× the best) | 465 ns (1.43× the best) |
| gf2_122-wincompletecompare suitePornin x1: hash to addend; output already an addend | 54.0 ns (1.01× the best) | in the hash | 16.6 ns (1.70× the best) | 141 ns (1.11× the best) | 186 ns (1.19× the best) | 261 ns (1.27× the best) | 348 ns (1.33× the best) | 442 ns (1.35× the best) |
| gf2_122-uunscaled (X:S:Z), w codec | 87.6 ns (1.64× the best) | 0.48 ns (1.04× the best) | 13.1 ns (1.34× the best) | 165 ns (1.30× the best) | 202 ns (1.29× the best) | 263 ns (1.28× the best) | 334 ns (1.28× the best) | 413 ns (1.27× the best) |
| gf2_122-ucompare suitePornin x1: hash to addend; output already an addend | 57.1 ns (1.07× the best) | in the hash | 13.1 ns (1.34× the best) | 134 ns (1.05× the best) | 171 ns (1.09× the best) | 232 ns (1.13× the best) | 303 ns (1.16× the best) | 382 ns (1.17× the best) |
| GF(2^122), constant in GF(2^61) (GLS-shaped), 16 bytes | ||||||||
| gf2_122-gls(X:S:Z:T) extended | 74.7 ns (1.40× the best) | 4.44 ns (9.63× the best) | 16.8 ns (1.72× the best) | 167 ns (1.31× the best) | 213 ns (1.35× the best) | 288 ns (1.41× the best) | 376 ns (1.43× the best) | 471 ns (1.44× the best) |
| gf2_122-glscompare suitePornin x1: hash to addend; output already an addend | 62.0 ns (1.16× the best) | in the hash | 16.8 ns (1.72× the best) | 150 ns (1.18× the best) | 195 ns (1.25× the best) | 271 ns (1.32× the best) | 358 ns (1.37× the best) | 453 ns (1.39× the best) |
| gf2_122-gls-lambdaincompleteλ-projective | 76.5 ns (1.43× the best) | 7.53 ns (16.36× the best) | 16.6 ns (1.70× the best) | 171 ns (1.34× the best) | 216 ns (1.38× the best) | 291 ns (1.42× the best) | 378 ns (1.44× the best) | 472 ns (1.45× the best) |
| gf2_122-gls-lambdaincompletecompare suitehashed straight to : no prepare | 73.8 ns (1.38× the best) | in the hash | 16.6 ns (1.70× the best) | 161 ns (1.26× the best) | 206 ns (1.31× the best) | 281 ns (1.37× the best) | 367 ns (1.40× the best) | 461 ns (1.42× the best) |
| gf2_122-gls-lambdaincompletecompare suitePornin x1: hash to addend; output already an addend | 55.4 ns (1.04× the best) | in the hash | 16.6 ns (1.70× the best) | 143 ns (1.12× the best) | 188 ns (1.20× the best) | 262 ns (1.28× the best) | 349 ns (1.33× the best) | 443 ns (1.36× the best) |
| gf2_122-gls-wincompleteλ-projective, w codec | 78.6 ns (1.47× the best) | 0.49 ns (1.06× the best) | 16.6 ns (1.70× the best) | 167 ns (1.31× the best) | 211 ns (1.35× the best) | 286 ns (1.40× the best) | 373 ns (1.42× the best) | 467 ns (1.43× the best) |
| gf2_122-gls-wincompletecompare suitePornin x1: hash to addend; output already an addend | 55.4 ns (1.04× the best) | in the hash | 16.6 ns (1.70× the best) | 143 ns (1.12× the best) | 188 ns (1.20× the best) | 262 ns (1.28× the best) | 349 ns (1.33× the best) | 443 ns (1.36× the best) |
| gf2_122-gls-uunscaled (X:S:Z), w codec | 80.2 ns (1.50× the best) | 0.48 ns (1.04× the best) | 13.1 ns (1.34× the best) | 158 ns (1.24× the best) | 195 ns (1.24× the best) | 255 ns (1.25× the best) | 327 ns (1.25× the best) | 406 ns (1.25× the best) |
| gf2_122-gls-ucompare suitePornin x1: hash to addend; output already an addend | 55.7 ns (1.04× the best) | in the hash | 13.1 ns (1.34× the best) | 133 ns (1.04× the best) | 170 ns (1.08× the best) | 231 ns (1.13× the best) | 302 ns (1.15× the best) | 381 ns (1.17× the best) |
| GF(2^109), 14 bytes | ||||||||
| gf2_109(X:S:Z:T) extended | 81.7 ns (1.53× the best) | 2.79 ns (6.06× the best) | 12.8 ns (1.32× the best) | 161 ns (1.26× the best) | 197 ns (1.26× the best) | 257 ns (1.25× the best) | 328 ns (1.25× the best) | 405 ns (1.24× the best) |
| gf2_109compare suitePornin x1: hash to addend; output already an addend | 63.7 ns (1.19× the best) | in the hash | 12.8 ns (1.32× the best) | 140 ns (1.10× the best) | 176 ns (1.12× the best) | 236 ns (1.15× the best) | 307 ns (1.17× the best) | 385 ns (1.18× the best) |
| gf2_109-lambdaincompleteλ-projective | 82.0 ns (1.53× the best) | 5.17 ns (11.22× the best) | 12.0 ns (1.23× the best) | 161 ns (1.27× the best) | 195 ns (1.24× the best) | 252 ns (1.23× the best) | 319 ns (1.22× the best) | 392 ns (1.20× the best) |
| gf2_109-lambdaincompletecompare suitehashed straight to : no prepare | 77.6 ns (1.45× the best) | in the hash | 12.0 ns (1.23× the best) | 152 ns (1.19× the best) | 186 ns (1.18× the best) | 242 ns (1.18× the best) | 309 ns (1.18× the best) | 383 ns (1.17× the best) |
| gf2_109-lambdaincompletecompare suitePornin x1: hash to addend; output already an addend | 55.2 ns (1.03× the best) | in the hash | 12.0 ns (1.23× the best) | 129 ns (1.01× the best) | 163 ns (1.04× the best) | 220 ns (1.07× the best) | 287 ns (1.09× the best) | 361 ns (1.11× the best) |
| gf2_109-wincompleteλ-projective, w codec | 79.4 ns (1.48× the best) | 0.48 ns (1.04× the best) | 12.0 ns (1.23× the best) | 154 ns (1.21× the best) | 188 ns (1.20× the best) | 244 ns (1.19× the best) | 311 ns (1.19× the best) | 385 ns (1.18× the best) |
| gf2_109-wincompletecompare suitePornin x1: hash to addend; output already an addend | 54.5 ns (1.02× the best) | in the hash | 12.0 ns (1.23× the best) | 129 ns (tied for the best, within noise, 1.01×) | 162 ns (1.04× the best) | 219 ns (1.07× the best) | 286 ns (1.09× the best) | 360 ns (1.10× the best) |
| gf2_109-uunscaled (X:S:Z), w codec | 81.2 ns (1.52× the best) | 0.49 ns (1.05× the best) | 9.76 ns (tied for the best, within noise) | 149 ns (1.17× the best) | 178 ns (1.13× the best) | 226 ns (1.10× the best) | 283 ns (1.08× the best) | 347 ns (1.06× the best) |
| gf2_109-ucompare suitePornin x1: hash to addend; output already an addend | 60.7 ns (1.13× the best) | in the hash | 9.76 ns (tied for the best, within noise) | 128 ns (tied for the best, within noise, 1.01×) | 157 ns (tied for the best, within noise) | 205 ns (best) | 262 ns (best) | 326 ns (best) |
| F_p, p = 2^127 − 1, 16 bytes | ||||||||
| edwards127a = 1 Edwards, extended += cached | 1.07 µs (19.97× the best) | 28.3 ns (61.37× the best) | 20.1 ns (2.06× the best) | 1.19 µs (9.37× the best) | 1.25 µs (7.95× the best) | 1.34 µs (6.52× the best) | 1.44 µs (5.49× the best) | 1.55 µs (4.75× the best) |
| weier127short Weierstrass, projective += affine | 1.04 µs (19.36× the best) | 0.46 ns (tied for the best, within noise, 1.00×) | 45.4 ns (4.65× the best) | 1.21 µs (9.47× the best) | 1.32 µs (8.42× the best) | 1.51 µs (7.36× the best) | 1.72 µs (6.57× the best) | 1.94 µs (5.96× the best) |
| weier127-jacobianincompleteshort Weierstrass, Jacobian += affine | 1.04 µs (19.41× the best) | 0.49 ns (1.06× the best) | 37.5 ns (3.84× the best) | 1.19 µs (9.31× the best) | 1.28 µs (8.17× the best) | 1.44 µs (7.02× the best) | 1.62 µs (6.17× the best) | 1.80 µs (5.53× the best) |
| F_p, p = 2^107 − 1, 14 bytes | ||||||||
| edwards107a = 1 Edwards, extended += cached | 805 ns (15.04× the best) | 22.7 ns (49.36× the best) | 15.5 ns (1.59× the best) | 912 ns (7.15× the best) | 954 ns (6.08× the best) | 1.02 µs (5.00× the best) | 1.11 µs (4.23× the best) | 1.20 µs (3.67× the best) |
| weier107short Weierstrass, projective += affine | 748 ns (13.98× the best) | 0.49 ns (1.07× the best) | 30.5 ns (3.12× the best) | 876 ns (6.87× the best) | 954 ns (6.08× the best) | 1.08 µs (5.29× the best) | 1.23 µs (4.70× the best) | 1.39 µs (4.25× the best) |
| weier107-jacobianincompleteshort Weierstrass, Jacobian += affine | 745 ns (13.93× the best) | 0.48 ns (1.04× the best) | 28.7 ns (2.94× the best) | 868 ns (6.81× the best) | 942 ns (6.01× the best) | 1.06 µs (5.19× the best) | 1.20 µs (4.60× the best) | 1.35 µs (4.14× the best) |
| F_p, p = 2^128 − 275, 16 bytes | ||||||||
| twisted128a = −1 twisted Edwards modulo 2-torsion, extended += cached | 1.92 µs (35.93× the best) | 8.08 ns (17.55× the best) | 23.9 ns (2.45× the best) | 2.04 µs (15.99× the best) | 2.10 µs (13.40× the best) | 2.20 µs (10.77× the best) | 2.32 µs (8.87× the best) | 2.45 µs (7.51× the best) |
| F_{p²}, p = 2^61 − 1, 16 bytes | ||||||||
| edwards61x2a = 1 Edwards, signed-x codec, extended += cached | 620 ns (11.59× the best) | 18.8 ns (40.87× the best) | 13.3 ns (1.37× the best) | 717 ns (5.62× the best) | 754 ns (4.81× the best) | 816 ns (3.98× the best) | 889 ns (3.39× the best) | 969 ns (2.97× the best) |
| weier61x2short Weierstrass, signed-x codec, projective += affine | 637 ns (11.90× the best) | 0.72 ns (1.56× the best) | 26.8 ns (2.74× the best) | 754 ns (5.92× the best) | 824 ns (5.25× the best) | 938 ns (4.58× the best) | 1.07 µs (4.08× the best) | 1.21 µs (3.71× the best) |
| weier61x2-jacobianincompleteshort Weierstrass, signed-x codec, Jacobian += affine | 638 ns (11.91× the best) | 0.54 ns (1.18× the best) | 31.6 ns (3.24× the best) | 769 ns (6.03× the best) | 850 ns (5.42× the best) | 984 ns (4.80× the best) | 1.14 µs (4.34× the best) | 1.30 µs (3.98× the best) |
| twisted61x2a = −1 Edwards modulo 2-torsion, extended += cached | 632 ns (11.81× the best) | 3.60 ns (7.81× the best) | 12.5 ns (1.28× the best) | 711 ns (5.58× the best) | 746 ns (4.76× the best) | 805 ns (3.93× the best) | 874 ns (3.34× the best) | 950 ns (2.91× the best) |
| F_{p²}, p = 2^64 − 59, 16 bytes | ||||||||
| twisted64x2a = −1 Edwards modulo 2-torsion, extended += cached | 1.10 µs (20.55× the best) | 5.51 ns (11.96× the best) | 17.2 ns (1.77× the best) | 1.19 µs (9.37× the best) | 1.24 µs (7.91× the best) | 1.32 µs (6.44× the best) | 1.41 µs (5.38× the best) | 1.51 µs (4.62× the best) |
| F_{p²}, p = 2^64 − 2^32 + 1, 16 bytes | ||||||||
| twisted-goldilocks2a = −1 Edwards modulo 2-torsion, extended += cached | 1.75 µs (32.71× the best) | 4.51 ns (9.78× the best) | 15.0 ns (1.54× the best) | 1.84 µs (14.41× the best) | 1.88 µs (11.98× the best) | 1.95 µs (9.51× the best) | 2.03 µs (7.74× the best) | 2.11 µs (6.49× the best) |
bold: the best of its column; italic, dotted: tied with the best within the confidence intervals; shading: ratio to the best, pale yellow at 1× to purple at 16× or more; grey: baseline, not compared.
Hashing and preparing one item at a time
| curve | per item, once | per cell | per item, into k cells | |||||
|---|---|---|---|---|---|---|---|---|
| hash (alone) | prepare (alone) | add (throughput) | : | : | : | : | : | |
| baseline | ||||||||
| xorcompare suitehash output added as is: no prepare | 24.2 ns | in the hash | 0.71 ns | 65.6 ns | 72.5 ns | 85.1 ns | 103 ns | 127 ns |
| GF(2^127), 16 bytes | ||||||||
| gf2_127(X:S:Z:T) extended accumulators, Pornin's formulas | 779 ns (2.47× the best) | 3.88 ns (6.33× the best) | 14.1 ns (1.44× the best) | 863 ns (2.18× the best) | 902 ns (2.08× the best) | 967 ns (1.96× the best) | 1.04 µs (1.84× the best) | 1.13 µs (1.75× the best) |
| gf2_127compare suitePornin x1: hash to addend; output already an addend | 485 ns (1.54× the best) | in the hash | 14.1 ns (1.44× the best) | 566 ns (1.43× the best) | 604 ns (1.40× the best) | 669 ns (1.36× the best) | 745 ns (1.32× the best) | 828 ns (1.29× the best) |
| gf2_127compare suitePornin x2: hash to addend; output already an addend | 916 ns (2.91× the best) | in the hash | 14.1 ns (1.44× the best) | 996 ns (2.51× the best) | 1.03 µs (2.39× the best) | 1.10 µs (2.23× the best) | 1.18 µs (2.08× the best) | 1.26 µs (1.95× the best) |
| gf2_127-lambdaincompleteλ-projective (X:L:Z) accumulators | 806 ns (2.56× the best) | 340 ns (553.91× the best) | 14.9 ns (1.53× the best) | 1.23 µs (3.10× the best) | 1.27 µs (2.93× the best) | 1.34 µs (2.71× the best) | 1.42 µs (2.51× the best) | 1.50 µs (2.33× the best) |
| gf2_127-lambdaincompletecompare suitehashed straight to : no prepare | 761 ns (2.42× the best) | in the hash | 14.9 ns (1.53× the best) | 843 ns (2.13× the best) | 884 ns (2.04× the best) | 952 ns (1.93× the best) | 1.03 µs (1.83× the best) | 1.12 µs (1.74× the best) |
| gf2_127-lambdaincompletecompare suitePornin x1: hash to addend; output already an addend | 456 ns (1.45× the best) | in the hash | 14.9 ns (1.53× the best) | 538 ns (1.36× the best) | 579 ns (1.34× the best) | 647 ns (1.31× the best) | 727 ns (1.29× the best) | 814 ns (1.26× the best) |
| gf2_127-wincompleteλ-projective, w codec: hashes and decodes to λ-affine | 865 ns (2.75× the best) | 0.63 ns (1.02× the best) | 14.9 ns (1.53× the best) | 948 ns (2.39× the best) | 989 ns (2.28× the best) | 1.06 µs (2.14× the best) | 1.14 µs (2.01× the best) | 1.22 µs (1.90× the best) |
| gf2_127-wincompletecompare suitePornin x1: hash to addend; output already an addend | 455 ns (1.44× the best) | in the hash | 14.9 ns (1.53× the best) | 538 ns (1.36× the best) | 578 ns (1.34× the best) | 646 ns (1.31× the best) | 726 ns (1.28× the best) | 812 ns (1.26× the best) |
| gf2_127-uunscaled (X:S:Z), w codec, direct addend hashes | 869 ns (2.76× the best) | 0.63 ns (1.03× the best) | 10.7 ns (1.09× the best) | 940 ns (2.37× the best) | 971 ns (2.24× the best) | 1.02 µs (2.07× the best) | 1.08 µs (1.92× the best) | 1.15 µs (1.79× the best) |
| gf2_127-ucompare suitePornin x1: hash to addend; output already an addend | 461 ns (1.46× the best) | in the hash | 10.7 ns (1.09× the best) | 531 ns (1.34× the best) | 562 ns (1.30× the best) | 613 ns (1.24× the best) | 674 ns (1.19× the best) | 742 ns (1.15× the best) |
| GF(2^122) = GF(2^61)[u], dense constant, 16 bytes | ||||||||
| gf2_122(X:S:Z:T) extended | 510 ns (1.62× the best) | 4.92 ns (8.02× the best) | 17.8 ns (1.83× the best) | 606 ns (1.53× the best) | 653 ns (1.51× the best) | 733 ns (1.48× the best) | 825 ns (1.46× the best) | 925 ns (1.44× the best) |
| gf2_122compare suitePornin x1: hash to addend; output already an addend | 373 ns (1.18× the best) | in the hash | 17.8 ns (1.83× the best) | 464 ns (1.17× the best) | 512 ns (1.18× the best) | 591 ns (1.20× the best) | 684 ns (1.21× the best) | 783 ns (1.22× the best) |
| gf2_122-lambdaincompleteλ-projective | 509 ns (1.62× the best) | 166 ns (271.21× the best) | 16.6 ns (1.70× the best) | 762 ns (1.92× the best) | 807 ns (1.86× the best) | 882 ns (1.79× the best) | 968 ns (1.71× the best) | 1.06 µs (1.65× the best) |
| gf2_122-lambdaincompletecompare suitehashed straight to : no prepare | 520 ns (1.65× the best) | in the hash | 16.6 ns (1.70× the best) | 607 ns (1.53× the best) | 652 ns (1.51× the best) | 727 ns (1.47× the best) | 813 ns (1.44× the best) | 907 ns (1.41× the best) |
| gf2_122-lambdaincompletecompare suitePornin x1: hash to addend; output already an addend | 326 ns (1.04× the best) | in the hash | 16.6 ns (1.70× the best) | 414 ns (1.04× the best) | 459 ns (1.06× the best) | 533 ns (1.08× the best) | 620 ns (1.10× the best) | 714 ns (1.11× the best) |
| gf2_122-wincompleteλ-projective, w codec | 517 ns (1.64× the best) | 0.63 ns (1.03× the best) | 16.6 ns (1.70× the best) | 605 ns (1.53× the best) | 650 ns (1.50× the best) | 724 ns (1.47× the best) | 811 ns (1.43× the best) | 905 ns (1.40× the best) |
| gf2_122-wincompletecompare suitePornin x1: hash to addend; output already an addend | 326 ns (1.04× the best) | in the hash | 16.6 ns (1.70× the best) | 414 ns (1.04× the best) | 459 ns (1.06× the best) | 533 ns (1.08× the best) | 620 ns (1.10× the best) | 714 ns (1.11× the best) |
| gf2_122-uunscaled (X:S:Z), w codec | 531 ns (1.69× the best) | 0.61 ns (tied for the best, within noise, 1.00×) | 13.1 ns (1.34× the best) | 609 ns (1.54× the best) | 646 ns (1.49× the best) | 706 ns (1.43× the best) | 778 ns (1.38× the best) | 857 ns (1.33× the best) |
| gf2_122-ucompare suitePornin x1: hash to addend; output already an addend | 326 ns (1.03× the best) | in the hash | 13.1 ns (1.34× the best) | 403 ns (1.02× the best) | 440 ns (1.02× the best) | 500 ns (1.01× the best) | 572 ns (1.01× the best) | 651 ns (1.01× the best) |
| GF(2^122), constant in GF(2^61) (GLS-shaped), 16 bytes | ||||||||
| gf2_122-gls(X:S:Z:T) extended | 535 ns (1.70× the best) | 4.31 ns (7.02× the best) | 16.8 ns (1.72× the best) | 628 ns (1.58× the best) | 673 ns (1.55× the best) | 748 ns (1.52× the best) | 836 ns (1.48× the best) | 931 ns (1.44× the best) |
| gf2_122-glscompare suitePornin x1: hash to addend; output already an addend | 369 ns (1.17× the best) | in the hash | 16.8 ns (1.72× the best) | 457 ns (1.15× the best) | 502 ns (1.16× the best) | 577 ns (1.17× the best) | 665 ns (1.18× the best) | 760 ns (1.18× the best) |
| gf2_122-gls-lambdaincompleteλ-projective | 515 ns (1.64× the best) | 167 ns (273.01× the best) | 16.6 ns (1.70× the best) | 770 ns (1.94× the best) | 815 ns (1.88× the best) | 889 ns (1.80× the best) | 976 ns (1.73× the best) | 1.07 µs (1.66× the best) |
| gf2_122-gls-lambdaincompletecompare suitehashed straight to : no prepare | 504 ns (1.60× the best) | in the hash | 16.6 ns (1.70× the best) | 592 ns (1.49× the best) | 637 ns (1.47× the best) | 711 ns (1.44× the best) | 798 ns (1.41× the best) | 892 ns (1.38× the best) |
| gf2_122-gls-lambdaincompletecompare suitePornin x1: hash to addend; output already an addend | 315 ns (tied for the best, within noise) | in the hash | 16.6 ns (1.70× the best) | 402 ns (1.01× the best) | 447 ns (1.03× the best) | 522 ns (1.06× the best) | 608 ns (1.08× the best) | 703 ns (1.09× the best) |
| gf2_122-gls-wincompleteλ-projective, w codec | 509 ns (1.62× the best) | 0.63 ns (1.03× the best) | 16.6 ns (1.70× the best) | 597 ns (1.51× the best) | 642 ns (1.48× the best) | 716 ns (1.45× the best) | 803 ns (1.42× the best) | 897 ns (1.39× the best) |
| gf2_122-gls-wincompletecompare suitePornin x1: hash to addend; output already an addend | 316 ns (tied for the best, within noise, 1.00×) | in the hash | 16.6 ns (1.70× the best) | 403 ns (1.02× the best) | 448 ns (1.03× the best) | 522 ns (1.06× the best) | 609 ns (1.08× the best) | 703 ns (1.09× the best) |
| gf2_122-gls-uunscaled (X:S:Z), w codec | 522 ns (1.66× the best) | 0.63 ns (1.02× the best) | 13.1 ns (1.34× the best) | 600 ns (1.51× the best) | 637 ns (1.47× the best) | 698 ns (1.41× the best) | 769 ns (1.36× the best) | 848 ns (1.32× the best) |
| gf2_122-gls-ucompare suitePornin x1: hash to addend; output already an addend | 319 ns (1.01× the best) | in the hash | 13.1 ns (1.34× the best) | 396 ns (best) | 433 ns (best) | 494 ns (best) | 565 ns (best) | 644 ns (best) |
| GF(2^109), 14 bytes | ||||||||
| gf2_109(X:S:Z:T) extended | 870 ns (2.76× the best) | 2.77 ns (4.51× the best) | 12.8 ns (1.32× the best) | 949 ns (2.40× the best) | 985 ns (2.28× the best) | 1.05 µs (2.12× the best) | 1.12 µs (1.97× the best) | 1.19 µs (1.85× the best) |
| gf2_109compare suitePornin x1: hash to addend; output already an addend | 560 ns (1.78× the best) | in the hash | 12.8 ns (1.32× the best) | 637 ns (1.61× the best) | 673 ns (1.55× the best) | 733 ns (1.48× the best) | 803 ns (1.42× the best) | 881 ns (1.37× the best) |
| gf2_109-lambdaincompleteλ-projective | 873 ns (2.77× the best) | 349 ns (568.88× the best) | 12.0 ns (1.23× the best) | 1.30 µs (3.27× the best) | 1.33 µs (3.07× the best) | 1.39 µs (2.81× the best) | 1.45 µs (2.57× the best) | 1.53 µs (2.37× the best) |
| gf2_109-lambdaincompletecompare suitehashed straight to : no prepare | 938 ns (2.98× the best) | in the hash | 12.0 ns (1.23× the best) | 1.01 µs (2.55× the best) | 1.05 µs (2.42× the best) | 1.10 µs (2.23× the best) | 1.17 µs (2.07× the best) | 1.24 µs (1.93× the best) |
| gf2_109-lambdaincompletecompare suitePornin x1: hash to addend; output already an addend | 550 ns (1.75× the best) | in the hash | 12.0 ns (1.23× the best) | 624 ns (1.58× the best) | 658 ns (1.52× the best) | 715 ns (1.45× the best) | 782 ns (1.38× the best) | 856 ns (1.33× the best) |
| gf2_109-wincompleteλ-projective, w codec | 855 ns (2.72× the best) | 0.61 ns (tied for the best, within noise) | 12.0 ns (1.23× the best) | 930 ns (2.35× the best) | 964 ns (2.23× the best) | 1.02 µs (2.07× the best) | 1.09 µs (1.92× the best) | 1.16 µs (1.80× the best) |
| gf2_109-wincompletecompare suitePornin x1: hash to addend; output already an addend | 535 ns (1.70× the best) | in the hash | 12.0 ns (1.23× the best) | 609 ns (1.54× the best) | 643 ns (1.48× the best) | 699 ns (1.42× the best) | 766 ns (1.35× the best) | 840 ns (1.30× the best) |
| gf2_109-uunscaled (X:S:Z), w codec | 874 ns (2.77× the best) | 0.63 ns (1.02× the best) | 9.76 ns (tied for the best, within noise) | 942 ns (2.38× the best) | 970 ns (2.24× the best) | 1.02 µs (2.06× the best) | 1.08 µs (1.90× the best) | 1.14 µs (1.77× the best) |
| gf2_109-ucompare suitePornin x1: hash to addend; output already an addend | 533 ns (1.69× the best) | in the hash | 9.76 ns (tied for the best, within noise) | 600 ns (1.51× the best) | 629 ns (1.45× the best) | 677 ns (1.37× the best) | 734 ns (1.30× the best) | 798 ns (1.24× the best) |
| F_p, p = 2^127 − 1, 16 bytes | ||||||||
| edwards127a = 1 Edwards, extended += cached | 1.07 µs (3.39× the best) | 582 ns (948.36× the best) | 20.1 ns (2.06× the best) | 1.75 µs (4.41× the best) | 1.80 µs (4.16× the best) | 1.89 µs (3.83× the best) | 1.99 µs (3.52× the best) | 2.10 µs (3.26× the best) |
| edwards127compare suiteElligator 2 x1: hash + prepare | 1.29 µs (4.08× the best) | 582 ns (948.36× the best) | 20.1 ns (2.06× the best) | 1.96 µs (4.96× the best) | 2.02 µs (4.66× the best) | 2.11 µs (4.26× the best) | 2.21 µs (3.90× the best) | 2.32 µs (3.60× the best) |
| weier127short Weierstrass, projective += affine | 1.03 µs (3.26× the best) | 0.61 ns (tied for the best, within noise, 1.00×) | 45.4 ns (4.65× the best) | 1.20 µs (3.02× the best) | 1.31 µs (3.03× the best) | 1.50 µs (3.04× the best) | 1.71 µs (3.03× the best) | 1.93 µs (3.00× the best) |
| weier127compare suiteSSWU x1: hash + prepare | 1.10 µs (3.50× the best) | 0.61 ns (tied for the best, within noise, 1.00×) | 45.4 ns (4.65× the best) | 1.27 µs (3.21× the best) | 1.39 µs (3.20× the best) | 1.57 µs (3.19× the best) | 1.79 µs (3.16× the best) | 2.01 µs (3.12× the best) |
| weier127-jacobianincompleteshort Weierstrass, Jacobian += affine | 1.03 µs (3.28× the best) | 0.62 ns (tied for the best, within noise, 1.01×) | 37.5 ns (3.84× the best) | 1.18 µs (2.98× the best) | 1.28 µs (2.95× the best) | 1.43 µs (2.90× the best) | 1.61 µs (2.85× the best) | 1.80 µs (2.79× the best) |
| F_p, p = 2^107 − 1, 14 bytes | ||||||||
| edwards107a = 1 Edwards, extended += cached | 806 ns (2.56× the best) | 546 ns (889.89× the best) | 15.5 ns (1.59× the best) | 1.44 µs (3.62× the best) | 1.48 µs (3.41× the best) | 1.55 µs (3.14× the best) | 1.63 µs (2.88× the best) | 1.72 µs (2.67× the best) |
| edwards107compare suiteElligator 2 x1: hash + prepare | 1.07 µs (3.38× the best) | 546 ns (889.89× the best) | 15.5 ns (1.59× the best) | 1.70 µs (4.28× the best) | 1.74 µs (4.01× the best) | 1.81 µs (3.66× the best) | 1.89 µs (3.34× the best) | 1.98 µs (3.07× the best) |
| weier107short Weierstrass, projective += affine | 746 ns (2.37× the best) | 0.62 ns (tied for the best, within noise, 1.01×) | 30.5 ns (3.12× the best) | 874 ns (2.21× the best) | 952 ns (2.20× the best) | 1.08 µs (2.19× the best) | 1.23 µs (2.17× the best) | 1.38 µs (2.15× the best) |
| weier107compare suiteSSWU x1: hash + prepare | 1.04 µs (3.30× the best) | 0.62 ns (tied for the best, within noise, 1.01×) | 30.5 ns (3.12× the best) | 1.17 µs (2.95× the best) | 1.25 µs (2.88× the best) | 1.37 µs (2.78× the best) | 1.52 µs (2.69× the best) | 1.68 µs (2.60× the best) |
| weier107-jacobianincompleteshort Weierstrass, Jacobian += affine | 742 ns (2.36× the best) | 0.62 ns (tied for the best, within noise, 1.00×) | 28.7 ns (2.94× the best) | 866 ns (2.18× the best) | 939 ns (2.17× the best) | 1.06 µs (2.15× the best) | 1.20 µs (2.12× the best) | 1.35 µs (2.09× the best) |
| F_p, p = 2^128 − 275, 16 bytes | ||||||||
| twisted128a = −1 twisted Edwards modulo 2-torsion, extended += cached | 1.92 µs (6.11× the best) | 8.24 ns (13.43× the best) | 23.9 ns (2.45× the best) | 2.04 µs (5.15× the best) | 2.10 µs (4.86× the best) | 2.21 µs (4.47× the best) | 2.33 µs (4.11× the best) | 2.45 µs (3.81× the best) |
| twisted128compare suiteElligator 2 x1: hash + prepare | 3.32 µs (10.55× the best) | 8.24 ns (13.43× the best) | 23.9 ns (2.45× the best) | 3.44 µs (8.68× the best) | 3.50 µs (8.09× the best) | 3.60 µs (7.30× the best) | 3.72 µs (6.58× the best) | 3.85 µs (5.98× the best) |
| F_{p²}, p = 2^61 − 1, 16 bytes | ||||||||
| edwards61x2a = 1 Edwards, signed-x codec, extended += cached | 624 ns (1.98× the best) | 216 ns (352.47× the best) | 13.3 ns (1.37× the best) | 918 ns (2.32× the best) | 956 ns (2.21× the best) | 1.02 µs (2.06× the best) | 1.09 µs (1.93× the best) | 1.17 µs (1.82× the best) |
| edwards61x2compare suiteElligator 2 x1: hash + prepare | 734 ns (2.33× the best) | 216 ns (352.47× the best) | 13.3 ns (1.37× the best) | 1.03 µs (2.59× the best) | 1.07 µs (2.46× the best) | 1.13 µs (2.28× the best) | 1.20 µs (2.12× the best) | 1.28 µs (1.99× the best) |
| weier61x2short Weierstrass, signed-x codec, projective += affine | 637 ns (2.02× the best) | 0.63 ns (1.02× the best) | 26.8 ns (2.74× the best) | 755 ns (1.90× the best) | 824 ns (1.90× the best) | 938 ns (1.90× the best) | 1.07 µs (1.89× the best) | 1.21 µs (1.88× the best) |
| weier61x2compare suiteSSWU x1: hash + prepare | 703 ns (2.23× the best) | 0.63 ns (1.02× the best) | 26.8 ns (2.74× the best) | 820 ns (2.07× the best) | 889 ns (2.05× the best) | 1.00 µs (2.03× the best) | 1.14 µs (2.01× the best) | 1.27 µs (1.98× the best) |
| weier61x2-jacobianincompleteshort Weierstrass, signed-x codec, Jacobian += affine | 638 ns (2.03× the best) | 0.63 ns (1.02× the best) | 31.6 ns (3.24× the best) | 770 ns (1.94× the best) | 851 ns (1.97× the best) | 985 ns (1.99× the best) | 1.14 µs (2.01× the best) | 1.30 µs (2.01× the best) |
| twisted61x2a = −1 Edwards modulo 2-torsion, extended += cached | 630 ns (2.00× the best) | 3.41 ns (5.55× the best) | 12.5 ns (1.28× the best) | 709 ns (1.79× the best) | 744 ns (1.72× the best) | 803 ns (1.63× the best) | 872 ns (1.54× the best) | 948 ns (1.47× the best) |
| twisted61x2compare suiteElligator 2 x1: hash + prepare | 892 ns (2.83× the best) | 3.41 ns (5.55× the best) | 12.5 ns (1.28× the best) | 971 ns (2.45× the best) | 1.01 µs (2.33× the best) | 1.07 µs (2.16× the best) | 1.13 µs (2.01× the best) | 1.21 µs (1.88× the best) |
| F_{p²}, p = 2^64 − 59, 16 bytes | ||||||||
| twisted64x2a = −1 Edwards modulo 2-torsion, extended += cached | 1.10 µs (3.49× the best) | 5.43 ns (8.85× the best) | 17.2 ns (1.77× the best) | 1.19 µs (3.01× the best) | 1.24 µs (2.86× the best) | 1.32 µs (2.67× the best) | 1.41 µs (2.49× the best) | 1.50 µs (2.33× the best) |
| twisted64x2compare suiteElligator 2 x1: hash + prepare | 1.53 µs (4.85× the best) | 5.43 ns (8.85× the best) | 17.2 ns (1.77× the best) | 1.62 µs (4.09× the best) | 1.67 µs (3.85× the best) | 1.75 µs (3.53× the best) | 1.84 µs (3.25× the best) | 1.93 µs (3.00× the best) |
| F_{p²}, p = 2^64 − 2^32 + 1, 16 bytes | ||||||||
| twisted-goldilocks2a = −1 Edwards modulo 2-torsion, extended += cached | 1.73 µs (5.50× the best) | 4.48 ns (7.30× the best) | 15.0 ns (1.54× the best) | 1.82 µs (4.59× the best) | 1.86 µs (4.30× the best) | 1.93 µs (3.90× the best) | 2.01 µs (3.55× the best) | 2.10 µs (3.25× the best) |
| twisted-goldilocks2compare suiteElligator 2 x1: hash + prepare | 2.16 µs (6.87× the best) | 4.48 ns (7.30× the best) | 15.0 ns (1.54× the best) | 2.25 µs (5.68× the best) | 2.29 µs (5.29× the best) | 2.36 µs (4.78× the best) | 2.44 µs (4.31× the best) | 2.53 µs (3.92× the best) |
| references, 32 and 33 bytes | ||||||||
| ristretto255compare suitehash output added as is: no prepare | 4.72 µs (14.98× the best) | in the hash | 65.1 ns (6.67× the best) | 4.95 µs (12.48× the best) | 5.11 µs (11.80× the best) | 5.37 µs (10.87× the best) | 5.67 µs (10.03× the best) | 5.98 µs (9.28× the best) |
bold: the best of its column; italic, dotted: tied with the best within the confidence intervals; shading: ratio to the best, pale yellow at 1× to purple at 16× or more; grey: baseline, not compared.
Batching
Batched against individual time per element. The inversions-shared column divides the saving by the difference between individual and batched field inversion; it also absorbs allocation and control flow.
| curve | hash to curve | prepare | encode | decode | ||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| alone | batched | faster by | inversions shared | alone | batched | faster by | inversions shared | alone | batched | faster by | inversions shared | alone | batched | faster by | inversions shared | |
| GF(2^127), 16 bytes | ||||||||||||||||
| gf2_127(X:S:Z:T) extended accumulators, Pornin's formulas | 779 ns | 72.9 ns (best) | 10.7× | 2.3 | 3.88 ns | 3.54 ns (7.69× the best) | 1.1× | 0 | 371 ns | 13.1 ns (1.62× the best) | 28.3× | 1.1 | 367 ns | 14.0 ns (1.06× the best) | 26.2× | 1.1 |
| gf2_127-lambdaincompleteλ-projective (X:L:Z) accumulators | 806 ns | 75.6 ns (1.04× the best) | 10.7× | 2.3 | 340 ns | 6.33 ns (13.74× the best) | 53.7× | 1.1 | 361 ns | 10.1 ns (1.25× the best) | 35.7× | 1.1 | 364 ns | 14.0 ns (1.06× the best) | 26.1× | 1.1 |
| gf2_127-wincompleteλ-projective, w codec: hashes and decodes to λ-affine | 865 ns | 83.3 ns (1.14× the best) | 10.4× | 2.5 | 0.63 ns | 0.48 ns (1.05× the best) | 1.3× | 0 | 361 ns | 10.3 ns (1.28× the best) | 35.0× | 1.1 | 361 ns | 15.1 ns (1.14× the best) | 24.0× | 1.1 |
| gf2_127-uunscaled (X:S:Z), w codec, direct addend hashes | 869 ns | 85.8 ns (1.18× the best) | 10.1× | 2.5 | 0.63 ns | 0.49 ns (1.06× the best) | 1.3× | 0 | 355 ns | 9.17 ns (1.14× the best) | 38.7× | 1.1 | 376 ns | 18.3 ns (1.39× the best) | 20.5× | 1.1 |
| GF(2^122) = GF(2^61)[u], dense constant, 16 bytes | ||||||||||||||||
| gf2_122(X:S:Z:T) extended | 510 ns | 74.9 ns (1.03× the best) | 6.8× | 2.8 | 4.92 ns | 5.02 ns (10.91× the best) | 1.0× | 0 | 211 ns | 15.7 ns (1.94× the best) | 13.5× | 1.3 | 197 ns | 13.5 ns (1.02× the best) | 14.5× | 1.2 |
| gf2_122-lambdaincompleteλ-projective | 509 ns | 74.9 ns (1.03× the best) | 6.8× | 2.8 | 166 ns | 7.55 ns (16.38× the best) | 22.0× | 1 | 189 ns | 11.9 ns (1.48× the best) | 15.9× | 1.1 | 196 ns | 13.5 ns (1.02× the best) | 14.5× | 1.2 |
| gf2_122-wincompleteλ-projective, w codec | 517 ns | 76.8 ns (1.05× the best) | 6.7× | 2.8 | 0.63 ns | 0.46 ns (best) | 1.4× | 0 | 204 ns | 14.4 ns (1.79× the best) | 14.2× | 1.2 | 193 ns | 14.4 ns (1.09× the best) | 13.3× | 1.2 |
| gf2_122-uunscaled (X:S:Z), w codec | 531 ns | 87.6 ns (1.20× the best) | 6.1× | 2.9 | 0.61 ns | 0.48 ns (1.04× the best) | 1.3× | 0 | 206 ns | 12.1 ns (1.49× the best) | 17.1× | 1.3 | 223 ns | 18.7 ns (1.42× the best) | 11.9× | 1.3 |
| GF(2^122), constant in GF(2^61) (GLS-shaped), 16 bytes | ||||||||||||||||
| gf2_122-gls(X:S:Z:T) extended | 535 ns | 74.7 ns (1.02× the best) | 7.2× | 3 | 4.31 ns | 4.44 ns (9.63× the best) | 1.0× | 0 | 209 ns | 15.2 ns (1.88× the best) | 13.7× | 1.3 | 195 ns | 13.2 ns (best) | 14.7× | 1.2 |
| gf2_122-gls-lambdaincompleteλ-projective | 515 ns | 76.5 ns (1.05× the best) | 6.7× | 2.8 | 167 ns | 7.53 ns (16.36× the best) | 22.2× | 1 | 189 ns | 11.6 ns (1.44× the best) | 16.3× | 1.1 | 187 ns | 13.2 ns (1.00× the best) | 14.2× | 1.1 |
| gf2_122-gls-wincompleteλ-projective, w codec | 509 ns | 78.6 ns (1.08× the best) | 6.5× | 2.8 | 0.63 ns | 0.49 ns (1.06× the best) | 1.3× | 0 | 204 ns | 14.4 ns (1.79× the best) | 14.1× | 1.2 | 191 ns | 14.3 ns (1.08× the best) | 13.3× | 1.1 |
| gf2_122-gls-uunscaled (X:S:Z), w codec | 522 ns | 80.2 ns (1.10× the best) | 6.5× | 2.9 | 0.63 ns | 0.48 ns (1.04× the best) | 1.3× | 0 | 195 ns | 12.3 ns (1.52× the best) | 15.9× | 1.2 | 207 ns | 16.8 ns (1.27× the best) | 12.3× | 1.2 |
| GF(2^109), 14 bytes | ||||||||||||||||
| gf2_109(X:S:Z:T) extended | 870 ns | 81.7 ns (1.12× the best) | 10.7× | 2.3 | 2.77 ns | 2.79 ns (6.06× the best) | 1.0× | 0 | 381 ns | 10.9 ns (1.36× the best) | 34.8× | 1.1 | 380 ns | 14.2 ns (1.08× the best) | 26.8× | 1.1 |
| gf2_109-lambdaincompleteλ-projective | 873 ns | 82.0 ns (1.12× the best) | 10.6× | 2.3 | 349 ns | 5.17 ns (11.22× the best) | 67.5× | 1 | 366 ns | 8.13 ns (1.01× the best) | 45.0× | 1.1 | 381 ns | 14.1 ns (1.07× the best) | 27.0× | 1.1 |
| gf2_109-wincompleteλ-projective, w codec | 855 ns | 79.4 ns (1.09× the best) | 10.8× | 2.3 | 0.61 ns | 0.48 ns (1.04× the best) | 1.3× | 0 | 359 ns | 10.4 ns (1.28× the best) | 34.6× | 1 | 378 ns | 15.5 ns (1.17× the best) | 24.4× | 1.1 |
| gf2_109-uunscaled (X:S:Z), w codec | 874 ns | 81.2 ns (1.11× the best) | 10.8× | 2.3 | 0.63 ns | 0.49 ns (1.05× the best) | 1.3× | 0 | 397 ns | 9.88 ns (1.22× the best) | 40.2× | 1.1 | 398 ns | 18.4 ns (1.39× the best) | 21.7× | 1.1 |
| F_p, p = 2^127 − 1, 16 bytes | ||||||||||||||||
| edwards127a = 1 Edwards, extended += cached | 1.07 µs | 1.07 µs (14.65× the best) | 1.0× | 0 | 582 ns | 28.3 ns (61.37× the best) | 20.6× | 1.1 | 549 ns | 22.0 ns (2.72× the best) | 25.0× | 1 | 489 ns | 486 ns (36.80× the best) | 1.0× | 0 |
| weier127short Weierstrass, projective += affine | 1.03 µs | 1.04 µs (14.20× the best) | 1.0× | 0 | 0.61 ns | 0.46 ns (1.00× the best) | 1.3× | 0 | 536 ns | 10.1 ns (1.25× the best) | 53.2× | 1 | 489 ns | 485 ns (36.73× the best) | 1.0× | 0 |
| weier127-jacobianincompleteshort Weierstrass, Jacobian += affine | 1.03 µs | 1.04 µs (14.24× the best) | 1.0× | 0 | 0.62 ns | 0.49 ns (1.06× the best) | 1.3× | 0 | 533 ns | 15.7 ns (1.94× the best) | 33.9× | 1 | 492 ns | 485 ns (36.77× the best) | 1.0× | 0 |
| F_p, p = 2^107 − 1, 14 bytes | ||||||||||||||||
| edwards107a = 1 Edwards, extended += cached | 806 ns | 805 ns (11.04× the best) | 1.0× | 0 | 546 ns | 22.7 ns (49.36× the best) | 24.0× | 1.1 | 506 ns | 20.3 ns (2.51× the best) | 25.0× | 1 | 359 ns | 354 ns (26.79× the best) | 1.0× | 0 |
| weier107short Weierstrass, projective += affine | 746 ns | 748 ns (10.26× the best) | 1.0× | 0 | 0.62 ns | 0.49 ns (1.07× the best) | 1.3× | 0 | 497 ns | 11.5 ns (1.42× the best) | 43.2× | 1 | 358 ns | 352 ns (26.66× the best) | 1.0× | 0 |
| weier107-jacobianincompleteshort Weierstrass, Jacobian += affine | 742 ns | 745 ns (10.22× the best) | 1.0× | 0 | 0.62 ns | 0.48 ns (1.04× the best) | 1.3× | 0 | 502 ns | 15.3 ns (1.90× the best) | 32.8× | 1 | 351 ns | 352 ns (26.63× the best) | 1.0× | 0 |
| F_p, p = 2^128 − 275, 16 bytes | ||||||||||||||||
| twisted128a = −1 twisted Edwards modulo 2-torsion, extended += cached | 1.92 µs | 1.92 µs (26.36× the best) | 1.0× | 8.24 ns | 8.08 ns (17.55× the best) | 1.0× | 939 ns | 16.0 ns (1.98× the best) | 58.7× | 949 ns | 952 ns (72.09× the best) | 1.0× | ||||
| F_{p²}, p = 2^61 − 1, 16 bytes | ||||||||||||||||
| edwards61x2a = 1 Edwards, signed-x codec, extended += cached | 624 ns | 620 ns (8.50× the best) | 1.0× | 0 | 216 ns | 18.8 ns (40.87× the best) | 11.5× | 1.3 | 181 ns | 16.2 ns (2.01× the best) | 11.1× | 1.1 | 405 ns | 404 ns (30.63× the best) | 1.0× | 0 |
| weier61x2short Weierstrass, signed-x codec, projective += affine | 637 ns | 637 ns (8.73× the best) | 1.0× | 0 | 0.63 ns | 0.72 ns (1.56× the best) | 0.9× | 0 | 170 ns | 8.11 ns (1.00× the best) | 20.9× | 1 | 416 ns | 412 ns (31.22× the best) | 1.0× | 0 |
| weier61x2-jacobianincompleteshort Weierstrass, signed-x codec, Jacobian += affine | 638 ns | 638 ns (8.74× the best) | 1.0× | 0 | 0.63 ns | 0.54 ns (1.18× the best) | 1.2× | 0 | 179 ns | 11.7 ns (1.45× the best) | 15.3× | 1.1 | 417 ns | 413 ns (31.25× the best) | 1.0× | 0 |
| twisted61x2a = −1 Edwards modulo 2-torsion, extended += cached | 630 ns | 632 ns (8.66× the best) | 1.0× | 0 | 3.41 ns | 3.60 ns (7.81× the best) | 0.9× | 0 | 179 ns | 8.07 ns (best) | 22.1× | 1.1 | 425 ns | 420 ns (31.80× the best) | 1.0× | 0 |
| F_{p²}, p = 2^64 − 59, 16 bytes | ||||||||||||||||
| twisted64x2a = −1 Edwards modulo 2-torsion, extended += cached | 1.10 µs | 1.10 µs (15.08× the best) | 1.0× | 0 | 5.43 ns | 5.51 ns (11.96× the best) | 1.0× | 0 | 290 ns | 10.3 ns (1.28× the best) | 28.1× | 1 | 721 ns | 718 ns (54.39× the best) | 1.0× | 0 |
| F_{p²}, p = 2^64 − 2^32 + 1, 16 bytes | ||||||||||||||||
| twisted-goldilocks2a = −1 Edwards modulo 2-torsion, extended += cached | 1.73 µs | 1.75 µs (24.00× the best) | 1.0× | -0.1 | 4.48 ns | 4.51 ns (9.78× the best) | 1.0× | 0 | 197 ns | 11.3 ns (1.40× the best) | 17.5× | 1 | 1.53 µs | 1.52 µs (114.99× the best) | 1.0× | 0.1 |
bold: the best of its column; italic, dotted: tied with the best within the confidence intervals; shading: ratio to the best, pale yellow at 1× to purple at 16× or more; grey: baseline, not compared.
Time per element against batch size.
| curve | hash to curve | prepare | encode | decode | ||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| alone | alone | alone | alone | |||||||||||||
| GF(2^127), 16 bytes | ||||||||||||||||
| gf2_127(X:S:Z:T) extended accumulators, Pornin's formulas | 779 ns (1.53× the best) | 322 ns (1.30× the best) | 127 ns (1.16× the best) | 72.9 ns (best) | 3.88 ns (6.33× the best) | 4.37 ns (3.14× the best) | 3.68 ns (7.31× the best) | 3.54 ns (7.69× the best) | 371 ns (2.19× the best) | 71.6 ns (1.58× the best) | 21.7 ns (1.57× the best) | 13.1 ns (1.62× the best) | 367 ns (1.96× the best) | 76.4 ns (1.33× the best) | 22.1 ns (1.14× the best) | 14.0 ns (1.06× the best) |
| gf2_127-lambdaincompleteλ-projective (X:L:Z) accumulators | 806 ns (1.58× the best) | 318 ns (1.28× the best) | 127 ns (1.15× the best) | 75.6 ns (1.04× the best) | 340 ns (553.91× the best) | 64.1 ns (46.03× the best) | 14.2 ns (28.19× the best) | 6.33 ns (13.74× the best) | 361 ns (2.13× the best) | 68.2 ns (1.50× the best) | 18.4 ns (1.33× the best) | 10.1 ns (1.25× the best) | 364 ns (1.95× the best) | 76.3 ns (1.33× the best) | 22.1 ns (1.14× the best) | 14.0 ns (1.06× the best) |
| gf2_127-wincompleteλ-projective, w codec: hashes and decodes to λ-affine | 865 ns (1.70× the best) | 346 ns (1.39× the best) | 138 ns (1.26× the best) | 83.3 ns (1.14× the best) | 0.63 ns (1.02× the best) | 1.40 ns (tied for the best, within noise, 1.01×) | 0.51 ns (1.01× the best) | 0.48 ns (1.05× the best) | 361 ns (2.13× the best) | 67.8 ns (1.49× the best) | 18.6 ns (1.34× the best) | 10.3 ns (1.28× the best) | 361 ns (1.93× the best) | 78.2 ns (1.36× the best) | 23.0 ns (1.18× the best) | 15.1 ns (1.14× the best) |
| gf2_127-uunscaled (X:S:Z), w codec, direct addend hashes | 869 ns (1.71× the best) | 351 ns (1.41× the best) | 142 ns (1.29× the best) | 85.8 ns (1.18× the best) | 0.63 ns (1.03× the best) | 1.41 ns (1.01× the best) | 0.51 ns (1.01× the best) | 0.49 ns (1.06× the best) | 355 ns (2.09× the best) | 65.7 ns (1.45× the best) | 17.2 ns (1.24× the best) | 9.17 ns (1.14× the best) | 376 ns (2.01× the best) | 82.4 ns (1.44× the best) | 26.9 ns (1.39× the best) | 18.3 ns (1.39× the best) |
| GF(2^122) = GF(2^61)[u], dense constant, 16 bytes | ||||||||||||||||
| gf2_122(X:S:Z:T) extended | 510 ns (tied for the best, within noise, 1.00×) | 74.9 ns (1.03× the best) | 4.92 ns (8.02× the best) | 5.02 ns (10.91× the best) | 211 ns (1.24× the best) | 15.7 ns (1.94× the best) | 197 ns (1.05× the best) | 13.5 ns (1.02× the best) | ||||||||
| gf2_122-lambdaincompleteλ-projective | 509 ns (tied for the best, within noise) | 249 ns (best) | 110 ns (best) | 74.9 ns (1.03× the best) | 166 ns (271.21× the best) | 46.9 ns (33.69× the best) | 13.1 ns (26.00× the best) | 7.55 ns (16.38× the best) | 189 ns (1.12× the best) | 52.8 ns (1.16× the best) | 17.8 ns (1.28× the best) | 11.9 ns (1.48× the best) | 196 ns (1.04× the best) | 57.4 ns (best) | 19.8 ns (1.02× the best) | 13.5 ns (1.02× the best) |
| gf2_122-wincompleteλ-projective, w codec | 517 ns (1.02× the best) | 257 ns (1.04× the best) | 114 ns (1.04× the best) | 76.8 ns (1.05× the best) | 0.63 ns (1.03× the best) | 1.39 ns (tied for the best, within noise) | 0.51 ns (tied for the best, within noise, 1.00×) | 0.46 ns (tied for the best, within noise) | 204 ns (1.21× the best) | 55.6 ns (1.22× the best) | 20.6 ns (1.49× the best) | 14.4 ns (1.79× the best) | 193 ns (1.03× the best) | 59.0 ns (1.03× the best) | 20.6 ns (1.06× the best) | 14.4 ns (1.09× the best) |
| gf2_122-uunscaled (X:S:Z), w codec | 531 ns (1.04× the best) | 268 ns (1.08× the best) | 125 ns (1.14× the best) | 87.6 ns (1.20× the best) | 0.61 ns (tied for the best, within noise, 1.00×) | 1.41 ns (1.01× the best) | 0.50 ns (tied for the best, within noise) | 0.48 ns (1.04× the best) | 206 ns (1.22× the best) | 50.6 ns (1.11× the best) | 18.1 ns (1.31× the best) | 12.1 ns (1.49× the best) | 223 ns (1.19× the best) | 65.6 ns (1.14× the best) | 25.2 ns (1.30× the best) | 18.7 ns (1.42× the best) |
| GF(2^122), constant in GF(2^61) (GLS-shaped), 16 bytes | ||||||||||||||||
| gf2_122-gls(X:S:Z:T) extended | 535 ns (1.05× the best) | 74.7 ns (1.02× the best) | 4.31 ns (7.02× the best) | 4.44 ns (9.63× the best) | 209 ns (1.23× the best) | 15.2 ns (1.88× the best) | 195 ns (1.04× the best) | 13.2 ns (tied for the best, within noise) | ||||||||
| gf2_122-gls-lambdaincompleteλ-projective | 515 ns (1.01× the best) | 265 ns (1.07× the best) | 114 ns (1.04× the best) | 76.5 ns (1.05× the best) | 167 ns (273.01× the best) | 47.8 ns (34.38× the best) | 13.1 ns (26.05× the best) | 7.53 ns (16.36× the best) | 189 ns (1.12× the best) | 53.2 ns (1.17× the best) | 17.7 ns (1.28× the best) | 11.6 ns (1.44× the best) | 187 ns (best) | 57.7 ns (1.01× the best) | 19.4 ns (best) | 13.2 ns (tied for the best, within noise, 1.00×) |
| gf2_122-gls-wincompleteλ-projective, w codec | 509 ns (tied for the best, within noise, 1.00×) | 256 ns (1.03× the best) | 115 ns (1.05× the best) | 78.6 ns (1.08× the best) | 0.63 ns (1.03× the best) | 1.42 ns (1.02× the best) | 0.51 ns (1.01× the best) | 0.49 ns (1.06× the best) | 204 ns (1.21× the best) | 55.5 ns (1.22× the best) | 20.6 ns (1.49× the best) | 14.4 ns (1.79× the best) | 191 ns (1.02× the best) | 58.4 ns (1.02× the best) | 20.1 ns (1.03× the best) | 14.3 ns (1.08× the best) |
| gf2_122-gls-uunscaled (X:S:Z), w codec | 522 ns (1.03× the best) | 258 ns (1.04× the best) | 117 ns (1.06× the best) | 80.2 ns (1.10× the best) | 0.63 ns (1.02× the best) | 1.42 ns (1.02× the best) | 0.51 ns (1.01× the best) | 0.48 ns (1.04× the best) | 195 ns (1.15× the best) | 51.2 ns (1.13× the best) | 18.1 ns (1.31× the best) | 12.3 ns (1.52× the best) | 207 ns (1.10× the best) | 62.1 ns (1.08× the best) | 22.6 ns (1.16× the best) | 16.8 ns (1.27× the best) |
| GF(2^109), 14 bytes | ||||||||||||||||
| gf2_109(X:S:Z:T) extended | 870 ns (1.71× the best) | 360 ns (1.45× the best) | 139 ns (1.27× the best) | 81.7 ns (1.12× the best) | 2.77 ns (4.51× the best) | 4.00 ns (2.87× the best) | 2.83 ns (5.61× the best) | 2.79 ns (6.06× the best) | 381 ns (2.25× the best) | 76.6 ns (1.69× the best) | 20.3 ns (1.47× the best) | 10.9 ns (1.36× the best) | 380 ns (2.03× the best) | 82.3 ns (1.43× the best) | 23.5 ns (1.21× the best) | 14.2 ns (1.08× the best) |
| gf2_109-lambdaincompleteλ-projective | 873 ns (1.72× the best) | 360 ns (1.45× the best) | 139 ns (1.26× the best) | 82.0 ns (1.12× the best) | 349 ns (568.88× the best) | 68.7 ns (49.37× the best) | 14.0 ns (27.78× the best) | 5.17 ns (11.22× the best) | 366 ns (2.16× the best) | 73.3 ns (1.62× the best) | 17.5 ns (1.26× the best) | 8.13 ns (1.01× the best) | 381 ns (2.04× the best) | 82.3 ns (1.44× the best) | 23.6 ns (1.21× the best) | 14.1 ns (1.07× the best) |
| gf2_109-wincompleteλ-projective, w codec | 855 ns (1.68× the best) | 346 ns (1.39× the best) | 131 ns (1.20× the best) | 79.4 ns (1.09× the best) | 0.61 ns (tied for the best, within noise) | 1.40 ns (1.01× the best) | 0.51 ns (1.01× the best) | 0.48 ns (1.04× the best) | 359 ns (2.12× the best) | 76.3 ns (1.68× the best) | 19.7 ns (1.42× the best) | 10.4 ns (1.28× the best) | 378 ns (2.02× the best) | 83.9 ns (1.46× the best) | 24.4 ns (1.26× the best) | 15.5 ns (1.17× the best) |
| gf2_109-uunscaled (X:S:Z), w codec | 874 ns (1.72× the best) | 349 ns (1.41× the best) | 135 ns (1.23× the best) | 81.2 ns (1.11× the best) | 0.63 ns (1.02× the best) | 1.42 ns (1.02× the best) | 0.51 ns (1.01× the best) | 0.49 ns (1.05× the best) | 397 ns (2.34× the best) | 74.5 ns (1.64× the best) | 19.1 ns (1.38× the best) | 9.88 ns (1.22× the best) | 398 ns (2.13× the best) | 87.4 ns (1.52× the best) | 26.7 ns (1.38× the best) | 18.4 ns (1.39× the best) |
| F_p, p = 2^127 − 1, 16 bytes | ||||||||||||||||
| edwards127a = 1 Edwards, extended += cached | 1.07 µs (2.10× the best) | 1.07 µs (14.65× the best) | 582 ns (948.36× the best) | 28.3 ns (61.37× the best) | 549 ns (3.24× the best) | 22.0 ns (2.72× the best) | 489 ns (2.61× the best) | 486 ns (36.80× the best) | ||||||||
| weier127short Weierstrass, projective += affine | 1.03 µs (2.02× the best) | 1.04 µs (14.20× the best) | 0.61 ns (tied for the best, within noise, 1.00×) | 0.46 ns (tied for the best, within noise, 1.00×) | 536 ns (3.16× the best) | 10.1 ns (1.25× the best) | 489 ns (2.61× the best) | 485 ns (36.73× the best) | ||||||||
| weier127-jacobianincompleteshort Weierstrass, Jacobian += affine | 1.03 µs (2.03× the best) | 1.04 µs (14.24× the best) | 0.62 ns (tied for the best, within noise, 1.01×) | 0.49 ns (1.06× the best) | 533 ns (3.14× the best) | 15.7 ns (1.94× the best) | 492 ns (2.63× the best) | 485 ns (36.77× the best) | ||||||||
| F_p, p = 2^107 − 1, 14 bytes | ||||||||||||||||
| edwards107a = 1 Edwards, extended += cached | 806 ns (1.58× the best) | 805 ns (11.04× the best) | 546 ns (889.89× the best) | 22.7 ns (49.36× the best) | 506 ns (2.99× the best) | 20.3 ns (2.51× the best) | 359 ns (1.92× the best) | 354 ns (26.79× the best) | ||||||||
| weier107short Weierstrass, projective += affine | 746 ns (1.47× the best) | 748 ns (10.26× the best) | 0.62 ns (tied for the best, within noise, 1.01×) | 0.49 ns (1.07× the best) | 497 ns (2.93× the best) | 11.5 ns (1.42× the best) | 358 ns (1.91× the best) | 352 ns (26.66× the best) | ||||||||
| weier107-jacobianincompleteshort Weierstrass, Jacobian += affine | 742 ns (1.46× the best) | 745 ns (10.22× the best) | 0.62 ns (tied for the best, within noise, 1.00×) | 0.48 ns (1.04× the best) | 502 ns (2.96× the best) | 15.3 ns (1.90× the best) | 351 ns (1.88× the best) | 352 ns (26.63× the best) | ||||||||
| F_p, p = 2^128 − 275, 16 bytes | ||||||||||||||||
| twisted128a = −1 twisted Edwards modulo 2-torsion, extended += cached | 1.92 µs (3.78× the best) | 1.92 µs (26.36× the best) | 8.24 ns (13.43× the best) | 8.08 ns (17.55× the best) | 939 ns (5.54× the best) | 16.0 ns (1.98× the best) | 949 ns (5.07× the best) | 952 ns (72.09× the best) | ||||||||
| F_{p²}, p = 2^61 − 1, 16 bytes | ||||||||||||||||
| edwards61x2a = 1 Edwards, signed-x codec, extended += cached | 624 ns (1.23× the best) | 620 ns (8.50× the best) | 216 ns (352.47× the best) | 18.8 ns (40.87× the best) | 181 ns (1.07× the best) | 16.2 ns (2.01× the best) | 405 ns (2.16× the best) | 404 ns (30.63× the best) | ||||||||
| weier61x2short Weierstrass, signed-x codec, projective += affine | 637 ns (1.25× the best) | 637 ns (8.73× the best) | 0.63 ns (1.02× the best) | 0.72 ns (1.56× the best) | 170 ns (best) | 8.11 ns (tied for the best, within noise, 1.00×) | 416 ns (2.22× the best) | 412 ns (31.22× the best) | ||||||||
| weier61x2-jacobianincompleteshort Weierstrass, signed-x codec, Jacobian += affine | 638 ns (1.26× the best) | 638 ns (8.74× the best) | 0.63 ns (1.02× the best) | 0.54 ns (1.18× the best) | 179 ns (1.06× the best) | 11.7 ns (1.45× the best) | 417 ns (2.23× the best) | 413 ns (31.25× the best) | ||||||||
| twisted61x2a = −1 Edwards modulo 2-torsion, extended += cached | 630 ns (1.24× the best) | 646 ns (2.60× the best) | 641 ns (5.84× the best) | 632 ns (8.66× the best) | 3.41 ns (5.55× the best) | 6.03 ns (4.34× the best) | 3.80 ns (7.54× the best) | 3.60 ns (7.81× the best) | 179 ns (1.05× the best) | 45.4 ns (best) | 13.8 ns (best) | 8.07 ns (tied for the best, within noise) | 425 ns (2.27× the best) | 423 ns (7.37× the best) | 418 ns (21.53× the best) | 420 ns (31.80× the best) |
| F_{p²}, p = 2^64 − 59, 16 bytes | ||||||||||||||||
| twisted64x2a = −1 Edwards modulo 2-torsion, extended += cached | 1.10 µs (2.16× the best) | 1.10 µs (15.08× the best) | 5.43 ns (8.85× the best) | 5.51 ns (11.96× the best) | 290 ns (1.71× the best) | 10.3 ns (1.28× the best) | 721 ns (3.85× the best) | 718 ns (54.39× the best) | ||||||||
| F_{p²}, p = 2^64 − 2^32 + 1, 16 bytes | ||||||||||||||||
| twisted-goldilocks2a = −1 Edwards modulo 2-torsion, extended += cached | 1.73 µs (3.40× the best) | 1.75 µs (24.00× the best) | 4.48 ns (7.30× the best) | 4.51 ns (9.78× the best) | 197 ns (1.16× the best) | 11.3 ns (1.40× the best) | 1.53 µs (8.18× the best) | 1.52 µs (114.99× the best) | ||||||||
bold: the best of its column; italic, dotted: tied with the best within the confidence intervals; shading: ratio to the best, pale yellow at 1× to purple at 16× or more; grey: baseline, not compared.
Costs by lifetime
What an insertion into cells keyed by IDs costs by how long each part stays valid, for each family the RIBLT suite timed so (proj=): the ID once per item; the curve and each hash’s keys once per salt; the hash to the addend, the mapping’s seed and its walk once per salt and item; and the addition, encoding and decoding of each cell. Salted SHA-256 hashes the ID anew under each salt; each projection, the checksum’s and the mapping’s in fields chosen apart, multiplies its halves by the salt’s keys. The last row is the measured encoding of n = 3500 items into m = 1350 cells, per item: by salted SHA-256 of the items themselves, and by projections of their IDs, computed beforehand (Costs by lifetime).
binary.109, pornin, checksum projected in , mapping in
| lifetime | term | salted SHA-256 | projection |
|---|---|---|---|
| per item | ID, the item’s SHA-256 | 33.1 ns | 33.1 ns |
| per salt | accept the curve | 55.2 µs | 55.2 µs |
| per salt | checksum keys | 74.7 ns | 257 ns |
| per salt | mapping keys | 74.7 ns | 257 ns |
| per salt and item | hash to the addend | 64.2 ns | 41.7 ns |
| per salt and item | mapping seed | 33.0 ns | 5.11 ns |
| per salt and item | mapping walk below m = 1350 | 34.2 ns | 34.2 ns |
| per cell | add | 12.8 ns | 12.8 ns |
| per cell | encode | 10.9 ns | 10.9 ns |
| per cell | decode | 14.2 ns | 14.2 ns |
| measured | insertion per item, k = 13.57 cells | 324 ns | 265 ns |
binary-lambda.109, pornin-addend, checksum projected in , mapping in
| lifetime | term | salted SHA-256 | projection |
|---|---|---|---|
| per item | ID, the item’s SHA-256 | 33.1 ns | 33.1 ns |
| per salt | accept the curve | 55.2 µs | 55.2 µs |
| per salt | checksum keys | 74.7 ns | 257 ns |
| per salt | mapping keys | 74.7 ns | 257 ns |
| per salt and item | hash to the addend | 57.7 ns | 34.2 ns |
| per salt and item | mapping seed | 33.0 ns | 5.11 ns |
| per salt and item | mapping walk below m = 1350 | 34.2 ns | 34.2 ns |
| per cell | add | 12.0 ns | 12.0 ns |
| per cell | encode | 8.13 ns | 8.13 ns |
| per cell | decode | 14.1 ns | 14.1 ns |
| measured | insertion per item, k = 13.57 cells | 303 ns | 244 ns |
binary-u.109, pornin-addend, checksum projected in , mapping in
| lifetime | term | salted SHA-256 | projection |
|---|---|---|---|
| per item | ID, the item’s SHA-256 | 33.1 ns | 33.1 ns |
| per salt | accept the curve | 55.2 µs | 55.2 µs |
| per salt | checksum keys | 74.7 ns | 257 ns |
| per salt | mapping keys | 74.7 ns | 257 ns |
| per salt and item | hash to the addend | 61.6 ns | 38.1 ns |
| per salt and item | mapping seed | 33.0 ns | 5.11 ns |
| per salt and item | mapping walk below m = 1350 | 34.2 ns | 34.2 ns |
| per cell | add | 9.76 ns | 9.76 ns |
| per cell | encode | 9.88 ns | 9.88 ns |
| per cell | decode | 18.4 ns | 18.4 ns |
| measured | insertion per item, k = 13.57 cells | 282 ns | 222 ns |
binary-w.109, pornin-addend, checksum projected in , mapping in
| lifetime | term | salted SHA-256 | projection |
|---|---|---|---|
| per item | ID, the item’s SHA-256 | 33.1 ns | 33.1 ns |
| per salt | accept the curve | 55.2 µs | 55.2 µs |
| per salt | checksum keys | 74.7 ns | 257 ns |
| per salt | mapping keys | 74.7 ns | 257 ns |
| per salt and item | hash to the addend | 57.6 ns | 34.2 ns |
| per salt and item | mapping seed | 33.0 ns | 5.11 ns |
| per salt and item | mapping walk below m = 1350 | 34.2 ns | 34.2 ns |
| per cell | add | 12.0 ns | 12.0 ns |
| per cell | encode | 10.4 ns | 10.4 ns |
| per cell | decode | 15.5 ns | 15.5 ns |
| measured | insertion per item, k = 13.57 cells | 302 ns | 239 ns |
binary-lambda.122-gls, pornin-addend, checksum projected in , mapping in
| lifetime | term | salted SHA-256 | projection |
|---|---|---|---|
| per item | ID, the item’s SHA-256 | 33.1 ns | 33.1 ns |
| per salt | accept the curve | 58.6 µs | 58.6 µs |
| per salt | checksum keys | 74.7 ns | 257 ns |
| per salt | mapping keys | 74.7 ns | 257 ns |
| per salt and item | hash to the addend | 58.8 ns | 35.0 ns |
| per salt and item | mapping seed | 33.0 ns | 5.11 ns |
| per salt and item | mapping walk below m = 1350 | 34.2 ns | 34.2 ns |
| per cell | add | 16.6 ns | 16.6 ns |
| per cell | encode | 11.6 ns | 11.6 ns |
| per cell | decode | 13.2 ns | 13.2 ns |
| measured | insertion per item, k = 13.57 cells | 342 ns | 286 ns |
binary-u.122-gls, pornin-addend, checksum projected in , mapping in
| lifetime | term | salted SHA-256 | projection |
|---|---|---|---|
| per item | ID, the item’s SHA-256 | 33.1 ns | 33.1 ns |
| per salt | accept the curve | 58.6 µs | 58.6 µs |
| per salt | checksum keys | 74.7 ns | 257 ns |
| per salt | mapping keys | 74.7 ns | 257 ns |
| per salt and item | hash to the addend | 60.2 ns | 36.1 ns |
| per salt and item | mapping seed | 33.0 ns | 5.11 ns |
| per salt and item | mapping walk below m = 1350 | 34.2 ns | 34.2 ns |
| per cell | add | 13.1 ns | 13.1 ns |
| per cell | encode | 12.3 ns | 12.3 ns |
| per cell | decode | 16.8 ns | 16.8 ns |
| measured | insertion per item, k = 13.57 cells | 306 ns | 252 ns |
binary-w.122-gls, pornin-addend, checksum projected in , mapping in
| lifetime | term | salted SHA-256 | projection |
|---|---|---|---|
| per item | ID, the item’s SHA-256 | 33.1 ns | 33.1 ns |
| per salt | accept the curve | 58.6 µs | 58.6 µs |
| per salt | checksum keys | 74.7 ns | 257 ns |
| per salt | mapping keys | 74.7 ns | 257 ns |
| per salt and item | hash to the addend | 59.3 ns | 34.9 ns |
| per salt and item | mapping seed | 33.0 ns | 5.11 ns |
| per salt and item | mapping walk below m = 1350 | 34.2 ns | 34.2 ns |
| per cell | add | 16.6 ns | 16.6 ns |
| per cell | encode | 14.4 ns | 14.4 ns |
| per cell | decode | 14.3 ns | 14.3 ns |
| measured | insertion per item, k = 13.57 cells | 340 ns | 281 ns |
binary-lambda.122, pornin-addend, checksum projected in , mapping in
| lifetime | term | salted SHA-256 | projection |
|---|---|---|---|
| per item | ID, the item’s SHA-256 | 33.1 ns | 33.1 ns |
| per salt | accept the curve | 55.2 µs | 55.2 µs |
| per salt | checksum keys | 74.7 ns | 257 ns |
| per salt | mapping keys | 74.7 ns | 257 ns |
| per salt and item | hash to the addend | 59.3 ns | 33.6 ns |
| per salt and item | mapping seed | 33.0 ns | 5.11 ns |
| per salt and item | mapping walk below m = 1350 | 34.2 ns | 34.2 ns |
| per cell | add | 16.6 ns | 16.6 ns |
| per cell | encode | 11.9 ns | 11.9 ns |
| per cell | decode | 13.5 ns | 13.5 ns |
| measured | insertion per item, k = 13.57 cells | 341 ns | 284 ns |
binary-u.122, pornin-addend, checksum projected in , mapping in
| lifetime | term | salted SHA-256 | projection |
|---|---|---|---|
| per item | ID, the item’s SHA-256 | 33.1 ns | 33.1 ns |
| per salt | accept the curve | 55.2 µs | 55.2 µs |
| per salt | checksum keys | 74.7 ns | 257 ns |
| per salt | mapping keys | 74.7 ns | 257 ns |
| per salt and item | hash to the addend | 63.2 ns | 38.8 ns |
| per salt and item | mapping seed | 33.0 ns | 5.11 ns |
| per salt and item | mapping walk below m = 1350 | 34.2 ns | 34.2 ns |
| per cell | add | 13.1 ns | 13.1 ns |
| per cell | encode | 12.1 ns | 12.1 ns |
| per cell | decode | 18.7 ns | 18.7 ns |
| measured | insertion per item, k = 13.57 cells | 308 ns | 253 ns |
binary-w.122, pornin-addend, checksum projected in , mapping in
| lifetime | term | salted SHA-256 | projection |
|---|---|---|---|
| per item | ID, the item’s SHA-256 | 33.1 ns | 33.1 ns |
| per salt | accept the curve | 55.2 µs | 55.2 µs |
| per salt | checksum keys | 74.7 ns | 257 ns |
| per salt | mapping keys | 74.7 ns | 257 ns |
| per salt and item | hash to the addend | 58.6 ns | 33.2 ns |
| per salt and item | mapping seed | 33.0 ns | 5.11 ns |
| per salt and item | mapping walk below m = 1350 | 34.2 ns | 34.2 ns |
| per cell | add | 16.6 ns | 16.6 ns |
| per cell | encode | 14.4 ns | 14.4 ns |
| per cell | decode | 14.4 ns | 14.4 ns |
| measured | insertion per item, k = 13.57 cells | 341 ns | 285 ns |
binary.127, pornin, checksum projected in , mapping in
| lifetime | term | salted SHA-256 | projection |
|---|---|---|---|
| per item | ID, the item’s SHA-256 | 33.1 ns | 33.1 ns |
| per salt | accept the curve | 56.1 µs | 56.1 µs |
| per salt | checksum keys | 74.7 ns | 257 ns |
| per salt | mapping keys | 74.7 ns | 257 ns |
| per salt and item | hash to the addend | 62.6 ns | 39.1 ns |
| per salt and item | mapping seed | 33.0 ns | 5.11 ns |
| per salt and item | mapping walk below m = 1350 | 34.2 ns | 34.2 ns |
| per cell | add | 14.1 ns | 14.1 ns |
| per cell | encode | 13.1 ns | 13.1 ns |
| per cell | decode | 14.0 ns | 14.0 ns |
| measured | insertion per item, k = 13.57 cells | 329 ns | 273 ns |
binary-lambda.127, pornin-addend, checksum projected in , mapping in
| lifetime | term | salted SHA-256 | projection |
|---|---|---|---|
| per item | ID, the item’s SHA-256 | 33.1 ns | 33.1 ns |
| per salt | accept the curve | 56.1 µs | 56.1 µs |
| per salt | checksum keys | 74.7 ns | 257 ns |
| per salt | mapping keys | 74.7 ns | 257 ns |
| per salt and item | hash to the addend | 58.4 ns | 34.1 ns |
| per salt and item | mapping seed | 33.0 ns | 5.11 ns |
| per salt and item | mapping walk below m = 1350 | 34.2 ns | 34.2 ns |
| per cell | add | 14.9 ns | 14.9 ns |
| per cell | encode | 10.1 ns | 10.1 ns |
| per cell | decode | 14.0 ns | 14.0 ns |
| measured | insertion per item, k = 13.57 cells | 326 ns | 268 ns |
binary-u.127, pornin-addend, checksum projected in , mapping in
| lifetime | term | salted SHA-256 | projection |
|---|---|---|---|
| per item | ID, the item’s SHA-256 | 33.1 ns | 33.1 ns |
| per salt | accept the curve | 56.1 µs | 56.1 µs |
| per salt | checksum keys | 74.7 ns | 257 ns |
| per salt | mapping keys | 74.7 ns | 257 ns |
| per salt and item | hash to the addend | 61.4 ns | 37.2 ns |
| per salt and item | mapping seed | 33.0 ns | 5.11 ns |
| per salt and item | mapping walk below m = 1350 | 34.2 ns | 34.2 ns |
| per cell | add | 10.7 ns | 10.7 ns |
| per cell | encode | 9.17 ns | 9.17 ns |
| per cell | decode | 18.3 ns | 18.3 ns |
| measured | insertion per item, k = 13.57 cells | 288 ns | 227 ns |
binary-w.127, pornin-addend, checksum projected in , mapping in
| lifetime | term | salted SHA-256 | projection |
|---|---|---|---|
| per item | ID, the item’s SHA-256 | 33.1 ns | 33.1 ns |
| per salt | accept the curve | 56.1 µs | 56.1 µs |
| per salt | checksum keys | 74.7 ns | 257 ns |
| per salt | mapping keys | 74.7 ns | 257 ns |
| per salt and item | hash to the addend | 58.5 ns | 34.2 ns |
| per salt and item | mapping seed | 33.0 ns | 5.11 ns |
| per salt and item | mapping walk below m = 1350 | 34.2 ns | 34.2 ns |
| per cell | add | 14.9 ns | 14.9 ns |
| per cell | encode | 10.3 ns | 10.3 ns |
| per cell | decode | 15.1 ns | 15.1 ns |
| measured | insertion per item, k = 13.57 cells | 325 ns | 268 ns |
Curve selection
Curve selection as this run timed it, once per seed (16 seeds): find searches a seed’s candidates for an acceptable curve; prove searches them again and certifies each rejection and the acceptance; verify checks that certificate. The figure shows each family’s method that finds fastest, a bar at the seeds’ mean in a box from the fastest seed to the slowest, and how the prover’s time divides among the search’s phases; the table lists every method (Parameter selection and verification). Accepting a curve (55.2 µs to 67.6 µs, curvegen/verify_accept) includes the embedding-degree bound, a baby-step giant-step search for with , which alone takes 29.6 µs to 30.7 µs (curvegen/embedding), 45% to 55% of it; rejected candidates do not reach it.
| family | method | shown | seeds | candidates | point counts (prove) | find | prove | verify | counting, of prove |
|---|---|---|---|---|---|---|---|---|---|
| edwards127 | pari+sieve | yes | 16 | 202.9 | 16.4 | 760 ms | 1.05 s | 435 µs | 87% |
| edwards61x2 | pari+sieve | yes | 16 | 122.7 | 10.7 | 360 ms | 503 ms | 200 µs | 91% |
| gf2_109 | agm | 16 | 50.1 | 50.1 | 18.1 ms | 18.3 ms | 107 µs | 97% | |
| gf2_109 | agm+factor | yes | 16 | 50.1 | 50.1 | 17.8 ms | 24.5 ms | 93.6 µs | 73% |
| gf2_109 | pari | 16 | 50.1 | 50.1 | 57.2 ms | 64.3 ms | 93.6 µs | 89% | |
| gf2_122 | agm | yes | 16 | 39.5 | 39.5 | 17.6 ms | 17.2 ms | 86.8 µs | 97% |
| gf2_122 | pari | 16 | 39.5 | 39.5 | 68.0 ms | 68.0 ms | 87.7 µs | 99% | |
| gf2_122-gls | agm | yes | 16 | 47.2 | 47.2 | 5.48 ms | 5.80 ms | 107 µs | 92% |
| gf2_122-gls | pari | 16 | 47.2 | 47.2 | 79.6 ms | 80.4 ms | 111 µs | 99% | |
| gf2_127 | agm+sieve | yes | 16 | 83.6 | 25.1 | 14.6 ms | 14.5 ms | 150 µs | 75% |
| gf2_127 | pari | 16 | 83.6 | 83.6 | 184 ms | 213 ms | 124 µs | 87% | |
| twisted-goldilocks2 | pari+sieve | yes | 16 | 306.9 | 28.4 | 1.19 s | 1.67 s | 596 µs | 87% |
| twisted61x2 | pari+sieve | yes | 16 | 247.9 | 22.4 | 803 ms | 1.06 s | 272 µs | 90% |
| twisted64x2 | pari+sieve | yes | 16 | 347.1 | 28.2 | 1.33 s | 1.79 s | 545 µs | 87% |
| weier127 | pari+sieve | yes | 16 | 179.0 | 19.6 | 888 ms | 1.25 s | 210 µs | 87% |
| weier61x2 | pari+sieve | yes | 16 | 97.5 | 11.1 | 401 ms | 533 ms | 132 µs | 90% |
Group operations
The fastest measurement of each operation and mode per family, the hashes over every construction; rows grouped by field.
| curve | hash to curve | hash to addend | prepare | add | subtract | negate | is identity | equals addend | encode | decode | |||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| alone | batched | alone | batched | alone | batched | throughput | latency | match | mismatch | alone | batched | alone | batched | ||||
| baseline | |||||||||||||||||
| xorSHA-256 digests XORed: no group, 32 bytes | 24.2 ns | 0.71 ns | 0.38 ns | ||||||||||||||
| GF(2^127), 16 bytes | |||||||||||||||||
| gf2_127(X:S:Z:T) extended accumulators, Pornin's formulas | 485 ns (1.32× the best) | 61.5 ns (best) | 3.88 ns (6.33× the best) | 3.54 ns (7.69× the best) | 14.1 ns (1.44× the best) | 22.0 ns (1.26× the best) | 14.7 ns (1.49× the best) | 0.64 ns (1.11× the best) | 0.81 ns (2.38× the best) | 2.98 ns (1.86× the best) | 2.87 ns (1.79× the best) | 371 ns (2.19× the best) | 13.1 ns (1.62× the best) | 367 ns (1.96× the best) | 14.0 ns (1.06× the best) | ||
| gf2_127-lambdaincompleteλ-projective (X:L:Z) accumulators | 806 ns (2.19× the best) | 75.6 ns (1.23× the best) | 456 ns (1.45× the best) | 53.5 ns (tied for the best, within noise) | 340 ns (553.91× the best) | 6.33 ns (13.74× the best) | 14.9 ns (1.53× the best) | 20.2 ns (1.15× the best) | 15.1 ns (1.53× the best) | 0.65 ns (1.11× the best) | 0.84 ns (2.47× the best) | 3.84 ns (2.40× the best) | 3.81 ns (2.38× the best) | 361 ns (2.13× the best) | 10.1 ns (1.25× the best) | 364 ns (1.95× the best) | 14.0 ns (1.06× the best) |
| gf2_127-wincompleteλ-projective, w codec: hashes and decodes to λ-affine | 865 ns (2.35× the best) | 83.3 ns (1.36× the best) | 455 ns (1.44× the best) | 53.5 ns (tied for the best, within noise) | 0.63 ns (1.02× the best) | 0.48 ns (1.05× the best) | 14.9 ns (1.53× the best) | 20.2 ns (1.15× the best) | 14.7 ns (1.49× the best) | 0.65 ns (1.12× the best) | 0.84 ns (2.47× the best) | 3.86 ns (2.41× the best) | 3.84 ns (2.40× the best) | 361 ns (2.13× the best) | 10.3 ns (1.28× the best) | 361 ns (1.93× the best) | 15.1 ns (1.14× the best) |
| gf2_127-uunscaled (X:S:Z), w codec, direct addend hashes | 869 ns (2.36× the best) | 85.8 ns (1.40× the best) | 461 ns (1.46× the best) | 57.2 ns (1.07× the best) | 0.63 ns (1.03× the best) | 0.49 ns (1.06× the best) | 10.7 ns (1.09× the best) | 17.5 ns (best) | 10.8 ns (1.09× the best) | 0.64 ns (1.09× the best) | 0.84 ns (2.47× the best) | 4.67 ns (2.92× the best) | 4.68 ns (2.92× the best) | 355 ns (2.09× the best) | 9.17 ns (1.14× the best) | 376 ns (2.01× the best) | 18.3 ns (1.39× the best) |
| GF(2^122) = GF(2^61)[u], dense constant, 16 bytes | |||||||||||||||||
| gf2_122(X:S:Z:T) extended | 373 ns (1.01× the best) | 62.8 ns (1.02× the best) | 4.92 ns (8.02× the best) | 5.02 ns (10.91× the best) | 17.8 ns (1.83× the best) | 26.1 ns (1.49× the best) | 0.63 ns (1.08× the best) | 0.77 ns (2.28× the best) | 3.75 ns (2.34× the best) | 211 ns (1.24× the best) | 15.7 ns (1.94× the best) | 197 ns (1.05× the best) | 13.5 ns (1.02× the best) | ||||
| gf2_122-lambdaincompleteλ-projective | 509 ns (1.38× the best) | 74.9 ns (1.22× the best) | 326 ns (1.04× the best) | 53.9 ns (1.01× the best) | 166 ns (271.21× the best) | 7.55 ns (16.38× the best) | 16.6 ns (1.70× the best) | 23.0 ns (1.32× the best) | 16.7 ns (1.69× the best) | 0.65 ns (1.12× the best) | 0.77 ns (2.28× the best) | 3.78 ns (2.36× the best) | 3.79 ns (2.37× the best) | 189 ns (1.12× the best) | 11.9 ns (1.48× the best) | 196 ns (1.04× the best) | 13.5 ns (1.02× the best) |
| gf2_122-wincompleteλ-projective, w codec | 517 ns (1.40× the best) | 76.8 ns (1.25× the best) | 326 ns (1.04× the best) | 54.0 ns (1.01× the best) | 0.63 ns (1.03× the best) | 0.46 ns (tied for the best, within noise) | 16.6 ns (1.70× the best) | 23.0 ns (1.31× the best) | 17.1 ns (1.73× the best) | 0.65 ns (1.12× the best) | 0.77 ns (2.28× the best) | 3.77 ns (2.36× the best) | 3.79 ns (2.37× the best) | 204 ns (1.21× the best) | 14.4 ns (1.79× the best) | 193 ns (1.03× the best) | 14.4 ns (1.09× the best) |
| gf2_122-uunscaled (X:S:Z), w codec | 531 ns (1.44× the best) | 87.6 ns (1.43× the best) | 326 ns (1.03× the best) | 57.1 ns (1.07× the best) | 0.61 ns (tied for the best, within noise, 1.00×) | 0.48 ns (1.04× the best) | 13.1 ns (1.34× the best) | 18.8 ns (1.08× the best) | 13.2 ns (1.34× the best) | 0.65 ns (1.12× the best) | 0.77 ns (2.28× the best) | 5.31 ns (3.32× the best) | 5.34 ns (3.34× the best) | 206 ns (1.22× the best) | 12.1 ns (1.49× the best) | 223 ns (1.19× the best) | 18.7 ns (1.42× the best) |
| GF(2^122), constant in GF(2^61) (GLS-shaped), 16 bytes | |||||||||||||||||
| gf2_122-gls(X:S:Z:T) extended | 369 ns (best) | 62.0 ns (1.01× the best) | 4.31 ns (7.02× the best) | 4.44 ns (9.63× the best) | 16.8 ns (1.72× the best) | 23.7 ns (1.36× the best) | 1.12 ns (1.93× the best) | 0.77 ns (2.27× the best) | 3.79 ns (2.37× the best) | 209 ns (1.23× the best) | 15.2 ns (1.88× the best) | 195 ns (1.04× the best) | 13.2 ns (tied for the best, within noise) | ||||
| gf2_122-gls-lambdaincompleteλ-projective | 515 ns (1.40× the best) | 76.5 ns (1.24× the best) | 315 ns (tied for the best, within noise) | 55.4 ns (1.04× the best) | 167 ns (273.01× the best) | 7.53 ns (16.36× the best) | 16.6 ns (1.70× the best) | 23.1 ns (1.32× the best) | 16.7 ns (1.69× the best) | 0.65 ns (1.11× the best) | 0.78 ns (2.28× the best) | 3.79 ns (2.37× the best) | 3.79 ns (2.37× the best) | 189 ns (1.12× the best) | 11.6 ns (1.44× the best) | 187 ns (best) | 13.2 ns (tied for the best, within noise, 1.00×) |
| gf2_122-gls-wincompleteλ-projective, w codec | 509 ns (1.38× the best) | 78.6 ns (1.28× the best) | 316 ns (tied for the best, within noise, 1.00×) | 55.4 ns (1.04× the best) | 0.63 ns (1.03× the best) | 0.49 ns (1.06× the best) | 16.6 ns (1.70× the best) | 23.1 ns (1.32× the best) | 16.8 ns (1.70× the best) | 0.65 ns (1.12× the best) | 0.78 ns (2.28× the best) | 3.79 ns (2.37× the best) | 3.79 ns (2.37× the best) | 204 ns (1.21× the best) | 14.4 ns (1.79× the best) | 191 ns (1.02× the best) | 14.3 ns (1.08× the best) |
| gf2_122-gls-uunscaled (X:S:Z), w codec | 522 ns (1.42× the best) | 80.2 ns (1.30× the best) | 319 ns (1.01× the best) | 55.7 ns (1.04× the best) | 0.63 ns (1.02× the best) | 0.48 ns (1.04× the best) | 13.1 ns (1.34× the best) | 18.9 ns (1.08× the best) | 13.2 ns (1.34× the best) | 0.65 ns (1.12× the best) | 0.78 ns (2.29× the best) | 5.32 ns (3.32× the best) | 5.31 ns (3.32× the best) | 195 ns (1.15× the best) | 12.3 ns (1.52× the best) | 207 ns (1.10× the best) | 16.8 ns (1.27× the best) |
| GF(2^109), 14 bytes | |||||||||||||||||
| gf2_109(X:S:Z:T) extended | 560 ns (1.52× the best) | 63.7 ns (1.04× the best) | 2.77 ns (4.51× the best) | 2.79 ns (6.06× the best) | 12.8 ns (1.32× the best) | 24.3 ns (1.39× the best) | 13.2 ns (1.34× the best) | 0.63 ns (1.08× the best) | 0.64 ns (1.87× the best) | 2.24 ns (1.40× the best) | 2.28 ns (1.43× the best) | 381 ns (2.25× the best) | 10.9 ns (1.36× the best) | 380 ns (2.03× the best) | 14.2 ns (1.08× the best) | ||
| gf2_109-lambdaincompleteλ-projective | 873 ns (2.37× the best) | 82.0 ns (1.33× the best) | 550 ns (1.75× the best) | 55.2 ns (1.03× the best) | 349 ns (568.88× the best) | 5.17 ns (11.22× the best) | 12.0 ns (1.23× the best) | 24.2 ns (1.38× the best) | 12.1 ns (1.22× the best) | 0.65 ns (1.11× the best) | 0.56 ns (1.64× the best) | 1.60 ns (best) | 1.60 ns (best) | 366 ns (2.16× the best) | 8.13 ns (1.01× the best) | 381 ns (2.04× the best) | 14.1 ns (1.07× the best) |
| gf2_109-wincompleteλ-projective, w codec | 855 ns (2.32× the best) | 79.4 ns (1.29× the best) | 535 ns (1.70× the best) | 54.5 ns (1.02× the best) | 0.61 ns (tied for the best, within noise) | 0.48 ns (1.04× the best) | 12.0 ns (1.23× the best) | 24.2 ns (1.38× the best) | 12.1 ns (1.23× the best) | 0.65 ns (1.12× the best) | 0.56 ns (1.64× the best) | 1.82 ns (1.13× the best) | 1.82 ns (1.14× the best) | 359 ns (2.12× the best) | 10.4 ns (1.28× the best) | 378 ns (2.02× the best) | 15.5 ns (1.17× the best) |
| gf2_109-uunscaled (X:S:Z), w codec | 874 ns (2.37× the best) | 81.2 ns (1.32× the best) | 533 ns (1.69× the best) | 60.7 ns (1.13× the best) | 0.63 ns (1.02× the best) | 0.49 ns (1.05× the best) | 9.76 ns (best) | 19.0 ns (1.09× the best) | 9.88 ns (best) | 0.65 ns (1.12× the best) | 0.56 ns (1.64× the best) | 3.46 ns (2.16× the best) | 3.50 ns (2.19× the best) | 397 ns (2.34× the best) | 9.88 ns (1.22× the best) | 398 ns (2.13× the best) | 18.4 ns (1.39× the best) |
| F_p, p = 2^127 − 1, 16 bytes | |||||||||||||||||
| edwards127a = 1 Edwards, extended += cached | 1.07 µs (2.90× the best) | 1.07 µs (17.39× the best) | 582 ns (948.36× the best) | 28.3 ns (61.37× the best) | 20.1 ns (2.06× the best) | 22.2 ns (1.27× the best) | 1.34 ns (2.30× the best) | 0.38 ns (1.12× the best) | 1.97 ns (1.23× the best) | 549 ns (3.24× the best) | 22.0 ns (2.72× the best) | 489 ns (2.61× the best) | 486 ns (36.80× the best) | ||||
| weier127short Weierstrass, projective += affine | 1.03 µs (2.79× the best) | 1.04 µs (16.85× the best) | 0.61 ns (tied for the best, within noise, 1.00×) | 0.46 ns (tied for the best, within noise, 1.00×) | 45.4 ns (4.65× the best) | 46.7 ns (2.67× the best) | 0.69 ns (1.18× the best) | 0.34 ns (tied for the best, within noise, 1.00×) | 2.05 ns (1.28× the best) | 536 ns (3.16× the best) | 10.1 ns (1.25× the best) | 489 ns (2.61× the best) | 485 ns (36.73× the best) | ||||
| weier127-jacobianincompleteshort Weierstrass, Jacobian += affine | 1.03 µs (2.80× the best) | 1.04 µs (16.90× the best) | 0.62 ns (tied for the best, within noise, 1.01×) | 0.49 ns (1.06× the best) | 37.5 ns (3.84× the best) | 45.3 ns (2.59× the best) | 0.69 ns (1.18× the best) | 0.34 ns (tied for the best, within noise) | 4.53 ns (2.83× the best) | 533 ns (3.14× the best) | 15.7 ns (1.94× the best) | 492 ns (2.63× the best) | 485 ns (36.77× the best) | ||||
| F_p, p = 2^107 − 1, 14 bytes | |||||||||||||||||
| edwards107a = 1 Edwards, extended += cached | 806 ns (2.19× the best) | 805 ns (13.10× the best) | 546 ns (889.89× the best) | 22.7 ns (49.36× the best) | 15.5 ns (1.59× the best) | 18.4 ns (1.05× the best) | 0.83 ns (1.42× the best) | 0.75 ns (2.20× the best) | 3.05 ns (1.91× the best) | 506 ns (2.99× the best) | 20.3 ns (2.51× the best) | 359 ns (1.92× the best) | 354 ns (26.79× the best) | ||||
| weier107short Weierstrass, projective += affine | 746 ns (2.02× the best) | 748 ns (12.17× the best) | 0.62 ns (tied for the best, within noise, 1.01×) | 0.49 ns (1.07× the best) | 30.5 ns (3.12× the best) | 32.4 ns (1.85× the best) | 0.58 ns (tied for the best, within noise) | 0.84 ns (2.48× the best) | 3.63 ns (2.27× the best) | 497 ns (2.93× the best) | 11.5 ns (1.42× the best) | 358 ns (1.91× the best) | 352 ns (26.66× the best) | ||||
| weier107-jacobianincompleteshort Weierstrass, Jacobian += affine | 742 ns (2.01× the best) | 745 ns (12.13× the best) | 0.62 ns (tied for the best, within noise, 1.00×) | 0.48 ns (1.04× the best) | 28.7 ns (2.94× the best) | 35.5 ns (2.03× the best) | 0.58 ns (tied for the best, within noise) | 0.84 ns (2.48× the best) | 5.96 ns (3.73× the best) | 502 ns (2.96× the best) | 15.3 ns (1.90× the best) | 351 ns (1.88× the best) | 352 ns (26.63× the best) | ||||
| F_p, p = 2^128 − 275, 16 bytes | |||||||||||||||||
| twisted128a = −1 twisted Edwards modulo 2-torsion, extended += cached | 1.92 µs (5.22× the best) | 1.92 µs (31.28× the best) | 8.24 ns (13.43× the best) | 8.08 ns (17.55× the best) | 23.9 ns (2.45× the best) | 28.8 ns (1.65× the best) | 0.85 ns (1.46× the best) | 0.34 ns (1.01× the best) | 7.51 ns (4.69× the best) | 939 ns (5.54× the best) | 16.0 ns (1.98× the best) | 949 ns (5.07× the best) | 952 ns (72.09× the best) | ||||
| F_{p²}, p = 2^61 − 1, 16 bytes | |||||||||||||||||
| edwards61x2a = 1 Edwards, signed-x codec, extended += cached | 624 ns (1.69× the best) | 620 ns (10.09× the best) | 216 ns (352.47× the best) | 18.8 ns (40.87× the best) | 13.3 ns (1.37× the best) | 22.5 ns (1.29× the best) | 0.88 ns (1.51× the best) | 0.38 ns (1.12× the best) | 1.65 ns (1.03× the best) | 181 ns (1.07× the best) | 16.2 ns (2.01× the best) | 405 ns (2.16× the best) | 404 ns (30.63× the best) | ||||
| weier61x2short Weierstrass, signed-x codec, projective += affine | 637 ns (1.73× the best) | 637 ns (10.36× the best) | 0.63 ns (1.02× the best) | 0.72 ns (1.56× the best) | 26.8 ns (2.74× the best) | 36.2 ns (2.07× the best) | 0.66 ns (1.13× the best) | 0.52 ns (1.55× the best) | 1.70 ns (1.06× the best) | 170 ns (best) | 8.11 ns (tied for the best, within noise, 1.00×) | 416 ns (2.22× the best) | 412 ns (31.22× the best) | ||||
| weier61x2-jacobianincompleteshort Weierstrass, signed-x codec, Jacobian += affine | 638 ns (1.73× the best) | 638 ns (10.37× the best) | 0.63 ns (1.02× the best) | 0.54 ns (1.18× the best) | 31.6 ns (3.24× the best) | 37.2 ns (2.13× the best) | 0.66 ns (1.13× the best) | 0.52 ns (1.54× the best) | 3.59 ns (2.24× the best) | 179 ns (1.06× the best) | 11.7 ns (1.45× the best) | 417 ns (2.23× the best) | 413 ns (31.25× the best) | ||||
| twisted61x2a = −1 Edwards modulo 2-torsion, extended += cached | 630 ns (1.71× the best) | 632 ns (10.28× the best) | 3.41 ns (5.55× the best) | 3.60 ns (7.81× the best) | 12.5 ns (1.28× the best) | 22.3 ns (1.28× the best) | 12.8 ns (1.29× the best) | 0.91 ns (1.56× the best) | 0.34 ns (1.01× the best) | 3.32 ns (2.07× the best) | 3.32 ns (2.07× the best) | 179 ns (1.05× the best) | 8.07 ns (tied for the best, within noise) | 425 ns (2.27× the best) | 420 ns (31.80× the best) | ||
| F_{p²}, p = 2^64 − 59, 16 bytes | |||||||||||||||||
| twisted64x2a = −1 Edwards modulo 2-torsion, extended += cached | 1.10 µs (2.98× the best) | 1.10 µs (17.90× the best) | 5.43 ns (8.85× the best) | 5.51 ns (11.96× the best) | 17.2 ns (1.77× the best) | 28.6 ns (1.64× the best) | 0.91 ns (1.56× the best) | 0.34 ns (1.02× the best) | 5.39 ns (3.36× the best) | 290 ns (1.71× the best) | 10.3 ns (1.28× the best) | 721 ns (3.85× the best) | 718 ns (54.39× the best) | ||||
| F_{p²}, p = 2^64 − 2^32 + 1, 16 bytes | |||||||||||||||||
| twisted-goldilocks2a = −1 Edwards modulo 2-torsion, extended += cached | 1.73 µs (4.70× the best) | 1.75 µs (28.48× the best) | 4.48 ns (7.30× the best) | 4.51 ns (9.78× the best) | 15.0 ns (1.54× the best) | 19.0 ns (1.09× the best) | 1.49 ns (2.55× the best) | 0.52 ns (1.55× the best) | 4.92 ns (3.07× the best) | 197 ns (1.16× the best) | 11.3 ns (1.40× the best) | 1.53 µs (8.18× the best) | 1.52 µs (114.99× the best) | ||||
| references, 32 and 33 bytes | |||||||||||||||||
| ristretto255curve25519-dalek | 4.72 µs (12.80× the best) | 65.1 ns (6.67× the best) | 63.8 ns (3.65× the best) | 64.4 ns (6.52× the best) | 6.20 ns (10.64× the best) | ||||||||||||
| secp256k1libsecp256k1 | 4.49 µs (12.17× the best) | 12.8 ns (22.01× the best) | |||||||||||||||
bold: the best of its column; italic, dotted: tied with the best within the confidence intervals; shading: ratio to the best, pale yellow at 1× to purple at 16× or more; grey: baseline, not compared.
Field operations
Per field; batched inversion per element of a batch of 1024.
| field | mul | square | add | sqrt | sqrt ratio | halftrace | invert | pack | unpack | |||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| throughput | latency | throughput | latency | alone | batched | |||||||
| binary | ||||||||||||
| gf2_127F_2[z]/(z^127 + z^63 + 1) | 1.21 ns (1.17× the best) | 3.75 ns (1.29× the best) | 0.70 ns (best) | 2.08 ns (best) | xor | 1.26 ns (best) | 4.11 ns (1.53× the best) | 317 ns (2.00× the best) | 3.60 ns (1.03× the best) | |||
| gf2_122GF(2^61)[u]/(u^2 + u + 1) | 1.21 ns (1.17× the best) | 4.90 ns (1.69× the best) | 1.09 ns (1.55× the best) | 4.44 ns (2.13× the best) | xor | 2.95 ns (2.35× the best) | 2.69 ns (best) | 159 ns (tied for the best, within noise, 1.00×) | 4.47 ns (1.28× the best) | |||
| gf2_109F_2[z]/(z^109 + z^5 + z^4 + z^2 + 1) | 1.04 ns (best) | 3.92 ns (1.35× the best) | 0.83 ns (1.19× the best) | 2.17 ns (1.04× the best) | xor | 2.77 ns (2.21× the best) | 3.32 ns (1.24× the best) | 341 ns (2.15× the best) | 3.49 ns (best) | |||
| prime | ||||||||||||
| fp127p = 2^127 − 1 | 1.50 ns (1.45× the best) | 3.82 ns (1.32× the best) | 1.78 ns (2.54× the best) | 3.57 ns (1.71× the best) | 0.83 ns (1.62× the best) | 470 ns (374.16× the best) | 518 ns (1.87× the best) | 520 ns (3.28× the best) | 5.64 ns (1.61× the best) | 0.34 ns (1.01× the best) | 0.51 ns (best) | |
| fp107p = 2^107 − 1 | 1.15 ns (1.11× the best) | 3.20 ns (1.10× the best) | 0.97 ns (1.39× the best) | 3.01 ns (1.44× the best) | 0.51 ns (best) | 341 ns (271.16× the best) | 482 ns (1.74× the best) | 477 ns (3.01× the best) | 5.23 ns (1.50× the best) | 0.67 ns (1.96× the best) | 0.51 ns (1.00× the best) | |
| fp128p = 2^128 − 275, for twisted128 | 2.77 ns (2.66× the best) | 6.58 ns (2.27× the best) | 2.58 ns (3.68× the best) | 6.37 ns (3.06× the best) | 0.89 ns (1.74× the best) | 878 ns (698.88× the best) | 932 ns (3.36× the best) | 933 ns (5.88× the best) | 0.34 ns (1.00× the best) | 0.51 ns (1.00× the best) | ||
| quadratic extensions of prime fields | ||||||||||||
| fp61x2GF(p^2) = F_p[i]/(i^2 + 1), p = 2^61 − 1 | 1.26 ns (1.21× the best) | 3.30 ns (1.14× the best) | 1.40 ns (1.99× the best) | 3.48 ns (1.67× the best) | 0.53 ns (1.04× the best) | 277 ns (220.65× the best) | 277 ns (best) | 159 ns (tied for the best, within noise) | 4.67 ns (1.34× the best) | 0.34 ns (best) | 0.72 ns (1.42× the best) | |
| fp64x2GF(p^2) = F_p[i]/(i^2 − 2), p = 2^64 − 59 | 2.24 ns (2.15× the best) | 5.08 ns (1.75× the best) | 2.23 ns (3.19× the best) | 4.92 ns (2.36× the best) | 0.56 ns (1.10× the best) | 485 ns (385.97× the best) | 481 ns (1.74× the best) | 281 ns (1.77× the best) | 5.77 ns (1.65× the best) | 0.34 ns (1.00× the best) | 0.55 ns (1.08× the best) | |
| goldilocks2GF(p^2) = F_p[i]/(i^2 − 7), p = 2^64 − 2^32 + 1 | 1.36 ns (1.31× the best) | 2.90 ns (best) | 1.69 ns (2.42× the best) | 3.43 ns (1.65× the best) | 0.59 ns (1.16× the best) | 727 ns (578.68× the best) | 677 ns (2.44× the best) | 186 ns (1.17× the best) | 5.87 ns (1.68× the best) | 0.40 ns (1.16× the best) | 0.55 ns (1.09× the best) | |
bold: the best of its column; italic, dotted: tied with the best within the confidence intervals; shading: ratio to the best, pale yellow at 1× to purple at 16× or more; grey: baseline, not compared.
Which bench each cell is
| operation | curve | bench | time | 95% CI |
|---|---|---|---|---|
| field mul, throughput | gf2_127 | field/gf2_127/mul throughput (8 chains) | 1.21 ns | 1.21 ns .. 1.21 ns |
| field mul, throughput | gf2_109 | field/gf2_109/mul throughput (8 chains) | 1.04 ns | 1.04 ns .. 1.04 ns |
| field mul, throughput | gf2_122 | field/gf2_122/mul throughput (8 chains) | 1.21 ns | 1.21 ns .. 1.21 ns |
| field mul, throughput | fp127 | field/fp127/mul throughput (8 chains) | 1.50 ns | 1.50 ns .. 1.50 ns |
| field mul, throughput | fp107 | field/fp107 schoolbook/mul throughput (8 chains) | 1.15 ns | 1.15 ns .. 1.15 ns |
| field mul, throughput | fp128 | field/fp128/mul throughput (8 chains) | 2.77 ns | 2.77 ns .. 2.77 ns |
| field mul, throughput | fp61x2 | field/fp61x2/mul throughput (8 chains) | 1.26 ns | 1.26 ns .. 1.26 ns |
| field mul, throughput | fp64x2 | field/fp64x2/mul throughput (8 chains) | 2.24 ns | 2.24 ns .. 2.24 ns |
| field mul, throughput | goldilocks2 | field/goldilocks2/mul throughput (8 chains) | 1.36 ns | 1.35 ns .. 1.38 ns |
| field mul, latency | gf2_127 | field/gf2_127/mul latency (dependent chain) | 3.75 ns | 3.74 ns .. 3.77 ns |
| field mul, latency | gf2_109 | field/gf2_109/mul latency (dependent chain) | 3.92 ns | 3.91 ns .. 3.93 ns |
| field mul, latency | gf2_122 | field/gf2_122/mul latency (dependent chain) | 4.90 ns | 4.90 ns .. 4.90 ns |
| field mul, latency | fp127 | field/fp127/mul latency (dependent chain) | 3.82 ns | 3.81 ns .. 3.82 ns |
| field mul, latency | fp107 | field/fp107 schoolbook/mul latency (dependent chain) | 3.20 ns | 3.20 ns .. 3.21 ns |
| field mul, latency | fp128 | field/fp128/mul latency (dependent chain) | 6.58 ns | 6.57 ns .. 6.58 ns |
| field mul, latency | fp61x2 | field/fp61x2/mul latency (dependent chain) | 3.30 ns | 3.30 ns .. 3.31 ns |
| field mul, latency | fp64x2 | field/fp64x2/mul latency (dependent chain) | 5.08 ns | 5.07 ns .. 5.09 ns |
| field mul, latency | goldilocks2 | field/goldilocks2/mul latency (dependent chain) | 2.90 ns | 2.90 ns .. 2.90 ns |
| field square, throughput | gf2_127 | field/gf2_127/square throughput (8 chains) | 0.70 ns | 0.70 ns .. 0.70 ns |
| field square, throughput | gf2_109 | field/gf2_109/square throughput (8 chains) | 0.83 ns | 0.83 ns .. 0.84 ns |
| field square, throughput | gf2_122 | field/gf2_122/square throughput (8 chains) | 1.09 ns | 1.09 ns .. 1.09 ns |
| field square, throughput | fp127 | field/fp127/square throughput (8 chains) | 1.78 ns | 1.78 ns .. 1.78 ns |
| field square, throughput | fp107 | field/fp107/square throughput (8 chains) | 0.97 ns | 0.97 ns .. 0.97 ns |
| field square, throughput | fp128 | field/fp128/square throughput (8 chains) | 2.58 ns | 2.58 ns .. 2.58 ns |
| field square, throughput | fp61x2 | field/fp61x2/square throughput (8 chains) | 1.40 ns | 1.39 ns .. 1.40 ns |
| field square, throughput | fp64x2 | field/fp64x2/square throughput (8 chains) | 2.23 ns | 2.23 ns .. 2.24 ns |
| field square, throughput | goldilocks2 | field/goldilocks2/square throughput (8 chains) | 1.69 ns | 1.68 ns .. 1.71 ns |
| field square, latency | gf2_127 | field/gf2_127/square latency (dependent chain) | 2.08 ns | 2.08 ns .. 2.09 ns |
| field square, latency | gf2_109 | field/gf2_109/square latency (dependent chain) | 2.17 ns | 2.16 ns .. 2.17 ns |
| field square, latency | gf2_122 | field/gf2_122/square latency (dependent chain) | 4.44 ns | 4.43 ns .. 4.44 ns |
| field square, latency | fp127 | field/fp127/square latency (dependent chain) | 3.57 ns | 3.56 ns .. 3.57 ns |
| field square, latency | fp107 | field/fp107/square latency (dependent chain) | 3.01 ns | 3.00 ns .. 3.02 ns |
| field square, latency | fp128 | field/fp128/square latency (dependent chain) | 6.37 ns | 6.36 ns .. 6.37 ns |
| field square, latency | fp61x2 | field/fp61x2/square latency (dependent chain) | 3.48 ns | 3.48 ns .. 3.49 ns |
| field square, latency | fp64x2 | field/fp64x2/square latency (dependent chain) | 4.92 ns | 4.91 ns .. 4.92 ns |
| field square, latency | goldilocks2 | field/goldilocks2/square latency (dependent chain) | 3.43 ns | 3.43 ns .. 3.44 ns |
| field add | fp127 | field/fp127/add | 0.83 ns | 0.83 ns .. 0.83 ns |
| field add | fp107 | field/fp107/add | 0.51 ns | 0.50 ns .. 0.52 ns |
| field add | fp128 | field/fp128/add | 0.89 ns | 0.89 ns .. 0.89 ns |
| field add | fp61x2 | field/fp61x2/add | 0.53 ns | 0.53 ns .. 0.53 ns |
| field add | fp64x2 | field/fp64x2/add | 0.56 ns | 0.56 ns .. 0.57 ns |
| field add | goldilocks2 | field/goldilocks2/add | 0.59 ns | 0.59 ns .. 0.59 ns |
| field sqrt | gf2_127 | field/gf2_127/sqrt | 1.26 ns | 1.26 ns .. 1.26 ns |
| field sqrt | gf2_109 | field/gf2_109/sqrt | 2.77 ns | 2.77 ns .. 2.78 ns |
| field sqrt | gf2_122 | field/gf2_122/sqrt | 2.95 ns | 2.95 ns .. 2.95 ns |
| field sqrt | fp127 | field/fp127/sqrt (x^(2^125)) | 470 ns | 468 ns .. 472 ns |
| field sqrt | fp107 | field/fp107/sqrt (x^(2^105)) | 341 ns | 340 ns .. 341 ns |
| field sqrt | fp128 | field/fp128/sqrt | 878 ns | 877 ns .. 878 ns |
| field sqrt | fp61x2 | field/fp61x2/sqrt | 277 ns | 277 ns .. 277 ns |
| field sqrt | fp64x2 | field/fp64x2/sqrt | 485 ns | 485 ns .. 485 ns |
| field sqrt | goldilocks2 | field/goldilocks2/sqrt | 727 ns | 724 ns .. 730 ns |
| field sqrt ratio | fp127 | field/fp127/sqrt_ratio | 518 ns | 517 ns .. 519 ns |
| field sqrt ratio | fp107 | field/fp107/sqrt_ratio | 482 ns | 482 ns .. 482 ns |
| field sqrt ratio | fp128 | field/fp128/sqrt_ratio | 932 ns | 932 ns .. 933 ns |
| field sqrt ratio | fp61x2 | field/fp61x2/sqrt_ratio | 277 ns | 277 ns .. 278 ns |
| field sqrt ratio | fp64x2 | field/fp64x2/sqrt_ratio | 481 ns | 481 ns .. 482 ns |
| field sqrt ratio | goldilocks2 | field/goldilocks2/sqrt_ratio | 677 ns | 676 ns .. 678 ns |
| field halftrace | gf2_127 | field/gf2_127/halftrace (byte tables) | 4.11 ns | 4.11 ns .. 4.11 ns |
| field halftrace | gf2_109 | field/gf2_109/halftrace (byte tables) | 3.32 ns | 3.32 ns .. 3.33 ns |
| field halftrace | gf2_122 | field/gf2_122/qsolve (z^2 + z = c, 2 base halftraces) | 2.69 ns | 2.68 ns .. 2.69 ns |
| field invert, one at a time | gf2_127 | field/gf2_127/invert | 317 ns | 317 ns .. 318 ns |
| field invert, one at a time | gf2_109 | field/gf2_109/invert | 341 ns | 340 ns .. 343 ns |
| field invert, one at a time | gf2_122 | field/gf2_122/invert | 159 ns | 159 ns .. 159 ns |
| field invert, one at a time | fp127 | field/fp127/invert | 520 ns | 518 ns .. 522 ns |
| field invert, one at a time | fp107 | field/fp107/invert | 477 ns | 477 ns .. 478 ns |
| field invert, one at a time | fp128 | field/fp128/invert | 933 ns | 932 ns .. 934 ns |
| field invert, one at a time | fp61x2 | field/fp61x2/invert | 159 ns | 159 ns .. 159 ns |
| field invert, one at a time | fp64x2 | field/fp64x2/invert | 281 ns | 280 ns .. 281 ns |
| field invert, one at a time | goldilocks2 | field/goldilocks2/invert | 186 ns | 182 ns .. 190 ns |
| field invert, batched | gf2_127 | field/gf2_127/batch invert (product tree) | 3.60 ns | 3.60 ns .. 3.61 ns |
| field invert, batched | gf2_109 | field/gf2_109/batch invert (product tree) | 3.49 ns | 3.49 ns .. 3.50 ns |
| field invert, batched | gf2_122 | field/gf2_122/batch invert (product tree) | 4.47 ns | 4.47 ns .. 4.47 ns |
| field invert, batched | fp127 | field/fp127/batch invert (product tree) | 5.64 ns | 5.64 ns .. 5.64 ns |
| field invert, batched | fp107 | field/fp107/batch invert (product tree) | 5.23 ns | 5.22 ns .. 5.23 ns |
| field invert, batched | fp61x2 | field/fp61x2/batch invert (product tree) | 4.67 ns | 4.66 ns .. 4.67 ns |
| field invert, batched | fp64x2 | field/fp64x2/batch invert (product tree) | 5.77 ns | 5.77 ns .. 5.78 ns |
| field invert, batched | goldilocks2 | field/goldilocks2/batch invert (product tree) | 5.87 ns | 5.85 ns .. 5.89 ns |
| field pack | fp127 | field/fp127/pack | 0.34 ns | 0.34 ns .. 0.34 ns |
| field pack | fp107 | field/fp107/pack | 0.67 ns | 0.67 ns .. 0.67 ns |
| field pack | fp128 | field/fp128/pack | 0.34 ns | 0.34 ns .. 0.34 ns |
| field pack | fp61x2 | field/fp61x2/pack | 0.34 ns | 0.34 ns .. 0.34 ns |
| field pack | fp64x2 | field/fp64x2/pack | 0.34 ns | 0.34 ns .. 0.34 ns |
| field pack | goldilocks2 | field/goldilocks2/pack | 0.40 ns | 0.40 ns .. 0.40 ns |
| field unpack | fp127 | field/fp127/unpack | 0.51 ns | 0.51 ns .. 0.51 ns |
| field unpack | fp107 | field/fp107/unpack | 0.51 ns | 0.51 ns .. 0.51 ns |
| field unpack | fp128 | field/fp128/unpack | 0.51 ns | 0.51 ns .. 0.51 ns |
| field unpack | fp61x2 | field/fp61x2/unpack | 0.72 ns | 0.72 ns .. 0.72 ns |
| field unpack | fp64x2 | field/fp64x2/unpack | 0.55 ns | 0.55 ns .. 0.55 ns |
| field unpack | goldilocks2 | field/goldilocks2/unpack | 0.55 ns | 0.55 ns .. 0.55 ns |
| point add, throughput | xor | add/xor-sha256/xor 32B, 8 accumulators | 0.71 ns | 0.70 ns .. 0.71 ns |
| point add, throughput | gf2_127 | group.add/binary.127/mode=throughput | 14.1 ns | 14.1 ns .. 14.1 ns |
| point add, throughput | gf2_127-lambda | group.add/binary-lambda.127/mode=throughput | 14.9 ns | 14.9 ns .. 14.9 ns |
| point add, throughput | gf2_127-w | group.add/binary-w.127/mode=throughput | 14.9 ns | 14.8 ns .. 14.9 ns |
| point add, throughput | gf2_127-u | group.add/binary-u.127/mode=throughput | 10.7 ns | 10.6 ns .. 10.7 ns |
| point add, throughput | gf2_109 | group.add/binary.109/mode=throughput | 12.8 ns | 12.8 ns .. 12.9 ns |
| point add, throughput | gf2_109-lambda | group.add/binary-lambda.109/mode=throughput | 12.0 ns | 12.0 ns .. 12.0 ns |
| point add, throughput | gf2_109-w | group.add/binary-w.109/mode=throughput | 12.0 ns | 11.9 ns .. 12.0 ns |
| point add, throughput | gf2_109-u | group.add/binary-u.109/mode=throughput | 9.76 ns | 9.74 ns .. 9.78 ns |
| point add, throughput | gf2_122 | group.add/binary.122/mode=throughput | 17.8 ns | 17.8 ns .. 17.9 ns |
| point add, throughput | gf2_122-lambda | group.add/binary-lambda.122/mode=throughput | 16.6 ns | 16.5 ns .. 16.6 ns |
| point add, throughput | gf2_122-w | group.add/binary-w.122/mode=throughput | 16.6 ns | 16.5 ns .. 16.6 ns |
| point add, throughput | gf2_122-u | group.add/binary-u.122/mode=throughput | 13.1 ns | 13.0 ns .. 13.1 ns |
| point add, throughput | gf2_122-gls | group.add/binary.122-gls/mode=throughput | 16.8 ns | 16.7 ns .. 16.8 ns |
| point add, throughput | gf2_122-gls-lambda | group.add/binary-lambda.122-gls/mode=throughput | 16.6 ns | 16.5 ns .. 16.6 ns |
| point add, throughput | gf2_122-gls-w | group.add/binary-w.122-gls/mode=throughput | 16.6 ns | 16.5 ns .. 16.6 ns |
| point add, throughput | gf2_122-gls-u | group.add/binary-u.122-gls/mode=throughput | 13.1 ns | 13.1 ns .. 13.1 ns |
| point add, throughput | edwards127 | group.add/edwards.127/mode=throughput | 20.1 ns | 20.0 ns .. 20.1 ns |
| point add, throughput | edwards107 | group.add/edwards.107/mode=throughput | 15.5 ns | 15.4 ns .. 15.5 ns |
| point add, throughput | twisted128 | group.add/twisted.128/mode=throughput | 23.9 ns | 23.8 ns .. 24.0 ns |
| point add, throughput | weier127 | group.add/weier.127/mode=throughput | 45.4 ns | 45.3 ns .. 45.5 ns |
| point add, throughput | weier127-jacobian | group.add/weier-jacobian.127/mode=throughput | 37.5 ns | 37.4 ns .. 37.6 ns |
| point add, throughput | weier107 | group.add/weier.107/mode=throughput | 30.5 ns | 30.4 ns .. 30.5 ns |
| point add, throughput | weier107-jacobian | group.add/weier-jacobian.107/mode=throughput | 28.7 ns | 28.6 ns .. 28.7 ns |
| point add, throughput | edwards61x2 | group.add/edwards.61x2/mode=throughput | 13.3 ns | 13.3 ns .. 13.4 ns |
| point add, throughput | weier61x2 | group.add/weier.61x2/mode=throughput | 26.8 ns | 26.7 ns .. 26.8 ns |
| point add, throughput | weier61x2-jacobian | group.add/weier-jacobian.61x2/mode=throughput | 31.6 ns | 31.6 ns .. 31.7 ns |
| point add, throughput | twisted61x2 | group.add/twisted.61x2/mode=throughput | 12.5 ns | 12.4 ns .. 12.6 ns |
| point add, throughput | twisted64x2 | group.add/twisted.64x2/mode=throughput | 17.2 ns | 17.2 ns .. 17.3 ns |
| point add, throughput | twisted-goldilocks2 | group.add/twisted.goldilocks2/mode=throughput | 15.0 ns | 15.0 ns .. 15.1 ns |
| point add, throughput | ristretto255 | add/ristretto255/+=, 8 accumulators | 65.1 ns | 64.8 ns .. 65.5 ns |
| point add, latency | xor | add/xor-sha256/xor 32B, 1 accumulator | 0.38 ns | 0.37 ns .. 0.38 ns |
| point add, latency | gf2_127 | group.add/binary.127/mode=latency | 22.0 ns | 21.9 ns .. 22.0 ns |
| point add, latency | gf2_127-lambda | group.add/binary-lambda.127/mode=latency | 20.2 ns | 20.1 ns .. 20.2 ns |
| point add, latency | gf2_127-w | group.add/binary-w.127/mode=latency | 20.2 ns | 20.1 ns .. 20.2 ns |
| point add, latency | gf2_127-u | group.add/binary-u.127/mode=latency | 17.5 ns | 17.4 ns .. 17.5 ns |
| point add, latency | gf2_109 | group.add/binary.109/mode=latency | 24.3 ns | 24.2 ns .. 24.4 ns |
| point add, latency | gf2_109-lambda | group.add/binary-lambda.109/mode=latency | 24.2 ns | 24.1 ns .. 24.3 ns |
| point add, latency | gf2_109-w | group.add/binary-w.109/mode=latency | 24.2 ns | 24.2 ns .. 24.3 ns |
| point add, latency | gf2_109-u | group.add/binary-u.109/mode=latency | 19.0 ns | 18.9 ns .. 19.0 ns |
| point add, latency | gf2_122 | group.add/binary.122/mode=latency | 26.1 ns | 26.1 ns .. 26.2 ns |
| point add, latency | gf2_122-lambda | group.add/binary-lambda.122/mode=latency | 23.0 ns | 23.0 ns .. 23.1 ns |
| point add, latency | gf2_122-w | group.add/binary-w.122/mode=latency | 23.0 ns | 22.9 ns .. 23.0 ns |
| point add, latency | gf2_122-u | group.add/binary-u.122/mode=latency | 18.8 ns | 18.8 ns .. 18.9 ns |
| point add, latency | gf2_122-gls | group.add/binary.122-gls/mode=latency | 23.7 ns | 23.7 ns .. 23.8 ns |
| point add, latency | gf2_122-gls-lambda | group.add/binary-lambda.122-gls/mode=latency | 23.1 ns | 23.1 ns .. 23.2 ns |
| point add, latency | gf2_122-gls-w | group.add/binary-w.122-gls/mode=latency | 23.1 ns | 23.0 ns .. 23.1 ns |
| point add, latency | gf2_122-gls-u | group.add/binary-u.122-gls/mode=latency | 18.9 ns | 18.8 ns .. 18.9 ns |
| point add, latency | edwards127 | group.add/edwards.127/mode=latency | 22.2 ns | 22.2 ns .. 22.2 ns |
| point add, latency | edwards107 | group.add/edwards.107/mode=latency | 18.4 ns | 18.3 ns .. 18.4 ns |
| point add, latency | twisted128 | group.add/twisted.128/mode=latency | 28.8 ns | 28.7 ns .. 28.8 ns |
| point add, latency | weier127 | group.add/weier.127/mode=latency | 46.7 ns | 46.5 ns .. 46.8 ns |
| point add, latency | weier127-jacobian | group.add/weier-jacobian.127/mode=latency | 45.3 ns | 45.1 ns .. 45.6 ns |
| point add, latency | weier107 | group.add/weier.107/mode=latency | 32.4 ns | 32.3 ns .. 32.4 ns |
| point add, latency | weier107-jacobian | group.add/weier-jacobian.107/mode=latency | 35.5 ns | 35.4 ns .. 35.6 ns |
| point add, latency | edwards61x2 | group.add/edwards.61x2/mode=latency | 22.5 ns | 22.4 ns .. 22.5 ns |
| point add, latency | weier61x2 | group.add/weier.61x2/mode=latency | 36.2 ns | 36.2 ns .. 36.3 ns |
| point add, latency | weier61x2-jacobian | group.add/weier-jacobian.61x2/mode=latency | 37.2 ns | 37.1 ns .. 37.3 ns |
| point add, latency | twisted61x2 | group.add/twisted.61x2/mode=latency | 22.3 ns | 22.3 ns .. 22.3 ns |
| point add, latency | twisted64x2 | group.add/twisted.64x2/mode=latency | 28.6 ns | 28.5 ns .. 28.7 ns |
| point add, latency | twisted-goldilocks2 | group.add/twisted.goldilocks2/mode=latency | 19.0 ns | 18.9 ns .. 19.0 ns |
| point add, latency | ristretto255 | add/ristretto255/+=, 1 accumulator | 63.8 ns | 63.7 ns .. 63.8 ns |
| point subtract | gf2_127 | group.sub/binary.127/mode=throughput | 14.7 ns | 14.7 ns .. 14.7 ns |
| point subtract | gf2_127-lambda | group.sub/binary-lambda.127/mode=throughput | 15.1 ns | 15.1 ns .. 15.2 ns |
| point subtract | gf2_127-w | group.sub/binary-w.127/mode=throughput | 14.7 ns | 14.6 ns .. 14.8 ns |
| point subtract | gf2_127-u | group.sub/binary-u.127/mode=throughput | 10.8 ns | 10.7 ns .. 10.8 ns |
| point subtract | gf2_109 | group.sub/binary.109/mode=throughput | 13.2 ns | 13.2 ns .. 13.3 ns |
| point subtract | gf2_109-lambda | group.sub/binary-lambda.109/mode=throughput | 12.1 ns | 12.1 ns .. 12.1 ns |
| point subtract | gf2_109-w | group.sub/binary-w.109/mode=throughput | 12.1 ns | 12.1 ns .. 12.1 ns |
| point subtract | gf2_109-u | group.sub/binary-u.109/mode=throughput | 9.88 ns | 9.86 ns .. 9.90 ns |
| point subtract | gf2_122-lambda | group.sub/binary-lambda.122/mode=throughput | 16.7 ns | 16.7 ns .. 16.8 ns |
| point subtract | gf2_122-w | group.sub/binary-w.122/mode=throughput | 17.1 ns | 16.7 ns .. 17.5 ns |
| point subtract | gf2_122-u | group.sub/binary-u.122/mode=throughput | 13.2 ns | 13.2 ns .. 13.2 ns |
| point subtract | gf2_122-gls-lambda | group.sub/binary-lambda.122-gls/mode=throughput | 16.7 ns | 16.7 ns .. 16.8 ns |
| point subtract | gf2_122-gls-w | group.sub/binary-w.122-gls/mode=throughput | 16.8 ns | 16.7 ns .. 16.9 ns |
| point subtract | gf2_122-gls-u | group.sub/binary-u.122-gls/mode=throughput | 13.2 ns | 13.2 ns .. 13.2 ns |
| point subtract | twisted61x2 | group.sub/twisted.61x2/mode=throughput | 12.8 ns | 12.7 ns .. 12.8 ns |
| point subtract | ristretto255 | add/ristretto255/-=, 8 accumulators | 64.4 ns | 64.1 ns .. 64.7 ns |
| point negate | gf2_127 | negate/gf2_127/affine (y += x) | 0.64 ns | 0.64 ns .. 0.64 ns |
| point negate | gf2_127-lambda | group.neg/binary-lambda.127 | 0.65 ns | 0.65 ns .. 0.65 ns |
| point negate | gf2_127-w | group.neg/binary-w.127 | 0.65 ns | 0.65 ns .. 0.65 ns |
| point negate | gf2_127-u | group.neg/binary-u.127 | 0.64 ns | 0.63 ns .. 0.64 ns |
| point negate | gf2_109 | negate/gf2_109/affine (y += x) | 0.63 ns | 0.63 ns .. 0.63 ns |
| point negate | gf2_109-lambda | group.neg/binary-lambda.109 | 0.65 ns | 0.65 ns .. 0.65 ns |
| point negate | gf2_109-w | group.neg/binary-w.109 | 0.65 ns | 0.65 ns .. 0.65 ns |
| point negate | gf2_109-u | group.neg/binary-u.109 | 0.65 ns | 0.65 ns .. 0.65 ns |
| point negate | gf2_122 | negate/gf2_122/affine (y += x) | 0.63 ns | 0.63 ns .. 0.63 ns |
| point negate | gf2_122-lambda | group.neg/binary-lambda.122 | 0.65 ns | 0.65 ns .. 0.65 ns |
| point negate | gf2_122-w | group.neg/binary-w.122 | 0.65 ns | 0.65 ns .. 0.65 ns |
| point negate | gf2_122-u | group.neg/binary-u.122 | 0.65 ns | 0.65 ns .. 0.65 ns |
| point negate | gf2_122-gls | group.neg/binary.122-gls | 1.12 ns | 1.12 ns .. 1.13 ns |
| point negate | gf2_122-gls-lambda | group.neg/binary-lambda.122-gls | 0.65 ns | 0.65 ns .. 0.65 ns |
| point negate | gf2_122-gls-w | group.neg/binary-w.122-gls | 0.65 ns | 0.65 ns .. 0.65 ns |
| point negate | gf2_122-gls-u | group.neg/binary-u.122-gls | 0.65 ns | 0.65 ns .. 0.65 ns |
| point negate | edwards127 | group.neg/edwards.127 | 1.34 ns | 1.33 ns .. 1.34 ns |
| point negate | edwards107 | group.neg/edwards.107 | 0.83 ns | 0.82 ns .. 0.83 ns |
| point negate | twisted128 | group.neg/twisted.128 | 0.85 ns | 0.85 ns .. 0.86 ns |
| point negate | weier127 | group.neg/weier.127 | 0.69 ns | 0.69 ns .. 0.69 ns |
| point negate | weier127-jacobian | group.neg/weier-jacobian.127 | 0.69 ns | 0.69 ns .. 0.69 ns |
| point negate | weier107 | group.neg/weier.107 | 0.58 ns | 0.58 ns .. 0.58 ns |
| point negate | weier107-jacobian | group.neg/weier-jacobian.107 | 0.58 ns | 0.58 ns .. 0.58 ns |
| point negate | edwards61x2 | group.neg/edwards.61x2 | 0.88 ns | 0.88 ns .. 0.88 ns |
| point negate | weier61x2 | group.neg/weier.61x2 | 0.66 ns | 0.66 ns .. 0.66 ns |
| point negate | weier61x2-jacobian | group.neg/weier-jacobian.61x2 | 0.66 ns | 0.66 ns .. 0.66 ns |
| point negate | twisted61x2 | group.neg/twisted.61x2 | 0.91 ns | 0.90 ns .. 0.92 ns |
| point negate | twisted64x2 | group.neg/twisted.64x2 | 0.91 ns | 0.90 ns .. 0.91 ns |
| point negate | twisted-goldilocks2 | group.neg/twisted.goldilocks2 | 1.49 ns | 1.48 ns .. 1.49 ns |
| point negate | ristretto255 | negate/ristretto255/-P | 6.20 ns | 6.17 ns .. 6.22 ns |
| point negate | secp256k1 | negate/secp256k1/PublicKey::negate | 12.8 ns | 12.7 ns .. 12.9 ns |
| point prepare, one at a time | gf2_127 | group.prepare/binary.127/mode=indep | 3.88 ns | 3.87 ns .. 3.91 ns |
| point prepare, one at a time | gf2_127-lambda | group.prepare/binary-lambda.127/mode=indep | 340 ns | 339 ns .. 340 ns |
| point prepare, one at a time | gf2_127-w | group.prepare/binary-w.127/mode=indep | 0.63 ns | 0.62 ns .. 0.63 ns |
| point prepare, one at a time | gf2_127-u | group.prepare/binary-u.127/mode=indep | 0.63 ns | 0.63 ns .. 0.63 ns |
| point prepare, one at a time | gf2_109 | group.prepare/binary.109/mode=indep | 2.77 ns | 2.76 ns .. 2.77 ns |
| point prepare, one at a time | gf2_109-lambda | group.prepare/binary-lambda.109/mode=indep | 349 ns | 348 ns .. 350 ns |
| point prepare, one at a time | gf2_109-w | group.prepare/binary-w.109/mode=indep | 0.61 ns | 0.61 ns .. 0.62 ns |
| point prepare, one at a time | gf2_109-u | group.prepare/binary-u.109/mode=indep | 0.63 ns | 0.63 ns .. 0.63 ns |
| point prepare, one at a time | gf2_122 | group.prepare/binary.122/mode=indep | 4.92 ns | 4.90 ns .. 4.93 ns |
| point prepare, one at a time | gf2_122-lambda | group.prepare/binary-lambda.122/mode=indep | 166 ns | 166 ns .. 167 ns |
| point prepare, one at a time | gf2_122-w | group.prepare/binary-w.122/mode=indep | 0.63 ns | 0.63 ns .. 0.63 ns |
| point prepare, one at a time | gf2_122-u | group.prepare/binary-u.122/mode=indep | 0.61 ns | 0.61 ns .. 0.62 ns |
| point prepare, one at a time | gf2_122-gls | group.prepare/binary.122-gls/mode=indep | 4.31 ns | 4.29 ns .. 4.32 ns |
| point prepare, one at a time | gf2_122-gls-lambda | group.prepare/binary-lambda.122-gls/mode=indep | 167 ns | 167 ns .. 168 ns |
| point prepare, one at a time | gf2_122-gls-w | group.prepare/binary-w.122-gls/mode=indep | 0.63 ns | 0.63 ns .. 0.63 ns |
| point prepare, one at a time | gf2_122-gls-u | group.prepare/binary-u.122-gls/mode=indep | 0.63 ns | 0.63 ns .. 0.63 ns |
| point prepare, one at a time | edwards127 | group.prepare/edwards.127/mode=indep | 582 ns | 581 ns .. 583 ns |
| point prepare, one at a time | edwards107 | group.prepare/edwards.107/mode=indep | 546 ns | 544 ns .. 548 ns |
| point prepare, one at a time | twisted128 | group.prepare/twisted.128/mode=indep | 8.24 ns | 8.22 ns .. 8.26 ns |
| point prepare, one at a time | weier127 | group.prepare/weier.127/mode=indep | 0.61 ns | 0.61 ns .. 0.62 ns |
| point prepare, one at a time | weier127-jacobian | group.prepare/weier-jacobian.127/mode=indep | 0.62 ns | 0.62 ns .. 0.62 ns |
| point prepare, one at a time | weier107 | group.prepare/weier.107/mode=indep | 0.62 ns | 0.62 ns .. 0.62 ns |
| point prepare, one at a time | weier107-jacobian | group.prepare/weier-jacobian.107/mode=indep | 0.62 ns | 0.61 ns .. 0.62 ns |
| point prepare, one at a time | edwards61x2 | group.prepare/edwards.61x2/mode=indep | 216 ns | 216 ns .. 217 ns |
| point prepare, one at a time | weier61x2 | group.prepare/weier.61x2/mode=indep | 0.63 ns | 0.63 ns .. 0.63 ns |
| point prepare, one at a time | weier61x2-jacobian | group.prepare/weier-jacobian.61x2/mode=indep | 0.63 ns | 0.63 ns .. 0.63 ns |
| point prepare, one at a time | twisted61x2 | group.prepare/twisted.61x2/mode=indep | 3.41 ns | 3.40 ns .. 3.41 ns |
| point prepare, one at a time | twisted64x2 | group.prepare/twisted.64x2/mode=indep | 5.43 ns | 5.41 ns .. 5.44 ns |
| point prepare, one at a time | twisted-goldilocks2 | group.prepare/twisted.goldilocks2/mode=indep | 4.48 ns | 4.46 ns .. 4.49 ns |
| point prepare, batched | gf2_127 | group.prepare/binary.127/mode=batch,n=1024 | 3.54 ns | 3.54 ns .. 3.54 ns |
| point prepare, batched | gf2_127-lambda | group.prepare/binary-lambda.127/mode=batch,n=1024 | 6.33 ns | 6.30 ns .. 6.35 ns |
| point prepare, batched | gf2_127-w | group.prepare/binary-w.127/mode=batch,n=1024 | 0.48 ns | 0.47 ns .. 0.49 ns |
| point prepare, batched | gf2_127-u | group.prepare/binary-u.127/mode=batch,n=1024 | 0.49 ns | 0.48 ns .. 0.49 ns |
| point prepare, batched | gf2_109 | group.prepare/binary.109/mode=batch,n=1024 | 2.79 ns | 2.79 ns .. 2.80 ns |
| point prepare, batched | gf2_109-lambda | group.prepare/binary-lambda.109/mode=batch,n=1024 | 5.17 ns | 5.16 ns .. 5.18 ns |
| point prepare, batched | gf2_109-w | group.prepare/binary-w.109/mode=batch,n=1024 | 0.48 ns | 0.47 ns .. 0.48 ns |
| point prepare, batched | gf2_109-u | group.prepare/binary-u.109/mode=batch,n=1024 | 0.49 ns | 0.48 ns .. 0.49 ns |
| point prepare, batched | gf2_122 | group.prepare/binary.122/mode=batch,n=1024 | 5.02 ns | 5.01 ns .. 5.03 ns |
| point prepare, batched | gf2_122-lambda | group.prepare/binary-lambda.122/mode=batch,n=1024 | 7.55 ns | 7.53 ns .. 7.56 ns |
| point prepare, batched | gf2_122-w | group.prepare/binary-w.122/mode=batch,n=1024 | 0.46 ns | 0.45 ns .. 0.47 ns |
| point prepare, batched | gf2_122-u | group.prepare/binary-u.122/mode=batch,n=1024 | 0.48 ns | 0.47 ns .. 0.48 ns |
| point prepare, batched | gf2_122-gls | group.prepare/binary.122-gls/mode=batch,n=1024 | 4.44 ns | 4.42 ns .. 4.45 ns |
| point prepare, batched | gf2_122-gls-lambda | group.prepare/binary-lambda.122-gls/mode=batch,n=1024 | 7.53 ns | 7.52 ns .. 7.55 ns |
| point prepare, batched | gf2_122-gls-w | group.prepare/binary-w.122-gls/mode=batch,n=1024 | 0.49 ns | 0.48 ns .. 0.50 ns |
| point prepare, batched | gf2_122-gls-u | group.prepare/binary-u.122-gls/mode=batch,n=1024 | 0.48 ns | 0.47 ns .. 0.48 ns |
| point prepare, batched | edwards127 | group.prepare/edwards.127/mode=batch,n=1024 | 28.3 ns | 28.2 ns .. 28.3 ns |
| point prepare, batched | edwards107 | group.prepare/edwards.107/mode=batch,n=1024 | 22.7 ns | 22.6 ns .. 22.8 ns |
| point prepare, batched | twisted128 | group.prepare/twisted.128/mode=batch,n=1024 | 8.08 ns | 8.06 ns .. 8.10 ns |
| point prepare, batched | weier127 | group.prepare/weier.127/mode=batch,n=1024 | 0.46 ns | 0.46 ns .. 0.47 ns |
| point prepare, batched | weier127-jacobian | group.prepare/weier-jacobian.127/mode=batch,n=1024 | 0.49 ns | 0.48 ns .. 0.50 ns |
| point prepare, batched | weier107 | group.prepare/weier.107/mode=batch,n=1024 | 0.49 ns | 0.48 ns .. 0.50 ns |
| point prepare, batched | weier107-jacobian | group.prepare/weier-jacobian.107/mode=batch,n=1024 | 0.48 ns | 0.48 ns .. 0.49 ns |
| point prepare, batched | edwards61x2 | group.prepare/edwards.61x2/mode=batch,n=1024 | 18.8 ns | 18.8 ns .. 18.9 ns |
| point prepare, batched | weier61x2 | group.prepare/weier.61x2/mode=batch,n=1024 | 0.72 ns | 0.66 ns .. 0.78 ns |
| point prepare, batched | weier61x2-jacobian | group.prepare/weier-jacobian.61x2/mode=batch,n=1024 | 0.54 ns | 0.52 ns .. 0.58 ns |
| point prepare, batched | twisted61x2 | group.prepare/twisted.61x2/mode=batch,n=1024 | 3.60 ns | 3.59 ns .. 3.60 ns |
| point prepare, batched | twisted64x2 | group.prepare/twisted.64x2/mode=batch,n=1024 | 5.51 ns | 5.49 ns .. 5.53 ns |
| point prepare, batched | twisted-goldilocks2 | group.prepare/twisted.goldilocks2/mode=batch,n=1024 | 4.51 ns | 4.48 ns .. 4.53 ns |
| is identity | gf2_127 | group.is_identity/binary.127 | 0.81 ns | 0.81 ns .. 0.81 ns |
| is identity | gf2_127-lambda | group.is_identity/binary-lambda.127 | 0.84 ns | 0.84 ns .. 0.84 ns |
| is identity | gf2_127-w | group.is_identity/binary-w.127 | 0.84 ns | 0.84 ns .. 0.84 ns |
| is identity | gf2_127-u | group.is_identity/binary-u.127 | 0.84 ns | 0.84 ns .. 0.84 ns |
| is identity | gf2_109 | group.is_identity/binary.109 | 0.64 ns | 0.63 ns .. 0.64 ns |
| is identity | gf2_109-lambda | group.is_identity/binary-lambda.109 | 0.56 ns | 0.55 ns .. 0.56 ns |
| is identity | gf2_109-w | group.is_identity/binary-w.109 | 0.56 ns | 0.56 ns .. 0.56 ns |
| is identity | gf2_109-u | group.is_identity/binary-u.109 | 0.56 ns | 0.55 ns .. 0.56 ns |
| is identity | gf2_122 | group.is_identity/binary.122 | 0.77 ns | 0.77 ns .. 0.78 ns |
| is identity | gf2_122-lambda | group.is_identity/binary-lambda.122 | 0.77 ns | 0.77 ns .. 0.78 ns |
| is identity | gf2_122-w | group.is_identity/binary-w.122 | 0.77 ns | 0.77 ns .. 0.78 ns |
| is identity | gf2_122-u | group.is_identity/binary-u.122 | 0.77 ns | 0.77 ns .. 0.78 ns |
| is identity | gf2_122-gls | group.is_identity/binary.122-gls | 0.77 ns | 0.77 ns .. 0.77 ns |
| is identity | gf2_122-gls-lambda | group.is_identity/binary-lambda.122-gls | 0.78 ns | 0.77 ns .. 0.78 ns |
| is identity | gf2_122-gls-w | group.is_identity/binary-w.122-gls | 0.78 ns | 0.77 ns .. 0.78 ns |
| is identity | gf2_122-gls-u | group.is_identity/binary-u.122-gls | 0.78 ns | 0.77 ns .. 0.78 ns |
| is identity | edwards127 | group.is_identity/edwards.127 | 0.38 ns | 0.38 ns .. 0.38 ns |
| is identity | edwards107 | group.is_identity/edwards.107 | 0.75 ns | 0.74 ns .. 0.75 ns |
| is identity | twisted128 | group.is_identity/twisted.128 | 0.34 ns | 0.34 ns .. 0.35 ns |
| is identity | weier127 | group.is_identity/weier.127 | 0.34 ns | 0.34 ns .. 0.34 ns |
| is identity | weier127-jacobian | group.is_identity/weier-jacobian.127 | 0.34 ns | 0.34 ns .. 0.34 ns |
| is identity | weier107 | group.is_identity/weier.107 | 0.84 ns | 0.84 ns .. 0.84 ns |
| is identity | weier107-jacobian | group.is_identity/weier-jacobian.107 | 0.84 ns | 0.84 ns .. 0.84 ns |
| is identity | edwards61x2 | group.is_identity/edwards.61x2 | 0.38 ns | 0.38 ns .. 0.38 ns |
| is identity | weier61x2 | group.is_identity/weier.61x2 | 0.52 ns | 0.52 ns .. 0.53 ns |
| is identity | weier61x2-jacobian | group.is_identity/weier-jacobian.61x2 | 0.52 ns | 0.52 ns .. 0.53 ns |
| is identity | twisted61x2 | group.is_identity/twisted.61x2 | 0.34 ns | 0.34 ns .. 0.35 ns |
| is identity | twisted64x2 | group.is_identity/twisted.64x2 | 0.34 ns | 0.34 ns .. 0.35 ns |
| is identity | twisted-goldilocks2 | group.is_identity/twisted.goldilocks2 | 0.52 ns | 0.52 ns .. 0.53 ns |
| equals addend, match | gf2_127 | group.equals/binary.127/mode=match | 2.98 ns | 2.97 ns .. 2.99 ns |
| equals addend, match | gf2_127-lambda | group.equals/binary-lambda.127/mode=match | 3.84 ns | 3.83 ns .. 3.85 ns |
| equals addend, match | gf2_127-w | group.equals/binary-w.127/mode=match | 3.86 ns | 3.84 ns .. 3.89 ns |
| equals addend, match | gf2_127-u | group.equals/binary-u.127/mode=match | 4.67 ns | 4.66 ns .. 4.68 ns |
| equals addend, match | gf2_109 | group.equals/binary.109/mode=match | 2.24 ns | 2.23 ns .. 2.26 ns |
| equals addend, match | gf2_109-lambda | group.equals/binary-lambda.109/mode=match | 1.60 ns | 1.60 ns .. 1.61 ns |
| equals addend, match | gf2_109-w | group.equals/binary-w.109/mode=match | 1.82 ns | 1.81 ns .. 1.82 ns |
| equals addend, match | gf2_109-u | group.equals/binary-u.109/mode=match | 3.46 ns | 3.46 ns .. 3.47 ns |
| equals addend, match | gf2_122-lambda | group.equals/binary-lambda.122/mode=match | 3.78 ns | 3.77 ns .. 3.79 ns |
| equals addend, match | gf2_122-w | group.equals/binary-w.122/mode=match | 3.77 ns | 3.77 ns .. 3.78 ns |
| equals addend, match | gf2_122-u | group.equals/binary-u.122/mode=match | 5.31 ns | 5.30 ns .. 5.32 ns |
| equals addend, match | gf2_122-gls-lambda | group.equals/binary-lambda.122-gls/mode=match | 3.79 ns | 3.78 ns .. 3.80 ns |
| equals addend, match | gf2_122-gls-w | group.equals/binary-w.122-gls/mode=match | 3.79 ns | 3.78 ns .. 3.80 ns |
| equals addend, match | gf2_122-gls-u | group.equals/binary-u.122-gls/mode=match | 5.32 ns | 5.30 ns .. 5.33 ns |
| equals addend, match | twisted61x2 | group.equals/twisted.61x2/mode=match | 3.32 ns | 3.31 ns .. 3.33 ns |
| equals addend, mismatch | gf2_127 | group.equals/binary.127/mode=mismatch | 2.87 ns | 2.87 ns .. 2.88 ns |
| equals addend, mismatch | gf2_127-lambda | group.equals/binary-lambda.127/mode=mismatch | 3.81 ns | 3.79 ns .. 3.82 ns |
| equals addend, mismatch | gf2_127-w | group.equals/binary-w.127/mode=mismatch | 3.84 ns | 3.83 ns .. 3.84 ns |
| equals addend, mismatch | gf2_127-u | group.equals/binary-u.127/mode=mismatch | 4.68 ns | 4.68 ns .. 4.69 ns |
| equals addend, mismatch | gf2_109 | group.equals/binary.109/mode=mismatch | 2.28 ns | 2.28 ns .. 2.29 ns |
| equals addend, mismatch | gf2_109-lambda | group.equals/binary-lambda.109/mode=mismatch | 1.60 ns | 1.60 ns .. 1.60 ns |
| equals addend, mismatch | gf2_109-w | group.equals/binary-w.109/mode=mismatch | 1.82 ns | 1.82 ns .. 1.82 ns |
| equals addend, mismatch | gf2_109-u | group.equals/binary-u.109/mode=mismatch | 3.50 ns | 3.48 ns .. 3.53 ns |
| equals addend, mismatch | gf2_122 | group.equals/binary.122/mode=mismatch | 3.75 ns | 3.73 ns .. 3.76 ns |
| equals addend, mismatch | gf2_122-lambda | group.equals/binary-lambda.122/mode=mismatch | 3.79 ns | 3.79 ns .. 3.80 ns |
| equals addend, mismatch | gf2_122-w | group.equals/binary-w.122/mode=mismatch | 3.79 ns | 3.78 ns .. 3.79 ns |
| equals addend, mismatch | gf2_122-u | group.equals/binary-u.122/mode=mismatch | 5.34 ns | 5.32 ns .. 5.36 ns |
| equals addend, mismatch | gf2_122-gls | group.equals/binary.122-gls/mode=mismatch | 3.79 ns | 3.78 ns .. 3.79 ns |
| equals addend, mismatch | gf2_122-gls-lambda | group.equals/binary-lambda.122-gls/mode=mismatch | 3.79 ns | 3.79 ns .. 3.80 ns |
| equals addend, mismatch | gf2_122-gls-w | group.equals/binary-w.122-gls/mode=mismatch | 3.79 ns | 3.78 ns .. 3.79 ns |
| equals addend, mismatch | gf2_122-gls-u | group.equals/binary-u.122-gls/mode=mismatch | 5.31 ns | 5.30 ns .. 5.32 ns |
| equals addend, mismatch | edwards127 | group.equals/edwards.127/mode=mismatch | 1.97 ns | 1.97 ns .. 1.98 ns |
| equals addend, mismatch | edwards107 | group.equals/edwards.107/mode=mismatch | 3.05 ns | 3.04 ns .. 3.06 ns |
| equals addend, mismatch | twisted128 | group.equals/twisted.128/mode=mismatch | 7.51 ns | 7.49 ns .. 7.53 ns |
| equals addend, mismatch | weier127 | group.equals/weier.127/mode=mismatch | 2.05 ns | 2.04 ns .. 2.06 ns |
| equals addend, mismatch | weier127-jacobian | group.equals/weier-jacobian.127/mode=mismatch | 4.53 ns | 4.52 ns .. 4.54 ns |
| equals addend, mismatch | weier107 | group.equals/weier.107/mode=mismatch | 3.63 ns | 3.62 ns .. 3.64 ns |
| equals addend, mismatch | weier107-jacobian | group.equals/weier-jacobian.107/mode=mismatch | 5.96 ns | 5.95 ns .. 5.98 ns |
| equals addend, mismatch | edwards61x2 | group.equals/edwards.61x2/mode=mismatch | 1.65 ns | 1.64 ns .. 1.66 ns |
| equals addend, mismatch | weier61x2 | group.equals/weier.61x2/mode=mismatch | 1.70 ns | 1.69 ns .. 1.71 ns |
| equals addend, mismatch | weier61x2-jacobian | group.equals/weier-jacobian.61x2/mode=mismatch | 3.59 ns | 3.57 ns .. 3.62 ns |
| equals addend, mismatch | twisted61x2 | group.equals/twisted.61x2/mode=mismatch | 3.32 ns | 3.31 ns .. 3.32 ns |
| equals addend, mismatch | twisted64x2 | group.equals/twisted.64x2/mode=mismatch | 5.39 ns | 5.37 ns .. 5.40 ns |
| equals addend, mismatch | twisted-goldilocks2 | group.equals/twisted.goldilocks2/mode=mismatch | 4.92 ns | 4.89 ns .. 4.95 ns |
| encode, one at a time | gf2_127 | group.encode/binary.127/mode=indep | 371 ns | 370 ns .. 372 ns |
| encode, one at a time | gf2_127-lambda | group.encode/binary-lambda.127/mode=indep | 361 ns | 360 ns .. 362 ns |
| encode, one at a time | gf2_127-w | group.encode/binary-w.127/mode=indep | 361 ns | 360 ns .. 361 ns |
| encode, one at a time | gf2_127-u | group.encode/binary-u.127/mode=indep | 355 ns | 354 ns .. 355 ns |
| encode, one at a time | gf2_109 | group.encode/binary.109/mode=indep | 381 ns | 381 ns .. 382 ns |
| encode, one at a time | gf2_109-lambda | group.encode/binary-lambda.109/mode=indep | 366 ns | 364 ns .. 368 ns |
| encode, one at a time | gf2_109-w | group.encode/binary-w.109/mode=indep | 359 ns | 357 ns .. 361 ns |
| encode, one at a time | gf2_109-u | group.encode/binary-u.109/mode=indep | 397 ns | 394 ns .. 401 ns |
| encode, one at a time | gf2_122 | group.encode/binary.122/mode=indep | 211 ns | 210 ns .. 212 ns |
| encode, one at a time | gf2_122-lambda | group.encode/binary-lambda.122/mode=indep | 189 ns | 189 ns .. 189 ns |
| encode, one at a time | gf2_122-w | group.encode/binary-w.122/mode=indep | 204 ns | 204 ns .. 205 ns |
| encode, one at a time | gf2_122-u | group.encode/binary-u.122/mode=indep | 206 ns | 206 ns .. 207 ns |
| encode, one at a time | gf2_122-gls | group.encode/binary.122-gls/mode=indep | 209 ns | 208 ns .. 209 ns |
| encode, one at a time | gf2_122-gls-lambda | group.encode/binary-lambda.122-gls/mode=indep | 189 ns | 189 ns .. 190 ns |
| encode, one at a time | gf2_122-gls-w | group.encode/binary-w.122-gls/mode=indep | 204 ns | 204 ns .. 205 ns |
| encode, one at a time | gf2_122-gls-u | group.encode/binary-u.122-gls/mode=indep | 195 ns | 195 ns .. 196 ns |
| encode, one at a time | edwards127 | group.encode/edwards.127/mode=indep | 549 ns | 548 ns .. 551 ns |
| encode, one at a time | edwards107 | group.encode/edwards.107/mode=indep | 506 ns | 505 ns .. 507 ns |
| encode, one at a time | twisted128 | group.encode/twisted.128/mode=indep | 939 ns | 937 ns .. 941 ns |
| encode, one at a time | weier127 | group.encode/weier.127/mode=indep | 536 ns | 534 ns .. 537 ns |
| encode, one at a time | weier127-jacobian | group.encode/weier-jacobian.127/mode=indep | 533 ns | 530 ns .. 536 ns |
| encode, one at a time | weier107 | group.encode/weier.107/mode=indep | 497 ns | 496 ns .. 498 ns |
| encode, one at a time | weier107-jacobian | group.encode/weier-jacobian.107/mode=indep | 502 ns | 501 ns .. 503 ns |
| encode, one at a time | edwards61x2 | group.encode/edwards.61x2/mode=indep | 181 ns | 180 ns .. 181 ns |
| encode, one at a time | weier61x2 | group.encode/weier.61x2/mode=indep | 170 ns | 169 ns .. 170 ns |
| encode, one at a time | weier61x2-jacobian | group.encode/weier-jacobian.61x2/mode=indep | 179 ns | 179 ns .. 180 ns |
| encode, one at a time | twisted61x2 | group.encode/twisted.61x2/mode=indep | 179 ns | 178 ns .. 179 ns |
| encode, one at a time | twisted64x2 | group.encode/twisted.64x2/mode=indep | 290 ns | 290 ns .. 291 ns |
| encode, one at a time | twisted-goldilocks2 | group.encode/twisted.goldilocks2/mode=indep | 197 ns | 194 ns .. 201 ns |
| encode, batched | gf2_127 | group.encode/binary.127/mode=batch,n=1024 | 13.1 ns | 13.0 ns .. 13.2 ns |
| encode, batched | gf2_127-lambda | group.encode/binary-lambda.127/mode=batch,n=1024 | 10.1 ns | 10.1 ns .. 10.2 ns |
| encode, batched | gf2_127-w | group.encode/binary-w.127/mode=batch,n=1024 | 10.3 ns | 10.3 ns .. 10.3 ns |
| encode, batched | gf2_127-u | group.encode/binary-u.127/mode=batch,n=1024 | 9.17 ns | 9.15 ns .. 9.20 ns |
| encode, batched | gf2_109 | group.encode/binary.109/mode=batch,n=1024 | 10.9 ns | 10.9 ns .. 11.0 ns |
| encode, batched | gf2_109-lambda | group.encode/binary-lambda.109/mode=batch,n=1024 | 8.13 ns | 8.12 ns .. 8.15 ns |
| encode, batched | gf2_109-w | group.encode/binary-w.109/mode=batch,n=1024 | 10.4 ns | 10.3 ns .. 10.4 ns |
| encode, batched | gf2_109-u | group.encode/binary-u.109/mode=batch,n=1024 | 9.88 ns | 9.84 ns .. 9.92 ns |
| encode, batched | gf2_122 | group.encode/binary.122/mode=batch,n=1024 | 15.7 ns | 15.6 ns .. 15.7 ns |
| encode, batched | gf2_122-lambda | group.encode/binary-lambda.122/mode=batch,n=1024 | 11.9 ns | 11.9 ns .. 11.9 ns |
| encode, batched | gf2_122-w | group.encode/binary-w.122/mode=batch,n=1024 | 14.4 ns | 14.4 ns .. 14.5 ns |
| encode, batched | gf2_122-u | group.encode/binary-u.122/mode=batch,n=1024 | 12.1 ns | 12.0 ns .. 12.1 ns |
| encode, batched | gf2_122-gls | group.encode/binary.122-gls/mode=batch,n=1024 | 15.2 ns | 15.2 ns .. 15.2 ns |
| encode, batched | gf2_122-gls-lambda | group.encode/binary-lambda.122-gls/mode=batch,n=1024 | 11.6 ns | 11.6 ns .. 11.6 ns |
| encode, batched | gf2_122-gls-w | group.encode/binary-w.122-gls/mode=batch,n=1024 | 14.4 ns | 14.4 ns .. 14.5 ns |
| encode, batched | gf2_122-gls-u | group.encode/binary-u.122-gls/mode=batch,n=1024 | 12.3 ns | 12.3 ns .. 12.3 ns |
| encode, batched | edwards127 | group.encode/edwards.127/mode=batch,n=1024 | 22.0 ns | 21.9 ns .. 22.0 ns |
| encode, batched | edwards107 | group.encode/edwards.107/mode=batch,n=1024 | 20.3 ns | 20.2 ns .. 20.3 ns |
| encode, batched | twisted128 | group.encode/twisted.128/mode=batch,n=1024 | 16.0 ns | 16.0 ns .. 16.0 ns |
| encode, batched | weier127 | group.encode/weier.127/mode=batch,n=1024 | 10.1 ns | 10.1 ns .. 10.1 ns |
| encode, batched | weier127-jacobian | group.encode/weier-jacobian.127/mode=batch,n=1024 | 15.7 ns | 15.7 ns .. 15.7 ns |
| encode, batched | weier107 | group.encode/weier.107/mode=batch,n=1024 | 11.5 ns | 11.5 ns .. 11.5 ns |
| encode, batched | weier107-jacobian | group.encode/weier-jacobian.107/mode=batch,n=1024 | 15.3 ns | 15.3 ns .. 15.3 ns |
| encode, batched | edwards61x2 | group.encode/edwards.61x2/mode=batch,n=1024 | 16.2 ns | 16.2 ns .. 16.3 ns |
| encode, batched | weier61x2 | group.encode/weier.61x2/mode=batch,n=1024 | 8.11 ns | 8.09 ns .. 8.12 ns |
| encode, batched | weier61x2-jacobian | group.encode/weier-jacobian.61x2/mode=batch,n=1024 | 11.7 ns | 11.7 ns .. 11.7 ns |
| encode, batched | twisted61x2 | group.encode/twisted.61x2/mode=batch,n=1024 | 8.07 ns | 8.05 ns .. 8.09 ns |
| encode, batched | twisted64x2 | group.encode/twisted.64x2/mode=batch,n=1024 | 10.3 ns | 10.3 ns .. 10.4 ns |
| encode, batched | twisted-goldilocks2 | group.encode/twisted.goldilocks2/mode=batch,n=1024 | 11.3 ns | 11.2 ns .. 11.3 ns |
| decode, one at a time | gf2_127 | group.decode/binary.127/mode=indep | 367 ns | 366 ns .. 368 ns |
| decode, one at a time | gf2_127-lambda | group.decode/binary-lambda.127/mode=indep | 364 ns | 364 ns .. 365 ns |
| decode, one at a time | gf2_127-w | group.decode/binary-w.127/mode=indep | 361 ns | 361 ns .. 362 ns |
| decode, one at a time | gf2_127-u | group.decode/binary-u.127/mode=indep | 376 ns | 375 ns .. 377 ns |
| decode, one at a time | gf2_109 | group.decode/binary.109/mode=indep | 380 ns | 379 ns .. 381 ns |
| decode, one at a time | gf2_109-lambda | group.decode/binary-lambda.109/mode=indep | 381 ns | 381 ns .. 382 ns |
| decode, one at a time | gf2_109-w | group.decode/binary-w.109/mode=indep | 378 ns | 377 ns .. 379 ns |
| decode, one at a time | gf2_109-u | group.decode/binary-u.109/mode=indep | 398 ns | 397 ns .. 400 ns |
| decode, one at a time | gf2_122 | group.decode/binary.122/mode=indep | 197 ns | 196 ns .. 197 ns |
| decode, one at a time | gf2_122-lambda | group.decode/binary-lambda.122/mode=indep | 196 ns | 195 ns .. 196 ns |
| decode, one at a time | gf2_122-w | group.decode/binary-w.122/mode=indep | 193 ns | 192 ns .. 193 ns |
| decode, one at a time | gf2_122-u | group.decode/binary-u.122/mode=indep | 223 ns | 222 ns .. 223 ns |
| decode, one at a time | gf2_122-gls | group.decode/binary.122-gls/mode=indep | 195 ns | 194 ns .. 195 ns |
| decode, one at a time | gf2_122-gls-lambda | group.decode/binary-lambda.122-gls/mode=indep | 187 ns | 187 ns .. 188 ns |
| decode, one at a time | gf2_122-gls-w | group.decode/binary-w.122-gls/mode=indep | 191 ns | 191 ns .. 191 ns |
| decode, one at a time | gf2_122-gls-u | group.decode/binary-u.122-gls/mode=indep | 207 ns | 206 ns .. 207 ns |
| decode, one at a time | edwards127 | group.decode/edwards.127/mode=indep | 489 ns | 488 ns .. 490 ns |
| decode, one at a time | edwards107 | group.decode/edwards.107/mode=indep | 359 ns | 359 ns .. 360 ns |
| decode, one at a time | twisted128 | group.decode/twisted.128/mode=indep | 949 ns | 946 ns .. 953 ns |
| decode, one at a time | weier127 | group.decode/weier.127/mode=indep | 489 ns | 487 ns .. 490 ns |
| decode, one at a time | weier127-jacobian | group.decode/weier-jacobian.127/mode=indep | 492 ns | 490 ns .. 493 ns |
| decode, one at a time | weier107 | group.decode/weier.107/mode=indep | 358 ns | 357 ns .. 358 ns |
| decode, one at a time | weier107-jacobian | group.decode/weier-jacobian.107/mode=indep | 351 ns | 350 ns .. 352 ns |
| decode, one at a time | edwards61x2 | group.decode/edwards.61x2/mode=indep | 405 ns | 404 ns .. 406 ns |
| decode, one at a time | weier61x2 | group.decode/weier.61x2/mode=indep | 416 ns | 416 ns .. 417 ns |
| decode, one at a time | weier61x2-jacobian | group.decode/weier-jacobian.61x2/mode=indep | 417 ns | 415 ns .. 418 ns |
| decode, one at a time | twisted61x2 | group.decode/twisted.61x2/mode=indep | 425 ns | 425 ns .. 426 ns |
| decode, one at a time | twisted64x2 | group.decode/twisted.64x2/mode=indep | 721 ns | 719 ns .. 722 ns |
| decode, one at a time | twisted-goldilocks2 | group.decode/twisted.goldilocks2/mode=indep | 1.53 µs | 1.53 µs .. 1.54 µs |
| decode, batched | gf2_127 | group.decode/binary.127/mode=batch,n=1024 | 14.0 ns | 14.0 ns .. 14.0 ns |
| decode, batched | gf2_127-lambda | group.decode/binary-lambda.127/mode=batch,n=1024 | 14.0 ns | 14.0 ns .. 14.0 ns |
| decode, batched | gf2_127-w | group.decode/binary-w.127/mode=batch,n=1024 | 15.1 ns | 15.1 ns .. 15.1 ns |
| decode, batched | gf2_127-u | group.decode/binary-u.127/mode=batch,n=1024 | 18.3 ns | 18.3 ns .. 18.4 ns |
| decode, batched | gf2_109 | group.decode/binary.109/mode=batch,n=1024 | 14.2 ns | 14.2 ns .. 14.2 ns |
| decode, batched | gf2_109-lambda | group.decode/binary-lambda.109/mode=batch,n=1024 | 14.1 ns | 14.1 ns .. 14.2 ns |
| decode, batched | gf2_109-w | group.decode/binary-w.109/mode=batch,n=1024 | 15.5 ns | 15.4 ns .. 15.5 ns |
| decode, batched | gf2_109-u | group.decode/binary-u.109/mode=batch,n=1024 | 18.4 ns | 18.4 ns .. 18.4 ns |
| decode, batched | gf2_122 | group.decode/binary.122/mode=batch,n=1024 | 13.5 ns | 13.5 ns .. 13.5 ns |
| decode, batched | gf2_122-lambda | group.decode/binary-lambda.122/mode=batch,n=1024 | 13.5 ns | 13.5 ns .. 13.5 ns |
| decode, batched | gf2_122-w | group.decode/binary-w.122/mode=batch,n=1024 | 14.4 ns | 14.4 ns .. 14.5 ns |
| decode, batched | gf2_122-u | group.decode/binary-u.122/mode=batch,n=1024 | 18.7 ns | 18.7 ns .. 18.8 ns |
| decode, batched | gf2_122-gls | group.decode/binary.122-gls/mode=batch,n=1024 | 13.2 ns | 13.2 ns .. 13.2 ns |
| decode, batched | gf2_122-gls-lambda | group.decode/binary-lambda.122-gls/mode=batch,n=1024 | 13.2 ns | 13.2 ns .. 13.2 ns |
| decode, batched | gf2_122-gls-w | group.decode/binary-w.122-gls/mode=batch,n=1024 | 14.3 ns | 14.3 ns .. 14.3 ns |
| decode, batched | gf2_122-gls-u | group.decode/binary-u.122-gls/mode=batch,n=1024 | 16.8 ns | 16.8 ns .. 16.8 ns |
| decode, batched | edwards127 | group.decode/edwards.127/mode=batch,n=1024 | 486 ns | 484 ns .. 488 ns |
| decode, batched | edwards107 | group.decode/edwards.107/mode=batch,n=1024 | 354 ns | 353 ns .. 355 ns |
| decode, batched | twisted128 | group.decode/twisted.128/mode=batch,n=1024 | 952 ns | 948 ns .. 956 ns |
| decode, batched | weier127 | group.decode/weier.127/mode=batch,n=1024 | 485 ns | 483 ns .. 487 ns |
| decode, batched | weier127-jacobian | group.decode/weier-jacobian.127/mode=batch,n=1024 | 485 ns | 484 ns .. 487 ns |
| decode, batched | weier107 | group.decode/weier.107/mode=batch,n=1024 | 352 ns | 351 ns .. 353 ns |
| decode, batched | weier107-jacobian | group.decode/weier-jacobian.107/mode=batch,n=1024 | 352 ns | 351 ns .. 352 ns |
| decode, batched | edwards61x2 | group.decode/edwards.61x2/mode=batch,n=1024 | 404 ns | 403 ns .. 405 ns |
| decode, batched | weier61x2 | group.decode/weier.61x2/mode=batch,n=1024 | 412 ns | 411 ns .. 413 ns |
| decode, batched | weier61x2-jacobian | group.decode/weier-jacobian.61x2/mode=batch,n=1024 | 413 ns | 412 ns .. 414 ns |
| decode, batched | twisted61x2 | group.decode/twisted.61x2/mode=batch,n=1024 | 420 ns | 419 ns .. 421 ns |
| decode, batched | twisted64x2 | group.decode/twisted.64x2/mode=batch,n=1024 | 718 ns | 717 ns .. 720 ns |
| decode, batched | twisted-goldilocks2 | group.decode/twisted.goldilocks2/mode=batch,n=1024 | 1.52 µs | 1.51 µs .. 1.52 µs |
| hash to curve, one at a time | xor | hash_to_curve/sha256 (XOR baseline) | 24.2 ns | 23.9 ns .. 24.6 ns |
| hash to curve, one at a time | gf2_127 | hash_to_curve/gf2_127/pornin map x1 | 485 ns | 485 ns .. 486 ns |
| hash to curve, one at a time | gf2_127-lambda | h2c/binary-lambda.127/mode=indep | 806 ns | 804 ns .. 808 ns |
| hash to curve, one at a time | gf2_127-w | h2c/binary-w.127/mode=indep | 865 ns | 863 ns .. 866 ns |
| hash to curve, one at a time | gf2_127-u | h2c/binary-u.127/mode=indep | 869 ns | 865 ns .. 874 ns |
| hash to curve, one at a time | gf2_109 | hash_to_curve/gf2_109/pornin map x1 | 560 ns | 559 ns .. 561 ns |
| hash to curve, one at a time | gf2_109-lambda | h2c/binary-lambda.109/mode=indep | 873 ns | 871 ns .. 875 ns |
| hash to curve, one at a time | gf2_109-w | h2c/binary-w.109/mode=indep | 855 ns | 854 ns .. 857 ns |
| hash to curve, one at a time | gf2_109-u | h2c/binary-u.109/mode=indep | 874 ns | 872 ns .. 875 ns |
| hash to curve, one at a time | gf2_122 | hash_to_curve/gf2_122/pornin map x1 | 373 ns | 373 ns .. 373 ns |
| hash to curve, one at a time | gf2_122-lambda | h2c/binary-lambda.122/mode=indep | 509 ns | 507 ns .. 510 ns |
| hash to curve, one at a time | gf2_122-w | h2c/binary-w.122/mode=indep | 517 ns | 516 ns .. 518 ns |
| hash to curve, one at a time | gf2_122-u | h2c/binary-u.122/mode=indep | 531 ns | 530 ns .. 532 ns |
| hash to curve, one at a time | gf2_122-gls | hash_to_curve/gf2_122-gls/pornin map x1 | 369 ns | 367 ns .. 370 ns |
| hash to curve, one at a time | gf2_122-gls-lambda | h2c/binary-lambda.122-gls/mode=indep | 515 ns | 513 ns .. 517 ns |
| hash to curve, one at a time | gf2_122-gls-w | h2c/binary-w.122-gls/mode=indep | 509 ns | 507 ns .. 511 ns |
| hash to curve, one at a time | gf2_122-gls-u | h2c/binary-u.122-gls/mode=indep | 522 ns | 521 ns .. 524 ns |
| hash to curve, one at a time | edwards127 | h2c/edwards.127/mode=indep | 1.07 µs | 1.06 µs .. 1.07 µs |
| hash to curve, one at a time | edwards107 | h2c/edwards.107/mode=indep | 806 ns | 802 ns .. 809 ns |
| hash to curve, one at a time | twisted128 | h2c/twisted.128/mode=indep | 1.92 µs | 1.92 µs .. 1.93 µs |
| hash to curve, one at a time | weier127 | h2c/weier.127/mode=indep | 1.03 µs | 1.02 µs .. 1.03 µs |
| hash to curve, one at a time | weier127-jacobian | h2c/weier-jacobian.127/mode=indep | 1.03 µs | 1.03 µs .. 1.03 µs |
| hash to curve, one at a time | weier107 | h2c/weier.107/mode=indep | 746 ns | 744 ns .. 747 ns |
| hash to curve, one at a time | weier107-jacobian | h2c/weier-jacobian.107/mode=indep | 742 ns | 741 ns .. 744 ns |
| hash to curve, one at a time | edwards61x2 | h2c/edwards.61x2/mode=indep | 624 ns | 622 ns .. 626 ns |
| hash to curve, one at a time | weier61x2 | h2c/weier.61x2/mode=indep | 637 ns | 635 ns .. 639 ns |
| hash to curve, one at a time | weier61x2-jacobian | h2c/weier-jacobian.61x2/mode=indep | 638 ns | 637 ns .. 640 ns |
| hash to curve, one at a time | twisted61x2 | h2c/twisted.61x2/mode=indep | 630 ns | 629 ns .. 631 ns |
| hash to curve, one at a time | twisted64x2 | h2c/twisted.64x2/mode=indep | 1.10 µs | 1.10 µs .. 1.10 µs |
| hash to curve, one at a time | twisted-goldilocks2 | h2c/twisted.goldilocks2/mode=indep | 1.73 µs | 1.72 µs .. 1.74 µs |
| hash to curve, one at a time | ristretto255 | hash_to_curve/ristretto255/hash_from_bytes<Sha512> | 4.72 µs | 4.70 µs .. 4.73 µs |
| hash to curve, one at a time | secp256k1 | hash_to_curve/secp256k1/try-and-increment (parse) | 4.49 µs | 4.48 µs .. 4.49 µs |
| hash to curve, batched | gf2_127 | hash_to_curve/gf2_127/pornin map x1, batched | 61.5 ns | 61.4 ns .. 61.5 ns |
| hash to curve, batched | gf2_127-lambda | h2c/binary-lambda.127/mode=batch,n=1024 | 75.6 ns | 75.5 ns .. 75.7 ns |
| hash to curve, batched | gf2_127-w | h2c/binary-w.127/mode=batch,n=1024 | 83.3 ns | 83.2 ns .. 83.4 ns |
| hash to curve, batched | gf2_127-u | h2c/binary-u.127/mode=batch,n=1024 | 85.8 ns | 85.5 ns .. 86.1 ns |
| hash to curve, batched | gf2_109 | hash_to_curve/gf2_109/pornin map x1, batched | 63.7 ns | 63.7 ns .. 63.8 ns |
| hash to curve, batched | gf2_109-lambda | h2c/binary-lambda.109/mode=batch,n=1024 | 82.0 ns | 81.9 ns .. 82.1 ns |
| hash to curve, batched | gf2_109-w | h2c/binary-w.109/mode=batch,n=1024 | 79.4 ns | 79.3 ns .. 79.5 ns |
| hash to curve, batched | gf2_109-u | h2c/binary-u.109/mode=batch,n=1024 | 81.2 ns | 81.1 ns .. 81.4 ns |
| hash to curve, batched | gf2_122 | hash_to_curve/gf2_122/pornin map x1, batched | 62.8 ns | 62.8 ns .. 62.8 ns |
| hash to curve, batched | gf2_122-lambda | h2c/binary-lambda.122/mode=batch,n=1024 | 74.9 ns | 74.8 ns .. 75.1 ns |
| hash to curve, batched | gf2_122-w | h2c/binary-w.122/mode=batch,n=1024 | 76.8 ns | 76.6 ns .. 76.9 ns |
| hash to curve, batched | gf2_122-u | h2c/binary-u.122/mode=batch,n=1024 | 87.6 ns | 87.5 ns .. 87.7 ns |
| hash to curve, batched | gf2_122-gls | hash_to_curve/gf2_122-gls/pornin map x1, batched | 62.0 ns | 61.9 ns .. 62.0 ns |
| hash to curve, batched | gf2_122-gls-lambda | h2c/binary-lambda.122-gls/mode=batch,n=1024 | 76.5 ns | 76.3 ns .. 76.6 ns |
| hash to curve, batched | gf2_122-gls-w | h2c/binary-w.122-gls/mode=batch,n=1024 | 78.6 ns | 78.5 ns .. 78.8 ns |
| hash to curve, batched | gf2_122-gls-u | h2c/binary-u.122-gls/mode=batch,n=1024 | 80.2 ns | 80.1 ns .. 80.3 ns |
| hash to curve, batched | edwards127 | h2c/edwards.127/mode=batch,n=1024 | 1.07 µs | 1.07 µs .. 1.07 µs |
| hash to curve, batched | edwards107 | h2c/edwards.107/mode=batch,n=1024 | 805 ns | 801 ns .. 810 ns |
| hash to curve, batched | twisted128 | h2c/twisted.128/mode=batch,n=1024 | 1.92 µs | 1.92 µs .. 1.93 µs |
| hash to curve, batched | weier127 | h2c/weier.127/mode=batch,n=1024 | 1.04 µs | 1.03 µs .. 1.04 µs |
| hash to curve, batched | weier127-jacobian | h2c/weier-jacobian.127/mode=batch,n=1024 | 1.04 µs | 1.04 µs .. 1.04 µs |
| hash to curve, batched | weier107 | h2c/weier.107/mode=batch,n=1024 | 748 ns | 747 ns .. 750 ns |
| hash to curve, batched | weier107-jacobian | h2c/weier-jacobian.107/mode=batch,n=1024 | 745 ns | 743 ns .. 748 ns |
| hash to curve, batched | edwards61x2 | h2c/edwards.61x2/mode=batch,n=1024 | 620 ns | 617 ns .. 623 ns |
| hash to curve, batched | weier61x2 | h2c/weier.61x2/mode=batch,n=1024 | 637 ns | 635 ns .. 638 ns |
| hash to curve, batched | weier61x2-jacobian | h2c/weier-jacobian.61x2/mode=batch,n=1024 | 638 ns | 636 ns .. 639 ns |
| hash to curve, batched | twisted61x2 | h2c/twisted.61x2/mode=batch,n=1024 | 632 ns | 630 ns .. 634 ns |
| hash to curve, batched | twisted64x2 | h2c/twisted.64x2/mode=batch,n=1024 | 1.10 µs | 1.10 µs .. 1.10 µs |
| hash to curve, batched | twisted-goldilocks2 | h2c/twisted.goldilocks2/mode=batch,n=1024 | 1.75 µs | 1.74 µs .. 1.76 µs |
| hash to addend, one at a time | gf2_127-lambda | hash_to_curve/gf2_127-lambda/pornin map x1 to (x, λ) | 456 ns | 455 ns .. 457 ns |
| hash to addend, one at a time | gf2_127-w | hash_to_curve/gf2_127-w/pornin map x1 to (x, λ) | 455 ns | 454 ns .. 456 ns |
| hash to addend, one at a time | gf2_127-u | hash_to_curve/gf2_127-u/pornin map x1 to (u, v) | 461 ns | 460 ns .. 462 ns |
| hash to addend, one at a time | gf2_109-lambda | hash_to_curve/gf2_109-lambda/pornin map x1 to (x, λ) | 550 ns | 548 ns .. 553 ns |
| hash to addend, one at a time | gf2_109-w | hash_to_curve/gf2_109-w/pornin map x1 to (x, λ) | 535 ns | 534 ns .. 535 ns |
| hash to addend, one at a time | gf2_109-u | hash_to_curve/gf2_109-u/pornin map x1 to (u, v) | 533 ns | 532 ns .. 533 ns |
| hash to addend, one at a time | gf2_122-lambda | hash_to_curve/gf2_122-lambda/pornin map x1 to (x, λ) | 326 ns | 326 ns .. 327 ns |
| hash to addend, one at a time | gf2_122-w | hash_to_curve/gf2_122-w/pornin map x1 to (x, λ) | 326 ns | 326 ns .. 327 ns |
| hash to addend, one at a time | gf2_122-u | hash_to_curve/gf2_122-u/pornin map x1 to (u, v) | 326 ns | 325 ns .. 326 ns |
| hash to addend, one at a time | gf2_122-gls-lambda | hash_to_curve/gf2_122-gls-lambda/pornin map x1 to (x, λ) | 315 ns | 314 ns .. 316 ns |
| hash to addend, one at a time | gf2_122-gls-w | hash_to_curve/gf2_122-gls-w/pornin map x1 to (x, λ) | 316 ns | 315 ns .. 317 ns |
| hash to addend, one at a time | gf2_122-gls-u | hash_to_curve/gf2_122-gls-u/pornin map x1 to (u, v) | 319 ns | 318 ns .. 320 ns |
| hash to addend, batched | gf2_127-lambda | hash_to_curve/gf2_127-lambda/pornin map x1 to (x, λ), batched | 53.5 ns | 53.4 ns .. 53.6 ns |
| hash to addend, batched | gf2_127-w | hash_to_curve/gf2_127-w/pornin map x1 to (x, λ), batched | 53.5 ns | 53.4 ns .. 53.6 ns |
| hash to addend, batched | gf2_127-u | hash_to_curve/gf2_127-u/pornin map x1 to (u, v), batched | 57.2 ns | 57.2 ns .. 57.3 ns |
| hash to addend, batched | gf2_109-lambda | hash_to_curve/gf2_109-lambda/pornin map x1 to (x, λ), batched | 55.2 ns | 55.0 ns .. 55.5 ns |
| hash to addend, batched | gf2_109-w | hash_to_curve/gf2_109-w/pornin map x1 to (x, λ), batched | 54.5 ns | 54.5 ns .. 54.5 ns |
| hash to addend, batched | gf2_109-u | hash_to_curve/gf2_109-u/pornin map x1 to (u, v), batched | 60.7 ns | 60.3 ns .. 61.0 ns |
| hash to addend, batched | gf2_122-lambda | hash_to_curve/gf2_122-lambda/pornin map x1 to (x, λ), batched | 53.9 ns | 53.9 ns .. 54.0 ns |
| hash to addend, batched | gf2_122-w | hash_to_curve/gf2_122-w/pornin map x1 to (x, λ), batched | 54.0 ns | 53.9 ns .. 54.0 ns |
| hash to addend, batched | gf2_122-u | hash_to_curve/gf2_122-u/pornin map x1 to (u, v), batched | 57.1 ns | 57.0 ns .. 57.1 ns |
| hash to addend, batched | gf2_122-gls-lambda | hash_to_curve/gf2_122-gls-lambda/pornin map x1 to (x, λ), batched | 55.4 ns | 55.4 ns .. 55.5 ns |
| hash to addend, batched | gf2_122-gls-w | hash_to_curve/gf2_122-gls-w/pornin map x1 to (x, λ), batched | 55.4 ns | 55.4 ns .. 55.4 ns |
| hash to addend, batched | gf2_122-gls-u | hash_to_curve/gf2_122-gls-u/pornin map x1 to (u, v), batched | 55.7 ns | 55.7 ns .. 55.8 ns |
Coverage
Benchmarks per hot-path operation and family; an empty cell was not measured.
| curve | hash to curve | prepare | add | subtract | negate | is identity | equals addend | encode | decode | RIBLT | ||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| encode | cells | peel | ||||||||||
| baseline | ||||||||||||
| xorSHA-256 digests XORed: no group, 32 bytes | 1 | 2 | 5 | 1 | 1 | |||||||
| xor-siphashSipHash-2-4 hashes XORed: no group, 8 bytes | 10 | 1 | 1 | |||||||||
| GF(2^127), 16 bytes | ||||||||||||
| gf2_127(X:S:Z:T) extended accumulators, Pornin's formulas | 4 | 4 | 3 | 1 | 2 | 1 | 2 | 4 | 4 | 11 | 3 | 6 |
| gf2_127-lambdaincompleteλ-projective (X:L:Z) accumulators | 4 | 4 | 2 | 1 | 1 | 1 | 2 | 4 | 4 | 6 | 3 | 6 |
| gf2_127-wincompleteλ-projective, w codec: hashes and decodes to λ-affine | 4 | 4 | 2 | 1 | 1 | 1 | 2 | 4 | 4 | 6 | 3 | 6 |
| gf2_127-uunscaled (X:S:Z), w codec, direct addend hashes | 4 | 4 | 2 | 1 | 1 | 1 | 2 | 4 | 4 | 8 | 5 | 23 |
| GF(2^122) = GF(2^61)[u], dense constant, 16 bytes | ||||||||||||
| gf2_122(X:S:Z:T) extended | 2 | 2 | 3 | 2 | 1 | 1 | 2 | 2 | 3 | 3 | 3 | |
| gf2_122-lambdaincompleteλ-projective | 4 | 4 | 2 | 1 | 1 | 1 | 2 | 4 | 4 | 6 | 3 | 6 |
| gf2_122-wincompleteλ-projective, w codec | 4 | 4 | 2 | 1 | 1 | 1 | 2 | 4 | 4 | 6 | 3 | 6 |
| gf2_122-uunscaled (X:S:Z), w codec | 4 | 4 | 2 | 1 | 1 | 1 | 2 | 4 | 4 | 6 | 3 | 6 |
| GF(2^122), constant in GF(2^61) (GLS-shaped), 16 bytes | ||||||||||||
| gf2_122-gls(X:S:Z:T) extended | 2 | 2 | 3 | 1 | 1 | 1 | 2 | 2 | 3 | 3 | 3 | |
| gf2_122-gls-lambdaincompleteλ-projective | 4 | 4 | 2 | 1 | 1 | 1 | 2 | 4 | 4 | 6 | 3 | 6 |
| gf2_122-gls-wincompleteλ-projective, w codec | 4 | 4 | 2 | 1 | 1 | 1 | 2 | 4 | 4 | 6 | 3 | 6 |
| gf2_122-gls-uunscaled (X:S:Z), w codec | 4 | 4 | 2 | 1 | 1 | 1 | 2 | 4 | 4 | 6 | 3 | 6 |
| GF(2^109), 14 bytes | ||||||||||||
| gf2_109(X:S:Z:T) extended | 4 | 4 | 3 | 1 | 2 | 1 | 2 | 4 | 4 | 6 | 3 | 6 |
| gf2_109-lambdaincompleteλ-projective | 4 | 4 | 2 | 1 | 1 | 1 | 2 | 4 | 4 | 8 | 5 | 23 |
| gf2_109-wincompleteλ-projective, w codec | 4 | 4 | 2 | 1 | 1 | 1 | 2 | 4 | 4 | 8 | 5 | 23 |
| gf2_109-uunscaled (X:S:Z), w codec | 4 | 4 | 2 | 1 | 1 | 1 | 2 | 4 | 4 | 8 | 5 | 23 |
| F_p, p = 2^127 − 1, 16 bytes | ||||||||||||
| edwards127a = 1 Edwards, extended += cached | 3 | 2 | 3 | 2 | 1 | 1 | 2 | 2 | 1 | 1 | 1 | |
| weier127short Weierstrass, projective += affine | 2 | 2 | 2 | 2 | 1 | 1 | 2 | 2 | 1 | 1 | 1 | |
| weier127-jacobianincompleteshort Weierstrass, Jacobian += affine | 2 | 2 | 2 | 1 | 1 | 1 | 2 | 2 | 1 | 1 | 1 | |
| F_p, p = 2^107 − 1, 14 bytes | ||||||||||||
| edwards107a = 1 Edwards, extended += cached | 3 | 2 | 3 | 2 | 1 | 1 | 2 | 2 | 1 | 1 | 1 | |
| weier107short Weierstrass, projective += affine | 2 | 2 | 2 | 2 | 1 | 1 | 2 | 2 | 1 | 1 | 1 | |
| weier107-jacobianincompleteshort Weierstrass, Jacobian += affine | 2 | 2 | 2 | 1 | 1 | 1 | 2 | 2 | 1 | 1 | 1 | |
| F_p, p = 2^128 − 275, 16 bytes | ||||||||||||
| twisted128a = −1 twisted Edwards modulo 2-torsion, extended += cached | 2 | 2 | 2 | 1 | 1 | 1 | 2 | 2 | 1 | 1 | 1 | |
| F_{p²}, p = 2^61 − 1, 16 bytes | ||||||||||||
| edwards61x2a = 1 Edwards, signed-x codec, extended += cached | 2 | 2 | 2 | 1 | 1 | 1 | 2 | 2 | 1 | 1 | 1 | |
| weier61x2short Weierstrass, signed-x codec, projective += affine | 2 | 2 | 2 | 1 | 1 | 1 | 2 | 2 | 1 | 1 | 1 | |
| weier61x2-jacobianincompleteshort Weierstrass, signed-x codec, Jacobian += affine | 2 | 2 | 2 | 1 | 1 | 1 | 2 | 2 | 1 | 1 | 1 | |
| twisted61x2a = −1 Edwards modulo 2-torsion, extended += cached | 4 | 4 | 2 | 1 | 1 | 1 | 2 | 4 | 4 | 1 | 1 | 1 |
| F_{p²}, p = 2^64 − 59, 16 bytes | ||||||||||||
| twisted64x2a = −1 Edwards modulo 2-torsion, extended += cached | 2 | 2 | 2 | 1 | 1 | 1 | 2 | 2 | 1 | 1 | 1 | |
| F_{p²}, p = 2^64 − 2^32 + 1, 16 bytes | ||||||||||||
| twisted-goldilocks2a = −1 Edwards modulo 2-torsion, extended += cached | 2 | 2 | 2 | 1 | 1 | 1 | 2 | 2 | 1 | 1 | 1 | |
| references, 32 and 33 bytes | ||||||||||||
| ristretto255curve25519-dalek | 1 | 2 | 1 | 1 | 10 | 1 | 1 | |||||
| secp256k1libsecp256k1 | 2 | 1 | ||||||||||
bold: the best of its column; italic, dotted: tied with the best within the confidence intervals; shading: ratio to the best, pale yellow at 1× to purple at 16× or more; grey: baseline, not compared.
All benchmarks
Every observation: a figure and a table per layer.
field
116 benchmarks
| operation | benchmark | family | mode | time | 95% CI | unit |
|---|---|---|---|---|---|---|
| batch invert | gf2_109/batch invert (product tree) | gf2_109 | batch | 3.49 ns | 3.49 ns .. 3.50 ns | per elem |
| batch invert | gf2_122/batch invert (product tree) | gf2_122 | batch | 4.47 ns | 4.47 ns .. 4.47 ns | per elem |
| batch invert | gf2_127/batch invert (product tree) | gf2_127 | batch | 3.60 ns | 3.60 ns .. 3.61 ns | per elem |
| batch invert | fp107/batch invert (product tree) | fp107 | batch | 5.23 ns | 5.22 ns .. 5.23 ns | per elem |
| batch invert | fp127/batch invert (product tree) | fp127 | batch | 5.64 ns | 5.64 ns .. 5.64 ns | per elem |
| batch invert | fp61x2/batch invert (product tree) | fp61x2 | batch | 4.67 ns | 4.66 ns .. 4.67 ns | per elem |
| batch invert | fp64x2/batch invert (product tree) | fp64x2 | batch | 5.77 ns | 5.77 ns .. 5.78 ns | per elem |
| batch invert | goldilocks2/batch invert (product tree) | goldilocks2 | batch | 5.87 ns | 5.85 ns .. 5.89 ns | per elem |
| halftrace | gf2_109/halftrace | gf2_109 | per-element | 37.2 ns | 37.2 ns .. 37.2 ns | per elem |
| halftrace | gf2_109/halftrace (byte tables) | gf2_109 | per-element | 3.32 ns | 3.32 ns .. 3.33 ns | per elem |
| halftrace | gf2_122/qsolve (z^2 + z = c, 2 base halftraces) | gf2_122 | per-element | 2.69 ns | 2.68 ns .. 2.69 ns | per elem |
| halftrace | gf2_127/halftrace | gf2_127 | per-element | 30.0 ns | 29.9 ns .. 30.0 ns | per elem |
| halftrace | gf2_127/halftrace (byte tables) | gf2_127 | per-element | 4.11 ns | 4.11 ns .. 4.11 ns | per elem |
| halftrace | gf2_127/halftrace (nibble tables) | gf2_127 | per-element | 17.2 ns | 17.2 ns .. 17.2 ns | per elem |
| pack | fp107/pack | fp107 | per-element | 0.67 ns | 0.67 ns .. 0.67 ns | per elem |
| pack | fp127/pack | fp127 | per-element | 0.34 ns | 0.34 ns .. 0.34 ns | per elem |
| pack | fp128/pack | fp128 | per-element | 0.34 ns | 0.34 ns .. 0.34 ns | per elem |
| pack | fp61x2/pack | fp61x2 | per-element | 0.34 ns | 0.34 ns .. 0.34 ns | per elem |
| pack | fp64x2/pack | fp64x2 | per-element | 0.34 ns | 0.34 ns .. 0.34 ns | per elem |
| pack | goldilocks2/pack | goldilocks2 | per-element | 0.40 ns | 0.40 ns .. 0.40 ns | per elem |
| trace | gf2_109/trace | gf2_109 | per-element | 0.46 ns | 0.46 ns .. 0.46 ns | per elem |
| trace | gf2_122/trace | gf2_122 | per-element | 0.35 ns | 0.34 ns .. 0.35 ns | per elem |
| trace | gf2_127/trace | gf2_127 | per-element | 0.33 ns | 0.33 ns .. 0.33 ns | per elem |
| neg | fp107/neg | fp107 | per-element | 0.42 ns | 0.42 ns .. 0.43 ns | per elem |
| neg | fp127/neg | fp127 | per-element | 0.66 ns | 0.66 ns .. 0.66 ns | per elem |
| neg | fp128/neg | fp128 | per-element | 0.40 ns | 0.40 ns .. 0.40 ns | per elem |
| neg | fp61x2/neg | fp61x2 | per-element | 0.38 ns | 0.38 ns .. 0.38 ns | per elem |
| neg | fp64x2/neg | fp64x2 | per-element | 0.40 ns | 0.40 ns .. 0.40 ns | per elem |
| neg | goldilocks2/neg | goldilocks2 | per-element | 0.39 ns | 0.39 ns .. 0.39 ns | per elem |
| mul_u2 | gf2_122/mul_u2 (by a^2 = 1 + a) latency (dependent chain) | gf2_122 | latency | 0.63 ns | 0.63 ns .. 0.63 ns | per elem |
| mul_u2 | gf2_122/mul_u2 (by a^2 = 1 + a) throughput (8 chains) | gf2_122 | throughput | 0.20 ns | 0.20 ns .. 0.20 ns | per elem |
| normalize | gf2_109/normalize (to_u128) | gf2_109 | per-element | 0.45 ns | 0.45 ns .. 0.45 ns | per elem |
| normalize | gf2_122/normalize (to_u128) | gf2_122 | per-element | 0.65 ns | 0.65 ns .. 0.65 ns | per elem |
| normalize | gf2_127/normalize (to_u128) | gf2_127 | per-element | 0.41 ns | 0.41 ns .. 0.41 ns | per elem |
| unpack | fp107/unpack | fp107 | per-element | 0.51 ns | 0.51 ns .. 0.51 ns | per elem |
| unpack | fp127/unpack | fp127 | per-element | 0.51 ns | 0.51 ns .. 0.51 ns | per elem |
| unpack | fp128/unpack | fp128 | per-element | 0.51 ns | 0.51 ns .. 0.51 ns | per elem |
| unpack | fp61x2/unpack | fp61x2 | per-element | 0.72 ns | 0.72 ns .. 0.72 ns | per elem |
| unpack | fp64x2/unpack | fp64x2 | per-element | 0.55 ns | 0.55 ns .. 0.55 ns | per elem |
| unpack | goldilocks2/unpack | goldilocks2 | per-element | 0.55 ns | 0.55 ns .. 0.55 ns | per elem |
| sub | fp128/sub | fp128 | per-element | 0.60 ns | 0.60 ns .. 0.60 ns | per elem |
| sub | fp61x2/sub | fp61x2 | per-element | 0.55 ns | 0.55 ns .. 0.55 ns | per elem |
| sub | fp64x2/sub | fp64x2 | per-element | 0.53 ns | 0.53 ns .. 0.54 ns | per elem |
| sub | goldilocks2/sub | goldilocks2 | per-element | 0.59 ns | 0.59 ns .. 0.60 ns | per elem |
| add | fp107/add | fp107 | per-element | 0.51 ns | 0.50 ns .. 0.52 ns | per elem |
| add | fp127/add | fp127 | per-element | 0.83 ns | 0.83 ns .. 0.83 ns | per elem |
| add | fp128/add | fp128 | per-element | 0.89 ns | 0.89 ns .. 0.89 ns | per elem |
| add | fp61x2/add | fp61x2 | per-element | 0.53 ns | 0.53 ns .. 0.53 ns | per elem |
| add | fp64x2/add | fp64x2 | per-element | 0.56 ns | 0.56 ns .. 0.57 ns | per elem |
| add | goldilocks2/add | goldilocks2 | per-element | 0.59 ns | 0.59 ns .. 0.59 ns | per elem |
| square | gf2_109/square latency (dependent chain) | gf2_109 | latency | 2.17 ns | 2.16 ns .. 2.17 ns | per elem |
| square | gf2_109/square throughput (8 chains) | gf2_109 | throughput | 0.83 ns | 0.83 ns .. 0.84 ns | per elem |
| square | gf2_122/square latency (dependent chain) | gf2_122 | latency | 4.44 ns | 4.43 ns .. 4.44 ns | per elem |
| square | gf2_122/square throughput (8 chains) | gf2_122 | throughput | 1.09 ns | 1.09 ns .. 1.09 ns | per elem |
| square | gf2_127/square latency (dependent chain) | gf2_127 | latency | 2.08 ns | 2.08 ns .. 2.09 ns | per elem |
| square | gf2_127/square throughput (8 chains) | gf2_127 | throughput | 0.70 ns | 0.70 ns .. 0.70 ns | per elem |
| square | fp107/square latency (dependent chain) | fp107 | latency | 3.01 ns | 3.00 ns .. 3.02 ns | per elem |
| square | fp107/square throughput (8 chains) | fp107 | throughput | 0.97 ns | 0.97 ns .. 0.97 ns | per elem |
| square | fp127/square latency (dependent chain) | fp127 | latency | 3.57 ns | 3.56 ns .. 3.57 ns | per elem |
| square | fp127/square throughput (8 chains) | fp127 | throughput | 1.78 ns | 1.78 ns .. 1.78 ns | per elem |
| square | fp128/square latency (dependent chain) | fp128 | latency | 6.37 ns | 6.36 ns .. 6.37 ns | per elem |
| square | fp128/square throughput (8 chains) | fp128 | throughput | 2.58 ns | 2.58 ns .. 2.58 ns | per elem |
| square | fp61x2/square latency (dependent chain) | fp61x2 | latency | 3.48 ns | 3.48 ns .. 3.49 ns | per elem |
| square | fp61x2/square throughput (8 chains) | fp61x2 | throughput | 1.40 ns | 1.39 ns .. 1.40 ns | per elem |
| square | fp64x2/square latency (dependent chain) | fp64x2 | latency | 4.92 ns | 4.91 ns .. 4.92 ns | per elem |
| square | fp64x2/square throughput (8 chains) | fp64x2 | throughput | 2.23 ns | 2.23 ns .. 2.24 ns | per elem |
| square | goldilocks2/square latency (dependent chain) | goldilocks2 | latency | 3.43 ns | 3.43 ns .. 3.44 ns | per elem |
| square | goldilocks2/square throughput (8 chains) | goldilocks2 | throughput | 1.69 ns | 1.68 ns .. 1.71 ns | per elem |
| mul_base | gf2_122/mul_base (by a GF(2^61) constant) latency (dependent chain) | gf2_122 | latency | 3.52 ns | 3.52 ns .. 3.52 ns | per elem |
| mul_base | gf2_122/mul_base (by a GF(2^61) constant) throughput (8 chains) | gf2_122 | throughput | 1.14 ns | 1.14 ns .. 1.14 ns | per elem |
| mul | gf2_109/mul latency (dependent chain) | gf2_109 | latency | 3.92 ns | 3.91 ns .. 3.93 ns | per elem |
| mul | gf2_109/mul throughput (8 chains) | gf2_109 | throughput | 1.04 ns | 1.04 ns .. 1.04 ns | per elem |
| mul | gf2_122/mul latency (dependent chain) | gf2_122 | latency | 4.90 ns | 4.90 ns .. 4.90 ns | per elem |
| mul | gf2_122/mul throughput (8 chains) | gf2_122 | throughput | 1.21 ns | 1.21 ns .. 1.21 ns | per elem |
| mul | gf2_127/mul latency (dependent chain) | gf2_127 | latency | 3.75 ns | 3.74 ns .. 3.77 ns | per elem |
| mul | gf2_127/mul throughput (8 chains) | gf2_127 | throughput | 1.21 ns | 1.21 ns .. 1.21 ns | per elem |
| mul | fp107 schoolbook/mul latency (dependent chain) | fp107 | latency | 3.20 ns | 3.20 ns .. 3.21 ns | per elem |
| mul | fp107 schoolbook/mul throughput (8 chains) | fp107 | throughput | 1.15 ns | 1.15 ns .. 1.15 ns | per elem |
| mul | fp107/mul latency (dependent chain) | fp107 | latency | 3.49 ns | 3.48 ns .. 3.50 ns | per elem |
| mul | fp107/mul throughput (8 chains) | fp107 | throughput | 1.29 ns | 1.29 ns .. 1.29 ns | per elem |
| mul | fp127/mul latency (dependent chain) | fp127 | latency | 3.82 ns | 3.81 ns .. 3.82 ns | per elem |
| mul | fp127/mul throughput (8 chains) | fp127 | throughput | 1.50 ns | 1.50 ns .. 1.50 ns | per elem |
| mul | fp128/mul latency (dependent chain) | fp128 | latency | 6.58 ns | 6.57 ns .. 6.58 ns | per elem |
| mul | fp128/mul throughput (8 chains) | fp128 | throughput | 2.77 ns | 2.77 ns .. 2.77 ns | per elem |
| mul | fp61x2/mul latency (dependent chain) | fp61x2 | latency | 3.30 ns | 3.30 ns .. 3.31 ns | per elem |
| mul | fp61x2/mul throughput (8 chains) | fp61x2 | throughput | 1.26 ns | 1.26 ns .. 1.26 ns | per elem |
| mul | fp64x2/mul latency (dependent chain) | fp64x2 | latency | 5.08 ns | 5.07 ns .. 5.09 ns | per elem |
| mul | fp64x2/mul throughput (8 chains) | fp64x2 | throughput | 2.24 ns | 2.24 ns .. 2.24 ns | per elem |
| mul | goldilocks2/mul latency (dependent chain) | goldilocks2 | latency | 2.90 ns | 2.90 ns .. 2.90 ns | per elem |
| mul | goldilocks2/mul throughput (8 chains) | goldilocks2 | throughput | 1.36 ns | 1.35 ns .. 1.38 ns | per elem |
| invert | gf2_109/invert | gf2_109 | per-element | 341 ns | 340 ns .. 343 ns | per elem |
| invert | gf2_122/invert | gf2_122 | per-element | 159 ns | 159 ns .. 159 ns | per elem |
| invert | gf2_127/invert | gf2_127 | per-element | 317 ns | 317 ns .. 318 ns | per elem |
| invert | fp107/invert | fp107 | per-element | 477 ns | 477 ns .. 478 ns | per elem |
| invert | fp127/invert | fp127 | per-element | 520 ns | 518 ns .. 522 ns | per elem |
| invert | fp128/invert | fp128 | per-element | 933 ns | 932 ns .. 934 ns | per elem |
| invert | fp61x2/invert | fp61x2 | per-element | 159 ns | 159 ns .. 159 ns | per elem |
| invert | fp64x2/invert | fp64x2 | per-element | 281 ns | 280 ns .. 281 ns | per elem |
| invert | goldilocks2/invert | goldilocks2 | per-element | 186 ns | 182 ns .. 190 ns | per elem |
| sqrt | gf2_109/sqrt | gf2_109 | per-element | 2.77 ns | 2.77 ns .. 2.78 ns | per elem |
| sqrt | gf2_122/sqrt | gf2_122 | per-element | 2.95 ns | 2.95 ns .. 2.95 ns | per elem |
| sqrt | gf2_127/sqrt | gf2_127 | per-element | 1.26 ns | 1.26 ns .. 1.26 ns | per elem |
| sqrt | fp107/sqrt (x^(2^105)) | fp107 | per-element | 341 ns | 340 ns .. 341 ns | per elem |
| sqrt | fp127/sqrt (x^(2^125)) | fp127 | per-element | 470 ns | 468 ns .. 472 ns | per elem |
| sqrt | fp128/sqrt | fp128 | per-element | 878 ns | 877 ns .. 878 ns | per elem |
| sqrt | fp61x2/sqrt | fp61x2 | per-element | 277 ns | 277 ns .. 277 ns | per elem |
| sqrt | fp64x2/sqrt | fp64x2 | per-element | 485 ns | 485 ns .. 485 ns | per elem |
| sqrt | goldilocks2/sqrt | goldilocks2 | per-element | 727 ns | 724 ns .. 730 ns | per elem |
| pow_p34 | fp107/pow_p34 (x^(2^105-1)) | fp107 | per-element | 469 ns | 468 ns .. 470 ns | per elem |
| pow_p34 | fp127/pow_p34 (x^(2^125-1)) | fp127 | per-element | 494 ns | 493 ns .. 495 ns | per elem |
| sqrt_ratio | fp107/sqrt_ratio | fp107 | per-element | 482 ns | 482 ns .. 482 ns | per elem |
| sqrt_ratio | fp127/sqrt_ratio | fp127 | per-element | 518 ns | 517 ns .. 519 ns | per elem |
| sqrt_ratio | fp128/sqrt_ratio | fp128 | per-element | 932 ns | 932 ns .. 933 ns | per elem |
| sqrt_ratio | fp61x2/sqrt_ratio | fp61x2 | per-element | 277 ns | 277 ns .. 278 ns | per elem |
| sqrt_ratio | fp64x2/sqrt_ratio | fp64x2 | per-element | 481 ns | 481 ns .. 482 ns | per elem |
| sqrt_ratio | goldilocks2/sqrt_ratio | goldilocks2 | per-element | 677 ns | 676 ns .. 678 ns | per elem |
group ops
470 benchmarks
| operation | benchmark | family | mode | time | 95% CI | unit |
|---|---|---|---|---|---|---|
| prepare | binary.109/mode=batch,n=1024 | gf2_109 | batch | 2.79 ns | 2.79 ns .. 2.80 ns | per elem |
| prepare | binary.109/mode=batch,n=64 | gf2_109 | batch | 2.83 ns | 2.82 ns .. 2.83 ns | per elem |
| prepare | binary.109/mode=batch,n=8 | gf2_109 | batch | 4.00 ns | 3.99 ns .. 4.01 ns | per elem |
| prepare | binary.109/mode=indep | gf2_109 | per-element | 2.77 ns | 2.76 ns .. 2.77 ns | per elem |
| prepare | binary-lambda.109/mode=batch,n=1024 | gf2_109-lambda | batch | 5.17 ns | 5.16 ns .. 5.18 ns | per elem |
| prepare | binary-lambda.109/mode=batch,n=64 | gf2_109-lambda | batch | 14.0 ns | 14.0 ns .. 14.0 ns | per elem |
| prepare | binary-lambda.109/mode=batch,n=8 | gf2_109-lambda | batch | 68.7 ns | 68.5 ns .. 68.9 ns | per elem |
| prepare | binary-lambda.109/mode=indep | gf2_109-lambda | per-element | 349 ns | 348 ns .. 350 ns | per elem |
| prepare | binary-u.109/mode=batch,n=1024 | gf2_109-u | batch | 0.49 ns | 0.48 ns .. 0.49 ns | per elem |
| prepare | binary-u.109/mode=batch,n=64 | gf2_109-u | batch | 0.51 ns | 0.51 ns .. 0.51 ns | per elem |
| prepare | binary-u.109/mode=batch,n=8 | gf2_109-u | batch | 1.42 ns | 1.41 ns .. 1.42 ns | per elem |
| prepare | binary-u.109/mode=indep | gf2_109-u | per-element | 0.63 ns | 0.63 ns .. 0.63 ns | per elem |
| prepare | binary-w.109/mode=batch,n=1024 | gf2_109-w | batch | 0.48 ns | 0.47 ns .. 0.48 ns | per elem |
| prepare | binary-w.109/mode=batch,n=64 | gf2_109-w | batch | 0.51 ns | 0.51 ns .. 0.51 ns | per elem |
| prepare | binary-w.109/mode=batch,n=8 | gf2_109-w | batch | 1.40 ns | 1.40 ns .. 1.41 ns | per elem |
| prepare | binary-w.109/mode=indep | gf2_109-w | per-element | 0.61 ns | 0.61 ns .. 0.62 ns | per elem |
| prepare | binary.122/mode=batch,n=1024 | gf2_122 | batch | 5.02 ns | 5.01 ns .. 5.03 ns | per elem |
| prepare | binary.122/mode=indep | gf2_122 | per-element | 4.92 ns | 4.90 ns .. 4.93 ns | per elem |
| prepare | binary.122-gls/mode=batch,n=1024 | gf2_122-gls | batch | 4.44 ns | 4.42 ns .. 4.45 ns | per elem |
| prepare | binary.122-gls/mode=indep | gf2_122-gls | per-element | 4.31 ns | 4.29 ns .. 4.32 ns | per elem |
| prepare | binary-lambda.122-gls/mode=batch,n=1024 | gf2_122-gls-lambda | batch | 7.53 ns | 7.52 ns .. 7.55 ns | per elem |
| prepare | binary-lambda.122-gls/mode=batch,n=64 | gf2_122-gls-lambda | batch | 13.1 ns | 13.1 ns .. 13.2 ns | per elem |
| prepare | binary-lambda.122-gls/mode=batch,n=8 | gf2_122-gls-lambda | batch | 47.8 ns | 47.7 ns .. 48.0 ns | per elem |
| prepare | binary-lambda.122-gls/mode=indep | gf2_122-gls-lambda | per-element | 167 ns | 167 ns .. 168 ns | per elem |
| prepare | binary-u.122-gls/mode=batch,n=1024 | gf2_122-gls-u | batch | 0.48 ns | 0.47 ns .. 0.48 ns | per elem |
| prepare | binary-u.122-gls/mode=batch,n=64 | gf2_122-gls-u | batch | 0.51 ns | 0.51 ns .. 0.51 ns | per elem |
| prepare | binary-u.122-gls/mode=batch,n=8 | gf2_122-gls-u | batch | 1.42 ns | 1.41 ns .. 1.42 ns | per elem |
| prepare | binary-u.122-gls/mode=indep | gf2_122-gls-u | per-element | 0.63 ns | 0.63 ns .. 0.63 ns | per elem |
| prepare | binary-w.122-gls/mode=batch,n=1024 | gf2_122-gls-w | batch | 0.49 ns | 0.48 ns .. 0.50 ns | per elem |
| prepare | binary-w.122-gls/mode=batch,n=64 | gf2_122-gls-w | batch | 0.51 ns | 0.51 ns .. 0.51 ns | per elem |
| prepare | binary-w.122-gls/mode=batch,n=8 | gf2_122-gls-w | batch | 1.42 ns | 1.41 ns .. 1.42 ns | per elem |
| prepare | binary-w.122-gls/mode=indep | gf2_122-gls-w | per-element | 0.63 ns | 0.63 ns .. 0.63 ns | per elem |
| prepare | binary-lambda.122/mode=batch,n=1024 | gf2_122-lambda | batch | 7.55 ns | 7.53 ns .. 7.56 ns | per elem |
| prepare | binary-lambda.122/mode=batch,n=64 | gf2_122-lambda | batch | 13.1 ns | 13.1 ns .. 13.1 ns | per elem |
| prepare | binary-lambda.122/mode=batch,n=8 | gf2_122-lambda | batch | 46.9 ns | 46.8 ns .. 47.0 ns | per elem |
| prepare | binary-lambda.122/mode=indep | gf2_122-lambda | per-element | 166 ns | 166 ns .. 167 ns | per elem |
| prepare | binary-u.122/mode=batch,n=1024 | gf2_122-u | batch | 0.48 ns | 0.47 ns .. 0.48 ns | per elem |
| prepare | binary-u.122/mode=batch,n=64 | gf2_122-u | batch | 0.50 ns | 0.50 ns .. 0.51 ns | per elem |
| prepare | binary-u.122/mode=batch,n=8 | gf2_122-u | batch | 1.41 ns | 1.41 ns .. 1.42 ns | per elem |
| prepare | binary-u.122/mode=indep | gf2_122-u | per-element | 0.61 ns | 0.61 ns .. 0.62 ns | per elem |
| prepare | binary-w.122/mode=batch,n=1024 | gf2_122-w | batch | 0.46 ns | 0.45 ns .. 0.47 ns | per elem |
| prepare | binary-w.122/mode=batch,n=64 | gf2_122-w | batch | 0.51 ns | 0.50 ns .. 0.51 ns | per elem |
| prepare | binary-w.122/mode=batch,n=8 | gf2_122-w | batch | 1.39 ns | 1.39 ns .. 1.40 ns | per elem |
| prepare | binary-w.122/mode=indep | gf2_122-w | per-element | 0.63 ns | 0.63 ns .. 0.63 ns | per elem |
| prepare | binary.127/mode=batch,n=1024 | gf2_127 | batch | 3.54 ns | 3.54 ns .. 3.54 ns | per elem |
| prepare | binary.127/mode=batch,n=64 | gf2_127 | batch | 3.68 ns | 3.68 ns .. 3.69 ns | per elem |
| prepare | binary.127/mode=batch,n=8 | gf2_127 | batch | 4.37 ns | 4.36 ns .. 4.38 ns | per elem |
| prepare | binary.127/mode=indep | gf2_127 | per-element | 3.88 ns | 3.87 ns .. 3.91 ns | per elem |
| prepare | binary-lambda.127/mode=batch,n=1024 | gf2_127-lambda | batch | 6.33 ns | 6.30 ns .. 6.35 ns | per elem |
| prepare | binary-lambda.127/mode=batch,n=64 | gf2_127-lambda | batch | 14.2 ns | 14.2 ns .. 14.2 ns | per elem |
| prepare | binary-lambda.127/mode=batch,n=8 | gf2_127-lambda | batch | 64.1 ns | 63.9 ns .. 64.2 ns | per elem |
| prepare | binary-lambda.127/mode=indep | gf2_127-lambda | per-element | 340 ns | 339 ns .. 340 ns | per elem |
| prepare | binary-u.127/mode=batch,n=1024 | gf2_127-u | batch | 0.49 ns | 0.48 ns .. 0.49 ns | per elem |
| prepare | binary-u.127/mode=batch,n=64 | gf2_127-u | batch | 0.51 ns | 0.51 ns .. 0.51 ns | per elem |
| prepare | binary-u.127/mode=batch,n=8 | gf2_127-u | batch | 1.41 ns | 1.40 ns .. 1.41 ns | per elem |
| prepare | binary-u.127/mode=indep | gf2_127-u | per-element | 0.63 ns | 0.63 ns .. 0.63 ns | per elem |
| prepare | binary-w.127/mode=batch,n=1024 | gf2_127-w | batch | 0.48 ns | 0.47 ns .. 0.49 ns | per elem |
| prepare | binary-w.127/mode=batch,n=64 | gf2_127-w | batch | 0.51 ns | 0.51 ns .. 0.51 ns | per elem |
| prepare | binary-w.127/mode=batch,n=8 | gf2_127-w | batch | 1.40 ns | 1.40 ns .. 1.41 ns | per elem |
| prepare | binary-w.127/mode=indep | gf2_127-w | per-element | 0.63 ns | 0.62 ns .. 0.63 ns | per elem |
| prepare | edwards.107/mode=batch,n=1024 | edwards107 | batch | 22.7 ns | 22.6 ns .. 22.8 ns | per elem |
| prepare | edwards.107/mode=indep | edwards107 | per-element | 546 ns | 544 ns .. 548 ns | per elem |
| prepare | edwards.127/mode=batch,n=1024 | edwards127 | batch | 28.3 ns | 28.2 ns .. 28.3 ns | per elem |
| prepare | edwards.127/mode=indep | edwards127 | per-element | 582 ns | 581 ns .. 583 ns | per elem |
| prepare | edwards.61x2/mode=batch,n=1024 | edwards61x2 | batch | 18.8 ns | 18.8 ns .. 18.9 ns | per elem |
| prepare | edwards.61x2/mode=indep | edwards61x2 | per-element | 216 ns | 216 ns .. 217 ns | per elem |
| prepare | twisted.goldilocks2/mode=batch,n=1024 | twisted-goldilocks2 | batch | 4.51 ns | 4.48 ns .. 4.53 ns | per elem |
| prepare | twisted.goldilocks2/mode=indep | twisted-goldilocks2 | per-element | 4.48 ns | 4.46 ns .. 4.49 ns | per elem |
| prepare | twisted.128/mode=batch,n=1024 | twisted128 | batch | 8.08 ns | 8.06 ns .. 8.10 ns | per elem |
| prepare | twisted.128/mode=indep | twisted128 | per-element | 8.24 ns | 8.22 ns .. 8.26 ns | per elem |
| prepare | twisted.61x2/mode=batch,n=1024 | twisted61x2 | batch | 3.60 ns | 3.59 ns .. 3.60 ns | per elem |
| prepare | twisted.61x2/mode=batch,n=64 | twisted61x2 | batch | 3.80 ns | 3.79 ns .. 3.81 ns | per elem |
| prepare | twisted.61x2/mode=batch,n=8 | twisted61x2 | batch | 6.03 ns | 6.02 ns .. 6.05 ns | per elem |
| prepare | twisted.61x2/mode=indep | twisted61x2 | per-element | 3.41 ns | 3.40 ns .. 3.41 ns | per elem |
| prepare | twisted.64x2/mode=batch,n=1024 | twisted64x2 | batch | 5.51 ns | 5.49 ns .. 5.53 ns | per elem |
| prepare | twisted.64x2/mode=indep | twisted64x2 | per-element | 5.43 ns | 5.41 ns .. 5.44 ns | per elem |
| prepare | weier.107/mode=batch,n=1024 | weier107 | batch | 0.49 ns | 0.48 ns .. 0.50 ns | per elem |
| prepare | weier.107/mode=indep | weier107 | per-element | 0.62 ns | 0.62 ns .. 0.62 ns | per elem |
| prepare | weier-jacobian.107/mode=batch,n=1024 | weier107-jacobian | batch | 0.48 ns | 0.48 ns .. 0.49 ns | per elem |
| prepare | weier-jacobian.107/mode=indep | weier107-jacobian | per-element | 0.62 ns | 0.61 ns .. 0.62 ns | per elem |
| prepare | weier.127/mode=batch,n=1024 | weier127 | batch | 0.46 ns | 0.46 ns .. 0.47 ns | per elem |
| prepare | weier.127/mode=indep | weier127 | per-element | 0.61 ns | 0.61 ns .. 0.62 ns | per elem |
| prepare | weier-jacobian.127/mode=batch,n=1024 | weier127-jacobian | batch | 0.49 ns | 0.48 ns .. 0.50 ns | per elem |
| prepare | weier-jacobian.127/mode=indep | weier127-jacobian | per-element | 0.62 ns | 0.62 ns .. 0.62 ns | per elem |
| prepare | weier.61x2/mode=batch,n=1024 | weier61x2 | batch | 0.72 ns | 0.66 ns .. 0.78 ns | per elem |
| prepare | weier.61x2/mode=indep | weier61x2 | per-element | 0.63 ns | 0.63 ns .. 0.63 ns | per elem |
| prepare | weier-jacobian.61x2/mode=batch,n=1024 | weier61x2-jacobian | batch | 0.54 ns | 0.52 ns .. 0.58 ns | per elem |
| prepare | weier-jacobian.61x2/mode=indep | weier61x2-jacobian | per-element | 0.63 ns | 0.63 ns .. 0.63 ns | per elem |
| add | xor-sha256/xor 32B, 1 accumulator | xor | latency | 0.38 ns | 0.37 ns .. 0.38 ns | per elem |
| add | xor-sha256/xor 32B, 8 accumulators | xor | throughput | 0.71 ns | 0.70 ns .. 0.71 ns | per elem |
| add | binary.109/mode=latency | gf2_109 | latency | 24.3 ns | 24.2 ns .. 24.4 ns | per elem |
| add | binary.109/mode=throughput | gf2_109 | throughput | 12.8 ns | 12.8 ns .. 12.9 ns | per elem |
| add | gf2_109/extended += affine, 8 accumulators | gf2_109 | throughput | 16.0 ns | 16.0 ns .. 16.0 ns | per elem |
| add | binary-lambda.109/mode=latency | gf2_109-lambda | latency | 24.2 ns | 24.1 ns .. 24.3 ns | per elem |
| add | binary-lambda.109/mode=throughput | gf2_109-lambda | throughput | 12.0 ns | 12.0 ns .. 12.0 ns | per elem |
| add | binary-u.109/mode=latency | gf2_109-u | latency | 19.0 ns | 18.9 ns .. 19.0 ns | per elem |
| add | binary-u.109/mode=throughput | gf2_109-u | throughput | 9.76 ns | 9.74 ns .. 9.78 ns | per elem |
| add | binary-w.109/mode=latency | gf2_109-w | latency | 24.2 ns | 24.2 ns .. 24.3 ns | per elem |
| add | binary-w.109/mode=throughput | gf2_109-w | throughput | 12.0 ns | 11.9 ns .. 12.0 ns | per elem |
| add | binary.122/mode=latency | gf2_122 | latency | 26.1 ns | 26.1 ns .. 26.2 ns | per elem |
| add | binary.122/mode=throughput | gf2_122 | throughput | 17.8 ns | 17.8 ns .. 17.9 ns | per elem |
| add | gf2_122/extended += affine, 8 accumulators | gf2_122 | throughput | 22.2 ns | 22.2 ns .. 22.2 ns | per elem |
| add | binary.122-gls/mode=latency | gf2_122-gls | latency | 23.7 ns | 23.7 ns .. 23.8 ns | per elem |
| add | binary.122-gls/mode=throughput | gf2_122-gls | throughput | 16.8 ns | 16.7 ns .. 16.8 ns | per elem |
| add | gf2_122-gls/extended += affine, 8 accumulators | gf2_122-gls | throughput | 20.1 ns | 20.1 ns .. 20.1 ns | per elem |
| add | binary-lambda.122-gls/mode=latency | gf2_122-gls-lambda | latency | 23.1 ns | 23.1 ns .. 23.2 ns | per elem |
| add | binary-lambda.122-gls/mode=throughput | gf2_122-gls-lambda | throughput | 16.6 ns | 16.5 ns .. 16.6 ns | per elem |
| add | binary-u.122-gls/mode=latency | gf2_122-gls-u | latency | 18.9 ns | 18.8 ns .. 18.9 ns | per elem |
| add | binary-u.122-gls/mode=throughput | gf2_122-gls-u | throughput | 13.1 ns | 13.1 ns .. 13.1 ns | per elem |
| add | binary-w.122-gls/mode=latency | gf2_122-gls-w | latency | 23.1 ns | 23.0 ns .. 23.1 ns | per elem |
| add | binary-w.122-gls/mode=throughput | gf2_122-gls-w | throughput | 16.6 ns | 16.5 ns .. 16.6 ns | per elem |
| add | binary-lambda.122/mode=latency | gf2_122-lambda | latency | 23.0 ns | 23.0 ns .. 23.1 ns | per elem |
| add | binary-lambda.122/mode=throughput | gf2_122-lambda | throughput | 16.6 ns | 16.5 ns .. 16.6 ns | per elem |
| add | binary-u.122/mode=latency | gf2_122-u | latency | 18.8 ns | 18.8 ns .. 18.9 ns | per elem |
| add | binary-u.122/mode=throughput | gf2_122-u | throughput | 13.1 ns | 13.0 ns .. 13.1 ns | per elem |
| add | binary-w.122/mode=latency | gf2_122-w | latency | 23.0 ns | 22.9 ns .. 23.0 ns | per elem |
| add | binary-w.122/mode=throughput | gf2_122-w | throughput | 16.6 ns | 16.5 ns .. 16.6 ns | per elem |
| add | binary.127/mode=latency | gf2_127 | latency | 22.0 ns | 21.9 ns .. 22.0 ns | per elem |
| add | binary.127/mode=throughput | gf2_127 | throughput | 14.1 ns | 14.1 ns .. 14.1 ns | per elem |
| add | gf2_127/extended += affine, 8 accumulators | gf2_127 | throughput | 18.8 ns | 18.8 ns .. 18.9 ns | per elem |
| add | binary-lambda.127/mode=latency | gf2_127-lambda | latency | 20.2 ns | 20.1 ns .. 20.2 ns | per elem |
| add | binary-lambda.127/mode=throughput | gf2_127-lambda | throughput | 14.9 ns | 14.9 ns .. 14.9 ns | per elem |
| add | binary-u.127/mode=latency | gf2_127-u | latency | 17.5 ns | 17.4 ns .. 17.5 ns | per elem |
| add | binary-u.127/mode=throughput | gf2_127-u | throughput | 10.7 ns | 10.6 ns .. 10.7 ns | per elem |
| add | binary-w.127/mode=latency | gf2_127-w | latency | 20.2 ns | 20.1 ns .. 20.2 ns | per elem |
| add | binary-w.127/mode=throughput | gf2_127-w | throughput | 14.9 ns | 14.8 ns .. 14.9 ns | per elem |
| add | edwards.107/mode=latency | edwards107 | latency | 18.4 ns | 18.3 ns .. 18.4 ns | per elem |
| add | edwards.107/mode=throughput | edwards107 | throughput | 15.5 ns | 15.4 ns .. 15.5 ns | per elem |
| add | edwards107/+= montgomery affine, 8 accumulators | edwards107 | throughput | 29.1 ns | 29.1 ns .. 29.1 ns | per elem |
| add | edwards.127/mode=latency | edwards127 | latency | 22.2 ns | 22.2 ns .. 22.2 ns | per elem |
| add | edwards.127/mode=throughput | edwards127 | throughput | 20.1 ns | 20.0 ns .. 20.1 ns | per elem |
| add | edwards127/+= montgomery affine, 8 accumulators | edwards127 | throughput | 40.1 ns | 40.1 ns .. 40.1 ns | per elem |
| add | edwards.61x2/mode=latency | edwards61x2 | latency | 22.5 ns | 22.4 ns .. 22.5 ns | per elem |
| add | edwards.61x2/mode=throughput | edwards61x2 | throughput | 13.3 ns | 13.3 ns .. 13.4 ns | per elem |
| add | twisted.goldilocks2/mode=latency | twisted-goldilocks2 | latency | 19.0 ns | 18.9 ns .. 19.0 ns | per elem |
| add | twisted.goldilocks2/mode=throughput | twisted-goldilocks2 | throughput | 15.0 ns | 15.0 ns .. 15.1 ns | per elem |
| add | twisted.128/mode=latency | twisted128 | latency | 28.8 ns | 28.7 ns .. 28.8 ns | per elem |
| add | twisted.128/mode=throughput | twisted128 | throughput | 23.9 ns | 23.8 ns .. 24.0 ns | per elem |
| add | twisted.61x2/mode=latency | twisted61x2 | latency | 22.3 ns | 22.3 ns .. 22.3 ns | per elem |
| add | twisted.61x2/mode=throughput | twisted61x2 | throughput | 12.5 ns | 12.4 ns .. 12.6 ns | per elem |
| add | twisted.64x2/mode=latency | twisted64x2 | latency | 28.6 ns | 28.5 ns .. 28.7 ns | per elem |
| add | twisted.64x2/mode=throughput | twisted64x2 | throughput | 17.2 ns | 17.2 ns .. 17.3 ns | per elem |
| add | weier.107/mode=latency | weier107 | latency | 32.4 ns | 32.3 ns .. 32.4 ns | per elem |
| add | weier.107/mode=throughput | weier107 | throughput | 30.5 ns | 30.4 ns .. 30.5 ns | per elem |
| add | weier-jacobian.107/mode=latency | weier107-jacobian | latency | 35.5 ns | 35.4 ns .. 35.6 ns | per elem |
| add | weier-jacobian.107/mode=throughput | weier107-jacobian | throughput | 28.7 ns | 28.6 ns .. 28.7 ns | per elem |
| add | weier.127/mode=latency | weier127 | latency | 46.7 ns | 46.5 ns .. 46.8 ns | per elem |
| add | weier.127/mode=throughput | weier127 | throughput | 45.4 ns | 45.3 ns .. 45.5 ns | per elem |
| add | weier-jacobian.127/mode=latency | weier127-jacobian | latency | 45.3 ns | 45.1 ns .. 45.6 ns | per elem |
| add | weier-jacobian.127/mode=throughput | weier127-jacobian | throughput | 37.5 ns | 37.4 ns .. 37.6 ns | per elem |
| add | weier.61x2/mode=latency | weier61x2 | latency | 36.2 ns | 36.2 ns .. 36.3 ns | per elem |
| add | weier.61x2/mode=throughput | weier61x2 | throughput | 26.8 ns | 26.7 ns .. 26.8 ns | per elem |
| add | weier-jacobian.61x2/mode=latency | weier61x2-jacobian | latency | 37.2 ns | 37.1 ns .. 37.3 ns | per elem |
| add | weier-jacobian.61x2/mode=throughput | weier61x2-jacobian | throughput | 31.6 ns | 31.6 ns .. 31.7 ns | per elem |
| add | ristretto255/+=, 1 accumulator | ristretto255 | latency | 63.8 ns | 63.7 ns .. 63.8 ns | per elem |
| add | ristretto255/+=, 8 accumulators | ristretto255 | throughput | 65.1 ns | 64.8 ns .. 65.5 ns | per elem |
| subtract | binary.109/mode=throughput | gf2_109 | throughput | 13.2 ns | 13.2 ns .. 13.3 ns | per elem |
| subtract | binary-lambda.109/mode=throughput | gf2_109-lambda | throughput | 12.1 ns | 12.1 ns .. 12.1 ns | per elem |
| subtract | binary-u.109/mode=throughput | gf2_109-u | throughput | 9.88 ns | 9.86 ns .. 9.90 ns | per elem |
| subtract | binary-w.109/mode=throughput | gf2_109-w | throughput | 12.1 ns | 12.1 ns .. 12.1 ns | per elem |
| subtract | binary-lambda.122-gls/mode=throughput | gf2_122-gls-lambda | throughput | 16.7 ns | 16.7 ns .. 16.8 ns | per elem |
| subtract | binary-u.122-gls/mode=throughput | gf2_122-gls-u | throughput | 13.2 ns | 13.2 ns .. 13.2 ns | per elem |
| subtract | binary-w.122-gls/mode=throughput | gf2_122-gls-w | throughput | 16.8 ns | 16.7 ns .. 16.9 ns | per elem |
| subtract | binary-lambda.122/mode=throughput | gf2_122-lambda | throughput | 16.7 ns | 16.7 ns .. 16.8 ns | per elem |
| subtract | binary-u.122/mode=throughput | gf2_122-u | throughput | 13.2 ns | 13.2 ns .. 13.2 ns | per elem |
| subtract | binary-w.122/mode=throughput | gf2_122-w | throughput | 17.1 ns | 16.7 ns .. 17.5 ns | per elem |
| subtract | binary.127/mode=throughput | gf2_127 | throughput | 14.7 ns | 14.7 ns .. 14.7 ns | per elem |
| subtract | binary-lambda.127/mode=throughput | gf2_127-lambda | throughput | 15.1 ns | 15.1 ns .. 15.2 ns | per elem |
| subtract | binary-u.127/mode=throughput | gf2_127-u | throughput | 10.8 ns | 10.7 ns .. 10.8 ns | per elem |
| subtract | binary-w.127/mode=throughput | gf2_127-w | throughput | 14.7 ns | 14.6 ns .. 14.8 ns | per elem |
| subtract | twisted.61x2/mode=throughput | twisted61x2 | throughput | 12.8 ns | 12.7 ns .. 12.8 ns | per elem |
| subtract | ristretto255/-=, 8 accumulators | ristretto255 | throughput | 64.4 ns | 64.1 ns .. 64.7 ns | per elem |
| negate | binary.109 | gf2_109 | per-element | 1.13 ns | 1.13 ns .. 1.13 ns | per elem |
| negate | gf2_109/affine (y += x) | gf2_109 | per-element | 0.63 ns | 0.63 ns .. 0.63 ns | per elem |
| negate | binary-lambda.109 | gf2_109-lambda | per-element | 0.65 ns | 0.65 ns .. 0.65 ns | per elem |
| negate | binary-u.109 | gf2_109-u | per-element | 0.65 ns | 0.65 ns .. 0.65 ns | per elem |
| negate | binary-w.109 | gf2_109-w | per-element | 0.65 ns | 0.65 ns .. 0.65 ns | per elem |
| negate | binary.122 | gf2_122 | per-element | 1.13 ns | 1.13 ns .. 1.13 ns | per elem |
| negate | gf2_122/affine (y += x) | gf2_122 | per-element | 0.63 ns | 0.63 ns .. 0.63 ns | per elem |
| negate | binary.122-gls | gf2_122-gls | per-element | 1.12 ns | 1.12 ns .. 1.13 ns | per elem |
| negate | binary-lambda.122-gls | gf2_122-gls-lambda | per-element | 0.65 ns | 0.65 ns .. 0.65 ns | per elem |
| negate | binary-u.122-gls | gf2_122-gls-u | per-element | 0.65 ns | 0.65 ns .. 0.65 ns | per elem |
| negate | binary-w.122-gls | gf2_122-gls-w | per-element | 0.65 ns | 0.65 ns .. 0.65 ns | per elem |
| negate | binary-lambda.122 | gf2_122-lambda | per-element | 0.65 ns | 0.65 ns .. 0.65 ns | per elem |
| negate | binary-u.122 | gf2_122-u | per-element | 0.65 ns | 0.65 ns .. 0.65 ns | per elem |
| negate | binary-w.122 | gf2_122-w | per-element | 0.65 ns | 0.65 ns .. 0.65 ns | per elem |
| negate | binary.127 | gf2_127 | per-element | 1.08 ns | 1.08 ns .. 1.09 ns | per elem |
| negate | gf2_127/affine (y += x) | gf2_127 | per-element | 0.64 ns | 0.64 ns .. 0.64 ns | per elem |
| negate | binary-lambda.127 | gf2_127-lambda | per-element | 0.65 ns | 0.65 ns .. 0.65 ns | per elem |
| negate | binary-u.127 | gf2_127-u | per-element | 0.64 ns | 0.63 ns .. 0.64 ns | per elem |
| negate | binary-w.127 | gf2_127-w | per-element | 0.65 ns | 0.65 ns .. 0.65 ns | per elem |
| negate | edwards.107 | edwards107 | per-element | 0.83 ns | 0.82 ns .. 0.83 ns | per elem |
| negate | edwards107/extended (-X, -T) | edwards107 | per-element | 1.02 ns | 1.02 ns .. 1.02 ns | per elem |
| negate | edwards.127 | edwards127 | per-element | 1.34 ns | 1.33 ns .. 1.34 ns | per elem |
| negate | edwards127/extended (-X, -T) | edwards127 | per-element | 1.44 ns | 1.43 ns .. 1.45 ns | per elem |
| negate | edwards.61x2 | edwards61x2 | per-element | 0.88 ns | 0.88 ns .. 0.88 ns | per elem |
| negate | twisted.goldilocks2 | twisted-goldilocks2 | per-element | 1.49 ns | 1.48 ns .. 1.49 ns | per elem |
| negate | twisted.128 | twisted128 | per-element | 0.85 ns | 0.85 ns .. 0.86 ns | per elem |
| negate | twisted.61x2 | twisted61x2 | per-element | 0.91 ns | 0.90 ns .. 0.92 ns | per elem |
| negate | twisted.64x2 | twisted64x2 | per-element | 0.91 ns | 0.90 ns .. 0.91 ns | per elem |
| negate | weier.107 | weier107 | per-element | 0.58 ns | 0.58 ns .. 0.58 ns | per elem |
| negate | weier107/projective (-Y) | weier107 | per-element | 0.80 ns | 0.80 ns .. 0.80 ns | per elem |
| negate | weier-jacobian.107 | weier107-jacobian | per-element | 0.58 ns | 0.58 ns .. 0.58 ns | per elem |
| negate | weier.127 | weier127 | per-element | 0.69 ns | 0.69 ns .. 0.69 ns | per elem |
| negate | weier127/projective (-Y) | weier127 | per-element | 0.93 ns | 0.92 ns .. 0.93 ns | per elem |
| negate | weier-jacobian.127 | weier127-jacobian | per-element | 0.69 ns | 0.69 ns .. 0.69 ns | per elem |
| negate | weier.61x2 | weier61x2 | per-element | 0.66 ns | 0.66 ns .. 0.66 ns | per elem |
| negate | weier-jacobian.61x2 | weier61x2-jacobian | per-element | 0.66 ns | 0.66 ns .. 0.66 ns | per elem |
| negate | ristretto255/-P | ristretto255 | per-element | 6.20 ns | 6.17 ns .. 6.22 ns | per elem |
| negate | secp256k1/PublicKey::negate | secp256k1 | per-element | 12.8 ns | 12.7 ns .. 12.9 ns | per elem |
| is identity | binary.109 | gf2_109 | per-element | 0.64 ns | 0.63 ns .. 0.64 ns | per elem |
| is identity | binary-lambda.109 | gf2_109-lambda | per-element | 0.56 ns | 0.55 ns .. 0.56 ns | per elem |
| is identity | binary-u.109 | gf2_109-u | per-element | 0.56 ns | 0.55 ns .. 0.56 ns | per elem |
| is identity | binary-w.109 | gf2_109-w | per-element | 0.56 ns | 0.56 ns .. 0.56 ns | per elem |
| is identity | binary.122 | gf2_122 | per-element | 0.77 ns | 0.77 ns .. 0.78 ns | per elem |
| is identity | binary.122-gls | gf2_122-gls | per-element | 0.77 ns | 0.77 ns .. 0.77 ns | per elem |
| is identity | binary-lambda.122-gls | gf2_122-gls-lambda | per-element | 0.78 ns | 0.77 ns .. 0.78 ns | per elem |
| is identity | binary-u.122-gls | gf2_122-gls-u | per-element | 0.78 ns | 0.77 ns .. 0.78 ns | per elem |
| is identity | binary-w.122-gls | gf2_122-gls-w | per-element | 0.78 ns | 0.77 ns .. 0.78 ns | per elem |
| is identity | binary-lambda.122 | gf2_122-lambda | per-element | 0.77 ns | 0.77 ns .. 0.78 ns | per elem |
| is identity | binary-u.122 | gf2_122-u | per-element | 0.77 ns | 0.77 ns .. 0.78 ns | per elem |
| is identity | binary-w.122 | gf2_122-w | per-element | 0.77 ns | 0.77 ns .. 0.78 ns | per elem |
| is identity | binary.127 | gf2_127 | per-element | 0.81 ns | 0.81 ns .. 0.81 ns | per elem |
| is identity | binary-lambda.127 | gf2_127-lambda | per-element | 0.84 ns | 0.84 ns .. 0.84 ns | per elem |
| is identity | binary-u.127 | gf2_127-u | per-element | 0.84 ns | 0.84 ns .. 0.84 ns | per elem |
| is identity | binary-w.127 | gf2_127-w | per-element | 0.84 ns | 0.84 ns .. 0.84 ns | per elem |
| is identity | edwards.107 | edwards107 | per-element | 0.75 ns | 0.74 ns .. 0.75 ns | per elem |
| is identity | edwards.127 | edwards127 | per-element | 0.38 ns | 0.38 ns .. 0.38 ns | per elem |
| is identity | edwards.61x2 | edwards61x2 | per-element | 0.38 ns | 0.38 ns .. 0.38 ns | per elem |
| is identity | twisted.goldilocks2 | twisted-goldilocks2 | per-element | 0.52 ns | 0.52 ns .. 0.53 ns | per elem |
| is identity | twisted.128 | twisted128 | per-element | 0.34 ns | 0.34 ns .. 0.35 ns | per elem |
| is identity | twisted.61x2 | twisted61x2 | per-element | 0.34 ns | 0.34 ns .. 0.35 ns | per elem |
| is identity | twisted.64x2 | twisted64x2 | per-element | 0.34 ns | 0.34 ns .. 0.35 ns | per elem |
| is identity | weier.107 | weier107 | per-element | 0.84 ns | 0.84 ns .. 0.84 ns | per elem |
| is identity | weier-jacobian.107 | weier107-jacobian | per-element | 0.84 ns | 0.84 ns .. 0.84 ns | per elem |
| is identity | weier.127 | weier127 | per-element | 0.34 ns | 0.34 ns .. 0.34 ns | per elem |
| is identity | weier-jacobian.127 | weier127-jacobian | per-element | 0.34 ns | 0.34 ns .. 0.34 ns | per elem |
| is identity | weier.61x2 | weier61x2 | per-element | 0.52 ns | 0.52 ns .. 0.53 ns | per elem |
| is identity | weier-jacobian.61x2 | weier61x2-jacobian | per-element | 0.52 ns | 0.52 ns .. 0.53 ns | per elem |
| equals addend | binary.109/mode=match | gf2_109 | match | 2.24 ns | 2.23 ns .. 2.26 ns | per elem |
| equals addend | binary.109/mode=mismatch | gf2_109 | mismatch | 2.28 ns | 2.28 ns .. 2.29 ns | per elem |
| equals addend | binary-lambda.109/mode=match | gf2_109-lambda | match | 1.60 ns | 1.60 ns .. 1.61 ns | per elem |
| equals addend | binary-lambda.109/mode=mismatch | gf2_109-lambda | mismatch | 1.60 ns | 1.60 ns .. 1.60 ns | per elem |
| equals addend | binary-u.109/mode=match | gf2_109-u | match | 3.46 ns | 3.46 ns .. 3.47 ns | per elem |
| equals addend | binary-u.109/mode=mismatch | gf2_109-u | mismatch | 3.50 ns | 3.48 ns .. 3.53 ns | per elem |
| equals addend | binary-w.109/mode=match | gf2_109-w | match | 1.82 ns | 1.81 ns .. 1.82 ns | per elem |
| equals addend | binary-w.109/mode=mismatch | gf2_109-w | mismatch | 1.82 ns | 1.82 ns .. 1.82 ns | per elem |
| equals addend | binary.122/mode=mismatch | gf2_122 | mismatch | 3.75 ns | 3.73 ns .. 3.76 ns | per elem |
| equals addend | binary.122-gls/mode=mismatch | gf2_122-gls | mismatch | 3.79 ns | 3.78 ns .. 3.79 ns | per elem |
| equals addend | binary-lambda.122-gls/mode=match | gf2_122-gls-lambda | match | 3.79 ns | 3.78 ns .. 3.80 ns | per elem |
| equals addend | binary-lambda.122-gls/mode=mismatch | gf2_122-gls-lambda | mismatch | 3.79 ns | 3.79 ns .. 3.80 ns | per elem |
| equals addend | binary-u.122-gls/mode=match | gf2_122-gls-u | match | 5.32 ns | 5.30 ns .. 5.33 ns | per elem |
| equals addend | binary-u.122-gls/mode=mismatch | gf2_122-gls-u | mismatch | 5.31 ns | 5.30 ns .. 5.32 ns | per elem |
| equals addend | binary-w.122-gls/mode=match | gf2_122-gls-w | match | 3.79 ns | 3.78 ns .. 3.80 ns | per elem |
| equals addend | binary-w.122-gls/mode=mismatch | gf2_122-gls-w | mismatch | 3.79 ns | 3.78 ns .. 3.79 ns | per elem |
| equals addend | binary-lambda.122/mode=match | gf2_122-lambda | match | 3.78 ns | 3.77 ns .. 3.79 ns | per elem |
| equals addend | binary-lambda.122/mode=mismatch | gf2_122-lambda | mismatch | 3.79 ns | 3.79 ns .. 3.80 ns | per elem |
| equals addend | binary-u.122/mode=match | gf2_122-u | match | 5.31 ns | 5.30 ns .. 5.32 ns | per elem |
| equals addend | binary-u.122/mode=mismatch | gf2_122-u | mismatch | 5.34 ns | 5.32 ns .. 5.36 ns | per elem |
| equals addend | binary-w.122/mode=match | gf2_122-w | match | 3.77 ns | 3.77 ns .. 3.78 ns | per elem |
| equals addend | binary-w.122/mode=mismatch | gf2_122-w | mismatch | 3.79 ns | 3.78 ns .. 3.79 ns | per elem |
| equals addend | binary.127/mode=match | gf2_127 | match | 2.98 ns | 2.97 ns .. 2.99 ns | per elem |
| equals addend | binary.127/mode=mismatch | gf2_127 | mismatch | 2.87 ns | 2.87 ns .. 2.88 ns | per elem |
| equals addend | binary-lambda.127/mode=match | gf2_127-lambda | match | 3.84 ns | 3.83 ns .. 3.85 ns | per elem |
| equals addend | binary-lambda.127/mode=mismatch | gf2_127-lambda | mismatch | 3.81 ns | 3.79 ns .. 3.82 ns | per elem |
| equals addend | binary-u.127/mode=match | gf2_127-u | match | 4.67 ns | 4.66 ns .. 4.68 ns | per elem |
| equals addend | binary-u.127/mode=mismatch | gf2_127-u | mismatch | 4.68 ns | 4.68 ns .. 4.69 ns | per elem |
| equals addend | binary-w.127/mode=match | gf2_127-w | match | 3.86 ns | 3.84 ns .. 3.89 ns | per elem |
| equals addend | binary-w.127/mode=mismatch | gf2_127-w | mismatch | 3.84 ns | 3.83 ns .. 3.84 ns | per elem |
| equals addend | edwards.107/mode=mismatch | edwards107 | mismatch | 3.05 ns | 3.04 ns .. 3.06 ns | per elem |
| equals addend | edwards.127/mode=mismatch | edwards127 | mismatch | 1.97 ns | 1.97 ns .. 1.98 ns | per elem |
| equals addend | edwards.61x2/mode=mismatch | edwards61x2 | mismatch | 1.65 ns | 1.64 ns .. 1.66 ns | per elem |
| equals addend | twisted.goldilocks2/mode=mismatch | twisted-goldilocks2 | mismatch | 4.92 ns | 4.89 ns .. 4.95 ns | per elem |
| equals addend | twisted.128/mode=mismatch | twisted128 | mismatch | 7.51 ns | 7.49 ns .. 7.53 ns | per elem |
| equals addend | twisted.61x2/mode=match | twisted61x2 | match | 3.32 ns | 3.31 ns .. 3.33 ns | per elem |
| equals addend | twisted.61x2/mode=mismatch | twisted61x2 | mismatch | 3.32 ns | 3.31 ns .. 3.32 ns | per elem |
| equals addend | twisted.64x2/mode=mismatch | twisted64x2 | mismatch | 5.39 ns | 5.37 ns .. 5.40 ns | per elem |
| equals addend | weier.107/mode=mismatch | weier107 | mismatch | 3.63 ns | 3.62 ns .. 3.64 ns | per elem |
| equals addend | weier-jacobian.107/mode=mismatch | weier107-jacobian | mismatch | 5.96 ns | 5.95 ns .. 5.98 ns | per elem |
| equals addend | weier.127/mode=mismatch | weier127 | mismatch | 2.05 ns | 2.04 ns .. 2.06 ns | per elem |
| equals addend | weier-jacobian.127/mode=mismatch | weier127-jacobian | mismatch | 4.53 ns | 4.52 ns .. 4.54 ns | per elem |
| equals addend | weier.61x2/mode=mismatch | weier61x2 | mismatch | 1.70 ns | 1.69 ns .. 1.71 ns | per elem |
| equals addend | weier-jacobian.61x2/mode=mismatch | weier61x2-jacobian | mismatch | 3.59 ns | 3.57 ns .. 3.62 ns | per elem |
| encode | binary.109/mode=batch,n=1024 | gf2_109 | batch | 10.9 ns | 10.9 ns .. 11.0 ns | per elem |
| encode | binary.109/mode=batch,n=64 | gf2_109 | batch | 20.3 ns | 20.3 ns .. 20.4 ns | per elem |
| encode | binary.109/mode=batch,n=8 | gf2_109 | batch | 76.6 ns | 76.4 ns .. 76.8 ns | per elem |
| encode | binary.109/mode=indep | gf2_109 | per-element | 381 ns | 381 ns .. 382 ns | per elem |
| encode | binary-lambda.109/mode=batch,n=1024 | gf2_109-lambda | batch | 8.13 ns | 8.12 ns .. 8.15 ns | per elem |
| encode | binary-lambda.109/mode=batch,n=64 | gf2_109-lambda | batch | 17.5 ns | 17.4 ns .. 17.5 ns | per elem |
| encode | binary-lambda.109/mode=batch,n=8 | gf2_109-lambda | batch | 73.3 ns | 73.1 ns .. 73.5 ns | per elem |
| encode | binary-lambda.109/mode=indep | gf2_109-lambda | per-element | 366 ns | 364 ns .. 368 ns | per elem |
| encode | binary-u.109/mode=batch,n=1024 | gf2_109-u | batch | 9.88 ns | 9.84 ns .. 9.92 ns | per elem |
| encode | binary-u.109/mode=batch,n=64 | gf2_109-u | batch | 19.1 ns | 19.0 ns .. 19.1 ns | per elem |
| encode | binary-u.109/mode=batch,n=8 | gf2_109-u | batch | 74.5 ns | 74.3 ns .. 74.8 ns | per elem |
| encode | binary-u.109/mode=indep | gf2_109-u | per-element | 397 ns | 394 ns .. 401 ns | per elem |
| encode | binary-w.109/mode=batch,n=1024 | gf2_109-w | batch | 10.4 ns | 10.3 ns .. 10.4 ns | per elem |
| encode | binary-w.109/mode=batch,n=64 | gf2_109-w | batch | 19.7 ns | 19.7 ns .. 19.7 ns | per elem |
| encode | binary-w.109/mode=batch,n=8 | gf2_109-w | batch | 76.3 ns | 76.1 ns .. 76.5 ns | per elem |
| encode | binary-w.109/mode=indep | gf2_109-w | per-element | 359 ns | 357 ns .. 361 ns | per elem |
| encode | binary.122/mode=batch,n=1024 | gf2_122 | batch | 15.7 ns | 15.6 ns .. 15.7 ns | per elem |
| encode | binary.122/mode=indep | gf2_122 | per-element | 211 ns | 210 ns .. 212 ns | per elem |
| encode | binary.122-gls/mode=batch,n=1024 | gf2_122-gls | batch | 15.2 ns | 15.2 ns .. 15.2 ns | per elem |
| encode | binary.122-gls/mode=indep | gf2_122-gls | per-element | 209 ns | 208 ns .. 209 ns | per elem |
| encode | binary-lambda.122-gls/mode=batch,n=1024 | gf2_122-gls-lambda | batch | 11.6 ns | 11.6 ns .. 11.6 ns | per elem |
| encode | binary-lambda.122-gls/mode=batch,n=64 | gf2_122-gls-lambda | batch | 17.7 ns | 17.7 ns .. 17.7 ns | per elem |
| encode | binary-lambda.122-gls/mode=batch,n=8 | gf2_122-gls-lambda | batch | 53.2 ns | 53.1 ns .. 53.4 ns | per elem |
| encode | binary-lambda.122-gls/mode=indep | gf2_122-gls-lambda | per-element | 189 ns | 189 ns .. 190 ns | per elem |
| encode | binary-u.122-gls/mode=batch,n=1024 | gf2_122-gls-u | batch | 12.3 ns | 12.3 ns .. 12.3 ns | per elem |
| encode | binary-u.122-gls/mode=batch,n=64 | gf2_122-gls-u | batch | 18.1 ns | 18.1 ns .. 18.2 ns | per elem |
| encode | binary-u.122-gls/mode=batch,n=8 | gf2_122-gls-u | batch | 51.2 ns | 51.1 ns .. 51.3 ns | per elem |
| encode | binary-u.122-gls/mode=indep | gf2_122-gls-u | per-element | 195 ns | 195 ns .. 196 ns | per elem |
| encode | binary-w.122-gls/mode=batch,n=1024 | gf2_122-gls-w | batch | 14.4 ns | 14.4 ns .. 14.5 ns | per elem |
| encode | binary-w.122-gls/mode=batch,n=64 | gf2_122-gls-w | batch | 20.6 ns | 20.6 ns .. 20.7 ns | per elem |
| encode | binary-w.122-gls/mode=batch,n=8 | gf2_122-gls-w | batch | 55.5 ns | 55.4 ns .. 55.6 ns | per elem |
| encode | binary-w.122-gls/mode=indep | gf2_122-gls-w | per-element | 204 ns | 204 ns .. 205 ns | per elem |
| encode | binary-lambda.122/mode=batch,n=1024 | gf2_122-lambda | batch | 11.9 ns | 11.9 ns .. 11.9 ns | per elem |
| encode | binary-lambda.122/mode=batch,n=64 | gf2_122-lambda | batch | 17.8 ns | 17.8 ns .. 17.8 ns | per elem |
| encode | binary-lambda.122/mode=batch,n=8 | gf2_122-lambda | batch | 52.8 ns | 52.6 ns .. 52.9 ns | per elem |
| encode | binary-lambda.122/mode=indep | gf2_122-lambda | per-element | 189 ns | 189 ns .. 189 ns | per elem |
| encode | binary-u.122/mode=batch,n=1024 | gf2_122-u | batch | 12.1 ns | 12.0 ns .. 12.1 ns | per elem |
| encode | binary-u.122/mode=batch,n=64 | gf2_122-u | batch | 18.1 ns | 18.0 ns .. 18.1 ns | per elem |
| encode | binary-u.122/mode=batch,n=8 | gf2_122-u | batch | 50.6 ns | 50.5 ns .. 50.7 ns | per elem |
| encode | binary-u.122/mode=indep | gf2_122-u | per-element | 206 ns | 206 ns .. 207 ns | per elem |
| encode | binary-w.122/mode=batch,n=1024 | gf2_122-w | batch | 14.4 ns | 14.4 ns .. 14.5 ns | per elem |
| encode | binary-w.122/mode=batch,n=64 | gf2_122-w | batch | 20.6 ns | 20.6 ns .. 20.6 ns | per elem |
| encode | binary-w.122/mode=batch,n=8 | gf2_122-w | batch | 55.6 ns | 55.4 ns .. 55.7 ns | per elem |
| encode | binary-w.122/mode=indep | gf2_122-w | per-element | 204 ns | 204 ns .. 205 ns | per elem |
| encode | binary.127/mode=batch,n=1024 | gf2_127 | batch | 13.1 ns | 13.0 ns .. 13.2 ns | per elem |
| encode | binary.127/mode=batch,n=64 | gf2_127 | batch | 21.7 ns | 21.7 ns .. 21.8 ns | per elem |
| encode | binary.127/mode=batch,n=8 | gf2_127 | batch | 71.6 ns | 71.4 ns .. 71.8 ns | per elem |
| encode | binary.127/mode=indep | gf2_127 | per-element | 371 ns | 370 ns .. 372 ns | per elem |
| encode | binary-lambda.127/mode=batch,n=1024 | gf2_127-lambda | batch | 10.1 ns | 10.1 ns .. 10.2 ns | per elem |
| encode | binary-lambda.127/mode=batch,n=64 | gf2_127-lambda | batch | 18.4 ns | 18.3 ns .. 18.4 ns | per elem |
| encode | binary-lambda.127/mode=batch,n=8 | gf2_127-lambda | batch | 68.2 ns | 68.0 ns .. 68.3 ns | per elem |
| encode | binary-lambda.127/mode=indep | gf2_127-lambda | per-element | 361 ns | 360 ns .. 362 ns | per elem |
| encode | binary-u.127/mode=batch,n=1024 | gf2_127-u | batch | 9.17 ns | 9.15 ns .. 9.20 ns | per elem |
| encode | binary-u.127/mode=batch,n=64 | gf2_127-u | batch | 17.2 ns | 17.1 ns .. 17.2 ns | per elem |
| encode | binary-u.127/mode=batch,n=8 | gf2_127-u | batch | 65.7 ns | 65.5 ns .. 65.9 ns | per elem |
| encode | binary-u.127/mode=indep | gf2_127-u | per-element | 355 ns | 354 ns .. 355 ns | per elem |
| encode | binary-w.127/mode=batch,n=1024 | gf2_127-w | batch | 10.3 ns | 10.3 ns .. 10.3 ns | per elem |
| encode | binary-w.127/mode=batch,n=64 | gf2_127-w | batch | 18.6 ns | 18.6 ns .. 18.6 ns | per elem |
| encode | binary-w.127/mode=batch,n=8 | gf2_127-w | batch | 67.8 ns | 67.7 ns .. 68.0 ns | per elem |
| encode | binary-w.127/mode=indep | gf2_127-w | per-element | 361 ns | 360 ns .. 361 ns | per elem |
| encode | edwards.107/mode=batch,n=1024 | edwards107 | batch | 20.3 ns | 20.2 ns .. 20.3 ns | per elem |
| encode | edwards.107/mode=indep | edwards107 | per-element | 506 ns | 505 ns .. 507 ns | per elem |
| encode | edwards.127/mode=batch,n=1024 | edwards127 | batch | 22.0 ns | 21.9 ns .. 22.0 ns | per elem |
| encode | edwards.127/mode=indep | edwards127 | per-element | 549 ns | 548 ns .. 551 ns | per elem |
| encode | edwards.61x2/mode=batch,n=1024 | edwards61x2 | batch | 16.2 ns | 16.2 ns .. 16.3 ns | per elem |
| encode | edwards.61x2/mode=indep | edwards61x2 | per-element | 181 ns | 180 ns .. 181 ns | per elem |
| encode | twisted.goldilocks2/mode=batch,n=1024 | twisted-goldilocks2 | batch | 11.3 ns | 11.2 ns .. 11.3 ns | per elem |
| encode | twisted.goldilocks2/mode=indep | twisted-goldilocks2 | per-element | 197 ns | 194 ns .. 201 ns | per elem |
| encode | twisted.128/mode=batch,n=1024 | twisted128 | batch | 16.0 ns | 16.0 ns .. 16.0 ns | per elem |
| encode | twisted.128/mode=indep | twisted128 | per-element | 939 ns | 937 ns .. 941 ns | per elem |
| encode | twisted.61x2/mode=batch,n=1024 | twisted61x2 | batch | 8.07 ns | 8.05 ns .. 8.09 ns | per elem |
| encode | twisted.61x2/mode=batch,n=64 | twisted61x2 | batch | 13.8 ns | 13.8 ns .. 13.9 ns | per elem |
| encode | twisted.61x2/mode=batch,n=8 | twisted61x2 | batch | 45.4 ns | 45.3 ns .. 45.5 ns | per elem |
| encode | twisted.61x2/mode=indep | twisted61x2 | per-element | 179 ns | 178 ns .. 179 ns | per elem |
| encode | twisted.64x2/mode=batch,n=1024 | twisted64x2 | batch | 10.3 ns | 10.3 ns .. 10.4 ns | per elem |
| encode | twisted.64x2/mode=indep | twisted64x2 | per-element | 290 ns | 290 ns .. 291 ns | per elem |
| encode | weier.107/mode=batch,n=1024 | weier107 | batch | 11.5 ns | 11.5 ns .. 11.5 ns | per elem |
| encode | weier.107/mode=indep | weier107 | per-element | 497 ns | 496 ns .. 498 ns | per elem |
| encode | weier-jacobian.107/mode=batch,n=1024 | weier107-jacobian | batch | 15.3 ns | 15.3 ns .. 15.3 ns | per elem |
| encode | weier-jacobian.107/mode=indep | weier107-jacobian | per-element | 502 ns | 501 ns .. 503 ns | per elem |
| encode | weier.127/mode=batch,n=1024 | weier127 | batch | 10.1 ns | 10.1 ns .. 10.1 ns | per elem |
| encode | weier.127/mode=indep | weier127 | per-element | 536 ns | 534 ns .. 537 ns | per elem |
| encode | weier-jacobian.127/mode=batch,n=1024 | weier127-jacobian | batch | 15.7 ns | 15.7 ns .. 15.7 ns | per elem |
| encode | weier-jacobian.127/mode=indep | weier127-jacobian | per-element | 533 ns | 530 ns .. 536 ns | per elem |
| encode | weier.61x2/mode=batch,n=1024 | weier61x2 | batch | 8.11 ns | 8.09 ns .. 8.12 ns | per elem |
| encode | weier.61x2/mode=indep | weier61x2 | per-element | 170 ns | 169 ns .. 170 ns | per elem |
| encode | weier-jacobian.61x2/mode=batch,n=1024 | weier61x2-jacobian | batch | 11.7 ns | 11.7 ns .. 11.7 ns | per elem |
| encode | weier-jacobian.61x2/mode=indep | weier61x2-jacobian | per-element | 179 ns | 179 ns .. 180 ns | per elem |
| decode | binary.109/mode=batch,n=1024 | gf2_109 | batch | 14.2 ns | 14.2 ns .. 14.2 ns | per elem |
| decode | binary.109/mode=batch,n=64 | gf2_109 | batch | 23.5 ns | 23.4 ns .. 23.6 ns | per elem |
| decode | binary.109/mode=batch,n=8 | gf2_109 | batch | 82.3 ns | 82.1 ns .. 82.5 ns | per elem |
| decode | binary.109/mode=indep | gf2_109 | per-element | 380 ns | 379 ns .. 381 ns | per elem |
| decode | binary-lambda.109/mode=batch,n=1024 | gf2_109-lambda | batch | 14.1 ns | 14.1 ns .. 14.2 ns | per elem |
| decode | binary-lambda.109/mode=batch,n=64 | gf2_109-lambda | batch | 23.6 ns | 23.5 ns .. 23.7 ns | per elem |
| decode | binary-lambda.109/mode=batch,n=8 | gf2_109-lambda | batch | 82.3 ns | 82.1 ns .. 82.6 ns | per elem |
| decode | binary-lambda.109/mode=indep | gf2_109-lambda | per-element | 381 ns | 381 ns .. 382 ns | per elem |
| decode | binary-u.109/mode=batch,n=1024 | gf2_109-u | batch | 18.4 ns | 18.4 ns .. 18.4 ns | per elem |
| decode | binary-u.109/mode=batch,n=64 | gf2_109-u | batch | 26.7 ns | 26.6 ns .. 26.9 ns | per elem |
| decode | binary-u.109/mode=batch,n=8 | gf2_109-u | batch | 87.4 ns | 87.2 ns .. 87.6 ns | per elem |
| decode | binary-u.109/mode=indep | gf2_109-u | per-element | 398 ns | 397 ns .. 400 ns | per elem |
| decode | binary-w.109/mode=batch,n=1024 | gf2_109-w | batch | 15.5 ns | 15.4 ns .. 15.5 ns | per elem |
| decode | binary-w.109/mode=batch,n=64 | gf2_109-w | batch | 24.4 ns | 24.4 ns .. 24.5 ns | per elem |
| decode | binary-w.109/mode=batch,n=8 | gf2_109-w | batch | 83.9 ns | 83.7 ns .. 84.1 ns | per elem |
| decode | binary-w.109/mode=indep | gf2_109-w | per-element | 378 ns | 377 ns .. 379 ns | per elem |
| decode | binary.122/mode=batch,n=1024 | gf2_122 | batch | 13.5 ns | 13.5 ns .. 13.5 ns | per elem |
| decode | binary.122/mode=indep | gf2_122 | per-element | 197 ns | 196 ns .. 197 ns | per elem |
| decode | binary.122-gls/mode=batch,n=1024 | gf2_122-gls | batch | 13.2 ns | 13.2 ns .. 13.2 ns | per elem |
| decode | binary.122-gls/mode=indep | gf2_122-gls | per-element | 195 ns | 194 ns .. 195 ns | per elem |
| decode | binary-lambda.122-gls/mode=batch,n=1024 | gf2_122-gls-lambda | batch | 13.2 ns | 13.2 ns .. 13.2 ns | per elem |
| decode | binary-lambda.122-gls/mode=batch,n=64 | gf2_122-gls-lambda | batch | 19.4 ns | 19.4 ns .. 19.5 ns | per elem |
| decode | binary-lambda.122-gls/mode=batch,n=8 | gf2_122-gls-lambda | batch | 57.7 ns | 57.6 ns .. 57.9 ns | per elem |
| decode | binary-lambda.122-gls/mode=indep | gf2_122-gls-lambda | per-element | 187 ns | 187 ns .. 188 ns | per elem |
| decode | binary-u.122-gls/mode=batch,n=1024 | gf2_122-gls-u | batch | 16.8 ns | 16.8 ns .. 16.8 ns | per elem |
| decode | binary-u.122-gls/mode=batch,n=64 | gf2_122-gls-u | batch | 22.6 ns | 22.5 ns .. 22.6 ns | per elem |
| decode | binary-u.122-gls/mode=batch,n=8 | gf2_122-gls-u | batch | 62.1 ns | 61.9 ns .. 62.4 ns | per elem |
| decode | binary-u.122-gls/mode=indep | gf2_122-gls-u | per-element | 207 ns | 206 ns .. 207 ns | per elem |
| decode | binary-w.122-gls/mode=batch,n=1024 | gf2_122-gls-w | batch | 14.3 ns | 14.3 ns .. 14.3 ns | per elem |
| decode | binary-w.122-gls/mode=batch,n=64 | gf2_122-gls-w | batch | 20.1 ns | 20.0 ns .. 20.1 ns | per elem |
| decode | binary-w.122-gls/mode=batch,n=8 | gf2_122-gls-w | batch | 58.4 ns | 58.3 ns .. 58.5 ns | per elem |
| decode | binary-w.122-gls/mode=indep | gf2_122-gls-w | per-element | 191 ns | 191 ns .. 191 ns | per elem |
| decode | binary-lambda.122/mode=batch,n=1024 | gf2_122-lambda | batch | 13.5 ns | 13.5 ns .. 13.5 ns | per elem |
| decode | binary-lambda.122/mode=batch,n=64 | gf2_122-lambda | batch | 19.8 ns | 19.8 ns .. 19.8 ns | per elem |
| decode | binary-lambda.122/mode=batch,n=8 | gf2_122-lambda | batch | 57.4 ns | 57.1 ns .. 57.6 ns | per elem |
| decode | binary-lambda.122/mode=indep | gf2_122-lambda | per-element | 196 ns | 195 ns .. 196 ns | per elem |
| decode | binary-u.122/mode=batch,n=1024 | gf2_122-u | batch | 18.7 ns | 18.7 ns .. 18.8 ns | per elem |
| decode | binary-u.122/mode=batch,n=64 | gf2_122-u | batch | 25.2 ns | 25.2 ns .. 25.3 ns | per elem |
| decode | binary-u.122/mode=batch,n=8 | gf2_122-u | batch | 65.6 ns | 65.4 ns .. 65.8 ns | per elem |
| decode | binary-u.122/mode=indep | gf2_122-u | per-element | 223 ns | 222 ns .. 223 ns | per elem |
| decode | binary-w.122/mode=batch,n=1024 | gf2_122-w | batch | 14.4 ns | 14.4 ns .. 14.5 ns | per elem |
| decode | binary-w.122/mode=batch,n=64 | gf2_122-w | batch | 20.6 ns | 20.6 ns .. 20.7 ns | per elem |
| decode | binary-w.122/mode=batch,n=8 | gf2_122-w | batch | 59.0 ns | 58.9 ns .. 59.2 ns | per elem |
| decode | binary-w.122/mode=indep | gf2_122-w | per-element | 193 ns | 192 ns .. 193 ns | per elem |
| decode | binary.127/mode=batch,n=1024 | gf2_127 | batch | 14.0 ns | 14.0 ns .. 14.0 ns | per elem |
| decode | binary.127/mode=batch,n=64 | gf2_127 | batch | 22.1 ns | 22.1 ns .. 22.1 ns | per elem |
| decode | binary.127/mode=batch,n=8 | gf2_127 | batch | 76.4 ns | 76.3 ns .. 76.6 ns | per elem |
| decode | binary.127/mode=indep | gf2_127 | per-element | 367 ns | 366 ns .. 368 ns | per elem |
| decode | binary-lambda.127/mode=batch,n=1024 | gf2_127-lambda | batch | 14.0 ns | 14.0 ns .. 14.0 ns | per elem |
| decode | binary-lambda.127/mode=batch,n=64 | gf2_127-lambda | batch | 22.1 ns | 22.1 ns .. 22.1 ns | per elem |
| decode | binary-lambda.127/mode=batch,n=8 | gf2_127-lambda | batch | 76.3 ns | 76.1 ns .. 76.6 ns | per elem |
| decode | binary-lambda.127/mode=indep | gf2_127-lambda | per-element | 364 ns | 364 ns .. 365 ns | per elem |
| decode | binary-u.127/mode=batch,n=1024 | gf2_127-u | batch | 18.3 ns | 18.3 ns .. 18.4 ns | per elem |
| decode | binary-u.127/mode=batch,n=64 | gf2_127-u | batch | 26.9 ns | 26.9 ns .. 27.0 ns | per elem |
| decode | binary-u.127/mode=batch,n=8 | gf2_127-u | batch | 82.4 ns | 82.1 ns .. 82.6 ns | per elem |
| decode | binary-u.127/mode=indep | gf2_127-u | per-element | 376 ns | 375 ns .. 377 ns | per elem |
| decode | binary-w.127/mode=batch,n=1024 | gf2_127-w | batch | 15.1 ns | 15.1 ns .. 15.1 ns | per elem |
| decode | binary-w.127/mode=batch,n=64 | gf2_127-w | batch | 23.0 ns | 22.9 ns .. 23.0 ns | per elem |
| decode | binary-w.127/mode=batch,n=8 | gf2_127-w | batch | 78.2 ns | 78.0 ns .. 78.4 ns | per elem |
| decode | binary-w.127/mode=indep | gf2_127-w | per-element | 361 ns | 361 ns .. 362 ns | per elem |
| decode | edwards.107/mode=batch,n=1024 | edwards107 | batch | 354 ns | 353 ns .. 355 ns | per elem |
| decode | edwards.107/mode=indep | edwards107 | per-element | 359 ns | 359 ns .. 360 ns | per elem |
| decode | edwards.127/mode=batch,n=1024 | edwards127 | batch | 486 ns | 484 ns .. 488 ns | per elem |
| decode | edwards.127/mode=indep | edwards127 | per-element | 489 ns | 488 ns .. 490 ns | per elem |
| decode | edwards.61x2/mode=batch,n=1024 | edwards61x2 | batch | 404 ns | 403 ns .. 405 ns | per elem |
| decode | edwards.61x2/mode=indep | edwards61x2 | per-element | 405 ns | 404 ns .. 406 ns | per elem |
| decode | twisted.goldilocks2/mode=batch,n=1024 | twisted-goldilocks2 | batch | 1.52 µs | 1.51 µs .. 1.52 µs | per elem |
| decode | twisted.goldilocks2/mode=indep | twisted-goldilocks2 | per-element | 1.53 µs | 1.53 µs .. 1.54 µs | per elem |
| decode | twisted.128/mode=batch,n=1024 | twisted128 | batch | 952 ns | 948 ns .. 956 ns | per elem |
| decode | twisted.128/mode=indep | twisted128 | per-element | 949 ns | 946 ns .. 953 ns | per elem |
| decode | twisted.61x2/mode=batch,n=1024 | twisted61x2 | batch | 420 ns | 419 ns .. 421 ns | per elem |
| decode | twisted.61x2/mode=batch,n=64 | twisted61x2 | batch | 418 ns | 418 ns .. 419 ns | per elem |
| decode | twisted.61x2/mode=batch,n=8 | twisted61x2 | batch | 423 ns | 421 ns .. 424 ns | per elem |
| decode | twisted.61x2/mode=indep | twisted61x2 | per-element | 425 ns | 425 ns .. 426 ns | per elem |
| decode | twisted.64x2/mode=batch,n=1024 | twisted64x2 | batch | 718 ns | 717 ns .. 720 ns | per elem |
| decode | twisted.64x2/mode=indep | twisted64x2 | per-element | 721 ns | 719 ns .. 722 ns | per elem |
| decode | weier.107/mode=batch,n=1024 | weier107 | batch | 352 ns | 351 ns .. 353 ns | per elem |
| decode | weier.107/mode=indep | weier107 | per-element | 358 ns | 357 ns .. 358 ns | per elem |
| decode | weier-jacobian.107/mode=batch,n=1024 | weier107-jacobian | batch | 352 ns | 351 ns .. 352 ns | per elem |
| decode | weier-jacobian.107/mode=indep | weier107-jacobian | per-element | 351 ns | 350 ns .. 352 ns | per elem |
| decode | weier.127/mode=batch,n=1024 | weier127 | batch | 485 ns | 483 ns .. 487 ns | per elem |
| decode | weier.127/mode=indep | weier127 | per-element | 489 ns | 487 ns .. 490 ns | per elem |
| decode | weier-jacobian.127/mode=batch,n=1024 | weier127-jacobian | batch | 485 ns | 484 ns .. 487 ns | per elem |
| decode | weier-jacobian.127/mode=indep | weier127-jacobian | per-element | 492 ns | 490 ns .. 493 ns | per elem |
| decode | weier.61x2/mode=batch,n=1024 | weier61x2 | batch | 412 ns | 411 ns .. 413 ns | per elem |
| decode | weier.61x2/mode=indep | weier61x2 | per-element | 416 ns | 416 ns .. 417 ns | per elem |
| decode | weier-jacobian.61x2/mode=batch,n=1024 | weier61x2-jacobian | batch | 413 ns | 412 ns .. 414 ns | per elem |
| decode | weier-jacobian.61x2/mode=indep | weier61x2-jacobian | per-element | 417 ns | 415 ns .. 418 ns | per elem |
| normalize | gf2_109/normalize, batched | gf2_109 | batch | 9.75 ns | 9.74 ns .. 9.76 ns | per elem |
| normalize | gf2_122/normalize, batched | gf2_122 | batch | 14.2 ns | 14.2 ns .. 14.2 ns | per elem |
| normalize | gf2_122-gls/normalize, batched | gf2_122-gls | batch | 13.2 ns | 13.2 ns .. 13.3 ns | per elem |
| batch sum | gf2_109/batch affine (tree sum) | gf2_109 | batch | 14.9 ns | 14.9 ns .. 14.9 ns | per elem |
| batch sum | gf2_122/batch affine (tree sum) | gf2_122 | batch | 15.8 ns | 15.8 ns .. 15.8 ns | per elem |
| batch sum | gf2_127/batch affine (tree sum) | gf2_127 | batch | 16.0 ns | 16.0 ns .. 16.1 ns | per elem |
| batch sum | edwards107/batch montgomery affine (tree sum) | edwards107 | batch | 24.5 ns | 24.5 ns .. 24.5 ns | per elem |
| batch sum | edwards127/batch montgomery affine (tree sum) | edwards127 | batch | 30.3 ns | 30.2 ns .. 30.3 ns | per elem |
| batch sum | weier107/batch affine (tree sum) | weier107 | batch | 23.1 ns | 23.1 ns .. 23.1 ns | per elem |
| batch sum | weier127/batch affine (tree sum) | weier127 | batch | 28.6 ns | 28.5 ns .. 28.6 ns | per elem |
| batch sum | secp256k1/combine_keys (jacobian += affine) | secp256k1 | batch | 88.8 ns | 88.3 ns .. 89.3 ns | per elem |
hash to curve
Figure
242 benchmarks
| operation | benchmark | family | mode | time | 95% CI | unit |
|---|---|---|---|---|---|---|
| hash to curve | sha256 (XOR baseline) | xor | per-element | 24.2 ns | 23.9 ns .. 24.6 ns | per elem |
| hash to curve | binary.109/mode=batch,n=1024 | gf2_109 | batch | 81.7 ns | 81.4 ns .. 81.9 ns | per elem |
| hash to curve | binary.109/mode=batch,n=64 | gf2_109 | batch | 139 ns | 139 ns .. 139 ns | per elem |
| hash to curve | binary.109/mode=batch,n=8 | gf2_109 | batch | 360 ns | 359 ns .. 361 ns | per elem |
| hash to curve | binary.109/mode=indep | gf2_109 | per-element | 870 ns | 869 ns .. 871 ns | per elem |
| hash to curve | binary-lambda.109/mode=batch,n=1024 | gf2_109-lambda | batch | 82.0 ns | 81.9 ns .. 82.1 ns | per elem |
| hash to curve | binary-lambda.109/mode=batch,n=64 | gf2_109-lambda | batch | 139 ns | 138 ns .. 139 ns | per elem |
| hash to curve | binary-lambda.109/mode=batch,n=8 | gf2_109-lambda | batch | 360 ns | 359 ns .. 361 ns | per elem |
| hash to curve | binary-lambda.109/mode=indep | gf2_109-lambda | per-element | 873 ns | 871 ns .. 875 ns | per elem |
| hash to curve | binary-u.109/mode=batch,n=1024 | gf2_109-u | batch | 81.2 ns | 81.1 ns .. 81.4 ns | per elem |
| hash to curve | binary-u.109/mode=batch,n=64 | gf2_109-u | batch | 135 ns | 135 ns .. 135 ns | per elem |
| hash to curve | binary-u.109/mode=batch,n=8 | gf2_109-u | batch | 349 ns | 349 ns .. 350 ns | per elem |
| hash to curve | binary-u.109/mode=indep | gf2_109-u | per-element | 874 ns | 872 ns .. 875 ns | per elem |
| hash to curve | binary-w.109/mode=batch,n=1024 | gf2_109-w | batch | 79.4 ns | 79.3 ns .. 79.5 ns | per elem |
| hash to curve | binary-w.109/mode=batch,n=64 | gf2_109-w | batch | 131 ns | 131 ns .. 132 ns | per elem |
| hash to curve | binary-w.109/mode=batch,n=8 | gf2_109-w | batch | 346 ns | 345 ns .. 347 ns | per elem |
| hash to curve | binary-w.109/mode=indep | gf2_109-w | per-element | 855 ns | 854 ns .. 857 ns | per elem |
| hash to curve | binary.122/mode=batch,n=1024 | gf2_122 | batch | 74.9 ns | 74.8 ns .. 75.1 ns | per elem |
| hash to curve | binary.122/mode=indep | gf2_122 | per-element | 510 ns | 508 ns .. 511 ns | per elem |
| hash to curve | binary.122-gls/mode=batch,n=1024 | gf2_122-gls | batch | 74.7 ns | 74.5 ns .. 74.9 ns | per elem |
| hash to curve | binary.122-gls/mode=indep | gf2_122-gls | per-element | 535 ns | 534 ns .. 537 ns | per elem |
| hash to curve | binary-lambda.122-gls/mode=batch,n=1024 | gf2_122-gls-lambda | batch | 76.5 ns | 76.3 ns .. 76.6 ns | per elem |
| hash to curve | binary-lambda.122-gls/mode=batch,n=64 | gf2_122-gls-lambda | batch | 114 ns | 114 ns .. 114 ns | per elem |
| hash to curve | binary-lambda.122-gls/mode=batch,n=8 | gf2_122-gls-lambda | batch | 265 ns | 265 ns .. 266 ns | per elem |
| hash to curve | binary-lambda.122-gls/mode=indep | gf2_122-gls-lambda | per-element | 515 ns | 513 ns .. 517 ns | per elem |
| hash to curve | binary-u.122-gls/mode=batch,n=1024 | gf2_122-gls-u | batch | 80.2 ns | 80.1 ns .. 80.3 ns | per elem |
| hash to curve | binary-u.122-gls/mode=batch,n=64 | gf2_122-gls-u | batch | 117 ns | 116 ns .. 117 ns | per elem |
| hash to curve | binary-u.122-gls/mode=batch,n=8 | gf2_122-gls-u | batch | 258 ns | 257 ns .. 259 ns | per elem |
| hash to curve | binary-u.122-gls/mode=indep | gf2_122-gls-u | per-element | 522 ns | 521 ns .. 524 ns | per elem |
| hash to curve | binary-w.122-gls/mode=batch,n=1024 | gf2_122-gls-w | batch | 78.6 ns | 78.5 ns .. 78.8 ns | per elem |
| hash to curve | binary-w.122-gls/mode=batch,n=64 | gf2_122-gls-w | batch | 115 ns | 115 ns .. 115 ns | per elem |
| hash to curve | binary-w.122-gls/mode=batch,n=8 | gf2_122-gls-w | batch | 256 ns | 255 ns .. 256 ns | per elem |
| hash to curve | binary-w.122-gls/mode=indep | gf2_122-gls-w | per-element | 509 ns | 507 ns .. 511 ns | per elem |
| hash to curve | binary-lambda.122/mode=batch,n=1024 | gf2_122-lambda | batch | 74.9 ns | 74.8 ns .. 75.1 ns | per elem |
| hash to curve | binary-lambda.122/mode=batch,n=64 | gf2_122-lambda | batch | 110 ns | 110 ns .. 110 ns | per elem |
| hash to curve | binary-lambda.122/mode=batch,n=8 | gf2_122-lambda | batch | 249 ns | 248 ns .. 249 ns | per elem |
| hash to curve | binary-lambda.122/mode=indep | gf2_122-lambda | per-element | 509 ns | 507 ns .. 510 ns | per elem |
| hash to curve | binary-u.122/mode=batch,n=1024 | gf2_122-u | batch | 87.6 ns | 87.5 ns .. 87.7 ns | per elem |
| hash to curve | binary-u.122/mode=batch,n=64 | gf2_122-u | batch | 125 ns | 125 ns .. 126 ns | per elem |
| hash to curve | binary-u.122/mode=batch,n=8 | gf2_122-u | batch | 268 ns | 267 ns .. 268 ns | per elem |
| hash to curve | binary-u.122/mode=indep | gf2_122-u | per-element | 531 ns | 530 ns .. 532 ns | per elem |
| hash to curve | binary-w.122/mode=batch,n=1024 | gf2_122-w | batch | 76.8 ns | 76.6 ns .. 76.9 ns | per elem |
| hash to curve | binary-w.122/mode=batch,n=64 | gf2_122-w | batch | 114 ns | 113 ns .. 114 ns | per elem |
| hash to curve | binary-w.122/mode=batch,n=8 | gf2_122-w | batch | 257 ns | 257 ns .. 258 ns | per elem |
| hash to curve | binary-w.122/mode=indep | gf2_122-w | per-element | 517 ns | 516 ns .. 518 ns | per elem |
| hash to curve | binary.127/mode=batch,n=1024 | gf2_127 | batch | 72.9 ns | 72.9 ns .. 73.0 ns | per elem |
| hash to curve | binary.127/mode=batch,n=64 | gf2_127 | batch | 127 ns | 127 ns .. 127 ns | per elem |
| hash to curve | binary.127/mode=batch,n=8 | gf2_127 | batch | 322 ns | 320 ns .. 325 ns | per elem |
| hash to curve | binary.127/mode=indep | gf2_127 | per-element | 779 ns | 778 ns .. 781 ns | per elem |
| hash to curve | binary-lambda.127/mode=batch,n=1024 | gf2_127-lambda | batch | 75.6 ns | 75.5 ns .. 75.7 ns | per elem |
| hash to curve | binary-lambda.127/mode=batch,n=64 | gf2_127-lambda | batch | 127 ns | 126 ns .. 127 ns | per elem |
| hash to curve | binary-lambda.127/mode=batch,n=8 | gf2_127-lambda | batch | 318 ns | 317 ns .. 319 ns | per elem |
| hash to curve | binary-lambda.127/mode=indep | gf2_127-lambda | per-element | 806 ns | 804 ns .. 808 ns | per elem |
| hash to curve | binary-u.127/mode=batch,n=1024 | gf2_127-u | batch | 85.8 ns | 85.5 ns .. 86.1 ns | per elem |
| hash to curve | binary-u.127/mode=batch,n=64 | gf2_127-u | batch | 142 ns | 141 ns .. 142 ns | per elem |
| hash to curve | binary-u.127/mode=batch,n=8 | gf2_127-u | batch | 351 ns | 350 ns .. 352 ns | per elem |
| hash to curve | binary-u.127/mode=indep | gf2_127-u | per-element | 869 ns | 865 ns .. 874 ns | per elem |
| hash to curve | binary-w.127/mode=batch,n=1024 | gf2_127-w | batch | 83.3 ns | 83.2 ns .. 83.4 ns | per elem |
| hash to curve | binary-w.127/mode=batch,n=64 | gf2_127-w | batch | 138 ns | 138 ns .. 139 ns | per elem |
| hash to curve | binary-w.127/mode=batch,n=8 | gf2_127-w | batch | 346 ns | 345 ns .. 347 ns | per elem |
| hash to curve | binary-w.127/mode=indep | gf2_127-w | per-element | 865 ns | 863 ns .. 866 ns | per elem |
| hash to curve | edwards.107/mode=batch,n=1024 | edwards107 | batch | 805 ns | 801 ns .. 810 ns | per elem |
| hash to curve | edwards.107/mode=indep | edwards107 | per-element | 806 ns | 802 ns .. 809 ns | per elem |
| hash to curve | edwards107/edwards-native try-and-increment | edwards107 | per-element | 1.07 µs | 1.07 µs .. 1.07 µs | per elem |
| hash to curve | edwards.127/mode=batch,n=1024 | edwards127 | batch | 1.07 µs | 1.07 µs .. 1.07 µs | per elem |
| hash to curve | edwards.127/mode=indep | edwards127 | per-element | 1.07 µs | 1.06 µs .. 1.07 µs | per elem |
| hash to curve | edwards127/edwards-native try-and-increment | edwards127 | per-element | 1.10 µs | 1.10 µs .. 1.10 µs | per elem |
| hash to curve | edwards.61x2/mode=batch,n=1024 | edwards61x2 | batch | 620 ns | 617 ns .. 623 ns | per elem |
| hash to curve | edwards.61x2/mode=indep | edwards61x2 | per-element | 624 ns | 622 ns .. 626 ns | per elem |
| hash to curve | twisted.goldilocks2/mode=batch,n=1024 | twisted-goldilocks2 | batch | 1.75 µs | 1.74 µs .. 1.76 µs | per elem |
| hash to curve | twisted.goldilocks2/mode=indep | twisted-goldilocks2 | per-element | 1.73 µs | 1.72 µs .. 1.74 µs | per elem |
| hash to curve | twisted.128/mode=batch,n=1024 | twisted128 | batch | 1.92 µs | 1.92 µs .. 1.93 µs | per elem |
| hash to curve | twisted.128/mode=indep | twisted128 | per-element | 1.92 µs | 1.92 µs .. 1.93 µs | per elem |
| hash to curve | twisted.61x2/mode=batch,n=1024 | twisted61x2 | batch | 632 ns | 630 ns .. 634 ns | per elem |
| hash to curve | twisted.61x2/mode=batch,n=64 | twisted61x2 | batch | 641 ns | 639 ns .. 643 ns | per elem |
| hash to curve | twisted.61x2/mode=batch,n=8 | twisted61x2 | batch | 646 ns | 645 ns .. 648 ns | per elem |
| hash to curve | twisted.61x2/mode=indep | twisted61x2 | per-element | 630 ns | 629 ns .. 631 ns | per elem |
| hash to curve | twisted.64x2/mode=batch,n=1024 | twisted64x2 | batch | 1.10 µs | 1.10 µs .. 1.10 µs | per elem |
| hash to curve | twisted.64x2/mode=indep | twisted64x2 | per-element | 1.10 µs | 1.10 µs .. 1.10 µs | per elem |
| hash to curve | weier.107/mode=batch,n=1024 | weier107 | batch | 748 ns | 747 ns .. 750 ns | per elem |
| hash to curve | weier.107/mode=indep | weier107 | per-element | 746 ns | 744 ns .. 747 ns | per elem |
| hash to curve | weier-jacobian.107/mode=batch,n=1024 | weier107-jacobian | batch | 745 ns | 743 ns .. 748 ns | per elem |
| hash to curve | weier-jacobian.107/mode=indep | weier107-jacobian | per-element | 742 ns | 741 ns .. 744 ns | per elem |
| hash to curve | weier.127/mode=batch,n=1024 | weier127 | batch | 1.04 µs | 1.03 µs .. 1.04 µs | per elem |
| hash to curve | weier.127/mode=indep | weier127 | per-element | 1.03 µs | 1.02 µs .. 1.03 µs | per elem |
| hash to curve | weier-jacobian.127/mode=batch,n=1024 | weier127-jacobian | batch | 1.04 µs | 1.04 µs .. 1.04 µs | per elem |
| hash to curve | weier-jacobian.127/mode=indep | weier127-jacobian | per-element | 1.03 µs | 1.03 µs .. 1.03 µs | per elem |
| hash to curve | weier.61x2/mode=batch,n=1024 | weier61x2 | batch | 637 ns | 635 ns .. 638 ns | per elem |
| hash to curve | weier.61x2/mode=indep | weier61x2 | per-element | 637 ns | 635 ns .. 639 ns | per elem |
| hash to curve | weier-jacobian.61x2/mode=batch,n=1024 | weier61x2-jacobian | batch | 638 ns | 636 ns .. 639 ns | per elem |
| hash to curve | weier-jacobian.61x2/mode=indep | weier61x2-jacobian | per-element | 638 ns | 637 ns .. 640 ns | per elem |
| hash to curve | ristretto255/hash_from_bytes<Sha512> | ristretto255 | per-element | 4.72 µs | 4.70 µs .. 4.73 µs | per elem |
| hash to curve | secp256k1/ellswift decode | secp256k1 | per-element | 4.97 µs | 4.96 µs .. 4.98 µs | per elem |
| hash to curve | secp256k1/try-and-increment (parse) | secp256k1 | per-element | 4.49 µs | 4.48 µs .. 4.49 µs | per elem |
| ID to addend | binary.109/proj=fp127,h2c=pornin,mode=batch,n=1024 | gf2_109 | batch | 43.5 ns | 43.3 ns .. 43.6 ns | per elem |
| ID to addend | binary.109/proj=fp127,h2c=ti,mode=batch,n=1024 | gf2_109 | batch | 47.0 ns | 46.9 ns .. 47.1 ns | per elem |
| ID to addend | binary.109/proj=fp130,h2c=pornin,mode=batch,n=1024 | gf2_109 | batch | 48.1 ns | 48.0 ns .. 48.2 ns | per elem |
| ID to addend | binary.109/proj=fp130,h2c=ti,mode=batch,n=1024 | gf2_109 | batch | 59.3 ns | 59.2 ns .. 59.5 ns | per elem |
| ID to addend | binary.109/proj=gf2_127,h2c=pornin,mode=batch,n=1024 | gf2_109 | batch | 41.7 ns | 41.7 ns .. 41.8 ns | per elem |
| ID to addend | binary.109/proj=gf2_127,h2c=ti,mode=batch,n=1024 | gf2_109 | batch | 43.9 ns | 43.7 ns .. 44.1 ns | per elem |
| ID to addend | binary.109/proj=none,h2c=pornin,mode=batch,n=1024 | gf2_109 | batch | 64.2 ns | 64.1 ns .. 64.3 ns | per elem |
| ID to addend | binary.109/proj=none,h2c=ti,mode=batch,n=1024 | gf2_109 | batch | 74.8 ns | 74.7 ns .. 74.9 ns | per elem |
| ID to addend | binary-lambda.109/proj=fp127,h2c=pornin-addend,mode=batch,n=1024 | gf2_109-lambda | batch | 36.4 ns | 36.3 ns .. 36.4 ns | per elem |
| ID to addend | binary-lambda.109/proj=fp127,h2c=ti,mode=batch,n=1024 | gf2_109-lambda | batch | 49.9 ns | 49.7 ns .. 50.0 ns | per elem |
| ID to addend | binary-lambda.109/proj=fp127,h2c=ti-addend,mode=batch,n=1024 | gf2_109-lambda | batch | 45.1 ns | 45.0 ns .. 45.2 ns | per elem |
| ID to addend | binary-lambda.109/proj=fp130,h2c=pornin-addend,mode=batch,n=1024 | gf2_109-lambda | batch | 40.8 ns | 40.7 ns .. 40.8 ns | per elem |
| ID to addend | binary-lambda.109/proj=fp130,h2c=ti,mode=batch,n=1024 | gf2_109-lambda | batch | 62.1 ns | 61.9 ns .. 62.2 ns | per elem |
| ID to addend | binary-lambda.109/proj=fp130,h2c=ti-addend,mode=batch,n=1024 | gf2_109-lambda | batch | 57.3 ns | 57.2 ns .. 57.4 ns | per elem |
| ID to addend | binary-lambda.109/proj=gf2_127,h2c=pornin-addend,mode=batch,n=1024 | gf2_109-lambda | batch | 34.2 ns | 34.1 ns .. 34.2 ns | per elem |
| ID to addend | binary-lambda.109/proj=gf2_127,h2c=ti,mode=batch,n=1024 | gf2_109-lambda | batch | 47.5 ns | 47.4 ns .. 47.6 ns | per elem |
| ID to addend | binary-lambda.109/proj=gf2_127,h2c=ti-addend,mode=batch,n=1024 | gf2_109-lambda | batch | 42.8 ns | 42.7 ns .. 43.0 ns | per elem |
| ID to addend | binary-lambda.109/proj=none,h2c=pornin-addend,mode=batch,n=1024 | gf2_109-lambda | batch | 57.7 ns | 57.6 ns .. 57.8 ns | per elem |
| ID to addend | binary-lambda.109/proj=none,h2c=ti,mode=batch,n=1024 | gf2_109-lambda | batch | 77.8 ns | 77.5 ns .. 78.1 ns | per elem |
| ID to addend | binary-lambda.109/proj=none,h2c=ti-addend,mode=batch,n=1024 | gf2_109-lambda | batch | 72.6 ns | 72.4 ns .. 72.7 ns | per elem |
| ID to addend | binary-u.109/proj=fp127,h2c=pornin-addend,mode=batch,n=1024 | gf2_109-u | batch | 40.3 ns | 40.2 ns .. 40.3 ns | per elem |
| ID to addend | binary-u.109/proj=fp127,h2c=ti,mode=batch,n=1024 | gf2_109-u | batch | 50.6 ns | 50.4 ns .. 50.7 ns | per elem |
| ID to addend | binary-u.109/proj=fp130,h2c=pornin-addend,mode=batch,n=1024 | gf2_109-u | batch | 44.7 ns | 44.6 ns .. 44.8 ns | per elem |
| ID to addend | binary-u.109/proj=fp130,h2c=ti,mode=batch,n=1024 | gf2_109-u | batch | 60.4 ns | 60.3 ns .. 60.5 ns | per elem |
| ID to addend | binary-u.109/proj=gf2_127,h2c=pornin-addend,mode=batch,n=1024 | gf2_109-u | batch | 38.1 ns | 38.0 ns .. 38.1 ns | per elem |
| ID to addend | binary-u.109/proj=gf2_127,h2c=ti,mode=batch,n=1024 | gf2_109-u | batch | 48.3 ns | 48.2 ns .. 48.4 ns | per elem |
| ID to addend | binary-u.109/proj=none,h2c=pornin-addend,mode=batch,n=1024 | gf2_109-u | batch | 61.6 ns | 61.5 ns .. 61.7 ns | per elem |
| ID to addend | binary-u.109/proj=none,h2c=ti,mode=batch,n=1024 | gf2_109-u | batch | 78.1 ns | 78.0 ns .. 78.3 ns | per elem |
| ID to addend | binary-w.109/proj=fp127,h2c=pornin-addend,mode=batch,n=1024 | gf2_109-w | batch | 36.4 ns | 36.3 ns .. 36.4 ns | per elem |
| ID to addend | binary-w.109/proj=fp127,h2c=ti,mode=batch,n=1024 | gf2_109-w | batch | 47.2 ns | 47.1 ns .. 47.3 ns | per elem |
| ID to addend | binary-w.109/proj=fp130,h2c=pornin-addend,mode=batch,n=1024 | gf2_109-w | batch | 40.6 ns | 40.5 ns .. 40.7 ns | per elem |
| ID to addend | binary-w.109/proj=fp130,h2c=ti,mode=batch,n=1024 | gf2_109-w | batch | 56.5 ns | 56.4 ns .. 56.7 ns | per elem |
| ID to addend | binary-w.109/proj=gf2_127,h2c=pornin-addend,mode=batch,n=1024 | gf2_109-w | batch | 34.2 ns | 34.2 ns .. 34.3 ns | per elem |
| ID to addend | binary-w.109/proj=gf2_127,h2c=ti,mode=batch,n=1024 | gf2_109-w | batch | 44.9 ns | 44.8 ns .. 45.0 ns | per elem |
| ID to addend | binary-w.109/proj=none,h2c=pornin-addend,mode=batch,n=1024 | gf2_109-w | batch | 57.6 ns | 57.5 ns .. 57.7 ns | per elem |
| ID to addend | binary-w.109/proj=none,h2c=ti,mode=batch,n=1024 | gf2_109-w | batch | 75.8 ns | 75.6 ns .. 75.9 ns | per elem |
| ID to addend | binary-lambda.122-gls/proj=fp127,h2c=pornin-addend,mode=batch,n=1024 | gf2_122-gls-lambda | batch | 37.9 ns | 37.9 ns .. 38.0 ns | per elem |
| ID to addend | binary-lambda.122-gls/proj=fp127,h2c=ti,mode=batch,n=1024 | gf2_122-gls-lambda | batch | 50.6 ns | 50.5 ns .. 50.7 ns | per elem |
| ID to addend | binary-lambda.122-gls/proj=fp127,h2c=ti-addend,mode=batch,n=1024 | gf2_122-gls-lambda | batch | 43.6 ns | 43.5 ns .. 43.7 ns | per elem |
| ID to addend | binary-lambda.122-gls/proj=fp130,h2c=pornin-addend,mode=batch,n=1024 | gf2_122-gls-lambda | batch | 42.3 ns | 42.1 ns .. 42.5 ns | per elem |
| ID to addend | binary-lambda.122-gls/proj=fp130,h2c=ti,mode=batch,n=1024 | gf2_122-gls-lambda | batch | 61.0 ns | 60.8 ns .. 61.2 ns | per elem |
| ID to addend | binary-lambda.122-gls/proj=fp130,h2c=ti-addend,mode=batch,n=1024 | gf2_122-gls-lambda | batch | 53.8 ns | 53.5 ns .. 54.1 ns | per elem |
| ID to addend | binary-lambda.122-gls/proj=gf2_127,h2c=pornin-addend,mode=batch,n=1024 | gf2_122-gls-lambda | batch | 35.0 ns | 34.9 ns .. 35.1 ns | per elem |
| ID to addend | binary-lambda.122-gls/proj=gf2_127,h2c=ti,mode=batch,n=1024 | gf2_122-gls-lambda | batch | 45.9 ns | 45.8 ns .. 46.0 ns | per elem |
| ID to addend | binary-lambda.122-gls/proj=gf2_127,h2c=ti-addend,mode=batch,n=1024 | gf2_122-gls-lambda | batch | 38.2 ns | 38.0 ns .. 38.2 ns | per elem |
| ID to addend | binary-lambda.122-gls/proj=none,h2c=pornin-addend,mode=batch,n=1024 | gf2_122-gls-lambda | batch | 58.8 ns | 58.7 ns .. 59.0 ns | per elem |
| ID to addend | binary-lambda.122-gls/proj=none,h2c=ti,mode=batch,n=1024 | gf2_122-gls-lambda | batch | 73.6 ns | 73.4 ns .. 73.8 ns | per elem |
| ID to addend | binary-lambda.122-gls/proj=none,h2c=ti-addend,mode=batch,n=1024 | gf2_122-gls-lambda | batch | 66.4 ns | 66.2 ns .. 66.6 ns | per elem |
| ID to addend | binary-u.122-gls/proj=fp127,h2c=pornin-addend,mode=batch,n=1024 | gf2_122-gls-u | batch | 38.6 ns | 38.3 ns .. 38.9 ns | per elem |
| ID to addend | binary-u.122-gls/proj=fp127,h2c=ti,mode=batch,n=1024 | gf2_122-gls-u | batch | 46.7 ns | 46.7 ns .. 46.8 ns | per elem |
| ID to addend | binary-u.122-gls/proj=fp130,h2c=pornin-addend,mode=batch,n=1024 | gf2_122-gls-u | batch | 42.2 ns | 42.1 ns .. 42.3 ns | per elem |
| ID to addend | binary-u.122-gls/proj=fp130,h2c=ti,mode=batch,n=1024 | gf2_122-gls-u | batch | 57.1 ns | 57.0 ns .. 57.2 ns | per elem |
| ID to addend | binary-u.122-gls/proj=gf2_127,h2c=pornin-addend,mode=batch,n=1024 | gf2_122-gls-u | batch | 36.1 ns | 35.9 ns .. 36.4 ns | per elem |
| ID to addend | binary-u.122-gls/proj=gf2_127,h2c=ti,mode=batch,n=1024 | gf2_122-gls-u | batch | 44.4 ns | 44.3 ns .. 44.5 ns | per elem |
| ID to addend | binary-u.122-gls/proj=none,h2c=pornin-addend,mode=batch,n=1024 | gf2_122-gls-u | batch | 60.2 ns | 60.1 ns .. 60.4 ns | per elem |
| ID to addend | binary-u.122-gls/proj=none,h2c=ti,mode=batch,n=1024 | gf2_122-gls-u | batch | 71.9 ns | 71.8 ns .. 72.1 ns | per elem |
| ID to addend | binary-w.122-gls/proj=fp127,h2c=pornin-addend,mode=batch,n=1024 | gf2_122-gls-w | batch | 38.0 ns | 37.9 ns .. 38.1 ns | per elem |
| ID to addend | binary-w.122-gls/proj=fp127,h2c=ti,mode=batch,n=1024 | gf2_122-gls-w | batch | 44.5 ns | 44.3 ns .. 44.6 ns | per elem |
| ID to addend | binary-w.122-gls/proj=fp130,h2c=pornin-addend,mode=batch,n=1024 | gf2_122-gls-w | batch | 42.4 ns | 42.3 ns .. 42.5 ns | per elem |
| ID to addend | binary-w.122-gls/proj=fp130,h2c=ti,mode=batch,n=1024 | gf2_122-gls-w | batch | 54.5 ns | 54.4 ns .. 54.6 ns | per elem |
| ID to addend | binary-w.122-gls/proj=gf2_127,h2c=pornin-addend,mode=batch,n=1024 | gf2_122-gls-w | batch | 34.9 ns | 34.8 ns .. 34.9 ns | per elem |
| ID to addend | binary-w.122-gls/proj=gf2_127,h2c=ti,mode=batch,n=1024 | gf2_122-gls-w | batch | 40.9 ns | 40.8 ns .. 41.0 ns | per elem |
| ID to addend | binary-w.122-gls/proj=none,h2c=pornin-addend,mode=batch,n=1024 | gf2_122-gls-w | batch | 59.3 ns | 59.1 ns .. 59.5 ns | per elem |
| ID to addend | binary-w.122-gls/proj=none,h2c=ti,mode=batch,n=1024 | gf2_122-gls-w | batch | 72.6 ns | 72.5 ns .. 72.8 ns | per elem |
| ID to addend | binary-lambda.122/proj=fp127,h2c=pornin-addend,mode=batch,n=1024 | gf2_122-lambda | batch | 36.0 ns | 35.9 ns .. 36.1 ns | per elem |
| ID to addend | binary-lambda.122/proj=fp127,h2c=ti,mode=batch,n=1024 | gf2_122-lambda | batch | 53.2 ns | 53.0 ns .. 53.4 ns | per elem |
| ID to addend | binary-lambda.122/proj=fp127,h2c=ti-addend,mode=batch,n=1024 | gf2_122-lambda | batch | 45.6 ns | 45.5 ns .. 45.7 ns | per elem |
| ID to addend | binary-lambda.122/proj=fp130,h2c=pornin-addend,mode=batch,n=1024 | gf2_122-lambda | batch | 40.8 ns | 40.7 ns .. 40.9 ns | per elem |
| ID to addend | binary-lambda.122/proj=fp130,h2c=ti,mode=batch,n=1024 | gf2_122-lambda | batch | 61.8 ns | 61.5 ns .. 62.1 ns | per elem |
| ID to addend | binary-lambda.122/proj=fp130,h2c=ti-addend,mode=batch,n=1024 | gf2_122-lambda | batch | 53.4 ns | 53.2 ns .. 53.7 ns | per elem |
| ID to addend | binary-lambda.122/proj=gf2_127,h2c=pornin-addend,mode=batch,n=1024 | gf2_122-lambda | batch | 33.6 ns | 33.5 ns .. 33.7 ns | per elem |
| ID to addend | binary-lambda.122/proj=gf2_127,h2c=ti,mode=batch,n=1024 | gf2_122-lambda | batch | 45.6 ns | 45.5 ns .. 45.7 ns | per elem |
| ID to addend | binary-lambda.122/proj=gf2_127,h2c=ti-addend,mode=batch,n=1024 | gf2_122-lambda | batch | 37.8 ns | 37.7 ns .. 37.8 ns | per elem |
| ID to addend | binary-lambda.122/proj=none,h2c=pornin-addend,mode=batch,n=1024 | gf2_122-lambda | batch | 59.3 ns | 58.9 ns .. 59.8 ns | per elem |
| ID to addend | binary-lambda.122/proj=none,h2c=ti,mode=batch,n=1024 | gf2_122-lambda | batch | 77.1 ns | 77.0 ns .. 77.2 ns | per elem |
| ID to addend | binary-lambda.122/proj=none,h2c=ti-addend,mode=batch,n=1024 | gf2_122-lambda | batch | 69.6 ns | 69.4 ns .. 69.7 ns | per elem |
| ID to addend | binary-u.122/proj=fp127,h2c=pornin-addend,mode=batch,n=1024 | gf2_122-u | batch | 41.2 ns | 41.1 ns .. 41.3 ns | per elem |
| ID to addend | binary-u.122/proj=fp127,h2c=ti,mode=batch,n=1024 | gf2_122-u | batch | 55.2 ns | 55.0 ns .. 55.3 ns | per elem |
| ID to addend | binary-u.122/proj=fp130,h2c=pornin-addend,mode=batch,n=1024 | gf2_122-u | batch | 45.2 ns | 45.1 ns .. 45.3 ns | per elem |
| ID to addend | binary-u.122/proj=fp130,h2c=ti,mode=batch,n=1024 | gf2_122-u | batch | 64.8 ns | 64.7 ns .. 65.0 ns | per elem |
| ID to addend | binary-u.122/proj=gf2_127,h2c=pornin-addend,mode=batch,n=1024 | gf2_122-u | batch | 38.8 ns | 38.7 ns .. 38.8 ns | per elem |
| ID to addend | binary-u.122/proj=gf2_127,h2c=ti,mode=batch,n=1024 | gf2_122-u | batch | 51.6 ns | 51.5 ns .. 51.7 ns | per elem |
| ID to addend | binary-u.122/proj=none,h2c=pornin-addend,mode=batch,n=1024 | gf2_122-u | batch | 63.2 ns | 63.1 ns .. 63.3 ns | per elem |
| ID to addend | binary-u.122/proj=none,h2c=ti,mode=batch,n=1024 | gf2_122-u | batch | 82.4 ns | 82.2 ns .. 82.5 ns | per elem |
| ID to addend | binary-w.122/proj=fp127,h2c=pornin-addend,mode=batch,n=1024 | gf2_122-w | batch | 36.0 ns | 35.9 ns .. 36.1 ns | per elem |
| ID to addend | binary-w.122/proj=fp127,h2c=ti,mode=batch,n=1024 | gf2_122-w | batch | 45.3 ns | 45.3 ns .. 45.4 ns | per elem |
| ID to addend | binary-w.122/proj=fp130,h2c=pornin-addend,mode=batch,n=1024 | gf2_122-w | batch | 40.6 ns | 40.5 ns .. 40.7 ns | per elem |
| ID to addend | binary-w.122/proj=fp130,h2c=ti,mode=batch,n=1024 | gf2_122-w | batch | 54.5 ns | 54.4 ns .. 54.6 ns | per elem |
| ID to addend | binary-w.122/proj=gf2_127,h2c=pornin-addend,mode=batch,n=1024 | gf2_122-w | batch | 33.2 ns | 33.0 ns .. 33.4 ns | per elem |
| ID to addend | binary-w.122/proj=gf2_127,h2c=ti,mode=batch,n=1024 | gf2_122-w | batch | 41.3 ns | 41.2 ns .. 41.3 ns | per elem |
| ID to addend | binary-w.122/proj=none,h2c=pornin-addend,mode=batch,n=1024 | gf2_122-w | batch | 58.6 ns | 58.5 ns .. 58.7 ns | per elem |
| ID to addend | binary-w.122/proj=none,h2c=ti,mode=batch,n=1024 | gf2_122-w | batch | 71.5 ns | 71.4 ns .. 71.6 ns | per elem |
| ID to addend | binary.127/proj=fp127,h2c=pornin,mode=batch,n=1024 | gf2_127 | batch | 41.7 ns | 41.6 ns .. 41.8 ns | per elem |
| ID to addend | binary.127/proj=fp127,h2c=ti,mode=batch,n=1024 | gf2_127 | batch | 49.5 ns | 49.3 ns .. 49.6 ns | per elem |
| ID to addend | binary.127/proj=fp130,h2c=pornin,mode=batch,n=1024 | gf2_127 | batch | 45.9 ns | 45.8 ns .. 46.0 ns | per elem |
| ID to addend | binary.127/proj=fp130,h2c=ti,mode=batch,n=1024 | gf2_127 | batch | 59.6 ns | 59.5 ns .. 59.8 ns | per elem |
| ID to addend | binary.127/proj=gf2_127,h2c=pornin,mode=batch,n=1024 | gf2_127 | batch | 39.1 ns | 39.0 ns .. 39.2 ns | per elem |
| ID to addend | binary.127/proj=gf2_127,h2c=ti,mode=batch,n=1024 | gf2_127 | batch | 43.0 ns | 42.8 ns .. 43.1 ns | per elem |
| ID to addend | binary.127/proj=none,h2c=pornin,mode=batch,n=1024 | gf2_127 | batch | 62.6 ns | 62.5 ns .. 62.8 ns | per elem |
| ID to addend | binary.127/proj=none,h2c=ti,mode=batch,n=1024 | gf2_127 | batch | 71.3 ns | 71.2 ns .. 71.4 ns | per elem |
| ID to addend | binary-lambda.127/proj=fp127,h2c=pornin-addend,mode=batch,n=1024 | gf2_127-lambda | batch | 36.5 ns | 36.4 ns .. 36.6 ns | per elem |
| ID to addend | binary-lambda.127/proj=fp127,h2c=ti,mode=batch,n=1024 | gf2_127-lambda | batch | 52.4 ns | 52.3 ns .. 52.5 ns | per elem |
| ID to addend | binary-lambda.127/proj=fp127,h2c=ti-addend,mode=batch,n=1024 | gf2_127-lambda | batch | 45.4 ns | 45.3 ns .. 45.5 ns | per elem |
| ID to addend | binary-lambda.127/proj=fp130,h2c=pornin-addend,mode=batch,n=1024 | gf2_127-lambda | batch | 40.9 ns | 40.8 ns .. 41.1 ns | per elem |
| ID to addend | binary-lambda.127/proj=fp130,h2c=ti,mode=batch,n=1024 | gf2_127-lambda | batch | 62.7 ns | 62.6 ns .. 62.9 ns | per elem |
| ID to addend | binary-lambda.127/proj=fp130,h2c=ti-addend,mode=batch,n=1024 | gf2_127-lambda | batch | 55.8 ns | 55.6 ns .. 55.9 ns | per elem |
| ID to addend | binary-lambda.127/proj=gf2_127,h2c=pornin-addend,mode=batch,n=1024 | gf2_127-lambda | batch | 34.1 ns | 33.9 ns .. 34.2 ns | per elem |
| ID to addend | binary-lambda.127/proj=gf2_127,h2c=ti,mode=batch,n=1024 | gf2_127-lambda | batch | 46.1 ns | 46.0 ns .. 46.2 ns | per elem |
| ID to addend | binary-lambda.127/proj=gf2_127,h2c=ti-addend,mode=batch,n=1024 | gf2_127-lambda | batch | 39.4 ns | 39.3 ns .. 39.5 ns | per elem |
| ID to addend | binary-lambda.127/proj=none,h2c=pornin-addend,mode=batch,n=1024 | gf2_127-lambda | batch | 58.4 ns | 58.2 ns .. 58.6 ns | per elem |
| ID to addend | binary-lambda.127/proj=none,h2c=ti,mode=batch,n=1024 | gf2_127-lambda | batch | 74.5 ns | 74.4 ns .. 74.6 ns | per elem |
| ID to addend | binary-lambda.127/proj=none,h2c=ti-addend,mode=batch,n=1024 | gf2_127-lambda | batch | 67.6 ns | 67.4 ns .. 67.7 ns | per elem |
| ID to addend | binary-u.127/proj=fp127,h2c=pornin-addend,mode=batch,n=1024 | gf2_127-u | batch | 39.6 ns | 39.5 ns .. 39.7 ns | per elem |
| ID to addend | binary-u.127/proj=fp127,h2c=ti,mode=batch,n=1024 | gf2_127-u | batch | 48.8 ns | 48.7 ns .. 48.9 ns | per elem |
| ID to addend | binary-u.127/proj=fp130,h2c=pornin-addend,mode=batch,n=1024 | gf2_127-u | batch | 43.8 ns | 43.7 ns .. 43.8 ns | per elem |
| ID to addend | binary-u.127/proj=fp130,h2c=ti,mode=batch,n=1024 | gf2_127-u | batch | 61.1 ns | 61.0 ns .. 61.2 ns | per elem |
| ID to addend | binary-u.127/proj=gf2_127,h2c=pornin-addend,mode=batch,n=1024 | gf2_127-u | batch | 37.2 ns | 37.1 ns .. 37.3 ns | per elem |
| ID to addend | binary-u.127/proj=gf2_127,h2c=ti,mode=batch,n=1024 | gf2_127-u | batch | 44.4 ns | 44.3 ns .. 44.5 ns | per elem |
| ID to addend | binary-u.127/proj=none,h2c=pornin-addend,mode=batch,n=1024 | gf2_127-u | batch | 61.4 ns | 61.3 ns .. 61.6 ns | per elem |
| ID to addend | binary-u.127/proj=none,h2c=ti,mode=batch,n=1024 | gf2_127-u | batch | 75.7 ns | 75.5 ns .. 75.8 ns | per elem |
| ID to addend | binary-w.127/proj=fp127,h2c=pornin-addend,mode=batch,n=1024 | gf2_127-w | batch | 36.3 ns | 36.2 ns .. 36.4 ns | per elem |
| ID to addend | binary-w.127/proj=fp127,h2c=ti,mode=batch,n=1024 | gf2_127-w | batch | 45.4 ns | 45.3 ns .. 45.5 ns | per elem |
| ID to addend | binary-w.127/proj=fp130,h2c=pornin-addend,mode=batch,n=1024 | gf2_127-w | batch | 40.8 ns | 40.7 ns .. 40.9 ns | per elem |
| ID to addend | binary-w.127/proj=fp130,h2c=ti,mode=batch,n=1024 | gf2_127-w | batch | 57.0 ns | 56.9 ns .. 57.2 ns | per elem |
| ID to addend | binary-w.127/proj=gf2_127,h2c=pornin-addend,mode=batch,n=1024 | gf2_127-w | batch | 34.2 ns | 34.0 ns .. 34.3 ns | per elem |
| ID to addend | binary-w.127/proj=gf2_127,h2c=ti,mode=batch,n=1024 | gf2_127-w | batch | 40.9 ns | 40.8 ns .. 41.0 ns | per elem |
| ID to addend | binary-w.127/proj=none,h2c=pornin-addend,mode=batch,n=1024 | gf2_127-w | batch | 58.5 ns | 58.4 ns .. 58.7 ns | per elem |
| ID to addend | binary-w.127/proj=none,h2c=ti,mode=batch,n=1024 | gf2_127-w | batch | 72.7 ns | 72.6 ns .. 72.9 ns | per elem |
| ID to addend | twisted.61x2/proj=fp127,h2c=elligator2,mode=batch,n=1024 | twisted61x2 | batch | 881 ns | 879 ns .. 884 ns | per elem |
| ID to addend | twisted.61x2/proj=fp127,h2c=ti,mode=batch,n=1024 | twisted61x2 | batch | 604 ns | 602 ns .. 605 ns | per elem |
| ID to addend | twisted.61x2/proj=fp130,h2c=elligator2,mode=batch,n=1024 | twisted61x2 | batch | 882 ns | 879 ns .. 884 ns | per elem |
| ID to addend | twisted.61x2/proj=fp130,h2c=ti,mode=batch,n=1024 | twisted61x2 | batch | 612 ns | 610 ns .. 613 ns | per elem |
| ID to addend | twisted.61x2/proj=gf2_127,h2c=elligator2,mode=batch,n=1024 | twisted61x2 | batch | 871 ns | 870 ns .. 873 ns | per elem |
| ID to addend | twisted.61x2/proj=gf2_127,h2c=ti,mode=batch,n=1024 | twisted61x2 | batch | 594 ns | 592 ns .. 595 ns | per elem |
| ID to addend | twisted.61x2/proj=none,h2c=elligator2,mode=batch,n=1024 | twisted61x2 | batch | 916 ns | 914 ns .. 917 ns | per elem |
| ID to addend | twisted.61x2/proj=none,h2c=ti,mode=batch,n=1024 | twisted61x2 | batch | 629 ns | 627 ns .. 630 ns | per elem |
| hash to addend | gf2_109-lambda/try-and-increment to (x, λ) | gf2_109-lambda | per-element | 938 ns | 937 ns .. 939 ns | per elem |
| hash to addend | gf2_109-lambda/try-and-increment to (x, λ), batched | gf2_109-lambda | batch | 77.6 ns | 77.5 ns .. 77.6 ns | per elem |
| hash to addend | gf2_122-gls-lambda/try-and-increment to (x, λ) | gf2_122-gls-lambda | per-element | 504 ns | 503 ns .. 505 ns | per elem |
| hash to addend | gf2_122-gls-lambda/try-and-increment to (x, λ), batched | gf2_122-gls-lambda | batch | 73.8 ns | 73.8 ns .. 73.9 ns | per elem |
| hash to addend | gf2_122-lambda/try-and-increment to (x, λ) | gf2_122-lambda | per-element | 520 ns | 519 ns .. 520 ns | per elem |
| hash to addend | gf2_122-lambda/try-and-increment to (x, λ), batched | gf2_122-lambda | batch | 72.3 ns | 72.3 ns .. 72.3 ns | per elem |
| hash to addend | gf2_127-lambda/try-and-increment to (x, λ) | gf2_127-lambda | per-element | 761 ns | 759 ns .. 762 ns | per elem |
| hash to addend | gf2_127-lambda/try-and-increment to (x, λ), batched | gf2_127-lambda | batch | 72.8 ns | 72.8 ns .. 72.9 ns | per elem |
| steps: digest | digest/sha512 (ristretto input) | ristretto255 | per-element | 60.9 ns | 60.7 ns .. 61.1 ns | per elem |
| steps: ristretto255 | ristretto255/from_uniform_bytes (2 maps + add) | ristretto255 | per-element | 4.78 µs | 4.76 µs .. 4.79 µs | per elem |
| x on curve | ristretto255/decompress (valid, inv sqrt) | ristretto255 | per-element | 2.32 µs | 2.31 µs .. 2.32 µs | per elem |
| x on curve | secp256k1/x: parse compressed (sqrt) | secp256k1 | per-element | 2.25 µs | 2.24 µs .. 2.25 µs | per elem |
comparison maps
Maps from digests to points other than try-and-increment, timed beside it: Pornin’s map on binary curves, Elligator 2 on Edwards curves and simplified SWU on Weierstrass curves, once, and Pornin’s map twice with the points summed; and Pornin’s map taken straight to the unscaled or -affine addend, where it stands for a hash and a prepare together, as try-and-increment to does. One map reaches at most points of , not uniformly. The checksum needs relations to be hard to find among hash outputs within the subset of the group that the hash reaches, not outputs uniform on the group (docs/problem.md, Adversary). Insertion estimates include each measured map with compatible preparation and addition; Pornin already returns an extended binary addend.
Figure
43 benchmarks
| operation | benchmark | family | mode | time | 95% CI | unit |
|---|---|---|---|---|---|---|
| one map to addend | gf2_109-lambda/pornin map x1 to (x, λ) | gf2_109-lambda | per-element | 550 ns | 548 ns .. 553 ns | per elem |
| one map to addend | gf2_109-lambda/pornin map x1 to (x, λ), batched | gf2_109-lambda | batch | 55.2 ns | 55.0 ns .. 55.5 ns | per elem |
| one map to addend | gf2_109-u/pornin map x1 to (u, v) | gf2_109-u | per-element | 533 ns | 532 ns .. 533 ns | per elem |
| one map to addend | gf2_109-u/pornin map x1 to (u, v), batched | gf2_109-u | batch | 60.7 ns | 60.3 ns .. 61.0 ns | per elem |
| one map to addend | gf2_109-w/pornin map x1 to (x, λ) | gf2_109-w | per-element | 535 ns | 534 ns .. 535 ns | per elem |
| one map to addend | gf2_109-w/pornin map x1 to (x, λ), batched | gf2_109-w | batch | 54.5 ns | 54.5 ns .. 54.5 ns | per elem |
| one map to addend | gf2_122-gls-lambda/pornin map x1 to (x, λ) | gf2_122-gls-lambda | per-element | 315 ns | 314 ns .. 316 ns | per elem |
| one map to addend | gf2_122-gls-lambda/pornin map x1 to (x, λ), batched | gf2_122-gls-lambda | batch | 55.4 ns | 55.4 ns .. 55.5 ns | per elem |
| one map to addend | gf2_122-gls-u/pornin map x1 to (u, v) | gf2_122-gls-u | per-element | 319 ns | 318 ns .. 320 ns | per elem |
| one map to addend | gf2_122-gls-u/pornin map x1 to (u, v), batched | gf2_122-gls-u | batch | 55.7 ns | 55.7 ns .. 55.8 ns | per elem |
| one map to addend | gf2_122-gls-w/pornin map x1 to (x, λ) | gf2_122-gls-w | per-element | 316 ns | 315 ns .. 317 ns | per elem |
| one map to addend | gf2_122-gls-w/pornin map x1 to (x, λ), batched | gf2_122-gls-w | batch | 55.4 ns | 55.4 ns .. 55.4 ns | per elem |
| one map to addend | gf2_122-lambda/pornin map x1 to (x, λ) | gf2_122-lambda | per-element | 326 ns | 326 ns .. 327 ns | per elem |
| one map to addend | gf2_122-lambda/pornin map x1 to (x, λ), batched | gf2_122-lambda | batch | 53.9 ns | 53.9 ns .. 54.0 ns | per elem |
| one map to addend | gf2_122-u/pornin map x1 to (u, v) | gf2_122-u | per-element | 326 ns | 325 ns .. 326 ns | per elem |
| one map to addend | gf2_122-u/pornin map x1 to (u, v), batched | gf2_122-u | batch | 57.1 ns | 57.0 ns .. 57.1 ns | per elem |
| one map to addend | gf2_122-w/pornin map x1 to (x, λ) | gf2_122-w | per-element | 326 ns | 326 ns .. 327 ns | per elem |
| one map to addend | gf2_122-w/pornin map x1 to (x, λ), batched | gf2_122-w | batch | 54.0 ns | 53.9 ns .. 54.0 ns | per elem |
| one map to addend | gf2_127-lambda/pornin map x1 to (x, λ) | gf2_127-lambda | per-element | 456 ns | 455 ns .. 457 ns | per elem |
| one map to addend | gf2_127-lambda/pornin map x1 to (x, λ), batched | gf2_127-lambda | batch | 53.5 ns | 53.4 ns .. 53.6 ns | per elem |
| one map to addend | gf2_127-u/pornin map x1 to (u, v) | gf2_127-u | per-element | 461 ns | 460 ns .. 462 ns | per elem |
| one map to addend | gf2_127-u/pornin map x1 to (u, v), batched | gf2_127-u | batch | 57.2 ns | 57.2 ns .. 57.3 ns | per elem |
| one map to addend | gf2_127-w/pornin map x1 to (x, λ) | gf2_127-w | per-element | 455 ns | 454 ns .. 456 ns | per elem |
| one map to addend | gf2_127-w/pornin map x1 to (x, λ), batched | gf2_127-w | batch | 53.5 ns | 53.4 ns .. 53.6 ns | per elem |
| one map | gf2_109/pornin map x1 | gf2_109 | per-element | 560 ns | 559 ns .. 561 ns | per elem |
| one map | gf2_109/pornin map x1, batched | gf2_109 | batch | 63.7 ns | 63.7 ns .. 63.8 ns | per elem |
| one map | gf2_122/pornin map x1 | gf2_122 | per-element | 373 ns | 373 ns .. 373 ns | per elem |
| one map | gf2_122/pornin map x1, batched | gf2_122 | batch | 62.8 ns | 62.8 ns .. 62.8 ns | per elem |
| one map | gf2_122-gls/pornin map x1 | gf2_122-gls | per-element | 369 ns | 367 ns .. 370 ns | per elem |
| one map | gf2_122-gls/pornin map x1, batched | gf2_122-gls | batch | 62.0 ns | 61.9 ns .. 62.0 ns | per elem |
| one map | gf2_127/pornin map x1 | gf2_127 | per-element | 485 ns | 485 ns .. 486 ns | per elem |
| one map | gf2_127/pornin map x1, batched | gf2_127 | batch | 61.5 ns | 61.4 ns .. 61.5 ns | per elem |
| one map | edwards107/elligator2 x1 | edwards107 | per-element | 1.07 µs | 1.06 µs .. 1.07 µs | per elem |
| one map | edwards127/elligator2 x1 | edwards127 | per-element | 1.29 µs | 1.28 µs .. 1.29 µs | per elem |
| one map | edwards61x2/elligator2 x1 | edwards61x2 | per-element | 734 ns | 734 ns .. 735 ns | per elem |
| one map | twisted-goldilocks2/elligator2 x1 | twisted-goldilocks2 | per-element | 2.16 µs | 2.16 µs .. 2.17 µs | per elem |
| one map | twisted128/elligator2 x1 | twisted128 | per-element | 3.32 µs | 3.32 µs .. 3.33 µs | per elem |
| one map | twisted61x2/elligator2 x1 | twisted61x2 | per-element | 892 ns | 891 ns .. 894 ns | per elem |
| one map | twisted64x2/elligator2 x1 | twisted64x2 | per-element | 1.53 µs | 1.53 µs .. 1.53 µs | per elem |
| one map | weier107/sswu x1 | weier107 | per-element | 1.04 µs | 1.04 µs .. 1.04 µs | per elem |
| one map | weier127/sswu x1 | weier127 | per-element | 1.10 µs | 1.10 µs .. 1.10 µs | per elem |
| one map | weier61x2/sswu x1 | weier61x2 | per-element | 703 ns | 701 ns .. 704 ns | per elem |
| two maps summed | gf2_127/pornin map x2 | gf2_127 | per-element | 916 ns | 914 ns .. 917 ns | per elem |
RIBLT workload
Ratios against Go riblt-ecmh also include the mapping generator and the port to Rust, which are not attributed to this project (Workload, Comparison with the reference implementations).
Figure
556 benchmarks
| operation | benchmark | family | mode | time | 95% CI | unit |
|---|---|---|---|---|---|---|
| encode (hash + cells) | xor-sha256.64/m=12150,n=3500 | xor | per-element | 199 ns | 199 ns .. 199 ns | per elem |
| encode (hash + cells) | xor-sha256.64/m=1350,n=3500 | xor | per-element | 165 ns | 165 ns .. 166 ns | per elem |
| encode (hash + cells) | xor-sha256.64/m=150,n=3500 | xor | per-element | 139 ns | 139 ns .. 140 ns | per elem |
| encode (hash + cells) | xor-sha256.64/m=20,n=3500 | xor | per-element | 116 ns | 115 ns .. 116 ns | per elem |
| encode (hash + cells) | xor-sha256.64/m=5,n=3500 | xor | per-element | 95.2 ns | 95.0 ns .. 95.5 ns | per elem |
| encode (hash + cells) | xor-siphash.64/m=12150,n=3500 | xor-siphash | per-element | 188 ns | 187 ns .. 188 ns | per elem |
| encode (hash + cells) | xor-siphash.64/m=12150,n=3500,map=mcg64 | xor-siphash | per-element | 183 ns | 182 ns .. 183 ns | per elem |
| encode (hash + cells) | xor-siphash.64/m=1350,n=3500 | xor-siphash | per-element | 155 ns | 154 ns .. 155 ns | per elem |
| encode (hash + cells) | xor-siphash.64/m=1350,n=3500,map=mcg64 | xor-siphash | per-element | 149 ns | 149 ns .. 150 ns | per elem |
| encode (hash + cells) | xor-siphash.64/m=150,n=3500 | xor-siphash | per-element | 129 ns | 129 ns .. 130 ns | per elem |
| encode (hash + cells) | xor-siphash.64/m=150,n=3500,map=mcg64 | xor-siphash | per-element | 124 ns | 123 ns .. 124 ns | per elem |
| encode (hash + cells) | xor-siphash.64/m=20,n=3500 | xor-siphash | per-element | 104 ns | 104 ns .. 104 ns | per elem |
| encode (hash + cells) | xor-siphash.64/m=20,n=3500,map=mcg64 | xor-siphash | per-element | 99.3 ns | 99.0 ns .. 99.5 ns | per elem |
| encode (hash + cells) | xor-siphash.64/m=5,n=3500 | xor-siphash | per-element | 85.7 ns | 85.5 ns .. 85.9 ns | per elem |
| encode (hash + cells) | xor-siphash.64/m=5,n=3500,map=mcg64 | xor-siphash | per-element | 82.0 ns | 81.8 ns .. 82.2 ns | per elem |
| encode (hash + cells) | binary.109/m=12150,n=3500,h2c=pornin | gf2_109 | per-element | 398 ns | 397 ns .. 399 ns | per elem |
| encode (hash + cells) | binary.109/m=12150,n=3500,h2c=pornin,proj=gf2_127,mapproj=gf2_127 | gf2_109 | per-element | 337 ns | 337 ns .. 338 ns | per elem |
| encode (hash + cells) | binary.109/m=1350,n=3500,h2c=pornin | gf2_109 | per-element | 324 ns | 323 ns .. 325 ns | per elem |
| encode (hash + cells) | binary.109/m=1350,n=3500,h2c=pornin,proj=gf2_127,mapproj=gf2_127 | gf2_109 | per-element | 265 ns | 264 ns .. 265 ns | per elem |
| encode (hash + cells) | binary.109/m=5,n=3500,h2c=pornin | gf2_109 | per-element | 172 ns | 172 ns .. 172 ns | per elem |
| encode (hash + cells) | binary.109/m=5,n=3500,h2c=pornin,proj=gf2_127,mapproj=gf2_127 | gf2_109 | per-element | 109 ns | 108 ns .. 109 ns | per elem |
| encode (hash + cells) | binary-lambda.109/m=12150,n=3500,h2c=pornin-addend | gf2_109-lambda | per-element | 361 ns | 360 ns .. 362 ns | per elem |
| encode (hash + cells) | binary-lambda.109/m=12150,n=3500,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_109-lambda | per-element | 305 ns | 305 ns .. 306 ns | per elem |
| encode (hash + cells) | binary-lambda.109/m=1350,n=3500,h2c=pornin-addend | gf2_109-lambda | per-element | 303 ns | 303 ns .. 304 ns | per elem |
| encode (hash + cells) | binary-lambda.109/m=1350,n=3500,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_109-lambda | per-element | 244 ns | 244 ns .. 244 ns | per elem |
| encode (hash + cells) | binary-lambda.109/m=150,n=3500,h2c=pornin-addend | gf2_109-lambda | per-element | 245 ns | 245 ns .. 245 ns | per elem |
| encode (hash + cells) | binary-lambda.109/m=20,n=3500,h2c=pornin-addend | gf2_109-lambda | per-element | 189 ns | 188 ns .. 189 ns | per elem |
| encode (hash + cells) | binary-lambda.109/m=5,n=3500,h2c=pornin-addend | gf2_109-lambda | per-element | 158 ns | 158 ns .. 159 ns | per elem |
| encode (hash + cells) | binary-lambda.109/m=5,n=3500,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_109-lambda | per-element | 98.5 ns | 98.4 ns .. 98.7 ns | per elem |
| encode (hash + cells) | binary-u.109/m=12150,n=3500,h2c=pornin-addend | gf2_109-u | per-element | 341 ns | 340 ns .. 342 ns | per elem |
| encode (hash + cells) | binary-u.109/m=12150,n=3500,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_109-u | per-element | 290 ns | 289 ns .. 291 ns | per elem |
| encode (hash + cells) | binary-u.109/m=1350,n=3500,h2c=pornin-addend | gf2_109-u | per-element | 282 ns | 281 ns .. 282 ns | per elem |
| encode (hash + cells) | binary-u.109/m=1350,n=3500,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_109-u | per-element | 222 ns | 222 ns .. 223 ns | per elem |
| encode (hash + cells) | binary-u.109/m=150,n=3500,h2c=pornin-addend | gf2_109-u | per-element | 229 ns | 229 ns .. 230 ns | per elem |
| encode (hash + cells) | binary-u.109/m=20,n=3500,h2c=pornin-addend | gf2_109-u | per-element | 185 ns | 184 ns .. 185 ns | per elem |
| encode (hash + cells) | binary-u.109/m=5,n=3500,h2c=pornin-addend | gf2_109-u | per-element | 157 ns | 157 ns .. 157 ns | per elem |
| encode (hash + cells) | binary-u.109/m=5,n=3500,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_109-u | per-element | 94.5 ns | 94.3 ns .. 94.7 ns | per elem |
| encode (hash + cells) | binary-w.109/m=12150,n=3500,h2c=pornin-addend | gf2_109-w | per-element | 361 ns | 360 ns .. 362 ns | per elem |
| encode (hash + cells) | binary-w.109/m=12150,n=3500,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_109-w | per-element | 302 ns | 301 ns .. 302 ns | per elem |
| encode (hash + cells) | binary-w.109/m=1350,n=3500,h2c=pornin-addend | gf2_109-w | per-element | 302 ns | 302 ns .. 303 ns | per elem |
| encode (hash + cells) | binary-w.109/m=1350,n=3500,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_109-w | per-element | 239 ns | 238 ns .. 241 ns | per elem |
| encode (hash + cells) | binary-w.109/m=150,n=3500,h2c=pornin-addend | gf2_109-w | per-element | 245 ns | 244 ns .. 245 ns | per elem |
| encode (hash + cells) | binary-w.109/m=20,n=3500,h2c=pornin-addend | gf2_109-w | per-element | 192 ns | 191 ns .. 192 ns | per elem |
| encode (hash + cells) | binary-w.109/m=5,n=3500,h2c=pornin-addend | gf2_109-w | per-element | 159 ns | 158 ns .. 159 ns | per elem |
| encode (hash + cells) | binary-w.109/m=5,n=3500,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_109-w | per-element | 98.3 ns | 98.1 ns .. 98.4 ns | per elem |
| encode (hash + cells) | binary.122/m=12150,n=3500,h2c=pornin | gf2_122 | per-element | 463 ns | 462 ns .. 463 ns | per elem |
| encode (hash + cells) | binary.122/m=1350,n=3500,h2c=pornin | gf2_122 | per-element | 371 ns | 370 ns .. 372 ns | per elem |
| encode (hash + cells) | binary.122/m=5,n=3500,h2c=pornin | gf2_122 | per-element | 169 ns | 168 ns .. 169 ns | per elem |
| encode (hash + cells) | binary.122-gls/m=12150,n=3500,h2c=pornin | gf2_122-gls | per-element | 446 ns | 445 ns .. 446 ns | per elem |
| encode (hash + cells) | binary.122-gls/m=1350,n=3500,h2c=pornin | gf2_122-gls | per-element | 358 ns | 358 ns .. 359 ns | per elem |
| encode (hash + cells) | binary.122-gls/m=5,n=3500,h2c=pornin | gf2_122-gls | per-element | 167 ns | 166 ns .. 167 ns | per elem |
| encode (hash + cells) | binary-lambda.122-gls/m=12150,n=3500,h2c=pornin-addend | gf2_122-gls-lambda | per-element | 417 ns | 416 ns .. 418 ns | per elem |
| encode (hash + cells) | binary-lambda.122-gls/m=12150,n=3500,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_122-gls-lambda | per-element | 358 ns | 357 ns .. 359 ns | per elem |
| encode (hash + cells) | binary-lambda.122-gls/m=1350,n=3500,h2c=pornin-addend | gf2_122-gls-lambda | per-element | 342 ns | 341 ns .. 342 ns | per elem |
| encode (hash + cells) | binary-lambda.122-gls/m=1350,n=3500,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_122-gls-lambda | per-element | 286 ns | 285 ns .. 286 ns | per elem |
| encode (hash + cells) | binary-lambda.122-gls/m=5,n=3500,h2c=pornin-addend | gf2_122-gls-lambda | per-element | 154 ns | 154 ns .. 155 ns | per elem |
| encode (hash + cells) | binary-lambda.122-gls/m=5,n=3500,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_122-gls-lambda | per-element | 99.0 ns | 98.9 ns .. 99.2 ns | per elem |
| encode (hash + cells) | binary-u.122-gls/m=12150,n=3500,h2c=pornin-addend | gf2_122-gls-u | per-element | 378 ns | 377 ns .. 378 ns | per elem |
| encode (hash + cells) | binary-u.122-gls/m=12150,n=3500,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_122-gls-u | per-element | 325 ns | 324 ns .. 325 ns | per elem |
| encode (hash + cells) | binary-u.122-gls/m=1350,n=3500,h2c=pornin-addend | gf2_122-gls-u | per-element | 306 ns | 305 ns .. 307 ns | per elem |
| encode (hash + cells) | binary-u.122-gls/m=1350,n=3500,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_122-gls-u | per-element | 252 ns | 251 ns .. 252 ns | per elem |
| encode (hash + cells) | binary-u.122-gls/m=5,n=3500,h2c=pornin-addend | gf2_122-gls-u | per-element | 150 ns | 150 ns .. 151 ns | per elem |
| encode (hash + cells) | binary-u.122-gls/m=5,n=3500,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_122-gls-u | per-element | 94.5 ns | 94.4 ns .. 94.7 ns | per elem |
| encode (hash + cells) | binary-w.122-gls/m=12150,n=3500,h2c=pornin-addend | gf2_122-gls-w | per-element | 417 ns | 416 ns .. 417 ns | per elem |
| encode (hash + cells) | binary-w.122-gls/m=12150,n=3500,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_122-gls-w | per-element | 360 ns | 359 ns .. 361 ns | per elem |
| encode (hash + cells) | binary-w.122-gls/m=1350,n=3500,h2c=pornin-addend | gf2_122-gls-w | per-element | 340 ns | 340 ns .. 341 ns | per elem |
| encode (hash + cells) | binary-w.122-gls/m=1350,n=3500,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_122-gls-w | per-element | 281 ns | 280 ns .. 283 ns | per elem |
| encode (hash + cells) | binary-w.122-gls/m=5,n=3500,h2c=pornin-addend | gf2_122-gls-w | per-element | 154 ns | 154 ns .. 154 ns | per elem |
| encode (hash + cells) | binary-w.122-gls/m=5,n=3500,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_122-gls-w | per-element | 98.7 ns | 98.5 ns .. 98.9 ns | per elem |
| encode (hash + cells) | binary-lambda.122/m=12150,n=3500,h2c=pornin-addend | gf2_122-lambda | per-element | 417 ns | 417 ns .. 418 ns | per elem |
| encode (hash + cells) | binary-lambda.122/m=12150,n=3500,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_122-lambda | per-element | 358 ns | 357 ns .. 359 ns | per elem |
| encode (hash + cells) | binary-lambda.122/m=1350,n=3500,h2c=pornin-addend | gf2_122-lambda | per-element | 341 ns | 340 ns .. 342 ns | per elem |
| encode (hash + cells) | binary-lambda.122/m=1350,n=3500,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_122-lambda | per-element | 284 ns | 283 ns .. 285 ns | per elem |
| encode (hash + cells) | binary-lambda.122/m=5,n=3500,h2c=pornin-addend | gf2_122-lambda | per-element | 154 ns | 154 ns .. 154 ns | per elem |
| encode (hash + cells) | binary-lambda.122/m=5,n=3500,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_122-lambda | per-element | 99.3 ns | 99.1 ns .. 99.4 ns | per elem |
| encode (hash + cells) | binary-u.122/m=12150,n=3500,h2c=pornin-addend | gf2_122-u | per-element | 378 ns | 376 ns .. 381 ns | per elem |
| encode (hash + cells) | binary-u.122/m=12150,n=3500,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_122-u | per-element | 325 ns | 325 ns .. 326 ns | per elem |
| encode (hash + cells) | binary-u.122/m=1350,n=3500,h2c=pornin-addend | gf2_122-u | per-element | 308 ns | 308 ns .. 309 ns | per elem |
| encode (hash + cells) | binary-u.122/m=1350,n=3500,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_122-u | per-element | 253 ns | 252 ns .. 253 ns | per elem |
| encode (hash + cells) | binary-u.122/m=5,n=3500,h2c=pornin-addend | gf2_122-u | per-element | 152 ns | 151 ns .. 152 ns | per elem |
| encode (hash + cells) | binary-u.122/m=5,n=3500,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_122-u | per-element | 94.3 ns | 93.8 ns .. 94.7 ns | per elem |
| encode (hash + cells) | binary-w.122/m=12150,n=3500,h2c=pornin-addend | gf2_122-w | per-element | 417 ns | 417 ns .. 418 ns | per elem |
| encode (hash + cells) | binary-w.122/m=12150,n=3500,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_122-w | per-element | 361 ns | 360 ns .. 362 ns | per elem |
| encode (hash + cells) | binary-w.122/m=1350,n=3500,h2c=pornin-addend | gf2_122-w | per-element | 341 ns | 340 ns .. 342 ns | per elem |
| encode (hash + cells) | binary-w.122/m=1350,n=3500,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_122-w | per-element | 285 ns | 285 ns .. 286 ns | per elem |
| encode (hash + cells) | binary-w.122/m=5,n=3500,h2c=pornin-addend | gf2_122-w | per-element | 154 ns | 154 ns .. 154 ns | per elem |
| encode (hash + cells) | binary-w.122/m=5,n=3500,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_122-w | per-element | 99.4 ns | 99.2 ns .. 99.5 ns | per elem |
| encode (hash + cells) | binary.127/m=12150,n=3500,h2c=pornin | gf2_127 | per-element | 411 ns | 410 ns .. 412 ns | per elem |
| encode (hash + cells) | binary.127/m=12150,n=3500,h2c=pornin,map=mcg64 | gf2_127 | per-element | 411 ns | 411 ns .. 412 ns | per elem |
| encode (hash + cells) | binary.127/m=12150,n=3500,h2c=pornin,proj=gf2_127,mapproj=gf2_127 | gf2_127 | per-element | 352 ns | 352 ns .. 353 ns | per elem |
| encode (hash + cells) | binary.127/m=1350,n=3500,h2c=pornin | gf2_127 | per-element | 329 ns | 327 ns .. 331 ns | per elem |
| encode (hash + cells) | binary.127/m=1350,n=3500,h2c=pornin,map=mcg64 | gf2_127 | per-element | 330 ns | 329 ns .. 331 ns | per elem |
| encode (hash + cells) | binary.127/m=1350,n=3500,h2c=pornin,proj=gf2_127,mapproj=gf2_127 | gf2_127 | per-element | 273 ns | 272 ns .. 273 ns | per elem |
| encode (hash + cells) | binary.127/m=150,n=3500,h2c=pornin,map=mcg64 | gf2_127 | per-element | 259 ns | 259 ns .. 260 ns | per elem |
| encode (hash + cells) | binary.127/m=20,n=3500,h2c=pornin,map=mcg64 | gf2_127 | per-element | 197 ns | 197 ns .. 198 ns | per elem |
| encode (hash + cells) | binary.127/m=5,n=3500,h2c=pornin | gf2_127 | per-element | 161 ns | 160 ns .. 162 ns | per elem |
| encode (hash + cells) | binary.127/m=5,n=3500,h2c=pornin,map=mcg64 | gf2_127 | per-element | 158 ns | 158 ns .. 159 ns | per elem |
| encode (hash + cells) | binary.127/m=5,n=3500,h2c=pornin,proj=gf2_127,mapproj=gf2_127 | gf2_127 | per-element | 102 ns | 102 ns .. 102 ns | per elem |
| encode (hash + cells) | binary-lambda.127/m=12150,n=3500,h2c=pornin-addend | gf2_127-lambda | per-element | 399 ns | 399 ns .. 400 ns | per elem |
| encode (hash + cells) | binary-lambda.127/m=12150,n=3500,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_127-lambda | per-element | 341 ns | 341 ns .. 342 ns | per elem |
| encode (hash + cells) | binary-lambda.127/m=1350,n=3500,h2c=pornin-addend | gf2_127-lambda | per-element | 326 ns | 325 ns .. 326 ns | per elem |
| encode (hash + cells) | binary-lambda.127/m=1350,n=3500,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_127-lambda | per-element | 268 ns | 267 ns .. 268 ns | per elem |
| encode (hash + cells) | binary-lambda.127/m=5,n=3500,h2c=pornin-addend | gf2_127-lambda | per-element | 151 ns | 151 ns .. 151 ns | per elem |
| encode (hash + cells) | binary-lambda.127/m=5,n=3500,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_127-lambda | per-element | 96.4 ns | 96.3 ns .. 96.6 ns | per elem |
| encode (hash + cells) | binary-u.127/m=12150,n=3500,h2c=pornin-addend | gf2_127-u | per-element | 351 ns | 349 ns .. 352 ns | per elem |
| encode (hash + cells) | binary-u.127/m=12150,n=3500,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_127-u | per-element | 294 ns | 293 ns .. 295 ns | per elem |
| encode (hash + cells) | binary-u.127/m=1350,n=3500,h2c=pornin-addend | gf2_127-u | per-element | 288 ns | 287 ns .. 288 ns | per elem |
| encode (hash + cells) | binary-u.127/m=1350,n=3500,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_127-u | per-element | 227 ns | 227 ns .. 228 ns | per elem |
| encode (hash + cells) | binary-u.127/m=150,n=3500,h2c=pornin-addend | gf2_127-u | per-element | 231 ns | 231 ns .. 232 ns | per elem |
| encode (hash + cells) | binary-u.127/m=20,n=3500,h2c=pornin-addend | gf2_127-u | per-element | 183 ns | 183 ns .. 184 ns | per elem |
| encode (hash + cells) | binary-u.127/m=5,n=3500,h2c=pornin-addend | gf2_127-u | per-element | 152 ns | 151 ns .. 152 ns | per elem |
| encode (hash + cells) | binary-u.127/m=5,n=3500,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_127-u | per-element | 90.5 ns | 90.4 ns .. 90.7 ns | per elem |
| encode (hash + cells) | binary-w.127/m=12150,n=3500,h2c=pornin-addend | gf2_127-w | per-element | 398 ns | 397 ns .. 399 ns | per elem |
| encode (hash + cells) | binary-w.127/m=12150,n=3500,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_127-w | per-element | 341 ns | 340 ns .. 341 ns | per elem |
| encode (hash + cells) | binary-w.127/m=1350,n=3500,h2c=pornin-addend | gf2_127-w | per-element | 325 ns | 325 ns .. 326 ns | per elem |
| encode (hash + cells) | binary-w.127/m=1350,n=3500,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_127-w | per-element | 268 ns | 268 ns .. 268 ns | per elem |
| encode (hash + cells) | binary-w.127/m=5,n=3500,h2c=pornin-addend | gf2_127-w | per-element | 151 ns | 151 ns .. 151 ns | per elem |
| encode (hash + cells) | binary-w.127/m=5,n=3500,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_127-w | per-element | 95.9 ns | 95.6 ns .. 96.1 ns | per elem |
| encode (hash + cells) | edwards.107/m=1350,n=3500,h2c=ti | edwards107 | per-element | 1.09 µs | 1.08 µs .. 1.09 µs | per elem |
| encode (hash + cells) | edwards.127/m=1350,n=3500,h2c=ti | edwards127 | per-element | 1.44 µs | 1.43 µs .. 1.44 µs | per elem |
| encode (hash + cells) | edwards.61x2/m=1350,n=3500,h2c=ti | edwards61x2 | per-element | 940 ns | 938 ns .. 942 ns | per elem |
| encode (hash + cells) | twisted.goldilocks2/m=1350,n=3500,h2c=ti | twisted-goldilocks2 | per-element | 2.18 µs | 2.17 µs .. 2.18 µs | per elem |
| encode (hash + cells) | twisted.128/m=1350,n=3500,h2c=ti | twisted128 | per-element | 2.37 µs | 2.36 µs .. 2.38 µs | per elem |
| encode (hash + cells) | twisted.61x2/m=1350,n=3500,h2c=ti | twisted61x2 | per-element | 900 ns | 898 ns .. 902 ns | per elem |
| encode (hash + cells) | twisted.64x2/m=1350,n=3500,h2c=ti | twisted64x2 | per-element | 1.45 µs | 1.45 µs .. 1.45 µs | per elem |
| encode (hash + cells) | weier.107/m=1350,n=3500,h2c=ti | weier107 | per-element | 1.24 µs | 1.24 µs .. 1.25 µs | per elem |
| encode (hash + cells) | weier-jacobian.107/m=1350,n=3500,h2c=ti | weier107-jacobian | per-element | 1.21 µs | 1.21 µs .. 1.21 µs | per elem |
| encode (hash + cells) | weier.127/m=1350,n=3500,h2c=ti | weier127 | per-element | 1.74 µs | 1.74 µs .. 1.74 µs | per elem |
| encode (hash + cells) | weier-jacobian.127/m=1350,n=3500,h2c=ti | weier127-jacobian | per-element | 1.59 µs | 1.59 µs .. 1.59 µs | per elem |
| encode (hash + cells) | weier.61x2/m=1350,n=3500,h2c=ti | weier61x2 | per-element | 1.08 µs | 1.08 µs .. 1.09 µs | per elem |
| encode (hash + cells) | weier-jacobian.61x2/m=1350,n=3500,h2c=ti | weier61x2-jacobian | per-element | 1.11 µs | 1.10 µs .. 1.11 µs | per elem |
| encode (hash + cells) | ristretto255/m=12150,n=3500 | ristretto255 | per-element | 6.16 µs | 6.14 µs .. 6.17 µs | per elem |
| encode (hash + cells) | ristretto255/m=12150,n=3500,map=mcg64 | ristretto255 | per-element | 6.35 µs | 6.33 µs .. 6.38 µs | per elem |
| encode (hash + cells) | ristretto255/m=1350,n=3500 | ristretto255 | per-element | 5.84 µs | 5.83 µs .. 5.85 µs | per elem |
| encode (hash + cells) | ristretto255/m=1350,n=3500,map=mcg64 | ristretto255 | per-element | 5.96 µs | 5.92 µs .. 5.99 µs | per elem |
| encode (hash + cells) | ristretto255/m=150,n=3500 | ristretto255 | per-element | 5.53 µs | 5.52 µs .. 5.53 µs | per elem |
| encode (hash + cells) | ristretto255/m=150,n=3500,map=mcg64 | ristretto255 | per-element | 5.49 µs | 5.48 µs .. 5.50 µs | per elem |
| encode (hash + cells) | ristretto255/m=20,n=3500 | ristretto255 | per-element | 5.25 µs | 5.23 µs .. 5.26 µs | per elem |
| encode (hash + cells) | ristretto255/m=20,n=3500,map=mcg64 | ristretto255 | per-element | 5.26 µs | 5.24 µs .. 5.27 µs | per elem |
| encode (hash + cells) | ristretto255/m=5,n=3500 | ristretto255 | per-element | 5.11 µs | 5.10 µs .. 5.11 µs | per elem |
| encode (hash + cells) | ristretto255/m=5,n=3500,map=mcg64 | ristretto255 | per-element | 5.08 µs | 5.08 µs .. 5.09 µs | per elem |
| cell updates | xor-sha256.64/m=1350,n=3500 | xor | per-element | 141 ns | 140 ns .. 141 ns | per elem |
| cell updates | xor-siphash.64/m=1350,n=3500 | xor-siphash | per-element | 141 ns | 140 ns .. 141 ns | per elem |
| cell updates | binary.109/m=12150,n=3500 | gf2_109 | per-element | 321 ns | 320 ns .. 321 ns | per elem |
| cell updates | binary.109/m=1350,n=3500 | gf2_109 | per-element | 248 ns | 247 ns .. 248 ns | per elem |
| cell updates | binary.109/m=5,n=3500 | gf2_109 | per-element | 93.7 ns | 93.5 ns .. 93.8 ns | per elem |
| cell updates | binary-lambda.109/m=12150,n=3500 | gf2_109-lambda | per-element | 295 ns | 294 ns .. 296 ns | per elem |
| cell updates | binary-lambda.109/m=1350,n=3500 | gf2_109-lambda | per-element | 237 ns | 236 ns .. 237 ns | per elem |
| cell updates | binary-lambda.109/m=150,n=3500 | gf2_109-lambda | per-element | 179 ns | 178 ns .. 179 ns | per elem |
| cell updates | binary-lambda.109/m=20,n=3500 | gf2_109-lambda | per-element | 122 ns | 122 ns .. 123 ns | per elem |
| cell updates | binary-lambda.109/m=5,n=3500 | gf2_109-lambda | per-element | 92.4 ns | 92.2 ns .. 92.6 ns | per elem |
| cell updates | binary-u.109/m=12150,n=3500 | gf2_109-u | per-element | 273 ns | 272 ns .. 273 ns | per elem |
| cell updates | binary-u.109/m=1350,n=3500 | gf2_109-u | per-element | 212 ns | 212 ns .. 212 ns | per elem |
| cell updates | binary-u.109/m=150,n=3500 | gf2_109-u | per-element | 161 ns | 160 ns .. 161 ns | per elem |
| cell updates | binary-u.109/m=20,n=3500 | gf2_109-u | per-element | 116 ns | 116 ns .. 116 ns | per elem |
| cell updates | binary-u.109/m=5,n=3500 | gf2_109-u | per-element | 87.6 ns | 87.4 ns .. 87.8 ns | per elem |
| cell updates | binary-w.109/m=12150,n=3500 | gf2_109-w | per-element | 292 ns | 290 ns .. 293 ns | per elem |
| cell updates | binary-w.109/m=1350,n=3500 | gf2_109-w | per-element | 237 ns | 236 ns .. 237 ns | per elem |
| cell updates | binary-w.109/m=150,n=3500 | gf2_109-w | per-element | 178 ns | 177 ns .. 178 ns | per elem |
| cell updates | binary-w.109/m=20,n=3500 | gf2_109-w | per-element | 126 ns | 125 ns .. 126 ns | per elem |
| cell updates | binary-w.109/m=5,n=3500 | gf2_109-w | per-element | 92.7 ns | 92.5 ns .. 92.8 ns | per elem |
| cell updates | binary.122/m=12150,n=3500 | gf2_122 | per-element | 391 ns | 390 ns .. 392 ns | per elem |
| cell updates | binary.122/m=1350,n=3500 | gf2_122 | per-element | 302 ns | 302 ns .. 303 ns | per elem |
| cell updates | binary.122/m=5,n=3500 | gf2_122 | per-element | 101 ns | 101 ns .. 101 ns | per elem |
| cell updates | binary.122-gls/m=12150,n=3500 | gf2_122-gls | per-element | 371 ns | 369 ns .. 373 ns | per elem |
| cell updates | binary.122-gls/m=1350,n=3500 | gf2_122-gls | per-element | 291 ns | 290 ns .. 291 ns | per elem |
| cell updates | binary.122-gls/m=5,n=3500 | gf2_122-gls | per-element | 99.3 ns | 99.0 ns .. 99.6 ns | per elem |
| cell updates | binary-lambda.122-gls/m=12150,n=3500 | gf2_122-gls-lambda | per-element | 359 ns | 359 ns .. 360 ns | per elem |
| cell updates | binary-lambda.122-gls/m=1350,n=3500 | gf2_122-gls-lambda | per-element | 284 ns | 284 ns .. 285 ns | per elem |
| cell updates | binary-lambda.122-gls/m=5,n=3500 | gf2_122-gls-lambda | per-element | 97.3 ns | 97.1 ns .. 97.5 ns | per elem |
| cell updates | binary-u.122-gls/m=12150,n=3500 | gf2_122-gls-u | per-element | 317 ns | 317 ns .. 318 ns | per elem |
| cell updates | binary-u.122-gls/m=1350,n=3500 | gf2_122-gls-u | per-element | 246 ns | 245 ns .. 246 ns | per elem |
| cell updates | binary-u.122-gls/m=5,n=3500 | gf2_122-gls-u | per-element | 89.4 ns | 89.2 ns .. 89.5 ns | per elem |
| cell updates | binary-w.122-gls/m=12150,n=3500 | gf2_122-gls-w | per-element | 359 ns | 358 ns .. 360 ns | per elem |
| cell updates | binary-w.122-gls/m=1350,n=3500 | gf2_122-gls-w | per-element | 284 ns | 283 ns .. 284 ns | per elem |
| cell updates | binary-w.122-gls/m=5,n=3500 | gf2_122-gls-w | per-element | 97.4 ns | 97.2 ns .. 97.6 ns | per elem |
| cell updates | binary-lambda.122/m=12150,n=3500 | gf2_122-lambda | per-element | 360 ns | 359 ns .. 360 ns | per elem |
| cell updates | binary-lambda.122/m=1350,n=3500 | gf2_122-lambda | per-element | 284 ns | 283 ns .. 284 ns | per elem |
| cell updates | binary-lambda.122/m=5,n=3500 | gf2_122-lambda | per-element | 96.6 ns | 96.4 ns .. 96.8 ns | per elem |
| cell updates | binary-u.122/m=12150,n=3500 | gf2_122-u | per-element | 317 ns | 315 ns .. 318 ns | per elem |
| cell updates | binary-u.122/m=1350,n=3500 | gf2_122-u | per-element | 246 ns | 245 ns .. 246 ns | per elem |
| cell updates | binary-u.122/m=5,n=3500 | gf2_122-u | per-element | 89.4 ns | 89.2 ns .. 89.5 ns | per elem |
| cell updates | binary-w.122/m=12150,n=3500 | gf2_122-w | per-element | 359 ns | 358 ns .. 359 ns | per elem |
| cell updates | binary-w.122/m=1350,n=3500 | gf2_122-w | per-element | 284 ns | 283 ns .. 285 ns | per elem |
| cell updates | binary-w.122/m=5,n=3500 | gf2_122-w | per-element | 96.5 ns | 96.3 ns .. 96.7 ns | per elem |
| cell updates | binary.127/m=12150,n=3500 | gf2_127 | per-element | 341 ns | 341 ns .. 342 ns | per elem |
| cell updates | binary.127/m=1350,n=3500 | gf2_127 | per-element | 261 ns | 260 ns .. 262 ns | per elem |
| cell updates | binary.127/m=5,n=3500 | gf2_127 | per-element | 94.5 ns | 94.3 ns .. 94.8 ns | per elem |
| cell updates | binary-lambda.127/m=12150,n=3500 | gf2_127-lambda | per-element | 341 ns | 341 ns .. 342 ns | per elem |
| cell updates | binary-lambda.127/m=1350,n=3500 | gf2_127-lambda | per-element | 267 ns | 267 ns .. 267 ns | per elem |
| cell updates | binary-lambda.127/m=5,n=3500 | gf2_127-lambda | per-element | 92.5 ns | 92.3 ns .. 92.7 ns | per elem |
| cell updates | binary-u.127/m=12150,n=3500 | gf2_127-u | per-element | 286 ns | 285 ns .. 287 ns | per elem |
| cell updates | binary-u.127/m=1350,n=3500 | gf2_127-u | per-element | 222 ns | 222 ns .. 222 ns | per elem |
| cell updates | binary-u.127/m=150,n=3500 | gf2_127-u | per-element | 167 ns | 167 ns .. 168 ns | per elem |
| cell updates | binary-u.127/m=20,n=3500 | gf2_127-u | per-element | 120 ns | 119 ns .. 120 ns | per elem |
| cell updates | binary-u.127/m=5,n=3500 | gf2_127-u | per-element | 86.4 ns | 86.3 ns .. 86.6 ns | per elem |
| cell updates | binary-w.127/m=12150,n=3500 | gf2_127-w | per-element | 341 ns | 341 ns .. 342 ns | per elem |
| cell updates | binary-w.127/m=1350,n=3500 | gf2_127-w | per-element | 267 ns | 267 ns .. 267 ns | per elem |
| cell updates | binary-w.127/m=5,n=3500 | gf2_127-w | per-element | 92.4 ns | 92.1 ns .. 92.6 ns | per elem |
| cell updates | edwards.107/m=1350,n=3500 | edwards107 | per-element | 286 ns | 285 ns .. 287 ns | per elem |
| cell updates | edwards.127/m=1350,n=3500 | edwards127 | per-element | 338 ns | 337 ns .. 339 ns | per elem |
| cell updates | edwards.61x2/m=1350,n=3500 | edwards61x2 | per-element | 270 ns | 270 ns .. 271 ns | per elem |
| cell updates | twisted.goldilocks2/m=1350,n=3500 | twisted-goldilocks2 | per-element | 325 ns | 324 ns .. 326 ns | per elem |
| cell updates | twisted.128/m=1350,n=3500 | twisted128 | per-element | 427 ns | 425 ns .. 429 ns | per elem |
| cell updates | twisted.61x2/m=1350,n=3500 | twisted61x2 | per-element | 250 ns | 250 ns .. 251 ns | per elem |
| cell updates | twisted.64x2/m=1350,n=3500 | twisted64x2 | per-element | 331 ns | 330 ns .. 331 ns | per elem |
| cell updates | weier.107/m=1350,n=3500 | weier107 | per-element | 474 ns | 472 ns .. 475 ns | per elem |
| cell updates | weier-jacobian.107/m=1350,n=3500 | weier107-jacobian | per-element | 439 ns | 439 ns .. 440 ns | per elem |
| cell updates | weier.127/m=1350,n=3500 | weier127 | per-element | 674 ns | 673 ns .. 675 ns | per elem |
| cell updates | weier-jacobian.127/m=1350,n=3500 | weier127-jacobian | per-element | 541 ns | 540 ns .. 543 ns | per elem |
| cell updates | weier.61x2/m=1350,n=3500 | weier61x2 | per-element | 432 ns | 432 ns .. 433 ns | per elem |
| cell updates | weier-jacobian.61x2/m=1350,n=3500 | weier61x2-jacobian | per-element | 487 ns | 485 ns .. 488 ns | per elem |
| cell updates | ristretto255/m=1350,n=3500 | ristretto255 | per-element | 1.02 µs | 1.02 µs .. 1.02 µs | per elem |
| peel, per difference | xor-sha256.64/d=1350,m=2700,prefilter=true,batch=true | xor | batch | 643 ns | 642 ns .. 645 ns | per elem |
| peel, per difference | xor-siphash.64/d=1350,m=2700,prefilter=true,batch=true | xor-siphash | batch | 648 ns | 647 ns .. 650 ns | per elem |
| peel, per difference | binary.109/d=10000,m=20000,prefilter=true,batch=true,h2c=pornin | gf2_109 | batch | 1.14 µs | 1.13 µs .. 1.14 µs | per elem |
| peel, per difference | binary.109/d=10000,m=20000,prefilter=true,batch=true,h2c=pornin,proj=gf2_127,mapproj=gf2_127 | gf2_109 | batch | 952 ns | 950 ns .. 953 ns | per elem |
| peel, per difference | binary.109/d=1350,m=2700,prefilter=true,batch=true,h2c=pornin | gf2_109 | batch | 838 ns | 836 ns .. 841 ns | per elem |
| peel, per difference | binary.109/d=1350,m=2700,prefilter=true,batch=true,h2c=pornin,proj=gf2_127,mapproj=gf2_127 | gf2_109 | batch | 614 ns | 612 ns .. 615 ns | per elem |
| peel, per difference | binary.109/d=4,m=10,prefilter=true,batch=true,h2c=pornin,proj=gf2_127,mapproj=gf2_127 | gf2_109 | batch | 735 ns | 734 ns .. 737 ns | per elem |
| peel, per difference | binary.109/d=4,m=8,prefilter=true,batch=true,h2c=pornin | gf2_109 | batch | 613 ns | 612 ns .. 615 ns | per elem |
| peel, per difference | binary-lambda.109/d=10000,m=20000,prefilter=false,batch=false,h2c=pornin-addend | gf2_109-lambda | per-element | 1.73 µs | 1.72 µs .. 1.73 µs | per elem |
| peel, per difference | binary-lambda.109/d=10000,m=20000,prefilter=false,batch=true,h2c=pornin-addend | gf2_109-lambda | batch | 897 ns | 896 ns .. 899 ns | per elem |
| peel, per difference | binary-lambda.109/d=10000,m=20000,prefilter=true,batch=false,h2c=pornin-addend | gf2_109-lambda | per-element | 1.60 µs | 1.59 µs .. 1.60 µs | per elem |
| peel, per difference | binary-lambda.109/d=10000,m=20000,prefilter=true,batch=true,h2c=pornin-addend | gf2_109-lambda | batch | 1.12 µs | 1.12 µs .. 1.13 µs | per elem |
| peel, per difference | binary-lambda.109/d=10000,m=20000,prefilter=true,batch=true,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_109-lambda | batch | 957 ns | 955 ns .. 958 ns | per elem |
| peel, per difference | binary-lambda.109/d=1350,m=2700,prefilter=false,batch=false,h2c=pornin-addend | gf2_109-lambda | per-element | 1.59 µs | 1.58 µs .. 1.60 µs | per elem |
| peel, per difference | binary-lambda.109/d=1350,m=2700,prefilter=false,batch=true,h2c=pornin-addend | gf2_109-lambda | batch | 683 ns | 680 ns .. 685 ns | per elem |
| peel, per difference | binary-lambda.109/d=1350,m=2700,prefilter=true,batch=false,h2c=pornin-addend | gf2_109-lambda | per-element | 1.37 µs | 1.36 µs .. 1.38 µs | per elem |
| peel, per difference | binary-lambda.109/d=1350,m=2700,prefilter=true,batch=true,h2c=pornin-addend | gf2_109-lambda | batch | 829 ns | 826 ns .. 832 ns | per elem |
| peel, per difference | binary-lambda.109/d=1350,m=2700,prefilter=true,batch=true,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_109-lambda | batch | 585 ns | 584 ns .. 587 ns | per elem |
| peel, per difference | binary-lambda.109/d=150,m=300,prefilter=false,batch=false,h2c=pornin-addend | gf2_109-lambda | per-element | 1.40 µs | 1.40 µs .. 1.41 µs | per elem |
| peel, per difference | binary-lambda.109/d=150,m=300,prefilter=false,batch=true,h2c=pornin-addend | gf2_109-lambda | batch | 556 ns | 555 ns .. 557 ns | per elem |
| peel, per difference | binary-lambda.109/d=150,m=300,prefilter=true,batch=false,h2c=pornin-addend | gf2_109-lambda | per-element | 1.14 µs | 1.13 µs .. 1.14 µs | per elem |
| peel, per difference | binary-lambda.109/d=150,m=300,prefilter=true,batch=true,h2c=pornin-addend | gf2_109-lambda | batch | 650 ns | 649 ns .. 651 ns | per elem |
| peel, per difference | binary-lambda.109/d=20,m=40,prefilter=false,batch=false,h2c=pornin-addend | gf2_109-lambda | per-element | 1.15 µs | 1.15 µs .. 1.16 µs | per elem |
| peel, per difference | binary-lambda.109/d=20,m=40,prefilter=false,batch=true,h2c=pornin-addend | gf2_109-lambda | batch | 519 ns | 518 ns .. 520 ns | per elem |
| peel, per difference | binary-lambda.109/d=20,m=40,prefilter=true,batch=false,h2c=pornin-addend | gf2_109-lambda | per-element | 985 ns | 982 ns .. 988 ns | per elem |
| peel, per difference | binary-lambda.109/d=20,m=40,prefilter=true,batch=true,h2c=pornin-addend | gf2_109-lambda | batch | 589 ns | 588 ns .. 590 ns | per elem |
| peel, per difference | binary-lambda.109/d=4,m=10,prefilter=true,batch=true,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_109-lambda | batch | 698 ns | 697 ns .. 700 ns | per elem |
| peel, per difference | binary-lambda.109/d=4,m=8,prefilter=false,batch=false,h2c=pornin-addend | gf2_109-lambda | per-element | 744 ns | 742 ns .. 746 ns | per elem |
| peel, per difference | binary-lambda.109/d=4,m=8,prefilter=false,batch=true,h2c=pornin-addend | gf2_109-lambda | batch | 536 ns | 535 ns .. 538 ns | per elem |
| peel, per difference | binary-lambda.109/d=4,m=8,prefilter=true,batch=false,h2c=pornin-addend | gf2_109-lambda | per-element | 794 ns | 792 ns .. 796 ns | per elem |
| peel, per difference | binary-lambda.109/d=4,m=8,prefilter=true,batch=true,h2c=pornin-addend | gf2_109-lambda | batch | 586 ns | 585 ns .. 588 ns | per elem |
| peel, per difference | binary-u.109/d=10000,m=20000,prefilter=false,batch=false,h2c=pornin-addend | gf2_109-u | per-element | 1.66 µs | 1.66 µs .. 1.67 µs | per elem |
| peel, per difference | binary-u.109/d=10000,m=20000,prefilter=false,batch=true,h2c=pornin-addend | gf2_109-u | batch | 840 ns | 839 ns .. 841 ns | per elem |
| peel, per difference | binary-u.109/d=10000,m=20000,prefilter=true,batch=false,h2c=pornin-addend | gf2_109-u | per-element | 1.54 µs | 1.54 µs .. 1.54 µs | per elem |
| peel, per difference | binary-u.109/d=10000,m=20000,prefilter=true,batch=true,h2c=pornin-addend | gf2_109-u | batch | 1.05 µs | 1.05 µs .. 1.06 µs | per elem |
| peel, per difference | binary-u.109/d=10000,m=20000,prefilter=true,batch=true,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_109-u | batch | 883 ns | 882 ns .. 885 ns | per elem |
| peel, per difference | binary-u.109/d=1350,m=2700,prefilter=false,batch=false,h2c=pornin-addend | gf2_109-u | per-element | 1.49 µs | 1.49 µs .. 1.49 µs | per elem |
| peel, per difference | binary-u.109/d=1350,m=2700,prefilter=false,batch=true,h2c=pornin-addend | gf2_109-u | batch | 640 ns | 639 ns .. 641 ns | per elem |
| peel, per difference | binary-u.109/d=1350,m=2700,prefilter=true,batch=false,h2c=pornin-addend | gf2_109-u | per-element | 1.27 µs | 1.27 µs .. 1.28 µs | per elem |
| peel, per difference | binary-u.109/d=1350,m=2700,prefilter=true,batch=true,h2c=pornin-addend | gf2_109-u | batch | 786 ns | 784 ns .. 788 ns | per elem |
| peel, per difference | binary-u.109/d=1350,m=2700,prefilter=true,batch=true,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_109-u | batch | 563 ns | 562 ns .. 564 ns | per elem |
| peel, per difference | binary-u.109/d=150,m=300,prefilter=false,batch=false,h2c=pornin-addend | gf2_109-u | per-element | 1.39 µs | 1.39 µs .. 1.39 µs | per elem |
| peel, per difference | binary-u.109/d=150,m=300,prefilter=false,batch=true,h2c=pornin-addend | gf2_109-u | batch | 550 ns | 550 ns .. 551 ns | per elem |
| peel, per difference | binary-u.109/d=150,m=300,prefilter=true,batch=false,h2c=pornin-addend | gf2_109-u | per-element | 1.12 µs | 1.12 µs .. 1.13 µs | per elem |
| peel, per difference | binary-u.109/d=150,m=300,prefilter=true,batch=true,h2c=pornin-addend | gf2_109-u | batch | 643 ns | 642 ns .. 644 ns | per elem |
| peel, per difference | binary-u.109/d=20,m=40,prefilter=false,batch=false,h2c=pornin-addend | gf2_109-u | per-element | 1.15 µs | 1.14 µs .. 1.15 µs | per elem |
| peel, per difference | binary-u.109/d=20,m=40,prefilter=false,batch=true,h2c=pornin-addend | gf2_109-u | batch | 519 ns | 518 ns .. 521 ns | per elem |
| peel, per difference | binary-u.109/d=20,m=40,prefilter=true,batch=false,h2c=pornin-addend | gf2_109-u | per-element | 986 ns | 984 ns .. 989 ns | per elem |
| peel, per difference | binary-u.109/d=20,m=40,prefilter=true,batch=true,h2c=pornin-addend | gf2_109-u | batch | 590 ns | 589 ns .. 591 ns | per elem |
| peel, per difference | binary-u.109/d=4,m=10,prefilter=true,batch=true,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_109-u | batch | 714 ns | 712 ns .. 715 ns | per elem |
| peel, per difference | binary-u.109/d=4,m=8,prefilter=false,batch=false,h2c=pornin-addend | gf2_109-u | per-element | 750 ns | 747 ns .. 753 ns | per elem |
| peel, per difference | binary-u.109/d=4,m=8,prefilter=false,batch=true,h2c=pornin-addend | gf2_109-u | batch | 547 ns | 546 ns .. 549 ns | per elem |
| peel, per difference | binary-u.109/d=4,m=8,prefilter=true,batch=false,h2c=pornin-addend | gf2_109-u | per-element | 802 ns | 800 ns .. 805 ns | per elem |
| peel, per difference | binary-u.109/d=4,m=8,prefilter=true,batch=true,h2c=pornin-addend | gf2_109-u | batch | 595 ns | 593 ns .. 596 ns | per elem |
| peel, per difference | binary-w.109/d=10000,m=20000,prefilter=false,batch=false,h2c=pornin-addend | gf2_109-w | per-element | 1.72 µs | 1.72 µs .. 1.73 µs | per elem |
| peel, per difference | binary-w.109/d=10000,m=20000,prefilter=false,batch=true,h2c=pornin-addend | gf2_109-w | batch | 897 ns | 895 ns .. 899 ns | per elem |
| peel, per difference | binary-w.109/d=10000,m=20000,prefilter=true,batch=false,h2c=pornin-addend | gf2_109-w | per-element | 1.60 µs | 1.60 µs .. 1.60 µs | per elem |
| peel, per difference | binary-w.109/d=10000,m=20000,prefilter=true,batch=true,h2c=pornin-addend | gf2_109-w | batch | 1.13 µs | 1.13 µs .. 1.13 µs | per elem |
| peel, per difference | binary-w.109/d=10000,m=20000,prefilter=true,batch=true,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_109-w | batch | 957 ns | 955 ns .. 958 ns | per elem |
| peel, per difference | binary-w.109/d=1350,m=2700,prefilter=false,batch=false,h2c=pornin-addend | gf2_109-w | per-element | 1.52 µs | 1.51 µs .. 1.52 µs | per elem |
| peel, per difference | binary-w.109/d=1350,m=2700,prefilter=false,batch=true,h2c=pornin-addend | gf2_109-w | batch | 666 ns | 665 ns .. 667 ns | per elem |
| peel, per difference | binary-w.109/d=1350,m=2700,prefilter=true,batch=false,h2c=pornin-addend | gf2_109-w | per-element | 1.31 µs | 1.31 µs .. 1.32 µs | per elem |
| peel, per difference | binary-w.109/d=1350,m=2700,prefilter=true,batch=true,h2c=pornin-addend | gf2_109-w | batch | 823 ns | 821 ns .. 825 ns | per elem |
| peel, per difference | binary-w.109/d=1350,m=2700,prefilter=true,batch=true,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_109-w | batch | 580 ns | 579 ns .. 582 ns | per elem |
| peel, per difference | binary-w.109/d=150,m=300,prefilter=false,batch=false,h2c=pornin-addend | gf2_109-w | per-element | 1.40 µs | 1.39 µs .. 1.40 µs | per elem |
| peel, per difference | binary-w.109/d=150,m=300,prefilter=false,batch=true,h2c=pornin-addend | gf2_109-w | batch | 554 ns | 553 ns .. 555 ns | per elem |
| peel, per difference | binary-w.109/d=150,m=300,prefilter=true,batch=false,h2c=pornin-addend | gf2_109-w | per-element | 1.14 µs | 1.13 µs .. 1.14 µs | per elem |
| peel, per difference | binary-w.109/d=150,m=300,prefilter=true,batch=true,h2c=pornin-addend | gf2_109-w | batch | 649 ns | 648 ns .. 651 ns | per elem |
| peel, per difference | binary-w.109/d=20,m=40,prefilter=false,batch=false,h2c=pornin-addend | gf2_109-w | per-element | 1.15 µs | 1.15 µs .. 1.15 µs | per elem |
| peel, per difference | binary-w.109/d=20,m=40,prefilter=false,batch=true,h2c=pornin-addend | gf2_109-w | batch | 518 ns | 517 ns .. 519 ns | per elem |
| peel, per difference | binary-w.109/d=20,m=40,prefilter=true,batch=false,h2c=pornin-addend | gf2_109-w | per-element | 986 ns | 982 ns .. 989 ns | per elem |
| peel, per difference | binary-w.109/d=20,m=40,prefilter=true,batch=true,h2c=pornin-addend | gf2_109-w | batch | 589 ns | 588 ns .. 590 ns | per elem |
| peel, per difference | binary-w.109/d=4,m=10,prefilter=true,batch=true,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_109-w | batch | 694 ns | 693 ns .. 696 ns | per elem |
| peel, per difference | binary-w.109/d=4,m=8,prefilter=false,batch=false,h2c=pornin-addend | gf2_109-w | per-element | 744 ns | 742 ns .. 747 ns | per elem |
| peel, per difference | binary-w.109/d=4,m=8,prefilter=false,batch=true,h2c=pornin-addend | gf2_109-w | batch | 537 ns | 536 ns .. 538 ns | per elem |
| peel, per difference | binary-w.109/d=4,m=8,prefilter=true,batch=false,h2c=pornin-addend | gf2_109-w | per-element | 796 ns | 794 ns .. 798 ns | per elem |
| peel, per difference | binary-w.109/d=4,m=8,prefilter=true,batch=true,h2c=pornin-addend | gf2_109-w | batch | 588 ns | 587 ns .. 590 ns | per elem |
| peel, per difference | binary.122/d=10000,m=20000,prefilter=true,batch=true,h2c=pornin | gf2_122 | batch | 1.20 µs | 1.20 µs .. 1.20 µs | per elem |
| peel, per difference | binary.122/d=1350,m=2700,prefilter=true,batch=true,h2c=pornin | gf2_122 | batch | 891 ns | 889 ns .. 893 ns | per elem |
| peel, per difference | binary.122/d=4,m=8,prefilter=true,batch=true,h2c=pornin | gf2_122 | batch | 527 ns | 526 ns .. 528 ns | per elem |
| peel, per difference | binary.122-gls/d=10000,m=20000,prefilter=true,batch=true,h2c=pornin | gf2_122-gls | batch | 1.18 µs | 1.18 µs .. 1.18 µs | per elem |
| peel, per difference | binary.122-gls/d=1350,m=2700,prefilter=true,batch=true,h2c=pornin | gf2_122-gls | batch | 888 ns | 886 ns .. 889 ns | per elem |
| peel, per difference | binary.122-gls/d=4,m=8,prefilter=true,batch=true,h2c=pornin | gf2_122-gls | batch | 521 ns | 519 ns .. 522 ns | per elem |
| peel, per difference | binary-lambda.122-gls/d=10000,m=20000,prefilter=true,batch=true,h2c=pornin-addend | gf2_122-gls-lambda | batch | 1.21 µs | 1.21 µs .. 1.21 µs | per elem |
| peel, per difference | binary-lambda.122-gls/d=10000,m=20000,prefilter=true,batch=true,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_122-gls-lambda | batch | 1.02 µs | 1.01 µs .. 1.02 µs | per elem |
| peel, per difference | binary-lambda.122-gls/d=1350,m=2700,prefilter=true,batch=true,h2c=pornin-addend | gf2_122-gls-lambda | batch | 888 ns | 885 ns .. 891 ns | per elem |
| peel, per difference | binary-lambda.122-gls/d=1350,m=2700,prefilter=true,batch=true,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_122-gls-lambda | batch | 651 ns | 648 ns .. 654 ns | per elem |
| peel, per difference | binary-lambda.122-gls/d=4,m=10,prefilter=true,batch=true,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_122-gls-lambda | batch | 560 ns | 558 ns .. 562 ns | per elem |
| peel, per difference | binary-lambda.122-gls/d=4,m=8,prefilter=true,batch=true,h2c=pornin-addend | gf2_122-gls-lambda | batch | 487 ns | 486 ns .. 488 ns | per elem |
| peel, per difference | binary-u.122-gls/d=10000,m=20000,prefilter=true,batch=true,h2c=pornin-addend | gf2_122-gls-u | batch | 1.12 µs | 1.11 µs .. 1.12 µs | per elem |
| peel, per difference | binary-u.122-gls/d=10000,m=20000,prefilter=true,batch=true,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_122-gls-u | batch | 926 ns | 924 ns .. 927 ns | per elem |
| peel, per difference | binary-u.122-gls/d=1350,m=2700,prefilter=true,batch=true,h2c=pornin-addend | gf2_122-gls-u | batch | 825 ns | 823 ns .. 826 ns | per elem |
| peel, per difference | binary-u.122-gls/d=1350,m=2700,prefilter=true,batch=true,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_122-gls-u | batch | 597 ns | 596 ns .. 598 ns | per elem |
| peel, per difference | binary-u.122-gls/d=4,m=10,prefilter=true,batch=true,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_122-gls-u | batch | 580 ns | 578 ns .. 581 ns | per elem |
| peel, per difference | binary-u.122-gls/d=4,m=8,prefilter=true,batch=true,h2c=pornin-addend | gf2_122-gls-u | batch | 502 ns | 500 ns .. 503 ns | per elem |
| peel, per difference | binary-w.122-gls/d=10000,m=20000,prefilter=true,batch=true,h2c=pornin-addend | gf2_122-gls-w | batch | 1.22 µs | 1.22 µs .. 1.22 µs | per elem |
| peel, per difference | binary-w.122-gls/d=10000,m=20000,prefilter=true,batch=true,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_122-gls-w | batch | 1.02 µs | 1.01 µs .. 1.03 µs | per elem |
| peel, per difference | binary-w.122-gls/d=1350,m=2700,prefilter=true,batch=true,h2c=pornin-addend | gf2_122-gls-w | batch | 892 ns | 889 ns .. 895 ns | per elem |
| peel, per difference | binary-w.122-gls/d=1350,m=2700,prefilter=true,batch=true,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_122-gls-w | batch | 645 ns | 643 ns .. 647 ns | per elem |
| peel, per difference | binary-w.122-gls/d=4,m=10,prefilter=true,batch=true,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_122-gls-w | batch | 560 ns | 558 ns .. 561 ns | per elem |
| peel, per difference | binary-w.122-gls/d=4,m=8,prefilter=true,batch=true,h2c=pornin-addend | gf2_122-gls-w | batch | 488 ns | 486 ns .. 489 ns | per elem |
| peel, per difference | binary-lambda.122/d=10000,m=20000,prefilter=true,batch=true,h2c=pornin-addend | gf2_122-lambda | batch | 1.21 µs | 1.21 µs .. 1.21 µs | per elem |
| peel, per difference | binary-lambda.122/d=10000,m=20000,prefilter=true,batch=true,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_122-lambda | batch | 1.02 µs | 1.02 µs .. 1.02 µs | per elem |
| peel, per difference | binary-lambda.122/d=1350,m=2700,prefilter=true,batch=true,h2c=pornin-addend | gf2_122-lambda | batch | 879 ns | 877 ns .. 882 ns | per elem |
| peel, per difference | binary-lambda.122/d=1350,m=2700,prefilter=true,batch=true,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_122-lambda | batch | 646 ns | 643 ns .. 649 ns | per elem |
| peel, per difference | binary-lambda.122/d=4,m=10,prefilter=true,batch=true,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_122-lambda | batch | 568 ns | 567 ns .. 569 ns | per elem |
| peel, per difference | binary-lambda.122/d=4,m=8,prefilter=true,batch=true,h2c=pornin-addend | gf2_122-lambda | batch | 492 ns | 491 ns .. 493 ns | per elem |
| peel, per difference | binary-u.122/d=10000,m=20000,prefilter=true,batch=true,h2c=pornin-addend | gf2_122-u | batch | 1.11 µs | 1.11 µs .. 1.11 µs | per elem |
| peel, per difference | binary-u.122/d=10000,m=20000,prefilter=true,batch=true,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_122-u | batch | 923 ns | 922 ns .. 925 ns | per elem |
| peel, per difference | binary-u.122/d=1350,m=2700,prefilter=true,batch=true,h2c=pornin-addend | gf2_122-u | batch | 821 ns | 819 ns .. 824 ns | per elem |
| peel, per difference | binary-u.122/d=1350,m=2700,prefilter=true,batch=true,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_122-u | batch | 597 ns | 595 ns .. 598 ns | per elem |
| peel, per difference | binary-u.122/d=4,m=10,prefilter=true,batch=true,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_122-u | batch | 584 ns | 583 ns .. 586 ns | per elem |
| peel, per difference | binary-u.122/d=4,m=8,prefilter=true,batch=true,h2c=pornin-addend | gf2_122-u | batch | 504 ns | 503 ns .. 505 ns | per elem |
| peel, per difference | binary-w.122/d=10000,m=20000,prefilter=true,batch=true,h2c=pornin-addend | gf2_122-w | batch | 1.22 µs | 1.21 µs .. 1.22 µs | per elem |
| peel, per difference | binary-w.122/d=10000,m=20000,prefilter=true,batch=true,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_122-w | batch | 1.03 µs | 1.02 µs .. 1.03 µs | per elem |
| peel, per difference | binary-w.122/d=1350,m=2700,prefilter=true,batch=true,h2c=pornin-addend | gf2_122-w | batch | 887 ns | 883 ns .. 891 ns | per elem |
| peel, per difference | binary-w.122/d=1350,m=2700,prefilter=true,batch=true,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_122-w | batch | 639 ns | 634 ns .. 643 ns | per elem |
| peel, per difference | binary-w.122/d=4,m=10,prefilter=true,batch=true,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_122-w | batch | 563 ns | 561 ns .. 565 ns | per elem |
| peel, per difference | binary-w.122/d=4,m=8,prefilter=true,batch=true,h2c=pornin-addend | gf2_122-w | batch | 492 ns | 490 ns .. 493 ns | per elem |
| peel, per difference | binary.127/d=10000,m=20000,prefilter=true,batch=true,h2c=pornin | gf2_127 | batch | 1.13 µs | 1.13 µs .. 1.14 µs | per elem |
| peel, per difference | binary.127/d=10000,m=20000,prefilter=true,batch=true,h2c=pornin,proj=gf2_127,mapproj=gf2_127 | gf2_127 | batch | 971 ns | 969 ns .. 973 ns | per elem |
| peel, per difference | binary.127/d=1350,m=2700,prefilter=true,batch=true,h2c=pornin | gf2_127 | batch | 844 ns | 841 ns .. 846 ns | per elem |
| peel, per difference | binary.127/d=1350,m=2700,prefilter=true,batch=true,h2c=pornin,proj=gf2_127,mapproj=gf2_127 | gf2_127 | batch | 624 ns | 623 ns .. 626 ns | per elem |
| peel, per difference | binary.127/d=4,m=10,prefilter=true,batch=true,h2c=pornin,proj=gf2_127,mapproj=gf2_127 | gf2_127 | batch | 713 ns | 711 ns .. 715 ns | per elem |
| peel, per difference | binary.127/d=4,m=8,prefilter=true,batch=true,h2c=pornin | gf2_127 | batch | 601 ns | 599 ns .. 603 ns | per elem |
| peel, per difference | binary-lambda.127/d=10000,m=20000,prefilter=true,batch=true,h2c=pornin-addend | gf2_127-lambda | batch | 1.19 µs | 1.19 µs .. 1.20 µs | per elem |
| peel, per difference | binary-lambda.127/d=10000,m=20000,prefilter=true,batch=true,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_127-lambda | batch | 999 ns | 997 ns .. 1.00 µs | per elem |
| peel, per difference | binary-lambda.127/d=1350,m=2700,prefilter=true,batch=true,h2c=pornin-addend | gf2_127-lambda | batch | 878 ns | 874 ns .. 881 ns | per elem |
| peel, per difference | binary-lambda.127/d=1350,m=2700,prefilter=true,batch=true,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_127-lambda | batch | 629 ns | 628 ns .. 631 ns | per elem |
| peel, per difference | binary-lambda.127/d=4,m=10,prefilter=true,batch=true,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_127-lambda | batch | 685 ns | 683 ns .. 686 ns | per elem |
| peel, per difference | binary-lambda.127/d=4,m=8,prefilter=true,batch=true,h2c=pornin-addend | gf2_127-lambda | batch | 574 ns | 572 ns .. 575 ns | per elem |
| peel, per difference | binary-u.127/d=10000,m=20000,prefilter=false,batch=false,h2c=pornin-addend | gf2_127-u | per-element | 1.65 µs | 1.65 µs .. 1.65 µs | per elem |
| peel, per difference | binary-u.127/d=10000,m=20000,prefilter=false,batch=true,h2c=pornin-addend | gf2_127-u | batch | 858 ns | 856 ns .. 859 ns | per elem |
| peel, per difference | binary-u.127/d=10000,m=20000,prefilter=true,batch=false,h2c=pornin-addend | gf2_127-u | per-element | 1.54 µs | 1.54 µs .. 1.54 µs | per elem |
| peel, per difference | binary-u.127/d=10000,m=20000,prefilter=true,batch=true,h2c=pornin-addend | gf2_127-u | batch | 1.08 µs | 1.08 µs .. 1.08 µs | per elem |
| peel, per difference | binary-u.127/d=10000,m=20000,prefilter=true,batch=true,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_127-u | batch | 894 ns | 893 ns .. 896 ns | per elem |
| peel, per difference | binary-u.127/d=1350,m=2700,prefilter=false,batch=false,h2c=pornin-addend | gf2_127-u | per-element | 1.45 µs | 1.45 µs .. 1.46 µs | per elem |
| peel, per difference | binary-u.127/d=1350,m=2700,prefilter=false,batch=true,h2c=pornin-addend | gf2_127-u | batch | 636 ns | 633 ns .. 638 ns | per elem |
| peel, per difference | binary-u.127/d=1350,m=2700,prefilter=true,batch=false,h2c=pornin-addend | gf2_127-u | per-element | 1.26 µs | 1.26 µs .. 1.27 µs | per elem |
| peel, per difference | binary-u.127/d=1350,m=2700,prefilter=true,batch=true,h2c=pornin-addend | gf2_127-u | batch | 796 ns | 793 ns .. 798 ns | per elem |
| peel, per difference | binary-u.127/d=1350,m=2700,prefilter=true,batch=true,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_127-u | batch | 573 ns | 572 ns .. 574 ns | per elem |
| peel, per difference | binary-u.127/d=150,m=300,prefilter=false,batch=false,h2c=pornin-addend | gf2_127-u | per-element | 1.36 µs | 1.36 µs .. 1.37 µs | per elem |
| peel, per difference | binary-u.127/d=150,m=300,prefilter=false,batch=true,h2c=pornin-addend | gf2_127-u | batch | 546 ns | 544 ns .. 547 ns | per elem |
| peel, per difference | binary-u.127/d=150,m=300,prefilter=true,batch=false,h2c=pornin-addend | gf2_127-u | per-element | 1.11 µs | 1.10 µs .. 1.11 µs | per elem |
| peel, per difference | binary-u.127/d=150,m=300,prefilter=true,batch=true,h2c=pornin-addend | gf2_127-u | batch | 639 ns | 637 ns .. 640 ns | per elem |
| peel, per difference | binary-u.127/d=20,m=40,prefilter=false,batch=false,h2c=pornin-addend | gf2_127-u | per-element | 1.10 µs | 1.09 µs .. 1.10 µs | per elem |
| peel, per difference | binary-u.127/d=20,m=40,prefilter=false,batch=true,h2c=pornin-addend | gf2_127-u | batch | 514 ns | 513 ns .. 516 ns | per elem |
| peel, per difference | binary-u.127/d=20,m=40,prefilter=true,batch=false,h2c=pornin-addend | gf2_127-u | per-element | 966 ns | 962 ns .. 970 ns | per elem |
| peel, per difference | binary-u.127/d=20,m=40,prefilter=true,batch=true,h2c=pornin-addend | gf2_127-u | batch | 576 ns | 574 ns .. 577 ns | per elem |
| peel, per difference | binary-u.127/d=4,m=10,prefilter=true,batch=true,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_127-u | batch | 698 ns | 695 ns .. 700 ns | per elem |
| peel, per difference | binary-u.127/d=4,m=8,prefilter=false,batch=false,h2c=pornin-addend | gf2_127-u | per-element | 720 ns | 718 ns .. 722 ns | per elem |
| peel, per difference | binary-u.127/d=4,m=8,prefilter=false,batch=true,h2c=pornin-addend | gf2_127-u | batch | 529 ns | 527 ns .. 530 ns | per elem |
| peel, per difference | binary-u.127/d=4,m=8,prefilter=true,batch=false,h2c=pornin-addend | gf2_127-u | per-element | 769 ns | 767 ns .. 771 ns | per elem |
| peel, per difference | binary-u.127/d=4,m=8,prefilter=true,batch=true,h2c=pornin-addend | gf2_127-u | batch | 576 ns | 575 ns .. 578 ns | per elem |
| peel, per difference | binary-w.127/d=10000,m=20000,prefilter=true,batch=true,h2c=pornin-addend | gf2_127-w | batch | 1.20 µs | 1.20 µs .. 1.20 µs | per elem |
| peel, per difference | binary-w.127/d=10000,m=20000,prefilter=true,batch=true,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_127-w | batch | 999 ns | 997 ns .. 1.00 µs | per elem |
| peel, per difference | binary-w.127/d=1350,m=2700,prefilter=true,batch=true,h2c=pornin-addend | gf2_127-w | batch | 879 ns | 876 ns .. 881 ns | per elem |
| peel, per difference | binary-w.127/d=1350,m=2700,prefilter=true,batch=true,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_127-w | batch | 636 ns | 634 ns .. 638 ns | per elem |
| peel, per difference | binary-w.127/d=4,m=10,prefilter=true,batch=true,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_127-w | batch | 684 ns | 682 ns .. 685 ns | per elem |
| peel, per difference | binary-w.127/d=4,m=8,prefilter=true,batch=true,h2c=pornin-addend | gf2_127-w | batch | 568 ns | 566 ns .. 569 ns | per elem |
| peel, per difference | edwards.107/d=1350,m=2700,prefilter=true,batch=true,h2c=ti | edwards107 | batch | 1.66 µs | 1.65 µs .. 1.66 µs | per elem |
| peel, per difference | edwards.127/d=1350,m=2700,prefilter=true,batch=true,h2c=ti | edwards127 | batch | 1.99 µs | 1.99 µs .. 2.00 µs | per elem |
| peel, per difference | edwards.61x2/d=1350,m=2700,prefilter=true,batch=true,h2c=ti | edwards61x2 | batch | 1.45 µs | 1.45 µs .. 1.46 µs | per elem |
| peel, per difference | twisted.goldilocks2/d=1350,m=2700,prefilter=true,batch=true,h2c=ti | twisted-goldilocks2 | batch | 2.81 µs | 2.80 µs .. 2.82 µs | per elem |
| peel, per difference | twisted.128/d=1350,m=2700,prefilter=true,batch=true,h2c=ti | twisted128 | batch | 3.06 µs | 3.05 µs .. 3.07 µs | per elem |
| peel, per difference | twisted.61x2/d=1350,m=2700,prefilter=true,batch=true,h2c=ti | twisted61x2 | batch | 1.45 µs | 1.45 µs .. 1.45 µs | per elem |
| peel, per difference | twisted.64x2/d=1350,m=2700,prefilter=true,batch=true,h2c=ti | twisted64x2 | batch | 2.00 µs | 2.00 µs .. 2.01 µs | per elem |
| peel, per difference | weier.107/d=1350,m=2700,prefilter=true,batch=true,h2c=ti | weier107 | batch | 1.83 µs | 1.83 µs .. 1.84 µs | per elem |
| peel, per difference | weier-jacobian.107/d=1350,m=2700,prefilter=true,batch=true,h2c=ti | weier107-jacobian | batch | 1.81 µs | 1.81 µs .. 1.82 µs | per elem |
| peel, per difference | weier.127/d=1350,m=2700,prefilter=true,batch=true,h2c=ti | weier127 | batch | 2.29 µs | 2.29 µs .. 2.30 µs | per elem |
| peel, per difference | weier-jacobian.127/d=1350,m=2700,prefilter=true,batch=true,h2c=ti | weier127-jacobian | batch | 2.15 µs | 2.14 µs .. 2.15 µs | per elem |
| peel, per difference | weier.61x2/d=1350,m=2700,prefilter=true,batch=true,h2c=ti | weier61x2 | batch | 1.64 µs | 1.64 µs .. 1.64 µs | per elem |
| peel, per difference | weier-jacobian.61x2/d=1350,m=2700,prefilter=true,batch=true,h2c=ti | weier61x2-jacobian | batch | 1.69 µs | 1.69 µs .. 1.69 µs | per elem |
| peel, per difference | ristretto255/d=1350,m=2700,prefilter=true,batch=true | ristretto255 | batch | 6.84 µs | 6.82 µs .. 6.85 µs | per elem |
| rateless encode and decode, per difference | xor-sha256.64/d=10 | xor | per-element | 572 ns | 570 ns .. 574 ns | per elem |
| rateless encode and decode, per difference | xor-sha256.64/d=100 | xor | per-element | 1.01 µs | 1.00 µs .. 1.01 µs | per elem |
| rateless encode and decode, per difference | xor-sha256.64/d=1000 | xor | per-element | 1.74 µs | 1.74 µs .. 1.74 µs | per elem |
| rateless encode and decode, per difference | xor-sha256.64/d=10000 | xor | per-element | 3.10 µs | 3.08 µs .. 3.13 µs | per elem |
| rateless encode and decode, per difference | xor-sha256.64/d=100000 | xor | per-element | 6.38 µs | 6.35 µs .. 6.42 µs | per elem |
| rateless encode and decode, per difference | xor-sha256.64/d=20 | xor | per-element | 673 ns | 673 ns .. 674 ns | per elem |
| rateless encode and decode, per difference | xor-sha256.64/d=40 | xor | per-element | 785 ns | 784 ns .. 787 ns | per elem |
| rateless encode and decode, per difference | xor-sha256.64/d=50000 | xor | per-element | 4.70 µs | 4.68 µs .. 4.72 µs | per elem |
| rateless encode and decode, per difference | xor-siphash.64/d=10 | xor-siphash | per-element | 514 ns | 512 ns .. 516 ns | per elem |
| rateless encode and decode, per difference | xor-siphash.64/d=10,map=mcg64 | xor-siphash | per-element | 498 ns | 498 ns .. 499 ns | per elem |
| rateless encode and decode, per difference | xor-siphash.64/d=100 | xor-siphash | per-element | 925 ns | 918 ns .. 930 ns | per elem |
| rateless encode and decode, per difference | xor-siphash.64/d=100,map=mcg64 | xor-siphash | per-element | 913 ns | 913 ns .. 914 ns | per elem |
| rateless encode and decode, per difference | xor-siphash.64/d=1000 | xor-siphash | per-element | 1.66 µs | 1.65 µs .. 1.66 µs | per elem |
| rateless encode and decode, per difference | xor-siphash.64/d=1000,map=mcg64 | xor-siphash | per-element | 1.65 µs | 1.65 µs .. 1.66 µs | per elem |
| rateless encode and decode, per difference | xor-siphash.64/d=10000 | xor-siphash | per-element | 3.01 µs | 2.98 µs .. 3.04 µs | per elem |
| rateless encode and decode, per difference | xor-siphash.64/d=10000,map=chacha8 | xor-siphash | per-element | 3.78 µs | 3.75 µs .. 3.81 µs | per elem |
| rateless encode and decode, per difference | xor-siphash.64/d=10000,map=mcg64 | xor-siphash | per-element | 2.97 µs | 2.94 µs .. 2.99 µs | per elem |
| rateless encode and decode, per difference | xor-siphash.64/d=100000 | xor-siphash | per-element | 6.29 µs | 6.25 µs .. 6.34 µs | per elem |
| rateless encode and decode, per difference | xor-siphash.64/d=100000,map=chacha8 | xor-siphash | per-element | 12.8 µs | 12.8 µs .. 12.9 µs | per elem |
| rateless encode and decode, per difference | xor-siphash.64/d=100000,map=mcg64 | xor-siphash | per-element | 5.55 µs | 5.49 µs .. 5.60 µs | per elem |
| rateless encode and decode, per difference | xor-siphash.64/d=20 | xor-siphash | per-element | 604 ns | 602 ns .. 605 ns | per elem |
| rateless encode and decode, per difference | xor-siphash.64/d=20,map=mcg64 | xor-siphash | per-element | 592 ns | 591 ns .. 592 ns | per elem |
| rateless encode and decode, per difference | xor-siphash.64/d=40 | xor-siphash | per-element | 709 ns | 708 ns .. 711 ns | per elem |
| rateless encode and decode, per difference | xor-siphash.64/d=40,map=mcg64 | xor-siphash | per-element | 687 ns | 683 ns .. 690 ns | per elem |
| rateless encode and decode, per difference | xor-siphash.64/d=50000 | xor-siphash | per-element | 4.65 µs | 4.63 µs .. 4.66 µs | per elem |
| rateless encode and decode, per difference | xor-siphash.64/d=50000,map=mcg64 | xor-siphash | per-element | 4.52 µs | 4.50 µs .. 4.54 µs | per elem |
| rateless encode and decode, per difference | binary.109/d=10,h2c=pornin | gf2_109 | per-element | 2.12 µs | 2.11 µs .. 2.12 µs | per elem |
| rateless encode and decode, per difference | binary.109/d=1000,h2c=pornin | gf2_109 | per-element | 3.97 µs | 3.95 µs .. 3.99 µs | per elem |
| rateless encode and decode, per difference | binary.109/d=100000,h2c=pornin | gf2_109 | per-element | 9.42 µs | 9.37 µs .. 9.47 µs | per elem |
| rateless encode and decode, per difference | binary-lambda.109/d=10,h2c=pornin-addend | gf2_109-lambda | per-element | 2.09 µs | 2.09 µs .. 2.10 µs | per elem |
| rateless encode and decode, per difference | binary-lambda.109/d=100,h2c=pornin-addend | gf2_109-lambda | per-element | 2.98 µs | 2.97 µs .. 2.99 µs | per elem |
| rateless encode and decode, per difference | binary-lambda.109/d=1000,h2c=pornin-addend | gf2_109-lambda | per-element | 3.92 µs | 3.90 µs .. 3.93 µs | per elem |
| rateless encode and decode, per difference | binary-lambda.109/d=10000,h2c=pornin-addend | gf2_109-lambda | per-element | 5.41 µs | 5.37 µs .. 5.44 µs | per elem |
| rateless encode and decode, per difference | binary-lambda.109/d=100000,h2c=pornin-addend | gf2_109-lambda | per-element | 9.36 µs | 9.30 µs .. 9.41 µs | per elem |
| rateless encode and decode, per difference | binary-lambda.109/d=20,h2c=pornin-addend | gf2_109-lambda | per-element | 2.40 µs | 2.39 µs .. 2.41 µs | per elem |
| rateless encode and decode, per difference | binary-lambda.109/d=40,h2c=pornin-addend | gf2_109-lambda | per-element | 2.64 µs | 2.64 µs .. 2.65 µs | per elem |
| rateless encode and decode, per difference | binary-lambda.109/d=50000,h2c=pornin-addend | gf2_109-lambda | per-element | 7.48 µs | 7.44 µs .. 7.52 µs | per elem |
| rateless encode and decode, per difference | binary-u.109/d=10,h2c=pornin-addend | gf2_109-u | per-element | 2.05 µs | 2.05 µs .. 2.06 µs | per elem |
| rateless encode and decode, per difference | binary-u.109/d=100,h2c=pornin-addend | gf2_109-u | per-element | 2.91 µs | 2.90 µs .. 2.92 µs | per elem |
| rateless encode and decode, per difference | binary-u.109/d=1000,h2c=pornin-addend | gf2_109-u | per-element | 3.85 µs | 3.84 µs .. 3.85 µs | per elem |
| rateless encode and decode, per difference | binary-u.109/d=10000,h2c=pornin-addend | gf2_109-u | per-element | 5.35 µs | 5.32 µs .. 5.38 µs | per elem |
| rateless encode and decode, per difference | binary-u.109/d=100000,h2c=pornin-addend | gf2_109-u | per-element | 8.96 µs | 8.88 µs .. 9.05 µs | per elem |
| rateless encode and decode, per difference | binary-u.109/d=20,h2c=pornin-addend | gf2_109-u | per-element | 2.34 µs | 2.33 µs .. 2.34 µs | per elem |
| rateless encode and decode, per difference | binary-u.109/d=40,h2c=pornin-addend | gf2_109-u | per-element | 2.56 µs | 2.55 µs .. 2.56 µs | per elem |
| rateless encode and decode, per difference | binary-u.109/d=50000,h2c=pornin-addend | gf2_109-u | per-element | 7.33 µs | 7.29 µs .. 7.37 µs | per elem |
| rateless encode and decode, per difference | binary-w.109/d=10,h2c=pornin-addend | gf2_109-w | per-element | 2.09 µs | 2.09 µs .. 2.10 µs | per elem |
| rateless encode and decode, per difference | binary-w.109/d=100,h2c=pornin-addend | gf2_109-w | per-element | 2.98 µs | 2.97 µs .. 2.99 µs | per elem |
| rateless encode and decode, per difference | binary-w.109/d=1000,h2c=pornin-addend | gf2_109-w | per-element | 3.92 µs | 3.91 µs .. 3.93 µs | per elem |
| rateless encode and decode, per difference | binary-w.109/d=10000,h2c=pornin-addend | gf2_109-w | per-element | 5.41 µs | 5.38 µs .. 5.44 µs | per elem |
| rateless encode and decode, per difference | binary-w.109/d=100000,h2c=pornin-addend | gf2_109-w | per-element | 9.36 µs | 9.32 µs .. 9.39 µs | per elem |
| rateless encode and decode, per difference | binary-w.109/d=20,h2c=pornin-addend | gf2_109-w | per-element | 2.40 µs | 2.40 µs .. 2.41 µs | per elem |
| rateless encode and decode, per difference | binary-w.109/d=40,h2c=pornin-addend | gf2_109-w | per-element | 2.64 µs | 2.63 µs .. 2.65 µs | per elem |
| rateless encode and decode, per difference | binary-w.109/d=50000,h2c=pornin-addend | gf2_109-w | per-element | 7.48 µs | 7.45 µs .. 7.51 µs | per elem |
| rateless encode and decode, per difference | binary.122/d=10,h2c=pornin | gf2_122 | per-element | 1.70 µs | 1.70 µs .. 1.71 µs | per elem |
| rateless encode and decode, per difference | binary.122/d=1000,h2c=pornin | gf2_122 | per-element | 3.56 µs | 3.55 µs .. 3.57 µs | per elem |
| rateless encode and decode, per difference | binary.122/d=100000,h2c=pornin | gf2_122 | per-element | 9.61 µs | 9.59 µs .. 9.63 µs | per elem |
| rateless encode and decode, per difference | binary.122-gls/d=10,h2c=pornin | gf2_122-gls | per-element | 1.68 µs | 1.67 µs .. 1.68 µs | per elem |
| rateless encode and decode, per difference | binary.122-gls/d=1000,h2c=pornin | gf2_122-gls | per-element | 3.49 µs | 3.48 µs .. 3.51 µs | per elem |
| rateless encode and decode, per difference | binary.122-gls/d=100000,h2c=pornin | gf2_122-gls | per-element | 9.09 µs | 9.07 µs .. 9.11 µs | per elem |
| rateless encode and decode, per difference | binary-lambda.122-gls/d=10,h2c=pornin-addend | gf2_122-gls-lambda | per-element | 1.63 µs | 1.63 µs .. 1.64 µs | per elem |
| rateless encode and decode, per difference | binary-lambda.122-gls/d=1000,h2c=pornin-addend | gf2_122-gls-lambda | per-element | 3.44 µs | 3.43 µs .. 3.44 µs | per elem |
| rateless encode and decode, per difference | binary-lambda.122-gls/d=100000,h2c=pornin-addend | gf2_122-gls-lambda | per-element | 8.99 µs | 8.96 µs .. 9.02 µs | per elem |
| rateless encode and decode, per difference | binary-u.122-gls/d=10,h2c=pornin-addend | gf2_122-gls-u | per-element | 1.59 µs | 1.58 µs .. 1.59 µs | per elem |
| rateless encode and decode, per difference | binary-u.122-gls/d=1000,h2c=pornin-addend | gf2_122-gls-u | per-element | 3.35 µs | 3.34 µs .. 3.37 µs | per elem |
| rateless encode and decode, per difference | binary-u.122-gls/d=100000,h2c=pornin-addend | gf2_122-gls-u | per-element | 8.69 µs | 8.62 µs .. 8.76 µs | per elem |
| rateless encode and decode, per difference | binary-w.122-gls/d=10,h2c=pornin-addend | gf2_122-gls-w | per-element | 1.63 µs | 1.63 µs .. 1.64 µs | per elem |
| rateless encode and decode, per difference | binary-w.122-gls/d=1000,h2c=pornin-addend | gf2_122-gls-w | per-element | 3.43 µs | 3.43 µs .. 3.44 µs | per elem |
| rateless encode and decode, per difference | binary-w.122-gls/d=100000,h2c=pornin-addend | gf2_122-gls-w | per-element | 8.97 µs | 8.94 µs .. 9.00 µs | per elem |
| rateless encode and decode, per difference | binary-lambda.122/d=10,h2c=pornin-addend | gf2_122-lambda | per-element | 1.64 µs | 1.64 µs .. 1.65 µs | per elem |
| rateless encode and decode, per difference | binary-lambda.122/d=1000,h2c=pornin-addend | gf2_122-lambda | per-element | 3.44 µs | 3.43 µs .. 3.45 µs | per elem |
| rateless encode and decode, per difference | binary-lambda.122/d=100000,h2c=pornin-addend | gf2_122-lambda | per-element | 9.02 µs | 8.97 µs .. 9.08 µs | per elem |
| rateless encode and decode, per difference | binary-u.122/d=10,h2c=pornin-addend | gf2_122-u | per-element | 1.59 µs | 1.58 µs .. 1.59 µs | per elem |
| rateless encode and decode, per difference | binary-u.122/d=1000,h2c=pornin-addend | gf2_122-u | per-element | 3.35 µs | 3.35 µs .. 3.36 µs | per elem |
| rateless encode and decode, per difference | binary-u.122/d=100000,h2c=pornin-addend | gf2_122-u | per-element | 8.72 µs | 8.68 µs .. 8.78 µs | per elem |
| rateless encode and decode, per difference | binary-w.122/d=10,h2c=pornin-addend | gf2_122-w | per-element | 1.64 µs | 1.63 µs .. 1.64 µs | per elem |
| rateless encode and decode, per difference | binary-w.122/d=1000,h2c=pornin-addend | gf2_122-w | per-element | 3.43 µs | 3.42 µs .. 3.44 µs | per elem |
| rateless encode and decode, per difference | binary-w.122/d=100000,h2c=pornin-addend | gf2_122-w | per-element | 8.97 µs | 8.93 µs .. 9.02 µs | per elem |
| rateless encode and decode, per difference | binary.127/d=10,h2c=pornin | gf2_127 | per-element | 2.00 µs | 1.99 µs .. 2.01 µs | per elem |
| rateless encode and decode, per difference | binary.127/d=10,h2c=pornin,map=mcg64 | gf2_127 | per-element | 2.01 µs | 2.00 µs .. 2.01 µs | per elem |
| rateless encode and decode, per difference | binary.127/d=100,h2c=pornin,map=mcg64 | gf2_127 | per-element | 2.90 µs | 2.90 µs .. 2.90 µs | per elem |
| rateless encode and decode, per difference | binary.127/d=1000,h2c=pornin | gf2_127 | per-element | 3.89 µs | 3.87 µs .. 3.91 µs | per elem |
| rateless encode and decode, per difference | binary.127/d=1000,h2c=pornin,map=mcg64 | gf2_127 | per-element | 3.86 µs | 3.85 µs .. 3.88 µs | per elem |
| rateless encode and decode, per difference | binary.127/d=10000,h2c=pornin,map=chacha8 | gf2_127 | per-element | 6.30 µs | 6.27 µs .. 6.32 µs | per elem |
| rateless encode and decode, per difference | binary.127/d=10000,h2c=pornin,map=mcg64 | gf2_127 | per-element | 5.41 µs | 5.38 µs .. 5.43 µs | per elem |
| rateless encode and decode, per difference | binary.127/d=100000,h2c=pornin | gf2_127 | per-element | 9.37 µs | 9.34 µs .. 9.41 µs | per elem |
| rateless encode and decode, per difference | binary.127/d=100000,h2c=pornin,map=chacha8 | gf2_127 | per-element | 15.8 µs | 15.7 µs .. 15.8 µs | per elem |
| rateless encode and decode, per difference | binary.127/d=100000,h2c=pornin,map=mcg64 | gf2_127 | per-element | 8.69 µs | 8.64 µs .. 8.75 µs | per elem |
| rateless encode and decode, per difference | binary.127/d=20,h2c=pornin,map=mcg64 | gf2_127 | per-element | 2.30 µs | 2.29 µs .. 2.30 µs | per elem |
| rateless encode and decode, per difference | binary.127/d=40,h2c=pornin,map=mcg64 | gf2_127 | per-element | 2.55 µs | 2.53 µs .. 2.57 µs | per elem |
| rateless encode and decode, per difference | binary.127/d=50000,h2c=pornin,map=mcg64 | gf2_127 | per-element | 7.47 µs | 7.42 µs .. 7.51 µs | per elem |
| rateless encode and decode, per difference | binary-lambda.127/d=10,h2c=pornin-addend | gf2_127-lambda | per-element | 1.97 µs | 1.97 µs .. 1.98 µs | per elem |
| rateless encode and decode, per difference | binary-lambda.127/d=1000,h2c=pornin-addend | gf2_127-lambda | per-element | 3.90 µs | 3.89 µs .. 3.91 µs | per elem |
| rateless encode and decode, per difference | binary-lambda.127/d=100000,h2c=pornin-addend | gf2_127-lambda | per-element | 9.40 µs | 9.35 µs .. 9.46 µs | per elem |
| rateless encode and decode, per difference | binary-u.127/d=10,h2c=pornin-addend | gf2_127-u | per-element | 1.95 µs | 1.95 µs .. 1.96 µs | per elem |
| rateless encode and decode, per difference | binary-u.127/d=100,h2c=pornin-addend | gf2_127-u | per-element | 2.84 µs | 2.83 µs .. 2.85 µs | per elem |
| rateless encode and decode, per difference | binary-u.127/d=1000,h2c=pornin-addend | gf2_127-u | per-element | 3.81 µs | 3.80 µs .. 3.82 µs | per elem |
| rateless encode and decode, per difference | binary-u.127/d=10000,h2c=pornin-addend | gf2_127-u | per-element | 5.31 µs | 5.27 µs .. 5.34 µs | per elem |
| rateless encode and decode, per difference | binary-u.127/d=100000,h2c=pornin-addend | gf2_127-u | per-element | 9.00 µs | 8.91 µs .. 9.08 µs | per elem |
| rateless encode and decode, per difference | binary-u.127/d=20,h2c=pornin-addend | gf2_127-u | per-element | 2.24 µs | 2.23 µs .. 2.24 µs | per elem |
| rateless encode and decode, per difference | binary-u.127/d=40,h2c=pornin-addend | gf2_127-u | per-element | 2.47 µs | 2.46 µs .. 2.48 µs | per elem |
| rateless encode and decode, per difference | binary-u.127/d=50000,h2c=pornin-addend | gf2_127-u | per-element | 7.31 µs | 7.28 µs .. 7.35 µs | per elem |
| rateless encode and decode, per difference | binary-w.127/d=10,h2c=pornin-addend | gf2_127-w | per-element | 1.97 µs | 1.97 µs .. 1.98 µs | per elem |
| rateless encode and decode, per difference | binary-w.127/d=1000,h2c=pornin-addend | gf2_127-w | per-element | 3.90 µs | 3.89 µs .. 3.92 µs | per elem |
| rateless encode and decode, per difference | binary-w.127/d=100000,h2c=pornin-addend | gf2_127-w | per-element | 9.38 µs | 9.33 µs .. 9.42 µs | per elem |
| rateless encode and decode, per difference | edwards.107/d=1000,h2c=ti | edwards107 | per-element | 7.08 µs | 7.06 µs .. 7.10 µs | per elem |
| rateless encode and decode, per difference | edwards.127/d=1000,h2c=ti | edwards127 | per-element | 8.34 µs | 8.29 µs .. 8.39 µs | per elem |
| rateless encode and decode, per difference | edwards.61x2/d=1000,h2c=ti | edwards61x2 | per-element | 5.46 µs | 5.45 µs .. 5.48 µs | per elem |
| rateless encode and decode, per difference | twisted.goldilocks2/d=1000,h2c=ti | twisted-goldilocks2 | per-element | 9.02 µs | 8.98 µs .. 9.06 µs | per elem |
| rateless encode and decode, per difference | twisted.128/d=1000,h2c=ti | twisted128 | per-element | 9.97 µs | 9.93 µs .. 10.0 µs | per elem |
| rateless encode and decode, per difference | twisted.61x2/d=1000,h2c=ti | twisted61x2 | per-element | 4.70 µs | 4.69 µs .. 4.72 µs | per elem |
| rateless encode and decode, per difference | twisted.64x2/d=1000,h2c=ti | twisted64x2 | per-element | 6.53 µs | 6.51 µs .. 6.56 µs | per elem |
| rateless encode and decode, per difference | weier.107/d=1000,h2c=ti | weier107 | per-element | 5.99 µs | 5.98 µs .. 6.01 µs | per elem |
| rateless encode and decode, per difference | weier-jacobian.107/d=1000,h2c=ti | weier107-jacobian | per-element | 5.80 µs | 5.77 µs .. 5.83 µs | per elem |
| rateless encode and decode, per difference | weier.127/d=1000,h2c=ti | weier127 | per-element | 7.70 µs | 7.68 µs .. 7.73 µs | per elem |
| rateless encode and decode, per difference | weier-jacobian.127/d=1000,h2c=ti | weier127-jacobian | per-element | 7.12 µs | 7.08 µs .. 7.15 µs | per elem |
| rateless encode and decode, per difference | weier.61x2/d=1000,h2c=ti | weier61x2 | per-element | 5.32 µs | 5.26 µs .. 5.37 µs | per elem |
| rateless encode and decode, per difference | weier-jacobian.61x2/d=1000,h2c=ti | weier61x2-jacobian | per-element | 5.52 µs | 5.50 µs .. 5.54 µs | per elem |
| rateless encode and decode, per difference | ristretto255/d=10 | ristretto255 | per-element | 14.1 µs | 14.0 µs .. 14.2 µs | per elem |
| rateless encode and decode, per difference | ristretto255/d=10,map=mcg64 | ristretto255 | per-element | 14.2 µs | 14.1 µs .. 14.4 µs | per elem |
| rateless encode and decode, per difference | ristretto255/d=100 | ristretto255 | per-element | 18.8 µs | 18.8 µs .. 18.9 µs | per elem |
| rateless encode and decode, per difference | ristretto255/d=100,map=mcg64 | ristretto255 | per-element | 18.6 µs | 18.5 µs .. 18.7 µs | per elem |
| rateless encode and decode, per difference | ristretto255/d=1000 | ristretto255 | per-element | 21.7 µs | 21.5 µs .. 21.8 µs | per elem |
| rateless encode and decode, per difference | ristretto255/d=1000,map=mcg64 | ristretto255 | per-element | 21.7 µs | 21.6 µs .. 21.7 µs | per elem |
| rateless encode and decode, per difference | ristretto255/d=10000 | ristretto255 | per-element | 25.2 µs | 25.1 µs .. 25.3 µs | per elem |
| rateless encode and decode, per difference | ristretto255/d=10000,map=chacha8 | ristretto255 | per-element | 26.3 µs | 26.3 µs .. 26.4 µs | per elem |
| rateless encode and decode, per difference | ristretto255/d=10000,map=mcg64 | ristretto255 | per-element | 25.0 µs | 24.8 µs .. 25.1 µs | per elem |
| rateless encode and decode, per difference | ristretto255/d=100000 | ristretto255 | per-element | 34.9 µs | 34.8 µs .. 35.0 µs | per elem |
| rateless encode and decode, per difference | ristretto255/d=100000,map=chacha8 | ristretto255 | per-element | 42.1 µs | 41.9 µs .. 42.3 µs | per elem |
| rateless encode and decode, per difference | ristretto255/d=100000,map=mcg64 | ristretto255 | per-element | 33.5 µs | 33.4 µs .. 33.6 µs | per elem |
| rateless encode and decode, per difference | ristretto255/d=20 | ristretto255 | per-element | 15.7 µs | 15.6 µs .. 15.9 µs | per elem |
| rateless encode and decode, per difference | ristretto255/d=20,map=mcg64 | ristretto255 | per-element | 15.8 µs | 15.7 µs .. 15.9 µs | per elem |
| rateless encode and decode, per difference | ristretto255/d=40 | ristretto255 | per-element | 17.3 µs | 17.3 µs .. 17.4 µs | per elem |
| rateless encode and decode, per difference | ristretto255/d=40,map=mcg64 | ristretto255 | per-element | 17.3 µs | 17.2 µs .. 17.3 µs | per elem |
| rateless encode and decode, per difference | ristretto255/d=50000 | ristretto255 | per-element | 31.1 µs | 31.0 µs .. 31.2 µs | per elem |
| rateless encode and decode, per difference | ristretto255/d=50000,map=mcg64 | ristretto255 | per-element | 30.2 µs | 30.1 µs .. 30.3 µs | per elem |
| mapping, per index | chacha8/next | mapping | per-element | 10.5 ns | 10.4 ns .. 10.5 ns | per elem |
| mapping, per index | mcg64/next | mapping | per-element | 5.68 ns | 5.66 ns .. 5.69 ns | per elem |
| mapping, per index | sha256-ctr/next | mapping | per-element | 8.47 ns | 8.45 ns .. 8.49 ns | per elem |
| mapping, per index | xoshiro256pp/next | mapping | per-element | 5.66 ns | 5.65 ns .. 5.67 ns | per elem |
| mapping, per item | chacha8/item,m=12150 | mapping | per-element | 289 ns | 288 ns .. 290 ns | per elem |
| mapping, per item | chacha8/item,m=1350 | mapping | per-element | 252 ns | 252 ns .. 253 ns | per elem |
| mapping, per item | chacha8/item,m=150 | mapping | per-element | 216 ns | 216 ns .. 217 ns | per elem |
| mapping, per item | chacha8/item,m=20 | mapping | per-element | 184 ns | 183 ns .. 184 ns | per elem |
| mapping, per item | chacha8/item,m=5 | mapping | per-element | 162 ns | 161 ns .. 162 ns | per elem |
| mapping, per item | mcg64/item,m=12150 | mapping | per-element | 43.5 ns | 43.3 ns .. 43.8 ns | per elem |
| mapping, per item | mcg64/item,m=1350 | mapping | per-element | 25.0 ns | 24.8 ns .. 25.1 ns | per elem |
| mapping, per item | mcg64/item,m=150 | mapping | per-element | 13.5 ns | 13.4 ns .. 13.6 ns | per elem |
| mapping, per item | mcg64/item,m=20 | mapping | per-element | 6.91 ns | 6.89 ns .. 6.93 ns | per elem |
| mapping, per item | mcg64/item,m=5 | mapping | per-element | 3.57 ns | 3.56 ns .. 3.58 ns | per elem |
| mapping, per item | sha256-ctr/item,m=12150 | mapping | per-element | 198 ns | 198 ns .. 199 ns | per elem |
| mapping, per item | sha256-ctr/item,m=1350 | mapping | per-element | 157 ns | 156 ns .. 158 ns | per elem |
| mapping, per item | sha256-ctr/item,m=150 | mapping | per-element | 119 ns | 119 ns .. 120 ns | per elem |
| mapping, per item | sha256-ctr/item,m=20 | mapping | per-element | 66.4 ns | 66.2 ns .. 66.6 ns | per elem |
| mapping, per item | sha256-ctr/item,m=5 | mapping | per-element | 34.9 ns | 34.8 ns .. 35.0 ns | per elem |
| mapping, per item | xoshiro256pp/item,m=12150 | mapping | per-element | 55.5 ns | 55.2 ns .. 55.7 ns | per elem |
| mapping, per item | xoshiro256pp/item,m=1350 | mapping | per-element | 34.2 ns | 34.0 ns .. 34.4 ns | per elem |
| mapping, per item | xoshiro256pp/item,m=150 | mapping | per-element | 19.8 ns | 19.8 ns .. 19.9 ns | per elem |
| mapping, per item | xoshiro256pp/item,m=20 | mapping | per-element | 10.0 ns | 9.96 ns .. 10.1 ns | per elem |
| mapping, per item | xoshiro256pp/item,m=5 | mapping | per-element | 4.85 ns | 4.82 ns .. 4.88 ns | per elem |
| map digest of an ID | projection-fp127/digest of id | mapping | per-element | 9.61 ns | 9.59 ns .. 9.62 ns | per elem |
| map digest of an ID | projection-fp130/digest of id | mapping | per-element | 16.5 ns | 16.3 ns .. 16.7 ns | per elem |
| map digest of an ID | projection-gf2_127/digest of id | mapping | per-element | 5.11 ns | 5.10 ns .. 5.12 ns | per elem |
| map digest of an ID | salted-sha256/digest of id | mapping | per-element | 33.0 ns | 32.9 ns .. 33.2 ns | per elem |
| per-salt keys | projection-fp127/keys | mapping | per-element | 266 ns | 266 ns .. 267 ns | per elem |
| per-salt keys | projection-fp130/keys | mapping | per-element | 321 ns | 320 ns .. 321 ns | per elem |
| per-salt keys | projection-gf2_127/keys | mapping | per-element | 257 ns | 257 ns .. 258 ns | per elem |
| per-salt keys | salted-sha256/keys | mapping | per-element | 74.7 ns | 74.4 ns .. 75.0 ns | per elem |
| item ID | sha256/id | xor | per-element | 33.1 ns | 33.0 ns .. 33.1 ns | per elem |
| map digest | salted-sha256/digest | mapping | per-element | 34.6 ns | 33.8 ns .. 35.3 ns | per elem |
digest
Figure
11 benchmarks
| operation | benchmark | family | mode | time | 95% CI | unit |
|---|---|---|---|---|---|---|
| digest | xor-sha256 | xor | per-element | 25.7 ns | 25.6 ns .. 25.9 ns | per elem |
| digest | gf2_109/batch | gf2_109 | batch | 93.0 ns | 92.9 ns .. 93.1 ns | per elem |
| digest | gf2_122/batch | gf2_122 | batch | 90.8 ns | 88.8 ns .. 93.0 ns | per elem |
| digest | gf2_122-gls/batch | gf2_122-gls | batch | 90.3 ns | 90.3 ns .. 90.4 ns | per elem |
| digest | gf2_127/batch | gf2_127 | batch | 88.5 ns | 88.5 ns .. 88.6 ns | per elem |
| digest | edwards107/batch | edwards107 | batch | 785 ns | 784 ns .. 786 ns | per elem |
| digest | edwards127/batch | edwards127 | batch | 1.08 µs | 1.08 µs .. 1.08 µs | per elem |
| digest | weier107/batch | weier107 | batch | 775 ns | 775 ns .. 776 ns | per elem |
| digest | weier127/batch | weier127 | batch | 1.05 µs | 1.04 µs .. 1.05 µs | per elem |
| digest | ristretto255/streaming | ristretto255 | streaming | 4.81 µs | 4.81 µs .. 4.82 µs | per elem |
| digest | secp256k1/try-and-increment + combine_keys | secp256k1 | batch | 4.59 µs | 4.59 µs .. 4.60 µs | per elem |
curve generation
Figure
85 benchmarks
| operation | benchmark | family | mode | time | 95% CI | unit |
|---|---|---|---|---|---|---|
| accept certificate | gf2_109/0 | gf2_109 | total | 55.2 µs | 54.7 µs .. 55.4 µs | per iter |
| accept certificate | gf2_122/0 | gf2_122 | total | 55.2 µs | 54.8 µs .. 55.4 µs | per iter |
| accept certificate | gf2_122-gls/0 | gf2_122-gls | total | 58.6 µs | 58.1 µs .. 58.9 µs | per iter |
| accept certificate | gf2_127/0 | gf2_127 | total | 56.1 µs | 55.9 µs .. 56.2 µs | per iter |
| accept certificate | edwards107/0 | edwards107 | total | 57.6 µs | 57.2 µs .. 58.0 µs | per iter |
| accept certificate | edwards127/0 | edwards127 | total | 61.0 µs | 60.7 µs .. 61.2 µs | per iter |
| accept certificate | edwards61x2/0 | edwards61x2 | total | 61.2 µs | 60.7 µs .. 61.5 µs | per iter |
| accept certificate | twisted-goldilocks2/0 | twisted-goldilocks2 | total | 59.9 µs | 59.4 µs .. 60.4 µs | per iter |
| accept certificate | twisted128/0 | twisted128 | total | 63.9 µs | 63.6 µs .. 64.0 µs | per iter |
| accept certificate | twisted61x2/0 | twisted61x2 | total | 60.3 µs | 59.9 µs .. 60.5 µs | per iter |
| accept certificate | twisted64x2/0 | twisted64x2 | total | 64.3 µs | 63.7 µs .. 64.7 µs | per iter |
| accept certificate | weier107/0 | weier107 | total | 59.7 µs | 59.4 µs .. 59.8 µs | per iter |
| accept certificate | weier127/0 | weier127 | total | 67.6 µs | 67.2 µs .. 67.9 µs | per iter |
| accept certificate | weier61x2/0 | weier61x2 | total | 63.1 µs | 62.6 µs .. 63.7 µs | per iter |
| verify certificate | gf2_109/198 rejections/0 | gf2_109 | total | 190 µs | 188 µs .. 192 µs | per iter |
| verify certificate | gf2_122/4 rejections/0 | gf2_122 | total | 57.1 µs | 56.8 µs .. 57.5 µs | per iter |
| verify certificate | gf2_122-gls/60 rejections/0 | gf2_122-gls | total | 114 µs | 113 µs .. 115 µs | per iter |
| verify certificate | gf2_127/30 rejections/0 | gf2_127 | total | 75.3 µs | 74.9 µs .. 75.8 µs | per iter |
| verify certificate | edwards107/28 rejections/0 | edwards107 | total | 142 µs | 142 µs .. 143 µs | per iter |
| verify certificate | edwards127/56 rejections/0 | edwards127 | total | 256 µs | 254 µs .. 258 µs | per iter |
| verify certificate | edwards61x2/118 rejections/0 | edwards61x2 | total | 318 µs | 316 µs .. 320 µs | per iter |
| verify certificate | twisted-goldilocks2/32 rejections/0 | twisted-goldilocks2 | total | 144 µs | 143 µs .. 144 µs | per iter |
| verify certificate | twisted128/4 rejections/0 | twisted128 | total | 73.6 µs | 73.4 µs .. 73.9 µs | per iter |
| verify certificate | twisted61x2/344 rejections/0 | twisted61x2 | total | 589 µs | 584 µs .. 593 µs | per iter |
| verify certificate | twisted64x2/36 rejections/0 | twisted64x2 | total | 160 µs | 159 µs .. 161 µs | per iter |
| verify certificate | weier107/519 rejections/0 | weier107 | total | 384 µs | 382 µs .. 385 µs | per iter |
| verify certificate | weier127/125 rejections/0 | weier127 | total | 159 µs | 158 µs .. 160 µs | per iter |
| verify certificate | weier61x2/123 rejections/0 | weier61x2 | total | 146 µs | 145 µs .. 147 µs | per iter |
| embedding-degree bound | gf2_109/0 | gf2_109 | total | 30.3 µs | 30.2 µs .. 30.4 µs | per iter |
| embedding-degree bound | gf2_122/0 | gf2_122 | total | 30.3 µs | 30.1 µs .. 30.5 µs | per iter |
| embedding-degree bound | gf2_122-gls/0 | gf2_122-gls | total | 30.7 µs | 30.7 µs .. 30.8 µs | per iter |
| embedding-degree bound | gf2_127/0 | gf2_127 | total | 30.5 µs | 30.4 µs .. 30.6 µs | per iter |
| embedding-degree bound | edwards107/0 | edwards107 | total | 30.3 µs | 30.2 µs .. 30.4 µs | per iter |
| embedding-degree bound | edwards127/0 | edwards127 | total | 30.6 µs | 30.5 µs .. 30.7 µs | per iter |
| embedding-degree bound | edwards61x2/0 | edwards61x2 | total | 30.1 µs | 29.8 µs .. 30.5 µs | per iter |
| embedding-degree bound | twisted-goldilocks2/0 | twisted-goldilocks2 | total | 30.1 µs | 30.0 µs .. 30.2 µs | per iter |
| embedding-degree bound | twisted128/0 | twisted128 | total | 30.4 µs | 30.2 µs .. 30.6 µs | per iter |
| embedding-degree bound | twisted61x2/0 | twisted61x2 | total | 29.6 µs | 29.5 µs .. 29.7 µs | per iter |
| embedding-degree bound | twisted64x2/0 | twisted64x2 | total | 30.4 µs | 30.3 µs .. 30.4 µs | per iter |
| embedding-degree bound | weier107/0 | weier107 | total | 30.6 µs | 30.4 µs .. 30.7 µs | per iter |
| embedding-degree bound | weier127/0 | weier127 | total | 30.3 µs | 30.2 µs .. 30.4 µs | per iter |
| embedding-degree bound | weier61x2/0 | weier61x2 | total | 30.5 µs | 30.3 µs .. 30.7 µs | per iter |
| find (Rust: AGM + sieve) | gf2_127 agm+sieve/index 114/1 | gf2_127 | total | 23.6 ms | 23.5 ms .. 23.7 ms | per iter |
| find (Rust: AGM + sieve) | gf2_127 agm+sieve/index 14/3 | gf2_127 | total | 2.38 ms | 2.37 ms .. 2.39 ms | per iter |
| find (Rust: AGM + sieve) | gf2_127 agm+sieve/index 30/0 | gf2_127 | total | 4.71 ms | 4.68 ms .. 4.75 ms | per iter |
| find (Rust: AGM + sieve) | gf2_127 agm+sieve/index 54/2 | gf2_127 | total | 11.7 ms | 11.6 ms .. 11.7 ms | per iter |
| certify (Rust: AGM + sieve + order witnesses) | gf2_127 agm+sieve/index 114/1 | gf2_127 | total | 23.8 ms | 23.6 ms .. 23.9 ms | per iter |
| certify (Rust: AGM + sieve + order witnesses) | gf2_127 agm+sieve/index 14/3 | gf2_127 | total | 2.45 ms | 2.44 ms .. 2.46 ms | per iter |
| certify (Rust: AGM + sieve + order witnesses) | gf2_127 agm+sieve/index 30/0 | gf2_127 | total | 4.77 ms | 4.74 ms .. 4.81 ms | per iter |
| certify (Rust: AGM + sieve + order witnesses) | gf2_127 agm+sieve/index 54/2 | gf2_127 | total | 11.7 ms | 11.7 ms .. 11.8 ms | per iter |
| point count (PARI) | gf2_127 | gf2_127 | total | 2.10 ms | 2.08 ms .. 2.11 ms | per iter |
| point count (PARI) | edwards127 | edwards127 | total | 53.8 ms | 53.7 ms .. 53.9 ms | per iter |
| point count (PARI) | edwards61x2 | edwards61x2 | total | 40.3 ms | 40.1 ms .. 40.5 ms | per iter |
| point count (PARI) | twisted-goldilocks2 | twisted-goldilocks2 | total | 49.3 ms | 49.1 ms .. 49.4 ms | per iter |
| point count (PARI) | twisted61x2 | twisted61x2 | total | 44.7 ms | 44.6 ms .. 44.8 ms | per iter |
| point count (PARI) | twisted64x2 | twisted64x2 | total | 51.3 ms | 51.2 ms .. 51.4 ms | per iter |
| point count (PARI) | weier127 | weier127 | total | 62.0 ms | 61.8 ms .. 62.2 ms | per iter |
| point count (PARI) | weier61x2 | weier61x2 | total | 39.5 ms | 39.3 ms .. 39.6 ms | per iter |
| point count (Rust AGM) | order | gf2_127 | total | 446 µs | 445 µs .. 447 µs | per iter |
| AGM steps | tables | gf2_127 | total | 1.63 ms | 1.63 ms .. 1.64 ms | per iter |
| AGM steps | trace | gf2_127 | total | 425 µs | 424 µs .. 425 µs | per iter |
| Z_q ring op | mul | gf2_127 | total | 2.25 µs | 2.24 µs .. 2.25 µs | per iter |
| Z_q ring op | sigma | gf2_127 | total | 2.58 µs | 2.56 µs .. 2.61 µs | per iter |
| Z_q ring op | sigma_inv | gf2_127 | total | 2.60 µs | 2.58 µs .. 2.62 µs | per iter |
| Z_q ring op | square | gf2_127 | total | 1.36 µs | 1.35 µs .. 1.36 µs | per iter |
| sieve, one l | gf2_127/11 | gf2_127 | total | 272 µs | 271 µs .. 273 µs | per iter |
| sieve, one l | gf2_127/13 | gf2_127 | total | 519 µs | 518 µs .. 520 µs | per iter |
| sieve, one l | gf2_127/3 | gf2_127 | total | 4.11 µs | 4.10 µs .. 4.12 µs | per iter |
| sieve, one l | gf2_127/5 | gf2_127 | total | 14.5 µs | 14.5 µs .. 14.5 µs | per iter |
| sieve, one l | gf2_127/7 | gf2_127 | total | 47.4 µs | 47.3 µs .. 47.6 µs | per iter |
| sieve, one l | edwards127/11 | edwards127 | total | 1.84 ms | 1.83 ms .. 1.84 ms | per iter |
| sieve, one l | edwards127/13 | edwards127 | total | 3.58 ms | 3.57 ms .. 3.58 ms | per iter |
| sieve, one l | edwards127/3 | edwards127 | total | 12.7 µs | 12.7 µs .. 12.7 µs | per iter |
| sieve, one l | edwards127/5 | edwards127 | total | 83.9 µs | 83.7 µs .. 84.1 µs | per iter |
| sieve, one l | edwards127/7 | edwards127 | total | 310 µs | 309 µs .. 310 µs | per iter |
| sieve, one l | edwards127/8 | edwards127 | total | 1.03 µs | 1.03 µs .. 1.03 µs | per iter |
| sieve, one l | weier127/11 | weier127 | total | 1.84 ms | 1.83 ms .. 1.84 ms | per iter |
| sieve, one l | weier127/13 | weier127 | total | 3.57 ms | 3.56 ms .. 3.57 ms | per iter |
| sieve, one l | weier127/2 | weier127 | total | 8.40 µs | 8.39 µs .. 8.42 µs | per iter |
| sieve, one l | weier127/3 | weier127 | total | 12.6 µs | 12.6 µs .. 12.6 µs | per iter |
| sieve, one l | weier127/5 | weier127 | total | 83.9 µs | 83.7 µs .. 84.0 µs | per iter |
| sieve, one l | weier127/7 | weier127 | total | 310 µs | 309 µs .. 310 µs | per iter |
| sieve, per candidate | gf2_127/7 | gf2_127 | per-element | 38.7 µs | 38.6 µs .. 38.7 µs | per elem |
| sieve, per candidate | edwards127/13 | edwards127 | per-element | 1.26 ms | 1.26 ms .. 1.27 ms | per elem |
| sieve, per candidate | weier127/13 | weier127 | per-element | 786 µs | 784 µs .. 787 µs | per elem |
Lower bound, every family
One hash plus an addition to each of the cells an item maps to in a sketch of cells (: ; : ; : ; : ; : ), from each family’s fastest hash and addition in any representation, without conversions; the only estimate for families without group-trait benchmarks.
| family | hashing | hash | hash time | add | add time | m=5 | m=20 | m=150 | m=1350 | m=12150 |
|---|---|---|---|---|---|---|---|---|---|---|
| xor | one at a time | sha256 (XOR baseline) | 24.2 ns | xor-sha256/xor 32B, 1 accumulator | 0.38 ns | 25.3 ns | 26.2 ns | 27.6 ns | 29.3 ns | 30.9 ns |
| gf2_109 | one at a time | gf2_109/pornin map x1 | 560 ns | binary.109/mode=throughput | 12.8 ns | 598 ns | 628 ns | 678 ns | 735 ns | 791 ns |
| gf2_109 | batched | gf2_109/pornin map x1, batched | 63.7 ns | binary.109/mode=throughput | 12.8 ns | 101 ns | 132 ns | 182 ns | 238 ns | 295 ns |
| gf2_109-lambda | one at a time | gf2_109-lambda/pornin map x1 to (x, λ) | 550 ns | binary-lambda.109/mode=throughput | 12.0 ns | 585 ns | 614 ns | 660 ns | 713 ns | 765 ns |
| gf2_109-lambda | batched | gf2_109-lambda/pornin map x1 to (x, λ), batched | 55.2 ns | binary-lambda.109/mode=throughput | 12.0 ns | 90.0 ns | 119 ns | 165 ns | 218 ns | 271 ns |
| gf2_109-u | one at a time | gf2_109-u/pornin map x1 to (u, v) | 533 ns | binary-u.109/mode=throughput | 9.76 ns | 561 ns | 584 ns | 622 ns | 665 ns | 708 ns |
| gf2_109-u | batched | gf2_109-u/pornin map x1 to (u, v), batched | 60.7 ns | binary-u.109/mode=throughput | 9.76 ns | 89.0 ns | 112 ns | 150 ns | 193 ns | 236 ns |
| gf2_109-w | one at a time | gf2_109-w/pornin map x1 to (x, λ) | 535 ns | binary-w.109/mode=throughput | 12.0 ns | 569 ns | 598 ns | 645 ns | 697 ns | 750 ns |
| gf2_109-w | batched | gf2_109-w/pornin map x1 to (x, λ), batched | 54.5 ns | binary-w.109/mode=throughput | 12.0 ns | 89.2 ns | 118 ns | 165 ns | 217 ns | 270 ns |
| gf2_122 | one at a time | gf2_122/pornin map x1 | 373 ns | binary.122/mode=throughput | 17.8 ns | 425 ns | 467 ns | 537 ns | 615 ns | 693 ns |
| gf2_122 | batched | gf2_122/pornin map x1, batched | 62.8 ns | binary.122/mode=throughput | 17.8 ns | 115 ns | 157 ns | 227 ns | 305 ns | 383 ns |
| gf2_122-gls | one at a time | gf2_122-gls/pornin map x1 | 369 ns | binary.122-gls/mode=throughput | 16.8 ns | 417 ns | 457 ns | 523 ns | 596 ns | 670 ns |
| gf2_122-gls | batched | gf2_122-gls/pornin map x1, batched | 62.0 ns | binary.122-gls/mode=throughput | 16.8 ns | 111 ns | 151 ns | 216 ns | 290 ns | 363 ns |
| gf2_122-gls-lambda | one at a time | gf2_122-gls-lambda/pornin map x1 to (x, λ) | 315 ns | binary-lambda.122-gls/mode=throughput | 16.6 ns | 363 ns | 403 ns | 467 ns | 540 ns | 612 ns |
| gf2_122-gls-lambda | batched | gf2_122-gls-lambda/pornin map x1 to (x, λ), batched | 55.4 ns | binary-lambda.122-gls/mode=throughput | 16.6 ns | 103 ns | 143 ns | 208 ns | 280 ns | 353 ns |
| gf2_122-gls-u | one at a time | gf2_122-gls-u/pornin map x1 to (u, v) | 319 ns | binary-u.122-gls/mode=throughput | 13.1 ns | 357 ns | 388 ns | 439 ns | 497 ns | 554 ns |
| gf2_122-gls-u | batched | gf2_122-gls-u/pornin map x1 to (u, v), batched | 55.7 ns | binary-u.122-gls/mode=throughput | 13.1 ns | 93.7 ns | 125 ns | 176 ns | 233 ns | 291 ns |
| gf2_122-gls-w | one at a time | gf2_122-gls-w/pornin map x1 to (x, λ) | 316 ns | binary-w.122-gls/mode=throughput | 16.6 ns | 364 ns | 403 ns | 468 ns | 540 ns | 613 ns |
| gf2_122-gls-w | batched | gf2_122-gls-w/pornin map x1 to (x, λ), batched | 55.4 ns | binary-w.122-gls/mode=throughput | 16.6 ns | 103 ns | 143 ns | 208 ns | 280 ns | 353 ns |
| gf2_122-lambda | one at a time | gf2_122-lambda/pornin map x1 to (x, λ) | 326 ns | binary-lambda.122/mode=throughput | 16.6 ns | 374 ns | 414 ns | 479 ns | 551 ns | 624 ns |
| gf2_122-lambda | batched | gf2_122-lambda/pornin map x1 to (x, λ), batched | 53.9 ns | binary-lambda.122/mode=throughput | 16.6 ns | 102 ns | 142 ns | 206 ns | 279 ns | 351 ns |
| gf2_122-u | one at a time | gf2_122-u/pornin map x1 to (u, v) | 326 ns | binary-u.122/mode=throughput | 13.1 ns | 364 ns | 395 ns | 446 ns | 503 ns | 561 ns |
| gf2_122-u | batched | gf2_122-u/pornin map x1 to (u, v), batched | 57.1 ns | binary-u.122/mode=throughput | 13.1 ns | 95.0 ns | 126 ns | 177 ns | 234 ns | 292 ns |
| gf2_122-w | one at a time | gf2_122-w/pornin map x1 to (x, λ) | 326 ns | binary-w.122/mode=throughput | 16.6 ns | 374 ns | 414 ns | 479 ns | 551 ns | 624 ns |
| gf2_122-w | batched | gf2_122-w/pornin map x1 to (x, λ), batched | 54.0 ns | binary-w.122/mode=throughput | 16.6 ns | 102 ns | 142 ns | 206 ns | 279 ns | 352 ns |
| gf2_127 | one at a time | gf2_127/pornin map x1 | 485 ns | binary.127/mode=throughput | 14.1 ns | 526 ns | 560 ns | 615 ns | 676 ns | 738 ns |
| gf2_127 | batched | gf2_127/pornin map x1, batched | 61.5 ns | binary.127/mode=throughput | 14.1 ns | 102 ns | 136 ns | 191 ns | 252 ns | 314 ns |
| gf2_127-lambda | one at a time | gf2_127-lambda/pornin map x1 to (x, λ) | 456 ns | binary-lambda.127/mode=throughput | 14.9 ns | 499 ns | 535 ns | 593 ns | 658 ns | 724 ns |
| gf2_127-lambda | batched | gf2_127-lambda/pornin map x1 to (x, λ), batched | 53.5 ns | binary-lambda.127/mode=throughput | 14.9 ns | 96.8 ns | 132 ns | 191 ns | 256 ns | 322 ns |
| gf2_127-u | one at a time | gf2_127-u/pornin map x1 to (u, v) | 461 ns | binary-u.127/mode=throughput | 10.7 ns | 491 ns | 517 ns | 559 ns | 605 ns | 652 ns |
| gf2_127-u | batched | gf2_127-u/pornin map x1 to (u, v), batched | 57.2 ns | binary-u.127/mode=throughput | 10.7 ns | 88.1 ns | 114 ns | 155 ns | 202 ns | 249 ns |
| gf2_127-w | one at a time | gf2_127-w/pornin map x1 to (x, λ) | 455 ns | binary-w.127/mode=throughput | 14.9 ns | 498 ns | 534 ns | 592 ns | 657 ns | 722 ns |
| gf2_127-w | batched | gf2_127-w/pornin map x1 to (x, λ), batched | 53.5 ns | binary-w.127/mode=throughput | 14.9 ns | 96.7 ns | 132 ns | 190 ns | 256 ns | 321 ns |
| edwards107 | one at a time | edwards.107/mode=indep | 806 ns | edwards.107/mode=throughput | 15.5 ns | 851 ns | 888 ns | 948 ns | 1.02 µs | 1.08 µs |
| edwards107 | batched | edwards.107/mode=batch,n=1024 | 805 ns | edwards.107/mode=throughput | 15.5 ns | 850 ns | 887 ns | 947 ns | 1.02 µs | 1.08 µs |
| edwards127 | one at a time | edwards.127/mode=indep | 1.07 µs | edwards.127/mode=throughput | 20.1 ns | 1.13 µs | 1.17 µs | 1.25 µs | 1.34 µs | 1.43 µs |
| edwards127 | batched | edwards.127/mode=batch,n=1024 | 1.07 µs | edwards.127/mode=throughput | 20.1 ns | 1.13 µs | 1.18 µs | 1.25 µs | 1.34 µs | 1.43 µs |
| edwards61x2 | one at a time | edwards.61x2/mode=indep | 624 ns | edwards.61x2/mode=throughput | 13.3 ns | 663 ns | 695 ns | 747 ns | 805 ns | 864 ns |
| edwards61x2 | batched | edwards.61x2/mode=batch,n=1024 | 620 ns | edwards.61x2/mode=throughput | 13.3 ns | 659 ns | 691 ns | 743 ns | 801 ns | 860 ns |
| twisted-goldilocks2 | one at a time | twisted.goldilocks2/mode=indep | 1.73 µs | twisted.goldilocks2/mode=throughput | 15.0 ns | 1.77 µs | 1.81 µs | 1.87 µs | 1.93 µs | 2.00 µs |
| twisted-goldilocks2 | batched | twisted.goldilocks2/mode=batch,n=1024 | 1.75 µs | twisted.goldilocks2/mode=throughput | 15.0 ns | 1.79 µs | 1.83 µs | 1.89 µs | 1.95 µs | 2.02 µs |
| twisted128 | one at a time | twisted.128/mode=indep | 1.92 µs | twisted.128/mode=throughput | 23.9 ns | 1.99 µs | 2.05 µs | 2.14 µs | 2.25 µs | 2.35 µs |
| twisted128 | batched | twisted.128/mode=batch,n=1024 | 1.92 µs | twisted.128/mode=throughput | 23.9 ns | 1.99 µs | 2.05 µs | 2.14 µs | 2.25 µs | 2.35 µs |
| twisted61x2 | one at a time | twisted.61x2/mode=indep | 630 ns | twisted.61x2/mode=throughput | 12.5 ns | 666 ns | 696 ns | 745 ns | 799 ns | 854 ns |
| twisted61x2 | batched | twisted.61x2/mode=batch,n=1024 | 632 ns | twisted.61x2/mode=throughput | 12.5 ns | 668 ns | 698 ns | 747 ns | 801 ns | 856 ns |
| twisted64x2 | one at a time | twisted.64x2/mode=indep | 1.10 µs | twisted.64x2/mode=throughput | 17.2 ns | 1.15 µs | 1.19 µs | 1.26 µs | 1.33 µs | 1.41 µs |
| twisted64x2 | batched | twisted.64x2/mode=batch,n=1024 | 1.10 µs | twisted.64x2/mode=throughput | 17.2 ns | 1.15 µs | 1.19 µs | 1.26 µs | 1.33 µs | 1.41 µs |
| weier107 | one at a time | weier.107/mode=indep | 746 ns | weier.107/mode=throughput | 30.5 ns | 834 ns | 907 ns | 1.03 µs | 1.16 µs | 1.29 µs |
| weier107 | batched | weier.107/mode=batch,n=1024 | 748 ns | weier.107/mode=throughput | 30.5 ns | 837 ns | 909 ns | 1.03 µs | 1.16 µs | 1.30 µs |
| weier107-jacobian | one at a time | weier-jacobian.107/mode=indep | 742 ns | weier-jacobian.107/mode=throughput | 28.7 ns | 826 ns | 894 ns | 1.01 µs | 1.13 µs | 1.26 µs |
| weier107-jacobian | batched | weier-jacobian.107/mode=batch,n=1024 | 745 ns | weier-jacobian.107/mode=throughput | 28.7 ns | 828 ns | 897 ns | 1.01 µs | 1.13 µs | 1.26 µs |
| weier127 | one at a time | weier.127/mode=indep | 1.03 µs | weier.127/mode=throughput | 45.4 ns | 1.16 µs | 1.27 µs | 1.44 µs | 1.64 µs | 1.84 µs |
| weier127 | batched | weier.127/mode=batch,n=1024 | 1.04 µs | weier.127/mode=throughput | 45.4 ns | 1.17 µs | 1.28 µs | 1.45 µs | 1.65 µs | 1.85 µs |
| weier127-jacobian | one at a time | weier-jacobian.127/mode=indep | 1.03 µs | weier-jacobian.127/mode=throughput | 37.5 ns | 1.14 µs | 1.23 µs | 1.38 µs | 1.54 µs | 1.71 µs |
| weier127-jacobian | batched | weier-jacobian.127/mode=batch,n=1024 | 1.04 µs | weier-jacobian.127/mode=throughput | 37.5 ns | 1.15 µs | 1.24 µs | 1.38 µs | 1.55 µs | 1.71 µs |
| weier61x2 | one at a time | weier.61x2/mode=indep | 637 ns | weier.61x2/mode=throughput | 26.8 ns | 715 ns | 779 ns | 883 ns | 1.00 µs | 1.12 µs |
| weier61x2 | batched | weier.61x2/mode=batch,n=1024 | 637 ns | weier.61x2/mode=throughput | 26.8 ns | 714 ns | 778 ns | 883 ns | 1000 ns | 1.12 µs |
| weier61x2-jacobian | one at a time | weier-jacobian.61x2/mode=indep | 638 ns | weier-jacobian.61x2/mode=throughput | 31.6 ns | 730 ns | 806 ns | 929 ns | 1.07 µs | 1.21 µs |
| weier61x2-jacobian | batched | weier-jacobian.61x2/mode=batch,n=1024 | 638 ns | weier-jacobian.61x2/mode=throughput | 31.6 ns | 729 ns | 805 ns | 929 ns | 1.07 µs | 1.21 µs |
| ristretto255 | one at a time | ristretto255/hash_from_bytes<Sha512> | 4.72 µs | ristretto255/+=, 1 accumulator | 63.8 ns | 4.90 µs | 5.05 µs | 5.30 µs | 5.58 µs | 5.86 µs |
Apple M4 · rustc 1.98.1 · RUSTFLAGS=-C target-cpu=apple-m4 · ef9e82d39fbf · full profile · 2026-10-08
Benchmark run Apple M4 · generic · full · ef9e82d3
Run Apple M4 · generic · full · ef9e82d3 started 2026-10-08T07:13:46Z on Apple M4 (macOS 27.0.1, arm64) and timed commit ef9e82d39fbf06c605e1740360370f0003dc4ca4, built by rustc 1.98.1 (48a229cea 2026-09-01) with RUSTFLAGS -C target-cpu=generic, in the full profile.
790 benchmarks from run Apple M4 · generic · full · ef9e82d3. Reading a run report explains the values, colours and tags.
Families compared
Each family’s nominal rho, this run’s costs (addition at throughput; hashing, preparation, encoding and decoding batched), the two regimes of Cost in repeated reconciliation for a set of items, a set difference of and a sketch of cells, in which a new item updates cells on average, and the mean time over seeds to find a curve and verify its certificate. Dominance is as defined in Measurement methodology. Additions are 94 to 100% of each rebuilt estimate.
| curve | security | per cell | per new item | per party and round | curve selection | dominated by | |||
|---|---|---|---|---|---|---|---|---|---|
| rho | add | encode | decode | hash + prepare | sums retained, | sums rebuilt, , | available tools | ||
| GF(2^127), 16 bytes | |||||||||
| gf2_127(X:S:Z:T) extended accumulators, Pornin's formulas | 62.8 | 155 ns (7.79× the best) | 106 ns (10.64× the best) | 88.0 ns (tied for the best, within noise) | 227 ns (1.27× the best) | 2.33 µs (1.71× the best) | 211 ms (7.33× the best) | Rust (AGM), PARI | none |
| gf2_127-lambdaincompleteλ-projective (X:L:Z) accumulators; hashed straight to : no prepare | 62.8 | 132 ns (6.60× the best) | 87.0 ns (8.72× the best) | 87.9 ns (tied for the best, within noise) | 179 ns (best) | 1.96 µs (1.44× the best) | 179 ms (6.21× the best) | Rust (AGM), PARI | none |
| gf2_127-wincompleteλ-projective, w codec: hashes and decodes to λ-affine; Pornin x1: hash to addend; output already an addend | 62.8 | 131 ns (6.58× the best) | 76.5 ns (7.67× the best) | 89.2 ns (1.01× the best) | 184 ns (1.03× the best) | 1.96 µs (1.44× the best) | 178 ms (6.19× the best) | Rust (AGM), PARI | none |
| gf2_127-uunscaled (X:S:Z), w codec, direct addend hashes; Pornin x1: hash to addend; output already an addend | 62.8 | 116 ns (5.84× the best) | 76.5 ns (7.67× the best) | 121 ns (1.38× the best) | 213 ns (1.19× the best) | 1.79 µs (1.31× the best) | 158 ms (5.49× the best) | Rust (AGM), PARI | none |
| GF(2^122) = GF(2^61)[u], dense constant, 16 bytes | |||||||||
| gf2_122(X:S:Z:T) extended | 60.3 | 263 ns (13.20× the best) | 202 ns (20.28× the best) | 187 ns (2.12× the best) | 413 ns (2.31× the best) | 3.98 µs (2.92× the best) | 358 ms (12.42× the best) | Rust (AGM), PARI | gf2_122-w, gf2_127, gf2_127-lambda, gf2_127-u, gf2_127-w |
| gf2_122-lambdaincompleteλ-projective; hashed straight to : no prepare | 60.3 | 217 ns (10.90× the best) | 156 ns (15.63× the best) | 186 ns (2.12× the best) | 361 ns (2.02× the best) | 3.31 µs (2.43× the best) | 295 ms (10.26× the best) | Rust (AGM), PARI | gf2_122-w, gf2_127, gf2_127-lambda, gf2_127-u, gf2_127-w |
| gf2_122-wincompleteλ-projective, w codec | 60.3 | 211 ns (10.58× the best) | 130 ns (13.07× the best) | 153 ns (1.74× the best) | 329 ns (1.83× the best) | 3.19 µs (2.34× the best) | 287 ms (9.95× the best) | Rust (AGM), PARI | gf2_127, gf2_127-lambda, gf2_127-u, gf2_127-w |
| gf2_122-uunscaled (X:S:Z), w codec | 60.3 | 183 ns (9.19× the best) | 132 ns (13.26× the best) | 204 ns (2.32× the best) | 392 ns (2.19× the best) | 2.88 µs (2.11× the best) | 249 ms (8.66× the best) | Rust (AGM), PARI | gf2_127, gf2_127-lambda, gf2_127-u, gf2_127-w |
| GF(2^122), constant in GF(2^61) (GLS-shaped), 16 bytes | |||||||||
| gf2_122-gls(X:S:Z:T) extended | 59.8 | 246 ns (12.33× the best) | 194 ns (19.45× the best) | 162 ns (1.85× the best) | 353 ns (1.97× the best) | 3.69 µs (2.71× the best) | 334 ms (11.60× the best) | Rust (AGM), PARI | gf2_122-gls-w, gf2_122-w, gf2_127, gf2_127-lambda, gf2_127-u, gf2_127-w |
| gf2_122-gls-lambdaincompleteλ-projective; hashed straight to : no prepare | 59.8 | 216 ns (10.85× the best) | 156 ns (15.63× the best) | 163 ns (1.85× the best) | 327 ns (1.82× the best) | 3.26 µs (2.39× the best) | 294 ms (10.21× the best) | Rust (AGM), PARI | gf2_127, gf2_127-lambda, gf2_127-u, gf2_127-w |
| gf2_122-gls-wincompleteλ-projective, w codec | 59.8 | 217 ns (10.87× the best) | 130 ns (13.01× the best) | 138 ns (1.57× the best) | 312 ns (1.74× the best) | 3.25 µs (2.39× the best) | 295 ms (10.23× the best) | Rust (AGM), PARI | gf2_127, gf2_127-lambda, gf2_127-u, gf2_127-w |
| gf2_122-gls-uunscaled (X:S:Z), w codec | 59.8 | 182 ns (9.16× the best) | 133 ns (13.32× the best) | 187 ns (2.13× the best) | 360 ns (2.01× the best) | 2.84 µs (2.08× the best) | 248 ms (8.62× the best) | Rust (AGM), PARI | gf2_127, gf2_127-lambda, gf2_127-u, gf2_127-w |
| GF(2^109), 14 bytes | |||||||||
| gf2_109(X:S:Z:T) extended | 53.8 | 403 ns (20.23× the best) | 306 ns (30.66× the best) | 263 ns (2.99× the best) | 614 ns (3.43× the best) | 6.08 µs (4.47× the best) | 548 ms (19.03× the best) | Rust (AGM), PARI | gf2_109-w, gf2_122, gf2_122-gls, gf2_122-gls-lambda, gf2_122-gls-u, gf2_122-gls-w, gf2_122-lambda, gf2_122-u, gf2_122-w, gf2_127, gf2_127-lambda, gf2_127-u, gf2_127-w |
| gf2_109-lambdaincompleteλ-projective; hashed straight to : no prepare | 53.8 | 331 ns (16.63× the best) | 221 ns (22.20× the best) | 263 ns (2.99× the best) | 511 ns (2.85× the best) | 5.01 µs (3.68× the best) | 451 ms (15.65× the best) | Rust (AGM), PARI | gf2_122, gf2_122-gls, gf2_122-gls-lambda, gf2_122-gls-u, gf2_122-gls-w, gf2_122-lambda, gf2_122-u, gf2_122-w, gf2_127, gf2_127-lambda, gf2_127-u, gf2_127-w |
| gf2_109-wincompleteλ-projective, w codec | 53.8 | 332 ns (16.67× the best) | 204 ns (20.42× the best) | 240 ns (2.73× the best) | 517 ns (2.88× the best) | 5.02 µs (3.69× the best) | 452 ms (15.68× the best) | Rust (AGM), PARI | gf2_122, gf2_122-gls, gf2_122-gls-lambda, gf2_122-gls-u, gf2_122-gls-w, gf2_122-lambda, gf2_122-u, gf2_122-w, gf2_127, gf2_127-lambda, gf2_127-u, gf2_127-w |
| gf2_109-uunscaled (X:S:Z), w codec; Pornin x1: hash to addend; output already an addend | 53.8 | 289 ns (14.53× the best) | 206 ns (20.63× the best) | 319 ns (3.62× the best) | 593 ns (3.31× the best) | 4.52 µs (3.32× the best) | 394 ms (13.68× the best) | Rust (AGM), PARI | gf2_122, gf2_122-gls, gf2_122-gls-lambda, gf2_122-gls-u, gf2_122-gls-w, gf2_122-lambda, gf2_122-u, gf2_122-w, gf2_127, gf2_127-lambda, gf2_127-u, gf2_127-w |
| F_p, p = 2^127 − 1, 16 bytes | |||||||||
| edwards127a = 1 Edwards, extended += cached | 62.3 | 19.9 ns (best) | 21.7 ns (2.18× the best) | 485 ns (5.51× the best) | 1.09 µs (6.09× the best) | 1.36 µs (best) | 28.8 ms (best) | PARI | none |
| weier127short Weierstrass, projective += affine | 63.3 | 44.7 ns (2.24× the best) | 9.97 ns (best) | 484 ns (5.51× the best) | 1.03 µs (5.75× the best) | 1.64 µs (1.20× the best) | 62.4 ms (2.17× the best) | PARI | none |
| weier127-jacobianincompleteshort Weierstrass, Jacobian += affine | 63.3 | 36.6 ns (1.84× the best) | 15.3 ns (1.54× the best) | 483 ns (5.49× the best) | 1.00 µs (5.60× the best) | 1.50 µs (1.10× the best) | 51.4 ms (1.78× the best) | PARI | none |
bold: the best of its column; italic, dotted: tied with the best within the confidence intervals; shading: ratio to the best, pale yellow at 1× to purple at 16× or more; grey: baseline, not compared.
Machine
| Apple M4 · generic · full · ef9e82d3 | |
|---|---|
| CPU | Apple M4, 10 cores, 24 GiB |
| OS | macOS 27.0.1 (Darwin 27.0.0, arm64) |
| rustc | rustc 1.98.1 (48a229cea 2026-09-01) |
| RUSTFLAGS | -C target-cpu=generic |
| field backend features | neon |
| commit | ef9e82d39fbf06c605e1740360370f0003dc4ca4 |
| suites | compare compare109 compare122 group riblt |
| profile | full |
| criterion arguments | –warm-up-time 3 –measurement-time 5 –sample-size 100 –nresamples 100000 binary|gf2|xor|edwards.?127|weier(-jacobian)?.?127|fp127|riblt.mapping |
| run | 2026-10-08T07:13:46Z .. 2026-10-08T09:30:18Z |
Load averages by phase while the run timed (Measurement methodology).
| phase | seconds | 1-minute average, mean | runnable, mean | runnable, most |
|---|---|---|---|---|
| idle before | 25 | 2.10 | 1.01 | 2.0 |
| compare | 515 | 2.02 | 2.01 | 9.0 |
| compare109 | 255 | 1.93 | 1.98 | 3.9 |
| compare122 | 450 | 2.13 | 2.14 | 11.0 |
| group | 2435 | 2.09 | 2.08 | 18.0 |
| group wide | 1140 | 1.97 | 1.97 | 15.1 |
| riblt mapping | 330 | 2.05 | 2.02 | 8.0 |
| riblt plan | 60 | 2.07 | 2.17 | 3.1 |
| riblt | 2875 | 2.11 | 2.13 | 18.0 |
| idle after | 30 | 3.75 | 4.18 | 7.0 |
Group benchmark plan
Which families the group suite’s second pass timed. Its first pass timed every family’s core rows; from them and the comparison maps, bench-run chose the families whose modeled insertion at was within 50% of the cheapest (lead) and, if none of them was over a field of odd characteristic, the cheapest that was (contrast). The second pass added the batch sweep, subtraction, equality on pure cells and the hashes of IDs (The group plan).
| family | role |
|---|---|
| edwards.127 | lead |
| weier-jacobian.127 | lead |
| weier.127 | lead |
| binary-u.127 | lead |
| binary-w.127 | lead |
| binary-lambda.127 | lead |
RIBLT benchmark plan
Which RIBLT benchmarks this run generated. Before the RIBLT suite ran, bench-run chose from this run’s group and hash-to-curve results, for each family below, the hash its RIBLT benchmarks use and their scope: every sweep (full), each axis’s endpoints and middle (buffer), or one point of each benchmark (spot); and for full and buffer scope, the field whose projection hashes the family’s IDs cheapest and the one whose projection seeds mappings cheapest, under which it also encodes and peels cells keyed by IDs. The plan records what was measured, not a result; the XOR checksums and ristretto255 are timed in full regardless (The RIBLT plan).
| family | hash | scope | projection | mapping projection |
|---|---|---|---|---|
| binary-lambda.109 | ti-addend | spot | ||
| binary-lambda.122 | ti-addend | spot | ||
| binary-lambda.122-gls | ti-addend | spot | ||
| binary-lambda.127 | ti-addend | buffer | fp127 | fp127 |
| binary-u.109 | pornin-addend | spot | ||
| binary-u.122 | ti | spot | ||
| binary-u.122-gls | ti | spot | ||
| binary-u.127 | pornin-addend | buffer | fp127 | fp127 |
| binary-w.109 | ti | spot | ||
| binary-w.122 | ti | spot | ||
| binary-w.122-gls | ti | spot | ||
| binary-w.127 | pornin-addend | buffer | fp127 | fp127 |
| binary.109 | ti | spot | ||
| binary.122 | ti | spot | ||
| binary.122-gls | ti | spot | ||
| binary.127 | ti | spot | ||
| edwards.127 | ti | full | fp130 | fp127 |
| weier-jacobian.127 | ti | full | fp127 | fp127 |
| weier.127 | ti | buffer | fp127 | fp127 |
Insertion
Modeled insertion per item into a sketch of cells: a hash, a prepare, and an addition to each of the cells the item maps to on average (: ; : ; : ; : ; : ), by compatible recipes (Reading a run report). Each total also counts, the same for every family, the salted SHA-256 map digest and the xoshiro256pp walk through the item’s indices below (riblt.mapping): 38.0 ns at , 43.8 ns at , 54.4 ns at , 69.1 ns at , 90.1 ns at . The key XOR and count of each cell are not modelled; riblt.cells measures them with the rest of the cell updates.
| curve | per item, once | per cell | per item, into k cells | |||||
|---|---|---|---|---|---|---|---|---|
| hash (batched) | prepare (batched) | add (throughput) | : | : | : | : | : | |
| GF(2^127), 16 bytes | ||||||||
| gf2_127(X:S:Z:T) extended accumulators, Pornin's formulas | 196 ns (1.09× the best) | 31.2 ns (68.79× the best) | 155 ns (7.79× the best) | 715 ns (1.22× the best) | 1.09 µs (1.25× the best) | 1.71 µs (1.29× the best) | 2.40 µs (1.68× the best) | 3.11 µs (2.02× the best) |
| gf2_127compare suitePornin x1: hash to addend; output already an addend | 232 ns (1.29× the best) | in the hash | 155 ns (7.79× the best) | 720 ns (1.22× the best) | 1.10 µs (1.26× the best) | 1.71 µs (1.29× the best) | 2.41 µs (1.68× the best) | 3.11 µs (2.02× the best) |
| gf2_127-lambdaincompleteλ-projective (X:L:Z) accumulators | 196 ns (1.09× the best) | 56.6 ns (124.81× the best) | 132 ns (6.60× the best) | 672 ns (1.14× the best) | 992 ns (1.14× the best) | 1.52 µs (1.14× the best) | 2.11 µs (1.47× the best) | 2.71 µs (1.76× the best) |
| gf2_127-lambdaincompletecompare suitehashed straight to : no prepare | 179 ns (best) | in the hash | 132 ns (6.60× the best) | 599 ns (1.02× the best) | 919 ns (1.05× the best) | 1.44 µs (1.09× the best) | 2.03 µs (1.42× the best) | 2.63 µs (1.71× the best) |
| gf2_127-lambdaincompletecompare suitePornin x1: hash to addend; output already an addend | 184 ns (1.03× the best) | in the hash | 132 ns (6.60× the best) | 604 ns (1.03× the best) | 924 ns (1.06× the best) | 1.45 µs (1.09× the best) | 2.04 µs (1.42× the best) | 2.64 µs (1.71× the best) |
| gf2_127-wincompleteλ-projective, w codec: hashes and decodes to λ-affine | 221 ns (1.23× the best) | 0.97 ns (2.14× the best) | 131 ns (6.58× the best) | 640 ns (1.09× the best) | 959 ns (1.10× the best) | 1.48 µs (1.12× the best) | 2.07 µs (1.45× the best) | 2.67 µs (1.73× the best) |
| gf2_127-wincompletecompare suitePornin x1: hash to addend; output already an addend | 184 ns (1.03× the best) | in the hash | 131 ns (6.58× the best) | 603 ns (1.03× the best) | 922 ns (1.06× the best) | 1.44 µs (1.09× the best) | 2.03 µs (1.42× the best) | 2.63 µs (1.71× the best) |
| gf2_127-uunscaled (X:S:Z), w codec, direct addend hashes | 258 ns (1.44× the best) | 0.98 ns (2.17× the best) | 116 ns (5.84× the best) | 634 ns (1.08× the best) | 917 ns (1.05× the best) | 1.38 µs (1.04× the best) | 1.90 µs (1.33× the best) | 2.44 µs (1.58× the best) |
| gf2_127-ucompare suitePornin x1: hash to addend; output already an addend | 213 ns (1.19× the best) | in the hash | 116 ns (5.84× the best) | 588 ns (best) | 871 ns (best) | 1.34 µs (1.01× the best) | 1.86 µs (1.30× the best) | 2.39 µs (1.55× the best) |
| GF(2^122) = GF(2^61)[u], dense constant, 16 bytes | ||||||||
| gf2_122(X:S:Z:T) extended | 350 ns (1.96× the best) | 63.1 ns (139.03× the best) | 263 ns (13.20× the best) | 1.21 µs (2.07× the best) | 1.85 µs (2.12× the best) | 2.89 µs (2.17× the best) | 4.05 µs (2.83× the best) | 5.23 µs (3.40× the best) |
| gf2_122compare suitePornin x1: hash to addend; output already an addend | 510 ns (2.85× the best) | in the hash | 263 ns (13.20× the best) | 1.31 µs (2.23× the best) | 1.95 µs (2.23× the best) | 2.98 µs (2.24× the best) | 4.15 µs (2.90× the best) | 5.32 µs (3.46× the best) |
| gf2_122-lambdaincompleteλ-projective | 350 ns (1.95× the best) | 100 ns (220.88× the best) | 217 ns (10.90× the best) | 1.12 µs (1.90× the best) | 1.64 µs (1.88× the best) | 2.50 µs (1.88× the best) | 3.46 µs (2.42× the best) | 4.44 µs (2.88× the best) |
| gf2_122-lambdaincompletecompare suitehashed straight to : no prepare | 361 ns (2.02× the best) | in the hash | 217 ns (10.90× the best) | 1.03 µs (1.75× the best) | 1.55 µs (1.78× the best) | 2.41 µs (1.81× the best) | 3.38 µs (2.36× the best) | 4.35 µs (2.83× the best) |
| gf2_122-lambdaincompletecompare suitePornin x1: hash to addend; output already an addend | 428 ns (2.39× the best) | in the hash | 217 ns (10.90× the best) | 1.10 µs (1.86× the best) | 1.62 µs (1.86× the best) | 2.48 µs (1.86× the best) | 3.44 µs (2.41× the best) | 4.42 µs (2.87× the best) |
| gf2_122-wincompleteλ-projective, w codec | 328 ns (1.83× the best) | 0.99 ns (2.17× the best) | 211 ns (10.58× the best) | 977 ns (1.66× the best) | 1.49 µs (1.71× the best) | 2.32 µs (1.75× the best) | 3.26 µs (2.28× the best) | 4.20 µs (2.73× the best) |
| gf2_122-wincompletecompare suitePornin x1: hash to addend; output already an addend | 429 ns (2.39× the best) | in the hash | 211 ns (10.58× the best) | 1.08 µs (1.83× the best) | 1.59 µs (1.82× the best) | 2.42 µs (1.82× the best) | 3.36 µs (2.35× the best) | 4.30 µs (2.80× the best) |
| gf2_122-uunscaled (X:S:Z), w codec | 391 ns (2.18× the best) | 0.99 ns (2.17× the best) | 183 ns (9.19× the best) | 961 ns (1.63× the best) | 1.40 µs (1.61× the best) | 2.13 µs (1.60× the best) | 2.95 µs (2.06× the best) | 3.77 µs (2.45× the best) |
| gf2_122-ucompare suitePornin x1: hash to addend; output already an addend | 622 ns (3.47× the best) | in the hash | 183 ns (9.19× the best) | 1.19 µs (2.03× the best) | 1.63 µs (1.88× the best) | 2.36 µs (1.78× the best) | 3.18 µs (2.22× the best) | 4.00 µs (2.60× the best) |
| GF(2^122), constant in GF(2^61) (GLS-shaped), 16 bytes | ||||||||
| gf2_122-gls(X:S:Z:T) extended | 309 ns (1.72× the best) | 44.3 ns (97.56× the best) | 246 ns (12.33× the best) | 1.10 µs (1.88× the best) | 1.70 µs (1.95× the best) | 2.67 µs (2.01× the best) | 3.76 µs (2.62× the best) | 4.86 µs (3.15× the best) |
| gf2_122-glscompare suitePornin x1: hash to addend; output already an addend | 410 ns (2.29× the best) | in the hash | 246 ns (12.33× the best) | 1.16 µs (1.97× the best) | 1.75 µs (2.01× the best) | 2.72 µs (2.05× the best) | 3.81 µs (2.66× the best) | 4.91 µs (3.19× the best) |
| gf2_122-gls-lambdaincompleteλ-projective | 315 ns (1.76× the best) | 101 ns (221.53× the best) | 216 ns (10.85× the best) | 1.08 µs (1.84× the best) | 1.60 µs (1.84× the best) | 2.46 µs (1.85× the best) | 3.42 µs (2.39× the best) | 4.39 µs (2.85× the best) |
| gf2_122-gls-lambdaincompletecompare suitehashed straight to : no prepare | 327 ns (1.82× the best) | in the hash | 216 ns (10.85× the best) | 992 ns (1.69× the best) | 1.51 µs (1.74× the best) | 2.37 µs (1.78× the best) | 3.33 µs (2.33× the best) | 4.30 µs (2.79× the best) |
| gf2_122-gls-lambdaincompletecompare suitePornin x1: hash to addend; output already an addend | 404 ns (2.25× the best) | in the hash | 216 ns (10.85× the best) | 1.07 µs (1.82× the best) | 1.59 µs (1.83× the best) | 2.45 µs (1.84× the best) | 3.41 µs (2.38× the best) | 4.38 µs (2.84× the best) |
| gf2_122-gls-wincompleteλ-projective, w codec | 311 ns (1.73× the best) | 0.97 ns (2.14× the best) | 217 ns (10.87× the best) | 977 ns (1.66× the best) | 1.50 µs (1.72× the best) | 2.36 µs (1.77× the best) | 3.32 µs (2.32× the best) | 4.29 µs (2.79× the best) |
| gf2_122-gls-wincompletecompare suitePornin x1: hash to addend; output already an addend | 404 ns (2.25× the best) | in the hash | 217 ns (10.87× the best) | 1.07 µs (1.82× the best) | 1.59 µs (1.83× the best) | 2.45 µs (1.84× the best) | 3.41 µs (2.38× the best) | 4.38 µs (2.85× the best) |
| gf2_122-gls-uunscaled (X:S:Z), w codec | 359 ns (2.00× the best) | 1.01 ns (2.22× the best) | 182 ns (9.16× the best) | 927 ns (1.58× the best) | 1.37 µs (1.57× the best) | 2.09 µs (1.57× the best) | 2.90 µs (2.03× the best) | 3.73 µs (2.42× the best) |
| gf2_122-gls-ucompare suitePornin x1: hash to addend; output already an addend | 593 ns (3.31× the best) | in the hash | 182 ns (9.16× the best) | 1.16 µs (1.97× the best) | 1.60 µs (1.84× the best) | 2.32 µs (1.75× the best) | 3.14 µs (2.19× the best) | 3.96 µs (2.57× the best) |
| GF(2^109), 14 bytes | ||||||||
| gf2_109(X:S:Z:T) extended | 518 ns (2.89× the best) | 95.7 ns (210.88× the best) | 403 ns (20.23× the best) | 1.82 µs (3.10× the best) | 2.79 µs (3.20× the best) | 4.37 µs (3.29× the best) | 6.15 µs (4.30× the best) | 7.94 µs (5.16× the best) |
| gf2_109compare suitePornin x1: hash to addend; output already an addend | 636 ns (3.55× the best) | in the hash | 403 ns (20.23× the best) | 1.84 µs (3.13× the best) | 2.81 µs (3.23× the best) | 4.39 µs (3.31× the best) | 6.17 µs (4.31× the best) | 7.96 µs (5.17× the best) |
| gf2_109-lambdaincompleteλ-projective | 517 ns (2.88× the best) | 147 ns (324.46× the best) | 331 ns (16.63× the best) | 1.66 µs (2.83× the best) | 2.46 µs (2.82× the best) | 3.76 µs (2.83× the best) | 5.23 µs (3.65× the best) | 6.70 µs (4.36× the best) |
| gf2_109-lambdaincompletecompare suitehashed straight to : no prepare | 511 ns (2.85× the best) | in the hash | 331 ns (16.63× the best) | 1.51 µs (2.57× the best) | 2.31 µs (2.65× the best) | 3.61 µs (2.72× the best) | 5.07 µs (3.55× the best) | 6.55 µs (4.26× the best) |
| gf2_109-lambdaincompletecompare suitePornin x1: hash to addend; output already an addend | 521 ns (2.91× the best) | in the hash | 331 ns (16.63× the best) | 1.52 µs (2.59× the best) | 2.32 µs (2.66× the best) | 3.62 µs (2.72× the best) | 5.09 µs (3.55× the best) | 6.56 µs (4.26× the best) |
| gf2_109-wincompleteλ-projective, w codec | 516 ns (2.88× the best) | 0.97 ns (2.14× the best) | 332 ns (16.67× the best) | 1.52 µs (2.58× the best) | 2.32 µs (2.66× the best) | 3.62 µs (2.73× the best) | 5.09 µs (3.56× the best) | 6.57 µs (4.27× the best) |
| gf2_109-wincompletecompare suitePornin x1: hash to addend; output already an addend | 522 ns (2.92× the best) | in the hash | 332 ns (16.67× the best) | 1.52 µs (2.59× the best) | 2.32 µs (2.67× the best) | 3.63 µs (2.73× the best) | 5.10 µs (3.56× the best) | 6.58 µs (4.27× the best) |
| gf2_109-uunscaled (X:S:Z), w codec | 592 ns (3.30× the best) | 0.98 ns (2.16× the best) | 289 ns (14.53× the best) | 1.47 µs (2.50× the best) | 2.17 µs (2.49× the best) | 3.31 µs (2.49× the best) | 4.59 µs (3.21× the best) | 5.88 µs (3.82× the best) |
| gf2_109-ucompare suitePornin x1: hash to addend; output already an addend | 593 ns (3.31× the best) | in the hash | 289 ns (14.53× the best) | 1.47 µs (2.50× the best) | 2.17 µs (2.49× the best) | 3.31 µs (2.49× the best) | 4.59 µs (3.21× the best) | 5.88 µs (3.82× the best) |
| F_p, p = 2^127 − 1, 16 bytes | ||||||||
| edwards127a = 1 Edwards, extended += cached | 1.06 µs (5.94× the best) | 27.2 ns (59.99× the best) | 19.9 ns (best) | 1.19 µs (2.02× the best) | 1.24 µs (1.42× the best) | 1.33 µs (best) | 1.43 µs (best) | 1.54 µs (best) |
| weier127short Weierstrass, projective += affine | 1.03 µs (5.75× the best) | 0.45 ns (tied for the best, within noise) | 44.7 ns (2.24× the best) | 1.20 µs (2.04× the best) | 1.31 µs (1.51× the best) | 1.50 µs (1.13× the best) | 1.71 µs (1.19× the best) | 1.92 µs (1.25× the best) |
| weier127-jacobianincompleteshort Weierstrass, Jacobian += affine | 1.00 µs (5.60× the best) | 0.46 ns (tied for the best, within noise, 1.01×) | 36.6 ns (1.84× the best) | 1.15 µs (1.95× the best) | 1.24 µs (1.42× the best) | 1.39 µs (1.05× the best) | 1.57 µs (1.10× the best) | 1.75 µs (1.14× the best) |
bold: the best of its column; italic, dotted: tied with the best within the confidence intervals; shading: ratio to the best, pale yellow at 1× to purple at 16× or more; grey: baseline, not compared.
Hashing and preparing one item at a time
| curve | per item, once | per cell | per item, into k cells | |||||
|---|---|---|---|---|---|---|---|---|
| hash (alone) | prepare (alone) | add (throughput) | : | : | : | : | : | |
| GF(2^127), 16 bytes | ||||||||
| gf2_127(X:S:Z:T) extended accumulators, Pornin's formulas | 890 ns (1.57× the best) | 31.6 ns (54.91× the best) | 155 ns (7.79× the best) | 1.41 µs (1.45× the best) | 1.79 µs (1.42× the best) | 2.40 µs (1.69× the best) | 3.10 µs (1.94× the best) | 3.80 µs (2.14× the best) |
| gf2_127compare suitePornin x1: hash to addend; output already an addend | 619 ns (1.09× the best) | in the hash | 155 ns (7.79× the best) | 1.11 µs (1.14× the best) | 1.48 µs (1.18× the best) | 2.10 µs (1.48× the best) | 2.79 µs (1.75× the best) | 3.50 µs (1.97× the best) |
| gf2_127compare suitePornin x2: hash to addend; output already an addend | 1.35 µs (2.38× the best) | in the hash | 155 ns (7.79× the best) | 1.84 µs (1.89× the best) | 2.22 µs (1.76× the best) | 2.83 µs (1.99× the best) | 3.53 µs (2.21× the best) | 4.23 µs (2.38× the best) |
| gf2_127-lambdaincompleteλ-projective (X:L:Z) accumulators | 880 ns (1.55× the best) | 412 ns (716.46× the best) | 132 ns (6.60× the best) | 1.71 µs (1.76× the best) | 2.03 µs (1.62× the best) | 2.56 µs (1.80× the best) | 3.15 µs (1.97× the best) | 3.75 µs (2.10× the best) |
| gf2_127-lambdaincompletecompare suitehashed straight to : no prepare | 870 ns (1.53× the best) | in the hash | 132 ns (6.60× the best) | 1.29 µs (1.33× the best) | 1.61 µs (1.28× the best) | 2.13 µs (1.50× the best) | 2.72 µs (1.71× the best) | 3.32 µs (1.87× the best) |
| gf2_127-lambdaincompletecompare suitePornin x1: hash to addend; output already an addend | 567 ns (tied for the best, within noise) | in the hash | 132 ns (6.60× the best) | 987 ns (1.01× the best) | 1.31 µs (1.04× the best) | 1.83 µs (1.29× the best) | 2.42 µs (1.52× the best) | 3.02 µs (1.70× the best) |
| gf2_127-wincompleteλ-projective, w codec: hashes and decodes to λ-affine | 975 ns (1.72× the best) | 0.62 ns (1.07× the best) | 131 ns (6.58× the best) | 1.39 µs (1.43× the best) | 1.71 µs (1.36× the best) | 2.24 µs (1.57× the best) | 2.82 µs (1.77× the best) | 3.42 µs (1.92× the best) |
| gf2_127-wincompletecompare suitePornin x1: hash to addend; output already an addend | 569 ns (tied for the best, within noise, 1.00×) | in the hash | 131 ns (6.58× the best) | 987 ns (1.01× the best) | 1.31 µs (1.04× the best) | 1.83 µs (1.29× the best) | 2.42 µs (1.51× the best) | 3.01 µs (1.69× the best) |
| gf2_127-uunscaled (X:S:Z), w codec, direct addend hashes | 1.00 µs (1.77× the best) | 0.62 ns (1.07× the best) | 116 ns (5.84× the best) | 1.38 µs (1.42× the best) | 1.66 µs (1.32× the best) | 2.13 µs (1.49× the best) | 2.65 µs (1.66× the best) | 3.18 µs (1.79× the best) |
| gf2_127-ucompare suitePornin x1: hash to addend; output already an addend | 598 ns (1.05× the best) | in the hash | 116 ns (5.84× the best) | 973 ns (best) | 1.26 µs (best) | 1.72 µs (1.21× the best) | 2.24 µs (1.40× the best) | 2.78 µs (1.56× the best) |
| GF(2^122) = GF(2^61)[u], dense constant, 16 bytes | ||||||||
| gf2_122(X:S:Z:T) extended | 1.16 µs (2.05× the best) | 64.2 ns (111.60× the best) | 263 ns (13.20× the best) | 2.03 µs (2.08× the best) | 2.66 µs (2.12× the best) | 3.70 µs (2.60× the best) | 4.87 µs (3.05× the best) | 6.04 µs (3.40× the best) |
| gf2_122compare suitePornin x1: hash to addend; output already an addend | 897 ns (1.58× the best) | in the hash | 263 ns (13.20× the best) | 1.70 µs (1.74× the best) | 2.33 µs (1.86× the best) | 3.37 µs (2.37× the best) | 4.53 µs (2.84× the best) | 5.71 µs (3.21× the best) |
| gf2_122-lambdaincompleteλ-projective | 1.18 µs (2.08× the best) | 521 ns (906.55× the best) | 217 ns (10.90× the best) | 2.37 µs (2.44× the best) | 2.90 µs (2.30× the best) | 3.75 µs (2.64× the best) | 4.72 µs (2.95× the best) | 5.69 µs (3.20× the best) |
| gf2_122-lambdaincompletecompare suitehashed straight to : no prepare | 1.18 µs (2.07× the best) | in the hash | 217 ns (10.90× the best) | 1.84 µs (1.89× the best) | 2.37 µs (1.88× the best) | 3.23 µs (2.27× the best) | 4.19 µs (2.62× the best) | 5.16 µs (2.90× the best) |
| gf2_122-lambdaincompletecompare suitePornin x1: hash to addend; output already an addend | 801 ns (1.41× the best) | in the hash | 217 ns (10.90× the best) | 1.47 µs (1.51× the best) | 1.99 µs (1.59× the best) | 2.85 µs (2.00× the best) | 3.82 µs (2.39× the best) | 4.79 µs (2.69× the best) |
| gf2_122-wincompleteλ-projective, w codec | 1.21 µs (2.14× the best) | 0.62 ns (1.07× the best) | 211 ns (10.58× the best) | 1.86 µs (1.92× the best) | 2.37 µs (1.89× the best) | 3.21 µs (2.25× the best) | 4.14 µs (2.59× the best) | 5.09 µs (2.86× the best) |
| gf2_122-wincompletecompare suitePornin x1: hash to addend; output already an addend | 799 ns (1.41× the best) | in the hash | 211 ns (10.58× the best) | 1.45 µs (1.49× the best) | 1.96 µs (1.56× the best) | 2.79 µs (1.96× the best) | 3.73 µs (2.33× the best) | 4.67 µs (2.63× the best) |
| gf2_122-uunscaled (X:S:Z), w codec | 1.27 µs (2.25× the best) | 0.62 ns (1.07× the best) | 183 ns (9.19× the best) | 1.84 µs (1.90× the best) | 2.29 µs (1.82× the best) | 3.01 µs (2.12× the best) | 3.83 µs (2.40× the best) | 4.65 µs (2.62× the best) |
| gf2_122-ucompare suitePornin x1: hash to addend; output already an addend | 857 ns (1.51× the best) | in the hash | 183 ns (9.19× the best) | 1.43 µs (1.47× the best) | 1.87 µs (1.49× the best) | 2.59 µs (1.82× the best) | 3.41 µs (2.13× the best) | 4.24 µs (2.38× the best) |
| GF(2^122), constant in GF(2^61) (GLS-shaped), 16 bytes | ||||||||
| gf2_122-gls(X:S:Z:T) extended | 1.20 µs (2.12× the best) | 44.2 ns (76.84× the best) | 246 ns (12.33× the best) | 2.00 µs (2.05× the best) | 2.59 µs (2.06× the best) | 3.56 µs (2.50× the best) | 4.65 µs (2.91× the best) | 5.75 µs (3.23× the best) |
| gf2_122-glscompare suitePornin x1: hash to addend; output already an addend | 865 ns (1.53× the best) | in the hash | 246 ns (12.33× the best) | 1.62 µs (1.66× the best) | 2.21 µs (1.76× the best) | 3.18 µs (2.23× the best) | 4.27 µs (2.67× the best) | 5.37 µs (3.02× the best) |
| gf2_122-gls-lambdaincompleteλ-projective | 1.18 µs (2.08× the best) | 524 ns (911.40× the best) | 216 ns (10.85× the best) | 2.37 µs (2.43× the best) | 2.89 µs (2.30× the best) | 3.74 µs (2.63× the best) | 4.70 µs (2.94× the best) | 5.67 µs (3.19× the best) |
| gf2_122-gls-lambdaincompletecompare suitehashed straight to : no prepare | 1.16 µs (2.05× the best) | in the hash | 216 ns (10.85× the best) | 1.82 µs (1.88× the best) | 2.35 µs (1.87× the best) | 3.20 µs (2.25× the best) | 4.16 µs (2.61× the best) | 5.13 µs (2.88× the best) |
| gf2_122-gls-lambdaincompletecompare suitePornin x1: hash to addend; output already an addend | 788 ns (1.39× the best) | in the hash | 216 ns (10.85× the best) | 1.45 µs (1.49× the best) | 1.98 µs (1.57× the best) | 2.83 µs (1.99× the best) | 3.79 µs (2.37× the best) | 4.76 µs (2.68× the best) |
| gf2_122-gls-wincompleteλ-projective, w codec | 1.24 µs (2.19× the best) | 0.62 ns (1.08× the best) | 217 ns (10.87× the best) | 1.91 µs (1.96× the best) | 2.43 µs (1.94× the best) | 3.29 µs (2.31× the best) | 4.25 µs (2.66× the best) | 5.22 µs (2.93× the best) |
| gf2_122-gls-wincompletecompare suitePornin x1: hash to addend; output already an addend | 791 ns (1.40× the best) | in the hash | 217 ns (10.87× the best) | 1.46 µs (1.50× the best) | 1.98 µs (1.58× the best) | 2.84 µs (1.99× the best) | 3.80 µs (2.38× the best) | 4.77 µs (2.68× the best) |
| gf2_122-gls-uunscaled (X:S:Z), w codec | 1.25 µs (2.20× the best) | 0.62 ns (1.07× the best) | 182 ns (9.16× the best) | 1.82 µs (1.87× the best) | 2.26 µs (1.80× the best) | 2.98 µs (2.10× the best) | 3.79 µs (2.37× the best) | 4.62 µs (2.59× the best) |
| gf2_122-gls-ucompare suitePornin x1: hash to addend; output already an addend | 843 ns (1.49× the best) | in the hash | 182 ns (9.16× the best) | 1.41 µs (1.45× the best) | 1.85 µs (1.47× the best) | 2.57 µs (1.81× the best) | 3.39 µs (2.12× the best) | 4.21 µs (2.37× the best) |
| GF(2^109), 14 bytes | ||||||||
| gf2_109(X:S:Z:T) extended | 5.86 µs (10.34× the best) | 95.3 ns (165.70× the best) | 403 ns (20.23× the best) | 7.16 µs (7.36× the best) | 8.13 µs (6.47× the best) | 9.72 µs (6.83× the best) | 11.5 µs (7.19× the best) | 13.3 µs (7.46× the best) |
| gf2_109compare suitePornin x1: hash to addend; output already an addend | 3.39 µs (5.98× the best) | in the hash | 403 ns (20.23× the best) | 4.60 µs (4.72× the best) | 5.57 µs (4.43× the best) | 7.15 µs (5.03× the best) | 8.93 µs (5.59× the best) | 10.7 µs (6.02× the best) |
| gf2_109-lambdaincompleteλ-projective | 5.87 µs (10.35× the best) | 2.86 µs (4982.19× the best) | 331 ns (16.63× the best) | 9.73 µs (10.00× the best) | 10.5 µs (8.38× the best) | 11.8 µs (8.32× the best) | 13.3 µs (8.32× the best) | 14.8 µs (8.30× the best) |
| gf2_109-lambdaincompletecompare suitehashed straight to : no prepare | 5.85 µs (10.31× the best) | in the hash | 331 ns (16.63× the best) | 6.84 µs (7.03× the best) | 7.64 µs (6.08× the best) | 8.95 µs (6.29× the best) | 10.4 µs (6.52× the best) | 11.9 µs (6.68× the best) |
| gf2_109-lambdaincompletecompare suitePornin x1: hash to addend; output already an addend | 3.28 µs (5.78× the best) | in the hash | 331 ns (16.63× the best) | 4.28 µs (4.40× the best) | 5.07 µs (4.04× the best) | 6.38 µs (4.48× the best) | 7.84 µs (4.91× the best) | 9.32 µs (5.24× the best) |
| gf2_109-wincompleteλ-projective, w codec | 5.78 µs (10.20× the best) | 0.62 ns (1.08× the best) | 332 ns (16.67× the best) | 6.78 µs (6.97× the best) | 7.58 µs (6.03× the best) | 8.89 µs (6.25× the best) | 10.4 µs (6.48× the best) | 11.8 µs (6.65× the best) |
| gf2_109-wincompletecompare suitePornin x1: hash to addend; output already an addend | 3.27 µs (5.77× the best) | in the hash | 332 ns (16.67× the best) | 4.28 µs (4.39× the best) | 5.07 µs (4.04× the best) | 6.38 µs (4.49× the best) | 7.85 µs (4.91× the best) | 9.33 µs (5.24× the best) |
| gf2_109-uunscaled (X:S:Z), w codec | 5.87 µs (10.36× the best) | 0.62 ns (1.08× the best) | 289 ns (14.53× the best) | 6.75 µs (6.94× the best) | 7.45 µs (5.93× the best) | 8.59 µs (6.04× the best) | 9.87 µs (6.18× the best) | 11.2 µs (6.27× the best) |
| gf2_109-ucompare suitePornin x1: hash to addend; output already an addend | 3.34 µs (5.89× the best) | in the hash | 289 ns (14.53× the best) | 4.22 µs (4.33× the best) | 4.91 µs (3.91× the best) | 6.05 µs (4.26× the best) | 7.34 µs (4.59× the best) | 8.63 µs (4.85× the best) |
| F_p, p = 2^127 − 1, 16 bytes | ||||||||
| edwards127a = 1 Edwards, extended += cached | 1.07 µs (1.88× the best) | 573 ns (996.17× the best) | 19.9 ns (tied for the best, within noise) | 1.73 µs (1.78× the best) | 1.79 µs (1.42× the best) | 1.88 µs (1.32× the best) | 1.98 µs (1.24× the best) | 2.09 µs (1.17× the best) |
| edwards127compare suiteElligator 2 x1: hash + prepare | 1.32 µs (2.33× the best) | 573 ns (996.17× the best) | 19.9 ns (tied for the best, within noise) | 1.99 µs (2.05× the best) | 2.04 µs (1.63× the best) | 2.13 µs (1.50× the best) | 2.23 µs (1.40× the best) | 2.34 µs (1.32× the best) |
| weier127short Weierstrass, projective += affine | 1.03 µs (1.82× the best) | 0.58 ns (tied for the best, within noise) | 44.7 ns (2.24× the best) | 1.20 µs (1.23× the best) | 1.31 µs (1.04× the best) | 1.50 µs (1.05× the best) | 1.71 µs (1.07× the best) | 1.93 µs (1.08× the best) |
| weier127compare suiteSSWU x1: hash + prepare | 1.12 µs (1.98× the best) | 0.58 ns (tied for the best, within noise) | 44.7 ns (2.24× the best) | 1.29 µs (1.33× the best) | 1.40 µs (1.12× the best) | 1.59 µs (1.12× the best) | 1.80 µs (1.13× the best) | 2.02 µs (1.13× the best) |
| weier127-jacobianincompleteshort Weierstrass, Jacobian += affine | 1.03 µs (1.82× the best) | 0.57 ns (tied for the best, within noise) | 36.6 ns (1.84× the best) | 1.18 µs (1.21× the best) | 1.27 µs (1.01× the best) | 1.42 µs (best) | 1.60 µs (best) | 1.78 µs (best) |
bold: the best of its column; italic, dotted: tied with the best within the confidence intervals; shading: ratio to the best, pale yellow at 1× to purple at 16× or more; grey: baseline, not compared.
Batching
Batched against individual time per element. The inversions-shared column divides the saving by the difference between individual and batched field inversion; it also absorbs allocation and control flow.
| curve | hash to curve | prepare | encode | decode | ||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| alone | batched | faster by | inversions shared | alone | batched | faster by | inversions shared | alone | batched | faster by | inversions shared | alone | batched | faster by | inversions shared | |
| GF(2^127), 16 bytes | ||||||||||||||||
| gf2_127(X:S:Z:T) extended accumulators, Pornin's formulas | 890 ns | 196 ns (best) | 4.5× | 2 | 31.6 ns | 31.2 ns (68.79× the best) | 1.0× | 0 | 462 ns | 106 ns (10.64× the best) | 4.4× | 1 | 446 ns | 88.0 ns (tied for the best, within noise) | 5.1× | 1 |
| gf2_127-lambdaincompleteλ-projective (X:L:Z) accumulators | 880 ns | 196 ns (1.00× the best) | 4.5× | 2 | 412 ns | 56.6 ns (124.81× the best) | 7.3× | 1 | 442 ns | 87.0 ns (8.72× the best) | 5.1× | 1 | 447 ns | 87.9 ns (tied for the best, within noise) | 5.1× | 1 |
| gf2_127-wincompleteλ-projective, w codec: hashes and decodes to λ-affine | 975 ns | 221 ns (1.13× the best) | 4.4× | 2.2 | 0.62 ns | 0.97 ns (2.14× the best) | 0.6× | 0 | 432 ns | 76.5 ns (7.67× the best) | 5.7× | 1 | 447 ns | 89.2 ns (1.01× the best) | 5.0× | 1 |
| gf2_127-uunscaled (X:S:Z), w codec, direct addend hashes | 1.00 µs | 258 ns (1.32× the best) | 3.9× | 2.1 | 0.62 ns | 0.98 ns (2.17× the best) | 0.6× | 0 | 438 ns | 76.5 ns (7.67× the best) | 5.7× | 1 | 479 ns | 121 ns (1.38× the best) | 4.0× | 1 |
| GF(2^122) = GF(2^61)[u], dense constant, 16 bytes | ||||||||||||||||
| gf2_122(X:S:Z:T) extended | 1.16 µs | 350 ns (1.79× the best) | 3.3× | 1.9 | 64.2 ns | 63.1 ns (139.03× the best) | 1.0× | 0 | 618 ns | 202 ns (20.28× the best) | 3.1× | 1 | 607 ns | 187 ns (2.12× the best) | 3.3× | 1 |
| gf2_122-lambdaincompleteλ-projective | 1.18 µs | 350 ns (1.79× the best) | 3.4× | 2 | 521 ns | 100 ns (220.88× the best) | 5.2× | 1 | 573 ns | 156 ns (15.63× the best) | 3.7× | 1 | 607 ns | 186 ns (2.12× the best) | 3.3× | 1 |
| gf2_122-wincompleteλ-projective, w codec | 1.21 µs | 328 ns (1.67× the best) | 3.7× | 2.1 | 0.62 ns | 0.99 ns (2.17× the best) | 0.6× | 0 | 551 ns | 130 ns (13.07× the best) | 4.2× | 1 | 601 ns | 153 ns (1.74× the best) | 3.9× | 1.1 |
| gf2_122-uunscaled (X:S:Z), w codec | 1.27 µs | 391 ns (2.00× the best) | 3.3× | 2.1 | 0.62 ns | 0.99 ns (2.17× the best) | 0.6× | 0 | 564 ns | 132 ns (13.26× the best) | 4.3× | 1 | 676 ns | 204 ns (2.32× the best) | 3.3× | 1.1 |
| GF(2^122), constant in GF(2^61) (GLS-shaped), 16 bytes | ||||||||||||||||
| gf2_122-gls(X:S:Z:T) extended | 1.20 µs | 309 ns (1.58× the best) | 3.9× | 2.1 | 44.2 ns | 44.3 ns (97.56× the best) | 1.0× | 0 | 612 ns | 194 ns (19.45× the best) | 3.2× | 1 | 592 ns | 162 ns (1.85× the best) | 3.7× | 1 |
| gf2_122-gls-lambdaincompleteλ-projective | 1.18 µs | 315 ns (1.61× the best) | 3.7× | 2.1 | 524 ns | 101 ns (221.53× the best) | 5.2× | 1 | 576 ns | 156 ns (15.63× the best) | 3.7× | 1 | 599 ns | 163 ns (1.85× the best) | 3.7× | 1 |
| gf2_122-gls-wincompleteλ-projective, w codec | 1.24 µs | 311 ns (1.59× the best) | 4.0× | 2.2 | 0.62 ns | 0.97 ns (2.14× the best) | 0.6× | 0 | 555 ns | 130 ns (13.01× the best) | 4.3× | 1 | 591 ns | 138 ns (1.57× the best) | 4.3× | 1.1 |
| gf2_122-gls-uunscaled (X:S:Z), w codec | 1.25 µs | 359 ns (1.83× the best) | 3.5× | 2.1 | 0.62 ns | 1.01 ns (2.22× the best) | 0.6× | 0 | 562 ns | 133 ns (13.32× the best) | 4.2× | 1 | 639 ns | 187 ns (2.13× the best) | 3.4× | 1.1 |
| GF(2^109), 14 bytes | ||||||||||||||||
| gf2_109(X:S:Z:T) extended | 5.86 µs | 518 ns (2.65× the best) | 11.3× | 2 | 95.3 ns | 95.7 ns (210.88× the best) | 1.0× | 0 | 3.03 µs | 306 ns (30.66× the best) | 9.9× | 1 | 2.98 µs | 263 ns (2.99× the best) | 11.3× | 1 |
| gf2_109-lambdaincompleteλ-projective | 5.87 µs | 517 ns (2.64× the best) | 11.4× | 2 | 2.86 µs | 147 ns (324.46× the best) | 19.4× | 1 | 2.95 µs | 221 ns (22.20× the best) | 13.3× | 1 | 2.98 µs | 263 ns (2.99× the best) | 11.3× | 1 |
| gf2_109-wincompleteλ-projective, w codec | 5.78 µs | 516 ns (2.64× the best) | 11.2× | 1.9 | 0.62 ns | 0.97 ns (2.14× the best) | 0.6× | 0 | 2.90 µs | 204 ns (20.42× the best) | 14.2× | 1 | 2.96 µs | 240 ns (2.73× the best) | 12.3× | 1 |
| gf2_109-uunscaled (X:S:Z), w codec | 5.87 µs | 592 ns (3.02× the best) | 9.9× | 1.9 | 0.62 ns | 0.98 ns (2.16× the best) | 0.6× | 0 | 2.95 µs | 206 ns (20.63× the best) | 14.3× | 1 | 3.04 µs | 319 ns (3.62× the best) | 9.6× | 1 |
| F_p, p = 2^127 − 1, 16 bytes | ||||||||||||||||
| edwards127a = 1 Edwards, extended += cached | 1.07 µs | 1.06 µs (5.44× the best) | 1.0× | 0 | 573 ns | 27.2 ns (59.99× the best) | 21.0× | 1.1 | 536 ns | 21.7 ns (2.18× the best) | 24.7× | 1 | 485 ns | 485 ns (5.51× the best) | 1.0× | 0 |
| weier127short Weierstrass, projective += affine | 1.03 µs | 1.03 µs (5.27× the best) | 1.0× | 0 | 0.58 ns | 0.45 ns (best) | 1.3× | 0 | 527 ns | 9.97 ns (best) | 52.9× | 1 | 487 ns | 484 ns (5.51× the best) | 1.0× | 0 |
| weier127-jacobianincompleteshort Weierstrass, Jacobian += affine | 1.03 µs | 1.00 µs (5.12× the best) | 1.0× | 0.1 | 0.57 ns | 0.46 ns (1.01× the best) | 1.2× | 0 | 531 ns | 15.3 ns (1.54× the best) | 34.7× | 1 | 484 ns | 483 ns (5.49× the best) | 1.0× | 0 |
bold: the best of its column; italic, dotted: tied with the best within the confidence intervals; shading: ratio to the best, pale yellow at 1× to purple at 16× or more; grey: baseline, not compared.
Time per element against batch size.
| curve | hash to curve | prepare | encode | decode | ||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| alone | alone | alone | alone | |||||||||||||
| GF(2^127), 16 bytes | ||||||||||||||||
| gf2_127(X:S:Z:T) extended accumulators, Pornin's formulas | 890 ns (1.01× the best) | 196 ns (tied for the best, within noise) | 31.6 ns (54.91× the best) | 31.2 ns (68.79× the best) | 462 ns (1.07× the best) | 106 ns (10.64× the best) | 446 ns (tied for the best, within noise) | 88.0 ns (tied for the best, within noise) | ||||||||
| gf2_127-lambdaincompleteλ-projective (X:L:Z) accumulators | 880 ns (best) | 430 ns (best) | 247 ns (best) | 196 ns (tied for the best, within noise, 1.00×) | 412 ns (716.46× the best) | 115 ns (81.26× the best) | 65.7 ns (121.70× the best) | 56.6 ns (124.81× the best) | 442 ns (1.02× the best) | 146 ns (1.72× the best) | 95.8 ns (4.70× the best) | 87.0 ns (8.72× the best) | 447 ns (tied for the best, within noise, 1.00×) | 149 ns (best) | 96.8 ns (best) | 87.9 ns (tied for the best, within noise) |
| gf2_127-wincompleteλ-projective, w codec: hashes and decodes to λ-affine | 975 ns (1.11× the best) | 467 ns (1.08× the best) | 278 ns (1.13× the best) | 221 ns (1.13× the best) | 0.62 ns (1.07× the best) | 1.85 ns (1.31× the best) | 1.01 ns (1.88× the best) | 0.97 ns (2.14× the best) | 432 ns (best) | 135 ns (1.59× the best) | 85.1 ns (4.18× the best) | 76.5 ns (7.67× the best) | 447 ns (tied for the best, within noise, 1.00×) | 153 ns (1.02× the best) | 97.8 ns (1.01× the best) | 89.2 ns (1.01× the best) |
| gf2_127-uunscaled (X:S:Z), w codec, direct addend hashes | 1.00 µs (1.14× the best) | 515 ns (1.20× the best) | 313 ns (1.27× the best) | 258 ns (1.32× the best) | 0.62 ns (1.07× the best) | 1.85 ns (1.30× the best) | 1.01 ns (1.87× the best) | 0.98 ns (2.17× the best) | 438 ns (1.01× the best) | 131 ns (1.54× the best) | 85.9 ns (4.22× the best) | 76.5 ns (7.67× the best) | 479 ns (1.07× the best) | 185 ns (1.24× the best) | 131 ns (1.35× the best) | 121 ns (1.38× the best) |
| GF(2^122) = GF(2^61)[u], dense constant, 16 bytes | ||||||||||||||||
| gf2_122(X:S:Z:T) extended | 1.16 µs (1.32× the best) | 350 ns (1.79× the best) | 64.2 ns (111.60× the best) | 63.1 ns (139.03× the best) | 618 ns (1.43× the best) | 202 ns (20.28× the best) | 607 ns (1.36× the best) | 187 ns (2.12× the best) | ||||||||
| gf2_122-lambdaincompleteλ-projective | 1.18 µs (1.34× the best) | 350 ns (1.79× the best) | 521 ns (906.55× the best) | 100 ns (220.88× the best) | 573 ns (1.33× the best) | 156 ns (15.63× the best) | 607 ns (1.36× the best) | 186 ns (2.12× the best) | ||||||||
| gf2_122-wincompleteλ-projective, w codec | 1.21 µs (1.38× the best) | 328 ns (1.67× the best) | 0.62 ns (1.07× the best) | 0.99 ns (2.17× the best) | 551 ns (1.28× the best) | 130 ns (13.07× the best) | 601 ns (1.35× the best) | 153 ns (1.74× the best) | ||||||||
| gf2_122-uunscaled (X:S:Z), w codec | 1.27 µs (1.45× the best) | 391 ns (2.00× the best) | 0.62 ns (1.07× the best) | 0.99 ns (2.17× the best) | 564 ns (1.31× the best) | 132 ns (13.26× the best) | 676 ns (1.51× the best) | 204 ns (2.32× the best) | ||||||||
| GF(2^122), constant in GF(2^61) (GLS-shaped), 16 bytes | ||||||||||||||||
| gf2_122-gls(X:S:Z:T) extended | 1.20 µs (1.37× the best) | 309 ns (1.58× the best) | 44.2 ns (76.84× the best) | 44.3 ns (97.56× the best) | 612 ns (1.42× the best) | 194 ns (19.45× the best) | 592 ns (1.33× the best) | 162 ns (1.85× the best) | ||||||||
| gf2_122-gls-lambdaincompleteλ-projective | 1.18 µs (1.34× the best) | 315 ns (1.61× the best) | 524 ns (911.40× the best) | 101 ns (221.53× the best) | 576 ns (1.33× the best) | 156 ns (15.63× the best) | 599 ns (1.34× the best) | 163 ns (1.85× the best) | ||||||||
| gf2_122-gls-wincompleteλ-projective, w codec | 1.24 µs (1.41× the best) | 311 ns (1.59× the best) | 0.62 ns (1.08× the best) | 0.97 ns (2.14× the best) | 555 ns (1.28× the best) | 130 ns (13.01× the best) | 591 ns (1.32× the best) | 138 ns (1.57× the best) | ||||||||
| gf2_122-gls-uunscaled (X:S:Z), w codec | 1.25 µs (1.42× the best) | 359 ns (1.83× the best) | 0.62 ns (1.07× the best) | 1.01 ns (2.22× the best) | 562 ns (1.30× the best) | 133 ns (13.32× the best) | 639 ns (1.43× the best) | 187 ns (2.13× the best) | ||||||||
| GF(2^109), 14 bytes | ||||||||||||||||
| gf2_109(X:S:Z:T) extended | 5.86 µs (6.66× the best) | 518 ns (2.65× the best) | 95.3 ns (165.70× the best) | 95.7 ns (210.88× the best) | 3.03 µs (7.00× the best) | 306 ns (30.66× the best) | 2.98 µs (6.67× the best) | 263 ns (2.99× the best) | ||||||||
| gf2_109-lambdaincompleteλ-projective | 5.87 µs (6.67× the best) | 517 ns (2.64× the best) | 2.86 µs (4982.19× the best) | 147 ns (324.46× the best) | 2.95 µs (6.82× the best) | 221 ns (22.20× the best) | 2.98 µs (6.68× the best) | 263 ns (2.99× the best) | ||||||||
| gf2_109-wincompleteλ-projective, w codec | 5.78 µs (6.57× the best) | 516 ns (2.64× the best) | 0.62 ns (1.08× the best) | 0.97 ns (2.14× the best) | 2.90 µs (6.70× the best) | 204 ns (20.42× the best) | 2.96 µs (6.64× the best) | 240 ns (2.73× the best) | ||||||||
| gf2_109-uunscaled (X:S:Z), w codec | 5.87 µs (6.67× the best) | 592 ns (3.02× the best) | 0.62 ns (1.08× the best) | 0.98 ns (2.16× the best) | 2.95 µs (6.82× the best) | 206 ns (20.63× the best) | 3.04 µs (6.82× the best) | 319 ns (3.62× the best) | ||||||||
| F_p, p = 2^127 − 1, 16 bytes | ||||||||||||||||
| edwards127a = 1 Edwards, extended += cached | 1.07 µs (1.21× the best) | 1.07 µs (2.50× the best) | 1.07 µs (4.32× the best) | 1.06 µs (5.44× the best) | 573 ns (996.17× the best) | 105 ns (74.13× the best) | 37.1 ns (68.62× the best) | 27.2 ns (59.99× the best) | 536 ns (1.24× the best) | 99.7 ns (1.17× the best) | 32.1 ns (1.57× the best) | 21.7 ns (2.18× the best) | 485 ns (1.09× the best) | 493 ns (3.31× the best) | 487 ns (5.04× the best) | 485 ns (5.51× the best) |
| weier127short Weierstrass, projective += affine | 1.03 µs (1.17× the best) | 1.03 µs (2.40× the best) | 1.04 µs (4.19× the best) | 1.03 µs (5.27× the best) | 0.58 ns (tied for the best, within noise) | 1.42 ns (tied for the best, within noise, 1.00×) | 0.54 ns (tied for the best, within noise) | 0.45 ns (tied for the best, within noise) | 527 ns (1.22× the best) | 85.1 ns (best) | 20.4 ns (best) | 9.97 ns (best) | 487 ns (1.09× the best) | 487 ns (3.26× the best) | 482 ns (4.98× the best) | 484 ns (5.51× the best) |
| weier127-jacobianincompleteshort Weierstrass, Jacobian += affine | 1.03 µs (1.17× the best) | 1.03 µs (2.39× the best) | 1.03 µs (4.17× the best) | 1.00 µs (5.12× the best) | 0.57 ns (tied for the best, within noise) | 1.41 ns (tied for the best, within noise) | 0.54 ns (tied for the best, within noise, 1.00×) | 0.46 ns (tied for the best, within noise, 1.01×) | 531 ns (1.23× the best) | 90.0 ns (1.06× the best) | 25.8 ns (1.27× the best) | 15.3 ns (1.54× the best) | 484 ns (1.09× the best) | 485 ns (3.25× the best) | 482 ns (4.98× the best) | 483 ns (5.49× the best) |
bold: the best of its column; italic, dotted: tied with the best within the confidence intervals; shading: ratio to the best, pale yellow at 1× to purple at 16× or more; grey: baseline, not compared.
Costs by lifetime
What an insertion into cells keyed by IDs costs by how long each part stays valid, for each family the RIBLT suite timed so (proj=): the ID once per item; the curve and each hash’s keys once per salt; the hash to the addend, the mapping’s seed and its walk once per salt and item; and the addition, encoding and decoding of each cell. Salted SHA-256 hashes the ID anew under each salt; each projection, the checksum’s and the mapping’s in fields chosen apart, multiplies its halves by the salt’s keys. The last row is the measured encoding of n = 3500 items into m = 1350 cells, per item: by salted SHA-256 of the items themselves, and by projections of their IDs, computed beforehand (Costs by lifetime).
binary-lambda.127, ti-addend, checksum projected in , mapping in
| lifetime | term | salted SHA-256 | projection |
|---|---|---|---|
| per item | ID, the item’s SHA-256 | 32.5 ns | 32.5 ns |
| per salt | accept the curve | not timed | not timed |
| per salt | checksum keys | 71.0 ns | 261 ns |
| per salt | mapping keys | 71.0 ns | 261 ns |
| per salt and item | hash to the addend | 176 ns | 147 ns |
| per salt and item | mapping seed | 32.9 ns | 9.40 ns |
| per salt and item | mapping walk below m = 1350 | 36.4 ns | 36.4 ns |
| per cell | add | 132 ns | 132 ns |
| per cell | encode | 87.0 ns | 87.0 ns |
| per cell | decode | 87.9 ns | 87.9 ns |
| measured | insertion per item, k = 13.57 cells | 2.04 µs | 1.98 µs |
binary-u.127, pornin-addend, checksum projected in , mapping in
| lifetime | term | salted SHA-256 | projection |
|---|---|---|---|
| per item | ID, the item’s SHA-256 | 32.5 ns | 32.5 ns |
| per salt | accept the curve | not timed | not timed |
| per salt | checksum keys | 71.0 ns | 261 ns |
| per salt | mapping keys | 71.0 ns | 261 ns |
| per salt and item | hash to the addend | 212 ns | 191 ns |
| per salt and item | mapping seed | 32.9 ns | 9.40 ns |
| per salt and item | mapping walk below m = 1350 | 36.4 ns | 36.4 ns |
| per cell | add | 116 ns | 116 ns |
| per cell | encode | 76.5 ns | 76.5 ns |
| per cell | decode | 121 ns | 121 ns |
| measured | insertion per item, k = 13.57 cells | 1.90 µs | 1.89 µs |
binary-w.127, pornin-addend, checksum projected in , mapping in
| lifetime | term | salted SHA-256 | projection |
|---|---|---|---|
| per item | ID, the item’s SHA-256 | 32.5 ns | 32.5 ns |
| per salt | accept the curve | not timed | not timed |
| per salt | checksum keys | 71.0 ns | 261 ns |
| per salt | mapping keys | 71.0 ns | 261 ns |
| per salt and item | hash to the addend | 183 ns | 162 ns |
| per salt and item | mapping seed | 32.9 ns | 9.40 ns |
| per salt and item | mapping walk below m = 1350 | 36.4 ns | 36.4 ns |
| per cell | add | 131 ns | 131 ns |
| per cell | encode | 76.5 ns | 76.5 ns |
| per cell | decode | 89.2 ns | 89.2 ns |
| measured | insertion per item, k = 13.57 cells | 2.04 µs | 2.01 µs |
edwards.127, ti, checksum projected in , mapping in
| lifetime | term | salted SHA-256 | projection |
|---|---|---|---|
| per item | ID, the item’s SHA-256 | 32.5 ns | 32.5 ns |
| per salt | accept the curve | not timed | not timed |
| per salt | checksum keys | 71.0 ns | 311 ns |
| per salt | mapping keys | 71.0 ns | 261 ns |
| per salt and item | hash to the addend | 1.10 µs | 1.05 µs |
| per salt and item | mapping seed | 32.9 ns | 9.40 ns |
| per salt and item | mapping walk below m = 1350 | 36.4 ns | 36.4 ns |
| per cell | add | 19.9 ns | 19.9 ns |
| per cell | encode | 21.7 ns | 21.7 ns |
| per cell | decode | 485 ns | 485 ns |
| measured | insertion per item, k = 13.57 cells | 1.42 µs | 1.35 µs |
weier.127, ti, checksum projected in , mapping in
| lifetime | term | salted SHA-256 | projection |
|---|---|---|---|
| per item | ID, the item’s SHA-256 | 32.5 ns | 32.5 ns |
| per salt | accept the curve | not timed | not timed |
| per salt | checksum keys | 71.0 ns | 261 ns |
| per salt | mapping keys | 71.0 ns | 261 ns |
| per salt and item | hash to the addend | 1.01 µs | 965 ns |
| per salt and item | mapping seed | 32.9 ns | 9.40 ns |
| per salt and item | mapping walk below m = 1350 | 36.4 ns | 36.4 ns |
| per cell | add | 44.7 ns | 44.7 ns |
| per cell | encode | 9.97 ns | 9.97 ns |
| per cell | decode | 484 ns | 484 ns |
| measured | insertion per item, k = 13.57 cells | 1.68 µs | 1.61 µs |
weier-jacobian.127, ti, checksum projected in , mapping in
| lifetime | term | salted SHA-256 | projection |
|---|---|---|---|
| per item | ID, the item’s SHA-256 | 32.5 ns | 32.5 ns |
| per salt | accept the curve | not timed | not timed |
| per salt | checksum keys | 71.0 ns | 261 ns |
| per salt | mapping keys | 71.0 ns | 261 ns |
| per salt and item | hash to the addend | 1.01 µs | 987 ns |
| per salt and item | mapping seed | 32.9 ns | 9.40 ns |
| per salt and item | mapping walk below m = 1350 | 36.4 ns | 36.4 ns |
| per cell | add | 36.6 ns | 36.6 ns |
| per cell | encode | 15.3 ns | 15.3 ns |
| per cell | decode | 483 ns | 483 ns |
| measured | insertion per item, k = 13.57 cells | 1.56 µs | 1.49 µs |
Group operations
The fastest measurement of each operation and mode per family, the hashes over every construction; rows grouped by field.
| curve | hash to curve | hash to addend | prepare | add | subtract | negate | is identity | equals addend | encode | decode | |||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| alone | batched | alone | batched | alone | batched | throughput | latency | match | mismatch | alone | batched | alone | batched | ||||
| baseline | |||||||||||||||||
| xorSHA-256 digests XORed: no group, 32 bytes | 0.73 ns | 0.39 ns | |||||||||||||||
| GF(2^127), 16 bytes | |||||||||||||||||
| gf2_127(X:S:Z:T) extended accumulators, Pornin's formulas | 619 ns (best) | 196 ns (tied for the best, within noise) | 31.6 ns (54.91× the best) | 31.2 ns (68.79× the best) | 155 ns (7.79× the best) | 156 ns (7.05× the best) | 0.69 ns (1.07× the best) | 0.59 ns (1.76× the best) | 30.3 ns (15.83× the best) | 462 ns (1.07× the best) | 106 ns (10.64× the best) | 446 ns (tied for the best, within noise) | 88.0 ns (tied for the best, within noise) | ||||
| gf2_127-lambdaincompleteλ-projective (X:L:Z) accumulators | 880 ns (1.42× the best) | 196 ns (tied for the best, within noise, 1.00×) | 567 ns (tied for the best, within noise) | 179 ns (best) | 412 ns (716.46× the best) | 56.6 ns (124.81× the best) | 132 ns (6.60× the best) | 135 ns (6.12× the best) | 131 ns (5.78× the best) | 0.64 ns (tied for the best, within noise) | 0.55 ns (1.62× the best) | 15.1 ns (4.07× the best) | 15.1 ns (7.91× the best) | 442 ns (1.02× the best) | 87.0 ns (8.72× the best) | 447 ns (tied for the best, within noise, 1.00×) | 87.9 ns (tied for the best, within noise) |
| gf2_127-wincompleteλ-projective, w codec: hashes and decodes to λ-affine | 975 ns (1.58× the best) | 221 ns (1.13× the best) | 569 ns (tied for the best, within noise, 1.00×) | 184 ns (1.03× the best) | 0.62 ns (1.07× the best) | 0.97 ns (2.14× the best) | 131 ns (6.58× the best) | 135 ns (6.11× the best) | 131 ns (5.79× the best) | 0.65 ns (tied for the best, within noise, 1.00×) | 0.55 ns (1.62× the best) | 15.0 ns (4.06× the best) | 15.1 ns (7.87× the best) | 432 ns (best) | 76.5 ns (7.67× the best) | 447 ns (tied for the best, within noise, 1.00×) | 89.2 ns (1.01× the best) |
| gf2_127-uunscaled (X:S:Z), w codec, direct addend hashes | 1.00 µs (1.62× the best) | 258 ns (1.32× the best) | 598 ns (1.05× the best) | 213 ns (1.19× the best) | 0.62 ns (1.07× the best) | 0.98 ns (2.17× the best) | 116 ns (5.84× the best) | 119 ns (5.41× the best) | 119 ns (5.24× the best) | 0.68 ns (1.05× the best) | 0.54 ns (1.61× the best) | 48.6 ns (13.12× the best) | 48.7 ns (25.41× the best) | 438 ns (1.01× the best) | 76.5 ns (7.67× the best) | 479 ns (1.07× the best) | 121 ns (1.38× the best) |
| GF(2^122) = GF(2^61)[u], dense constant, 16 bytes | |||||||||||||||||
| gf2_122(X:S:Z:T) extended | 897 ns (1.45× the best) | 350 ns (1.79× the best) | 64.2 ns (111.60× the best) | 63.1 ns (139.03× the best) | 263 ns (13.20× the best) | 267 ns (12.10× the best) | 0.69 ns (1.07× the best) | 0.84 ns (2.49× the best) | 53.7 ns (28.03× the best) | 618 ns (1.43× the best) | 202 ns (20.28× the best) | 607 ns (1.36× the best) | 187 ns (2.12× the best) | ||||
| gf2_122-lambdaincompleteλ-projective | 1.18 µs (1.91× the best) | 350 ns (1.79× the best) | 801 ns (1.41× the best) | 361 ns (2.02× the best) | 521 ns (906.55× the best) | 100 ns (220.88× the best) | 217 ns (10.90× the best) | 219 ns (9.94× the best) | 0.65 ns (tied for the best, within noise, 1.00×) | 0.84 ns (2.49× the best) | 27.9 ns (14.57× the best) | 573 ns (1.33× the best) | 156 ns (15.63× the best) | 607 ns (1.36× the best) | 186 ns (2.12× the best) | ||
| gf2_122-wincompleteλ-projective, w codec | 1.21 µs (1.96× the best) | 328 ns (1.67× the best) | 799 ns (1.41× the best) | 429 ns (2.39× the best) | 0.62 ns (1.07× the best) | 0.99 ns (2.17× the best) | 211 ns (10.58× the best) | 219 ns (9.93× the best) | 0.64 ns (tied for the best, within noise, 1.00×) | 0.84 ns (2.49× the best) | 27.8 ns (14.51× the best) | 551 ns (1.28× the best) | 130 ns (13.07× the best) | 601 ns (1.35× the best) | 153 ns (1.74× the best) | ||
| gf2_122-uunscaled (X:S:Z), w codec | 1.27 µs (2.06× the best) | 391 ns (2.00× the best) | 857 ns (1.51× the best) | 622 ns (3.47× the best) | 0.62 ns (1.07× the best) | 0.99 ns (2.17× the best) | 183 ns (9.19× the best) | 183 ns (8.31× the best) | 0.69 ns (1.07× the best) | 0.83 ns (2.46× the best) | 84.9 ns (44.33× the best) | 564 ns (1.31× the best) | 132 ns (13.26× the best) | 676 ns (1.51× the best) | 204 ns (2.32× the best) | ||
| GF(2^122), constant in GF(2^61) (GLS-shaped), 16 bytes | |||||||||||||||||
| gf2_122-gls(X:S:Z:T) extended | 865 ns (1.40× the best) | 309 ns (1.58× the best) | 44.2 ns (76.84× the best) | 44.3 ns (97.56× the best) | 246 ns (12.33× the best) | 240 ns (10.88× the best) | 1.02 ns (1.58× the best) | 0.84 ns (2.49× the best) | 54.4 ns (28.41× the best) | 612 ns (1.42× the best) | 194 ns (19.45× the best) | 592 ns (1.33× the best) | 162 ns (1.85× the best) | ||||
| gf2_122-gls-lambdaincompleteλ-projective | 1.18 µs (1.90× the best) | 315 ns (1.61× the best) | 788 ns (1.39× the best) | 327 ns (1.82× the best) | 524 ns (911.40× the best) | 101 ns (221.53× the best) | 216 ns (10.85× the best) | 219 ns (9.94× the best) | 0.65 ns (tied for the best, within noise, 1.00×) | 0.84 ns (2.49× the best) | 27.8 ns (14.53× the best) | 576 ns (1.33× the best) | 156 ns (15.63× the best) | 599 ns (1.34× the best) | 163 ns (1.85× the best) | ||
| gf2_122-gls-wincompleteλ-projective, w codec | 1.24 µs (2.01× the best) | 311 ns (1.59× the best) | 791 ns (1.40× the best) | 404 ns (2.25× the best) | 0.62 ns (1.08× the best) | 0.97 ns (2.14× the best) | 217 ns (10.87× the best) | 219 ns (9.94× the best) | 0.65 ns (tied for the best, within noise, 1.00×) | 0.84 ns (2.48× the best) | 27.9 ns (14.58× the best) | 555 ns (1.28× the best) | 130 ns (13.01× the best) | 591 ns (1.32× the best) | 138 ns (1.57× the best) | ||
| gf2_122-gls-uunscaled (X:S:Z), w codec | 1.25 µs (2.02× the best) | 359 ns (1.83× the best) | 843 ns (1.49× the best) | 593 ns (3.31× the best) | 0.62 ns (1.07× the best) | 1.01 ns (2.22× the best) | 182 ns (9.16× the best) | 183 ns (8.29× the best) | 0.69 ns (1.07× the best) | 0.84 ns (2.49× the best) | 85.0 ns (44.39× the best) | 562 ns (1.30× the best) | 133 ns (13.32× the best) | 639 ns (1.43× the best) | 187 ns (2.13× the best) | ||
| GF(2^109), 14 bytes | |||||||||||||||||
| gf2_109(X:S:Z:T) extended | 3.39 µs (5.48× the best) | 518 ns (2.65× the best) | 95.3 ns (165.70× the best) | 95.7 ns (210.88× the best) | 403 ns (20.23× the best) | 403 ns (18.27× the best) | 0.69 ns (1.06× the best) | 0.59 ns (1.74× the best) | 72.9 ns (38.07× the best) | 3.03 µs (7.00× the best) | 306 ns (30.66× the best) | 2.98 µs (6.67× the best) | 263 ns (2.99× the best) | ||||
| gf2_109-lambdaincompleteλ-projective | 5.87 µs (9.49× the best) | 517 ns (2.64× the best) | 3.28 µs (5.78× the best) | 511 ns (2.85× the best) | 2.86 µs (4982.19× the best) | 147 ns (324.46× the best) | 331 ns (16.63× the best) | 334 ns (15.12× the best) | 0.65 ns (tied for the best, within noise, 1.00×) | 0.57 ns (1.70× the best) | 39.3 ns (20.52× the best) | 2.95 µs (6.82× the best) | 221 ns (22.20× the best) | 2.98 µs (6.68× the best) | 263 ns (2.99× the best) | ||
| gf2_109-wincompleteλ-projective, w codec | 5.78 µs (9.35× the best) | 516 ns (2.64× the best) | 3.27 µs (5.77× the best) | 522 ns (2.92× the best) | 0.62 ns (1.08× the best) | 0.97 ns (2.14× the best) | 332 ns (16.67× the best) | 335 ns (15.17× the best) | 0.64 ns (tied for the best, within noise, 1.00×) | 0.58 ns (1.71× the best) | 39.4 ns (20.59× the best) | 2.90 µs (6.70× the best) | 204 ns (20.42× the best) | 2.96 µs (6.64× the best) | 240 ns (2.73× the best) | ||
| gf2_109-uunscaled (X:S:Z), w codec | 5.87 µs (9.50× the best) | 592 ns (3.02× the best) | 3.34 µs (5.89× the best) | 593 ns (3.31× the best) | 0.62 ns (1.08× the best) | 0.98 ns (2.16× the best) | 289 ns (14.53× the best) | 290 ns (13.13× the best) | 0.69 ns (1.07× the best) | 0.58 ns (1.72× the best) | 115 ns (60.25× the best) | 2.95 µs (6.82× the best) | 206 ns (20.63× the best) | 3.04 µs (6.82× the best) | 319 ns (3.62× the best) | ||
| F_p, p = 2^127 − 1, 16 bytes | |||||||||||||||||
| edwards127a = 1 Edwards, extended += cached | 1.07 µs (1.72× the best) | 1.06 µs (5.44× the best) | 573 ns (996.17× the best) | 27.2 ns (59.99× the best) | 19.9 ns (best) | 22.1 ns (best) | 22.7 ns (best) | 1.36 ns (2.11× the best) | 0.34 ns (best) | 3.70 ns (best) | 1.91 ns (best) | 536 ns (1.24× the best) | 21.7 ns (2.18× the best) | 485 ns (1.09× the best) | 485 ns (5.51× the best) | ||
| weier127short Weierstrass, projective += affine | 1.03 µs (1.67× the best) | 1.03 µs (5.27× the best) | 0.58 ns (tied for the best, within noise) | 0.45 ns (tied for the best, within noise) | 44.7 ns (2.24× the best) | 46.2 ns (2.10× the best) | 46.4 ns (2.05× the best) | 0.76 ns (1.17× the best) | 0.34 ns (1.01× the best) | 3.81 ns (1.03× the best) | 1.98 ns (1.04× the best) | 527 ns (1.22× the best) | 9.97 ns (best) | 487 ns (1.09× the best) | 484 ns (5.51× the best) | ||
| weier127-jacobianincompleteshort Weierstrass, Jacobian += affine | 1.03 µs (1.67× the best) | 1.00 µs (5.12× the best) | 0.57 ns (tied for the best, within noise) | 0.46 ns (tied for the best, within noise, 1.01×) | 36.6 ns (1.84× the best) | 45.0 ns (2.04× the best) | 37.6 ns (1.66× the best) | 0.76 ns (1.17× the best) | 0.34 ns (1.01× the best) | 8.92 ns (2.41× the best) | 4.29 ns (2.24× the best) | 531 ns (1.23× the best) | 15.3 ns (1.54× the best) | 484 ns (1.09× the best) | 483 ns (5.49× the best) | ||
bold: the best of its column; italic, dotted: tied with the best within the confidence intervals; shading: ratio to the best, pale yellow at 1× to purple at 16× or more; grey: baseline, not compared.
Field operations
Per field; batched inversion per element of a batch of 1024.
| field | mul | square | add | sqrt | sqrt ratio | halftrace | invert | pack | unpack | |||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| throughput | latency | throughput | latency | alone | batched | |||||||
| binary | ||||||||||||
| gf2_127F_2[z]/(z^127 + z^63 + 1) | 13.2 ns (8.60× the best) | 13.4 ns (3.69× the best) | 2.58 ns (1.35× the best) | 4.19 ns (1.15× the best) | xor | 2.61 ns (best) | 3.50 ns (1.47× the best) | 391 ns (best) | 42.0 ns (7.36× the best) | |||
| gf2_122GF(2^61)[u]/(u^2 + u + 1) | 24.6 ns (16.00× the best) | 29.1 ns (8.00× the best) | 3.84 ns (2.01× the best) | 16.7 ns (4.60× the best) | xor | 3.41 ns (1.31× the best) | 2.39 ns (best) | 494 ns (1.26× the best) | 74.0 ns (12.95× the best) | |||
| gf2_109F_2[z]/(z^109 + z^5 + z^4 + z^2 + 1) | 34.7 ns (22.59× the best) | 38.9 ns (10.69× the best) | 21.8 ns (11.38× the best) | 26.7 ns (7.34× the best) | xor | 19.2 ns (7.38× the best) | 3.28 ns (1.38× the best) | 2.82 µs (7.22× the best) | 109 ns (19.02× the best) | |||
| prime | ||||||||||||
| fp127p = 2^127 − 1 | 1.54 ns (best) | 3.64 ns (best) | 1.91 ns (best) | 3.64 ns (best) | 0.94 ns (best) | 474 ns (181.79× the best) | 525 ns (best) | 519 ns (1.33× the best) | 5.71 ns (best) | 0.35 ns (best) | 0.57 ns (best) | |
bold: the best of its column; italic, dotted: tied with the best within the confidence intervals; shading: ratio to the best, pale yellow at 1× to purple at 16× or more; grey: baseline, not compared.
Which bench each cell is
| operation | curve | bench | time | 95% CI |
|---|---|---|---|---|
| field mul, throughput | gf2_127 | field/gf2_127/mul throughput (8 chains) | 13.2 ns | 13.2 ns .. 13.3 ns |
| field mul, throughput | gf2_109 | field/gf2_109/mul throughput (8 chains) | 34.7 ns | 34.6 ns .. 34.9 ns |
| field mul, throughput | gf2_122 | field/gf2_122/mul throughput (8 chains) | 24.6 ns | 24.6 ns .. 24.7 ns |
| field mul, throughput | fp127 | field/fp127/mul throughput (8 chains) | 1.54 ns | 1.54 ns .. 1.54 ns |
| field mul, latency | gf2_127 | field/gf2_127/mul latency (dependent chain) | 13.4 ns | 13.4 ns .. 13.5 ns |
| field mul, latency | gf2_109 | field/gf2_109/mul latency (dependent chain) | 38.9 ns | 38.8 ns .. 39.0 ns |
| field mul, latency | gf2_122 | field/gf2_122/mul latency (dependent chain) | 29.1 ns | 29.1 ns .. 29.2 ns |
| field mul, latency | fp127 | field/fp127/mul latency (dependent chain) | 3.64 ns | 3.63 ns .. 3.65 ns |
| field square, throughput | gf2_127 | field/gf2_127/square throughput (8 chains) | 2.58 ns | 2.58 ns .. 2.59 ns |
| field square, throughput | gf2_109 | field/gf2_109/square throughput (8 chains) | 21.8 ns | 21.7 ns .. 21.8 ns |
| field square, throughput | gf2_122 | field/gf2_122/square throughput (8 chains) | 3.84 ns | 3.83 ns .. 3.85 ns |
| field square, throughput | fp127 | field/fp127/square throughput (8 chains) | 1.91 ns | 1.91 ns .. 1.92 ns |
| field square, latency | gf2_127 | field/gf2_127/square latency (dependent chain) | 4.19 ns | 4.18 ns .. 4.20 ns |
| field square, latency | gf2_109 | field/gf2_109/square latency (dependent chain) | 26.7 ns | 26.7 ns .. 26.8 ns |
| field square, latency | gf2_122 | field/gf2_122/square latency (dependent chain) | 16.7 ns | 16.7 ns .. 16.8 ns |
| field square, latency | fp127 | field/fp127/square latency (dependent chain) | 3.64 ns | 3.63 ns .. 3.65 ns |
| field add | fp127 | field/fp127/add | 0.94 ns | 0.94 ns .. 0.94 ns |
| field sqrt | gf2_127 | field/gf2_127/sqrt | 2.61 ns | 2.60 ns .. 2.62 ns |
| field sqrt | gf2_109 | field/gf2_109/sqrt | 19.2 ns | 19.2 ns .. 19.3 ns |
| field sqrt | gf2_122 | field/gf2_122/sqrt | 3.41 ns | 3.40 ns .. 3.41 ns |
| field sqrt | fp127 | field/fp127/sqrt (x^(2^125)) | 474 ns | 473 ns .. 475 ns |
| field sqrt ratio | fp127 | field/fp127/sqrt_ratio | 525 ns | 523 ns .. 526 ns |
| field halftrace | gf2_127 | field/gf2_127/halftrace (byte tables) | 3.50 ns | 3.49 ns .. 3.51 ns |
| field halftrace | gf2_109 | field/gf2_109/halftrace (byte tables) | 3.28 ns | 3.27 ns .. 3.29 ns |
| field halftrace | gf2_122 | field/gf2_122/qsolve (z^2 + z = c, 2 base halftraces) | 2.39 ns | 2.38 ns .. 2.39 ns |
| field invert, one at a time | gf2_127 | field/gf2_127/invert | 391 ns | 390 ns .. 392 ns |
| field invert, one at a time | gf2_109 | field/gf2_109/invert | 2.82 µs | 2.82 µs .. 2.83 µs |
| field invert, one at a time | gf2_122 | field/gf2_122/invert | 494 ns | 493 ns .. 495 ns |
| field invert, one at a time | fp127 | field/fp127/invert | 519 ns | 518 ns .. 521 ns |
| field invert, batched | gf2_127 | field/gf2_127/batch invert (product tree) | 42.0 ns | 42.0 ns .. 42.1 ns |
| field invert, batched | gf2_109 | field/gf2_109/batch invert (product tree) | 109 ns | 108 ns .. 109 ns |
| field invert, batched | gf2_122 | field/gf2_122/batch invert (product tree) | 74.0 ns | 73.8 ns .. 74.1 ns |
| field invert, batched | fp127 | field/fp127/batch invert (product tree) | 5.71 ns | 5.69 ns .. 5.74 ns |
| field pack | fp127 | field/fp127/pack | 0.35 ns | 0.35 ns .. 0.36 ns |
| field unpack | fp127 | field/fp127/unpack | 0.57 ns | 0.57 ns .. 0.57 ns |
| point add, throughput | xor | add/xor-sha256/xor 32B, 8 accumulators | 0.73 ns | 0.73 ns .. 0.73 ns |
| point add, throughput | gf2_127 | group.add/binary.127/mode=throughput | 155 ns | 155 ns .. 155 ns |
| point add, throughput | gf2_127-lambda | group.add/binary-lambda.127/mode=throughput | 132 ns | 131 ns .. 132 ns |
| point add, throughput | gf2_127-w | group.add/binary-w.127/mode=throughput | 131 ns | 131 ns .. 131 ns |
| point add, throughput | gf2_127-u | group.add/binary-u.127/mode=throughput | 116 ns | 116 ns .. 116 ns |
| point add, throughput | gf2_109 | group.add/binary.109/mode=throughput | 403 ns | 402 ns .. 404 ns |
| point add, throughput | gf2_109-lambda | group.add/binary-lambda.109/mode=throughput | 331 ns | 330 ns .. 332 ns |
| point add, throughput | gf2_109-w | group.add/binary-w.109/mode=throughput | 332 ns | 331 ns .. 332 ns |
| point add, throughput | gf2_109-u | group.add/binary-u.109/mode=throughput | 289 ns | 289 ns .. 290 ns |
| point add, throughput | gf2_122 | group.add/binary.122/mode=throughput | 263 ns | 262 ns .. 264 ns |
| point add, throughput | gf2_122-lambda | group.add/binary-lambda.122/mode=throughput | 217 ns | 217 ns .. 217 ns |
| point add, throughput | gf2_122-w | group.add/binary-w.122/mode=throughput | 211 ns | 209 ns .. 212 ns |
| point add, throughput | gf2_122-u | group.add/binary-u.122/mode=throughput | 183 ns | 183 ns .. 183 ns |
| point add, throughput | gf2_122-gls | group.add/binary.122-gls/mode=throughput | 246 ns | 245 ns .. 247 ns |
| point add, throughput | gf2_122-gls-lambda | group.add/binary-lambda.122-gls/mode=throughput | 216 ns | 215 ns .. 217 ns |
| point add, throughput | gf2_122-gls-w | group.add/binary-w.122-gls/mode=throughput | 217 ns | 216 ns .. 217 ns |
| point add, throughput | gf2_122-gls-u | group.add/binary-u.122-gls/mode=throughput | 182 ns | 182 ns .. 183 ns |
| point add, throughput | edwards127 | group.add/edwards.127/mode=throughput | 19.9 ns | 19.9 ns .. 19.9 ns |
| point add, throughput | weier127 | group.add/weier.127/mode=throughput | 44.7 ns | 44.6 ns .. 44.8 ns |
| point add, throughput | weier127-jacobian | group.add/weier-jacobian.127/mode=throughput | 36.6 ns | 36.5 ns .. 36.8 ns |
| point add, latency | xor | add/xor-sha256/xor 32B, 1 accumulator | 0.39 ns | 0.39 ns .. 0.39 ns |
| point add, latency | gf2_127 | group.add/binary.127/mode=latency | 156 ns | 155 ns .. 156 ns |
| point add, latency | gf2_127-lambda | group.add/binary-lambda.127/mode=latency | 135 ns | 135 ns .. 135 ns |
| point add, latency | gf2_127-w | group.add/binary-w.127/mode=latency | 135 ns | 135 ns .. 135 ns |
| point add, latency | gf2_127-u | group.add/binary-u.127/mode=latency | 119 ns | 119 ns .. 120 ns |
| point add, latency | gf2_109 | group.add/binary.109/mode=latency | 403 ns | 403 ns .. 404 ns |
| point add, latency | gf2_109-lambda | group.add/binary-lambda.109/mode=latency | 334 ns | 333 ns .. 335 ns |
| point add, latency | gf2_109-w | group.add/binary-w.109/mode=latency | 335 ns | 334 ns .. 335 ns |
| point add, latency | gf2_109-u | group.add/binary-u.109/mode=latency | 290 ns | 289 ns .. 290 ns |
| point add, latency | gf2_122 | group.add/binary.122/mode=latency | 267 ns | 266 ns .. 268 ns |
| point add, latency | gf2_122-lambda | group.add/binary-lambda.122/mode=latency | 219 ns | 219 ns .. 220 ns |
| point add, latency | gf2_122-w | group.add/binary-w.122/mode=latency | 219 ns | 219 ns .. 220 ns |
| point add, latency | gf2_122-u | group.add/binary-u.122/mode=latency | 183 ns | 183 ns .. 184 ns |
| point add, latency | gf2_122-gls | group.add/binary.122-gls/mode=latency | 240 ns | 239 ns .. 241 ns |
| point add, latency | gf2_122-gls-lambda | group.add/binary-lambda.122-gls/mode=latency | 219 ns | 219 ns .. 220 ns |
| point add, latency | gf2_122-gls-w | group.add/binary-w.122-gls/mode=latency | 219 ns | 219 ns .. 220 ns |
| point add, latency | gf2_122-gls-u | group.add/binary-u.122-gls/mode=latency | 183 ns | 183 ns .. 183 ns |
| point add, latency | edwards127 | group.add/edwards.127/mode=latency | 22.1 ns | 22.0 ns .. 22.1 ns |
| point add, latency | weier127 | group.add/weier.127/mode=latency | 46.2 ns | 46.1 ns .. 46.3 ns |
| point add, latency | weier127-jacobian | group.add/weier-jacobian.127/mode=latency | 45.0 ns | 44.8 ns .. 45.1 ns |
| point subtract | gf2_127-lambda | group.sub/binary-lambda.127/mode=throughput | 131 ns | 131 ns .. 131 ns |
| point subtract | gf2_127-w | group.sub/binary-w.127/mode=throughput | 131 ns | 131 ns .. 131 ns |
| point subtract | gf2_127-u | group.sub/binary-u.127/mode=throughput | 119 ns | 118 ns .. 119 ns |
| point subtract | edwards127 | group.sub/edwards.127/mode=throughput | 22.7 ns | 22.6 ns .. 22.7 ns |
| point subtract | weier127 | group.sub/weier.127/mode=throughput | 46.4 ns | 46.3 ns .. 46.5 ns |
| point subtract | weier127-jacobian | group.sub/weier-jacobian.127/mode=throughput | 37.6 ns | 37.5 ns .. 37.6 ns |
| point negate | gf2_127 | negate/gf2_127/affine (y += x) | 0.69 ns | 0.69 ns .. 0.69 ns |
| point negate | gf2_127-lambda | group.neg/binary-lambda.127 | 0.64 ns | 0.64 ns .. 0.65 ns |
| point negate | gf2_127-w | group.neg/binary-w.127 | 0.65 ns | 0.65 ns .. 0.65 ns |
| point negate | gf2_127-u | group.neg/binary-u.127 | 0.68 ns | 0.67 ns .. 0.69 ns |
| point negate | gf2_109 | negate/gf2_109/affine (y += x) | 0.69 ns | 0.68 ns .. 0.69 ns |
| point negate | gf2_109-lambda | group.neg/binary-lambda.109 | 0.65 ns | 0.64 ns .. 0.65 ns |
| point negate | gf2_109-w | group.neg/binary-w.109 | 0.64 ns | 0.64 ns .. 0.65 ns |
| point negate | gf2_109-u | group.neg/binary-u.109 | 0.69 ns | 0.69 ns .. 0.69 ns |
| point negate | gf2_122 | negate/gf2_122/affine (y += x) | 0.69 ns | 0.69 ns .. 0.69 ns |
| point negate | gf2_122-lambda | group.neg/binary-lambda.122 | 0.65 ns | 0.64 ns .. 0.65 ns |
| point negate | gf2_122-w | group.neg/binary-w.122 | 0.64 ns | 0.64 ns .. 0.65 ns |
| point negate | gf2_122-u | group.neg/binary-u.122 | 0.69 ns | 0.69 ns .. 0.69 ns |
| point negate | gf2_122-gls | group.neg/binary.122-gls | 1.02 ns | 1.02 ns .. 1.02 ns |
| point negate | gf2_122-gls-lambda | group.neg/binary-lambda.122-gls | 0.65 ns | 0.64 ns .. 0.65 ns |
| point negate | gf2_122-gls-w | group.neg/binary-w.122-gls | 0.65 ns | 0.64 ns .. 0.65 ns |
| point negate | gf2_122-gls-u | group.neg/binary-u.122-gls | 0.69 ns | 0.69 ns .. 0.69 ns |
| point negate | edwards127 | negate/edwards127/extended (-X, -T) | 1.36 ns | 1.35 ns .. 1.37 ns |
| point negate | weier127 | group.neg/weier.127 | 0.76 ns | 0.75 ns .. 0.76 ns |
| point negate | weier127-jacobian | group.neg/weier-jacobian.127 | 0.76 ns | 0.75 ns .. 0.76 ns |
| point prepare, one at a time | gf2_127 | group.prepare/binary.127/mode=indep | 31.6 ns | 31.5 ns .. 31.6 ns |
| point prepare, one at a time | gf2_127-lambda | group.prepare/binary-lambda.127/mode=indep | 412 ns | 411 ns .. 412 ns |
| point prepare, one at a time | gf2_127-w | group.prepare/binary-w.127/mode=indep | 0.62 ns | 0.62 ns .. 0.62 ns |
| point prepare, one at a time | gf2_127-u | group.prepare/binary-u.127/mode=indep | 0.62 ns | 0.62 ns .. 0.62 ns |
| point prepare, one at a time | gf2_109 | group.prepare/binary.109/mode=indep | 95.3 ns | 95.1 ns .. 95.4 ns |
| point prepare, one at a time | gf2_109-lambda | group.prepare/binary-lambda.109/mode=indep | 2.86 µs | 2.86 µs .. 2.87 µs |
| point prepare, one at a time | gf2_109-w | group.prepare/binary-w.109/mode=indep | 0.62 ns | 0.62 ns .. 0.62 ns |
| point prepare, one at a time | gf2_109-u | group.prepare/binary-u.109/mode=indep | 0.62 ns | 0.62 ns .. 0.62 ns |
| point prepare, one at a time | gf2_122 | group.prepare/binary.122/mode=indep | 64.2 ns | 64.0 ns .. 64.3 ns |
| point prepare, one at a time | gf2_122-lambda | group.prepare/binary-lambda.122/mode=indep | 521 ns | 520 ns .. 523 ns |
| point prepare, one at a time | gf2_122-w | group.prepare/binary-w.122/mode=indep | 0.62 ns | 0.61 ns .. 0.62 ns |
| point prepare, one at a time | gf2_122-u | group.prepare/binary-u.122/mode=indep | 0.62 ns | 0.62 ns .. 0.62 ns |
| point prepare, one at a time | gf2_122-gls | group.prepare/binary.122-gls/mode=indep | 44.2 ns | 44.0 ns .. 44.3 ns |
| point prepare, one at a time | gf2_122-gls-lambda | group.prepare/binary-lambda.122-gls/mode=indep | 524 ns | 522 ns .. 525 ns |
| point prepare, one at a time | gf2_122-gls-w | group.prepare/binary-w.122-gls/mode=indep | 0.62 ns | 0.62 ns .. 0.62 ns |
| point prepare, one at a time | gf2_122-gls-u | group.prepare/binary-u.122-gls/mode=indep | 0.62 ns | 0.61 ns .. 0.62 ns |
| point prepare, one at a time | edwards127 | group.prepare/edwards.127/mode=indep | 573 ns | 571 ns .. 574 ns |
| point prepare, one at a time | weier127 | group.prepare/weier.127/mode=indep | 0.58 ns | 0.57 ns .. 0.58 ns |
| point prepare, one at a time | weier127-jacobian | group.prepare/weier-jacobian.127/mode=indep | 0.57 ns | 0.57 ns .. 0.58 ns |
| point prepare, batched | gf2_127 | group.prepare/binary.127/mode=batch,n=1024 | 31.2 ns | 31.2 ns .. 31.3 ns |
| point prepare, batched | gf2_127-lambda | group.prepare/binary-lambda.127/mode=batch,n=1024 | 56.6 ns | 56.5 ns .. 56.8 ns |
| point prepare, batched | gf2_127-w | group.prepare/binary-w.127/mode=batch,n=1024 | 0.97 ns | 0.96 ns .. 0.98 ns |
| point prepare, batched | gf2_127-u | group.prepare/binary-u.127/mode=batch,n=1024 | 0.98 ns | 0.98 ns .. 0.99 ns |
| point prepare, batched | gf2_109 | group.prepare/binary.109/mode=batch,n=1024 | 95.7 ns | 95.5 ns .. 95.9 ns |
| point prepare, batched | gf2_109-lambda | group.prepare/binary-lambda.109/mode=batch,n=1024 | 147 ns | 147 ns .. 147 ns |
| point prepare, batched | gf2_109-w | group.prepare/binary-w.109/mode=batch,n=1024 | 0.97 ns | 0.96 ns .. 0.98 ns |
| point prepare, batched | gf2_109-u | group.prepare/binary-u.109/mode=batch,n=1024 | 0.98 ns | 0.97 ns .. 0.99 ns |
| point prepare, batched | gf2_122 | group.prepare/binary.122/mode=batch,n=1024 | 63.1 ns | 62.9 ns .. 63.3 ns |
| point prepare, batched | gf2_122-lambda | group.prepare/binary-lambda.122/mode=batch,n=1024 | 100 ns | 99.9 ns .. 101 ns |
| point prepare, batched | gf2_122-w | group.prepare/binary-w.122/mode=batch,n=1024 | 0.99 ns | 0.98 ns .. 1.00 ns |
| point prepare, batched | gf2_122-u | group.prepare/binary-u.122/mode=batch,n=1024 | 0.99 ns | 0.98 ns .. 0.99 ns |
| point prepare, batched | gf2_122-gls | group.prepare/binary.122-gls/mode=batch,n=1024 | 44.3 ns | 44.1 ns .. 44.4 ns |
| point prepare, batched | gf2_122-gls-lambda | group.prepare/binary-lambda.122-gls/mode=batch,n=1024 | 101 ns | 100 ns .. 101 ns |
| point prepare, batched | gf2_122-gls-w | group.prepare/binary-w.122-gls/mode=batch,n=1024 | 0.97 ns | 0.96 ns .. 0.99 ns |
| point prepare, batched | gf2_122-gls-u | group.prepare/binary-u.122-gls/mode=batch,n=1024 | 1.01 ns | 0.98 ns .. 1.04 ns |
| point prepare, batched | edwards127 | group.prepare/edwards.127/mode=batch,n=1024 | 27.2 ns | 27.2 ns .. 27.3 ns |
| point prepare, batched | weier127 | group.prepare/weier.127/mode=batch,n=1024 | 0.45 ns | 0.45 ns .. 0.46 ns |
| point prepare, batched | weier127-jacobian | group.prepare/weier-jacobian.127/mode=batch,n=1024 | 0.46 ns | 0.46 ns .. 0.46 ns |
| is identity | gf2_127 | group.is_identity/binary.127 | 0.59 ns | 0.59 ns .. 0.60 ns |
| is identity | gf2_127-lambda | group.is_identity/binary-lambda.127 | 0.55 ns | 0.54 ns .. 0.55 ns |
| is identity | gf2_127-w | group.is_identity/binary-w.127 | 0.55 ns | 0.54 ns .. 0.55 ns |
| is identity | gf2_127-u | group.is_identity/binary-u.127 | 0.54 ns | 0.54 ns .. 0.55 ns |
| is identity | gf2_109 | group.is_identity/binary.109 | 0.59 ns | 0.58 ns .. 0.59 ns |
| is identity | gf2_109-lambda | group.is_identity/binary-lambda.109 | 0.57 ns | 0.57 ns .. 0.58 ns |
| is identity | gf2_109-w | group.is_identity/binary-w.109 | 0.58 ns | 0.58 ns .. 0.58 ns |
| is identity | gf2_109-u | group.is_identity/binary-u.109 | 0.58 ns | 0.58 ns .. 0.58 ns |
| is identity | gf2_122 | group.is_identity/binary.122 | 0.84 ns | 0.84 ns .. 0.84 ns |
| is identity | gf2_122-lambda | group.is_identity/binary-lambda.122 | 0.84 ns | 0.84 ns .. 0.84 ns |
| is identity | gf2_122-w | group.is_identity/binary-w.122 | 0.84 ns | 0.84 ns .. 0.84 ns |
| is identity | gf2_122-u | group.is_identity/binary-u.122 | 0.83 ns | 0.82 ns .. 0.84 ns |
| is identity | gf2_122-gls | group.is_identity/binary.122-gls | 0.84 ns | 0.84 ns .. 0.84 ns |
| is identity | gf2_122-gls-lambda | group.is_identity/binary-lambda.122-gls | 0.84 ns | 0.84 ns .. 0.84 ns |
| is identity | gf2_122-gls-w | group.is_identity/binary-w.122-gls | 0.84 ns | 0.84 ns .. 0.84 ns |
| is identity | gf2_122-gls-u | group.is_identity/binary-u.122-gls | 0.84 ns | 0.84 ns .. 0.84 ns |
| is identity | edwards127 | group.is_identity/edwards.127 | 0.34 ns | 0.33 ns .. 0.34 ns |
| is identity | weier127 | group.is_identity/weier.127 | 0.34 ns | 0.34 ns .. 0.34 ns |
| is identity | weier127-jacobian | group.is_identity/weier-jacobian.127 | 0.34 ns | 0.34 ns .. 0.34 ns |
| equals addend, match | gf2_127-lambda | group.equals/binary-lambda.127/mode=match | 15.1 ns | 15.0 ns .. 15.1 ns |
| equals addend, match | gf2_127-w | group.equals/binary-w.127/mode=match | 15.0 ns | 15.0 ns .. 15.1 ns |
| equals addend, match | gf2_127-u | group.equals/binary-u.127/mode=match | 48.6 ns | 48.5 ns .. 48.7 ns |
| equals addend, match | edwards127 | group.equals/edwards.127/mode=match | 3.70 ns | 3.68 ns .. 3.72 ns |
| equals addend, match | weier127 | group.equals/weier.127/mode=match | 3.81 ns | 3.80 ns .. 3.82 ns |
| equals addend, match | weier127-jacobian | group.equals/weier-jacobian.127/mode=match | 8.92 ns | 8.89 ns .. 8.96 ns |
| equals addend, mismatch | gf2_127 | group.equals/binary.127/mode=mismatch | 30.3 ns | 30.3 ns .. 30.4 ns |
| equals addend, mismatch | gf2_127-lambda | group.equals/binary-lambda.127/mode=mismatch | 15.1 ns | 15.1 ns .. 15.2 ns |
| equals addend, mismatch | gf2_127-w | group.equals/binary-w.127/mode=mismatch | 15.1 ns | 15.0 ns .. 15.1 ns |
| equals addend, mismatch | gf2_127-u | group.equals/binary-u.127/mode=mismatch | 48.7 ns | 48.6 ns .. 48.8 ns |
| equals addend, mismatch | gf2_109 | group.equals/binary.109/mode=mismatch | 72.9 ns | 72.7 ns .. 73.1 ns |
| equals addend, mismatch | gf2_109-lambda | group.equals/binary-lambda.109/mode=mismatch | 39.3 ns | 39.2 ns .. 39.4 ns |
| equals addend, mismatch | gf2_109-w | group.equals/binary-w.109/mode=mismatch | 39.4 ns | 39.3 ns .. 39.5 ns |
| equals addend, mismatch | gf2_109-u | group.equals/binary-u.109/mode=mismatch | 115 ns | 115 ns .. 116 ns |
| equals addend, mismatch | gf2_122 | group.equals/binary.122/mode=mismatch | 53.7 ns | 53.5 ns .. 53.9 ns |
| equals addend, mismatch | gf2_122-lambda | group.equals/binary-lambda.122/mode=mismatch | 27.9 ns | 27.8 ns .. 28.0 ns |
| equals addend, mismatch | gf2_122-w | group.equals/binary-w.122/mode=mismatch | 27.8 ns | 27.7 ns .. 27.9 ns |
| equals addend, mismatch | gf2_122-u | group.equals/binary-u.122/mode=mismatch | 84.9 ns | 84.7 ns .. 85.1 ns |
| equals addend, mismatch | gf2_122-gls | group.equals/binary.122-gls/mode=mismatch | 54.4 ns | 54.3 ns .. 54.5 ns |
| equals addend, mismatch | gf2_122-gls-lambda | group.equals/binary-lambda.122-gls/mode=mismatch | 27.8 ns | 27.7 ns .. 27.9 ns |
| equals addend, mismatch | gf2_122-gls-w | group.equals/binary-w.122-gls/mode=mismatch | 27.9 ns | 27.9 ns .. 28.0 ns |
| equals addend, mismatch | gf2_122-gls-u | group.equals/binary-u.122-gls/mode=mismatch | 85.0 ns | 84.8 ns .. 85.2 ns |
| equals addend, mismatch | edwards127 | group.equals/edwards.127/mode=mismatch | 1.91 ns | 1.91 ns .. 1.92 ns |
| equals addend, mismatch | weier127 | group.equals/weier.127/mode=mismatch | 1.98 ns | 1.98 ns .. 1.99 ns |
| equals addend, mismatch | weier127-jacobian | group.equals/weier-jacobian.127/mode=mismatch | 4.29 ns | 4.28 ns .. 4.31 ns |
| encode, one at a time | gf2_127 | group.encode/binary.127/mode=indep | 462 ns | 461 ns .. 462 ns |
| encode, one at a time | gf2_127-lambda | group.encode/binary-lambda.127/mode=indep | 442 ns | 441 ns .. 443 ns |
| encode, one at a time | gf2_127-w | group.encode/binary-w.127/mode=indep | 432 ns | 432 ns .. 433 ns |
| encode, one at a time | gf2_127-u | group.encode/binary-u.127/mode=indep | 438 ns | 437 ns .. 438 ns |
| encode, one at a time | gf2_109 | group.encode/binary.109/mode=indep | 3.03 µs | 3.02 µs .. 3.03 µs |
| encode, one at a time | gf2_109-lambda | group.encode/binary-lambda.109/mode=indep | 2.95 µs | 2.94 µs .. 2.95 µs |
| encode, one at a time | gf2_109-w | group.encode/binary-w.109/mode=indep | 2.90 µs | 2.89 µs .. 2.91 µs |
| encode, one at a time | gf2_109-u | group.encode/binary-u.109/mode=indep | 2.95 µs | 2.93 µs .. 2.96 µs |
| encode, one at a time | gf2_122 | group.encode/binary.122/mode=indep | 618 ns | 616 ns .. 619 ns |
| encode, one at a time | gf2_122-lambda | group.encode/binary-lambda.122/mode=indep | 573 ns | 572 ns .. 575 ns |
| encode, one at a time | gf2_122-w | group.encode/binary-w.122/mode=indep | 551 ns | 550 ns .. 553 ns |
| encode, one at a time | gf2_122-u | group.encode/binary-u.122/mode=indep | 564 ns | 563 ns .. 566 ns |
| encode, one at a time | gf2_122-gls | group.encode/binary.122-gls/mode=indep | 612 ns | 609 ns .. 614 ns |
| encode, one at a time | gf2_122-gls-lambda | group.encode/binary-lambda.122-gls/mode=indep | 576 ns | 575 ns .. 578 ns |
| encode, one at a time | gf2_122-gls-w | group.encode/binary-w.122-gls/mode=indep | 555 ns | 553 ns .. 556 ns |
| encode, one at a time | gf2_122-gls-u | group.encode/binary-u.122-gls/mode=indep | 562 ns | 561 ns .. 564 ns |
| encode, one at a time | edwards127 | group.encode/edwards.127/mode=indep | 536 ns | 534 ns .. 538 ns |
| encode, one at a time | weier127 | group.encode/weier.127/mode=indep | 527 ns | 526 ns .. 528 ns |
| encode, one at a time | weier127-jacobian | group.encode/weier-jacobian.127/mode=indep | 531 ns | 530 ns .. 532 ns |
| encode, batched | gf2_127 | group.encode/binary.127/mode=batch,n=1024 | 106 ns | 106 ns .. 106 ns |
| encode, batched | gf2_127-lambda | group.encode/binary-lambda.127/mode=batch,n=1024 | 87.0 ns | 86.8 ns .. 87.1 ns |
| encode, batched | gf2_127-w | group.encode/binary-w.127/mode=batch,n=1024 | 76.5 ns | 76.3 ns .. 76.6 ns |
| encode, batched | gf2_127-u | group.encode/binary-u.127/mode=batch,n=1024 | 76.5 ns | 75.9 ns .. 77.2 ns |
| encode, batched | gf2_109 | group.encode/binary.109/mode=batch,n=1024 | 306 ns | 305 ns .. 306 ns |
| encode, batched | gf2_109-lambda | group.encode/binary-lambda.109/mode=batch,n=1024 | 221 ns | 221 ns .. 222 ns |
| encode, batched | gf2_109-w | group.encode/binary-w.109/mode=batch,n=1024 | 204 ns | 203 ns .. 204 ns |
| encode, batched | gf2_109-u | group.encode/binary-u.109/mode=batch,n=1024 | 206 ns | 205 ns .. 207 ns |
| encode, batched | gf2_122 | group.encode/binary.122/mode=batch,n=1024 | 202 ns | 202 ns .. 203 ns |
| encode, batched | gf2_122-lambda | group.encode/binary-lambda.122/mode=batch,n=1024 | 156 ns | 155 ns .. 156 ns |
| encode, batched | gf2_122-w | group.encode/binary-w.122/mode=batch,n=1024 | 130 ns | 130 ns .. 131 ns |
| encode, batched | gf2_122-u | group.encode/binary-u.122/mode=batch,n=1024 | 132 ns | 132 ns .. 133 ns |
| encode, batched | gf2_122-gls | group.encode/binary.122-gls/mode=batch,n=1024 | 194 ns | 193 ns .. 195 ns |
| encode, batched | gf2_122-gls-lambda | group.encode/binary-lambda.122-gls/mode=batch,n=1024 | 156 ns | 155 ns .. 156 ns |
| encode, batched | gf2_122-gls-w | group.encode/binary-w.122-gls/mode=batch,n=1024 | 130 ns | 129 ns .. 130 ns |
| encode, batched | gf2_122-gls-u | group.encode/binary-u.122-gls/mode=batch,n=1024 | 133 ns | 133 ns .. 133 ns |
| encode, batched | edwards127 | group.encode/edwards.127/mode=batch,n=1024 | 21.7 ns | 21.7 ns .. 21.7 ns |
| encode, batched | weier127 | group.encode/weier.127/mode=batch,n=1024 | 9.97 ns | 9.95 ns .. 9.99 ns |
| encode, batched | weier127-jacobian | group.encode/weier-jacobian.127/mode=batch,n=1024 | 15.3 ns | 15.3 ns .. 15.4 ns |
| decode, one at a time | gf2_127 | group.decode/binary.127/mode=indep | 446 ns | 445 ns .. 447 ns |
| decode, one at a time | gf2_127-lambda | group.decode/binary-lambda.127/mode=indep | 447 ns | 446 ns .. 447 ns |
| decode, one at a time | gf2_127-w | group.decode/binary-w.127/mode=indep | 447 ns | 446 ns .. 448 ns |
| decode, one at a time | gf2_127-u | group.decode/binary-u.127/mode=indep | 479 ns | 478 ns .. 480 ns |
| decode, one at a time | gf2_109 | group.decode/binary.109/mode=indep | 2.98 µs | 2.97 µs .. 2.98 µs |
| decode, one at a time | gf2_109-lambda | group.decode/binary-lambda.109/mode=indep | 2.98 µs | 2.98 µs .. 2.99 µs |
| decode, one at a time | gf2_109-w | group.decode/binary-w.109/mode=indep | 2.96 µs | 2.96 µs .. 2.97 µs |
| decode, one at a time | gf2_109-u | group.decode/binary-u.109/mode=indep | 3.04 µs | 3.04 µs .. 3.05 µs |
| decode, one at a time | gf2_122 | group.decode/binary.122/mode=indep | 607 ns | 606 ns .. 609 ns |
| decode, one at a time | gf2_122-lambda | group.decode/binary-lambda.122/mode=indep | 607 ns | 605 ns .. 608 ns |
| decode, one at a time | gf2_122-w | group.decode/binary-w.122/mode=indep | 601 ns | 600 ns .. 603 ns |
| decode, one at a time | gf2_122-u | group.decode/binary-u.122/mode=indep | 676 ns | 674 ns .. 677 ns |
| decode, one at a time | gf2_122-gls | group.decode/binary.122-gls/mode=indep | 592 ns | 591 ns .. 594 ns |
| decode, one at a time | gf2_122-gls-lambda | group.decode/binary-lambda.122-gls/mode=indep | 599 ns | 595 ns .. 603 ns |
| decode, one at a time | gf2_122-gls-w | group.decode/binary-w.122-gls/mode=indep | 591 ns | 589 ns .. 592 ns |
| decode, one at a time | gf2_122-gls-u | group.decode/binary-u.122-gls/mode=indep | 639 ns | 637 ns .. 641 ns |
| decode, one at a time | edwards127 | group.decode/edwards.127/mode=indep | 485 ns | 484 ns .. 486 ns |
| decode, one at a time | weier127 | group.decode/weier.127/mode=indep | 487 ns | 486 ns .. 489 ns |
| decode, one at a time | weier127-jacobian | group.decode/weier-jacobian.127/mode=indep | 484 ns | 483 ns .. 486 ns |
| decode, batched | gf2_127 | group.decode/binary.127/mode=batch,n=1024 | 88.0 ns | 87.8 ns .. 88.1 ns |
| decode, batched | gf2_127-lambda | group.decode/binary-lambda.127/mode=batch,n=1024 | 87.9 ns | 87.8 ns .. 88.1 ns |
| decode, batched | gf2_127-w | group.decode/binary-w.127/mode=batch,n=1024 | 89.2 ns | 89.0 ns .. 89.3 ns |
| decode, batched | gf2_127-u | group.decode/binary-u.127/mode=batch,n=1024 | 121 ns | 121 ns .. 121 ns |
| decode, batched | gf2_109 | group.decode/binary.109/mode=batch,n=1024 | 263 ns | 262 ns .. 263 ns |
| decode, batched | gf2_109-lambda | group.decode/binary-lambda.109/mode=batch,n=1024 | 263 ns | 262 ns .. 263 ns |
| decode, batched | gf2_109-w | group.decode/binary-w.109/mode=batch,n=1024 | 240 ns | 239 ns .. 241 ns |
| decode, batched | gf2_109-u | group.decode/binary-u.109/mode=batch,n=1024 | 319 ns | 318 ns .. 319 ns |
| decode, batched | gf2_122 | group.decode/binary.122/mode=batch,n=1024 | 187 ns | 186 ns .. 187 ns |
| decode, batched | gf2_122-lambda | group.decode/binary-lambda.122/mode=batch,n=1024 | 186 ns | 186 ns .. 187 ns |
| decode, batched | gf2_122-w | group.decode/binary-w.122/mode=batch,n=1024 | 153 ns | 153 ns .. 154 ns |
| decode, batched | gf2_122-u | group.decode/binary-u.122/mode=batch,n=1024 | 204 ns | 204 ns .. 205 ns |
| decode, batched | gf2_122-gls | group.decode/binary.122-gls/mode=batch,n=1024 | 162 ns | 162 ns .. 163 ns |
| decode, batched | gf2_122-gls-lambda | group.decode/binary-lambda.122-gls/mode=batch,n=1024 | 163 ns | 162 ns .. 163 ns |
| decode, batched | gf2_122-gls-w | group.decode/binary-w.122-gls/mode=batch,n=1024 | 138 ns | 137 ns .. 138 ns |
| decode, batched | gf2_122-gls-u | group.decode/binary-u.122-gls/mode=batch,n=1024 | 187 ns | 186 ns .. 187 ns |
| decode, batched | edwards127 | group.decode/edwards.127/mode=batch,n=1024 | 485 ns | 483 ns .. 486 ns |
| decode, batched | weier127 | group.decode/weier.127/mode=batch,n=1024 | 484 ns | 483 ns .. 485 ns |
| decode, batched | weier127-jacobian | group.decode/weier-jacobian.127/mode=batch,n=1024 | 483 ns | 482 ns .. 484 ns |
| hash to curve, one at a time | gf2_127 | hash_to_curve/gf2_127/pornin map x1 | 619 ns | 617 ns .. 620 ns |
| hash to curve, one at a time | gf2_127-lambda | h2c/binary-lambda.127/mode=indep | 880 ns | 877 ns .. 883 ns |
| hash to curve, one at a time | gf2_127-w | h2c/binary-w.127/mode=indep | 975 ns | 973 ns .. 977 ns |
| hash to curve, one at a time | gf2_127-u | h2c/binary-u.127/mode=indep | 1.00 µs | 1.00 µs .. 1.00 µs |
| hash to curve, one at a time | gf2_109 | hash_to_curve/gf2_109/pornin map x1 | 3.39 µs | 3.39 µs .. 3.40 µs |
| hash to curve, one at a time | gf2_109-lambda | h2c/binary-lambda.109/mode=indep | 5.87 µs | 5.86 µs .. 5.88 µs |
| hash to curve, one at a time | gf2_109-w | h2c/binary-w.109/mode=indep | 5.78 µs | 5.77 µs .. 5.79 µs |
| hash to curve, one at a time | gf2_109-u | h2c/binary-u.109/mode=indep | 5.87 µs | 5.86 µs .. 5.88 µs |
| hash to curve, one at a time | gf2_122 | hash_to_curve/gf2_122/pornin map x1 | 897 ns | 894 ns .. 899 ns |
| hash to curve, one at a time | gf2_122-lambda | h2c/binary-lambda.122/mode=indep | 1.18 µs | 1.18 µs .. 1.19 µs |
| hash to curve, one at a time | gf2_122-w | h2c/binary-w.122/mode=indep | 1.21 µs | 1.21 µs .. 1.22 µs |
| hash to curve, one at a time | gf2_122-u | h2c/binary-u.122/mode=indep | 1.27 µs | 1.27 µs .. 1.28 µs |
| hash to curve, one at a time | gf2_122-gls | hash_to_curve/gf2_122-gls/pornin map x1 | 865 ns | 864 ns .. 867 ns |
| hash to curve, one at a time | gf2_122-gls-lambda | h2c/binary-lambda.122-gls/mode=indep | 1.18 µs | 1.18 µs .. 1.18 µs |
| hash to curve, one at a time | gf2_122-gls-w | h2c/binary-w.122-gls/mode=indep | 1.24 µs | 1.23 µs .. 1.26 µs |
| hash to curve, one at a time | gf2_122-gls-u | h2c/binary-u.122-gls/mode=indep | 1.25 µs | 1.25 µs .. 1.25 µs |
| hash to curve, one at a time | edwards127 | h2c/edwards.127/mode=indep | 1.07 µs | 1.06 µs .. 1.07 µs |
| hash to curve, one at a time | weier127 | h2c/weier.127/mode=indep | 1.03 µs | 1.03 µs .. 1.03 µs |
| hash to curve, one at a time | weier127-jacobian | h2c/weier-jacobian.127/mode=indep | 1.03 µs | 1.03 µs .. 1.03 µs |
| hash to curve, batched | gf2_127 | h2c/binary.127/mode=batch,n=1024 | 196 ns | 195 ns .. 196 ns |
| hash to curve, batched | gf2_127-lambda | h2c/binary-lambda.127/mode=batch,n=1024 | 196 ns | 196 ns .. 196 ns |
| hash to curve, batched | gf2_127-w | h2c/binary-w.127/mode=batch,n=1024 | 221 ns | 220 ns .. 222 ns |
| hash to curve, batched | gf2_127-u | h2c/binary-u.127/mode=batch,n=1024 | 258 ns | 257 ns .. 258 ns |
| hash to curve, batched | gf2_109 | h2c/binary.109/mode=batch,n=1024 | 518 ns | 517 ns .. 520 ns |
| hash to curve, batched | gf2_109-lambda | h2c/binary-lambda.109/mode=batch,n=1024 | 517 ns | 516 ns .. 518 ns |
| hash to curve, batched | gf2_109-w | h2c/binary-w.109/mode=batch,n=1024 | 516 ns | 515 ns .. 517 ns |
| hash to curve, batched | gf2_109-u | h2c/binary-u.109/mode=batch,n=1024 | 592 ns | 591 ns .. 593 ns |
| hash to curve, batched | gf2_122 | h2c/binary.122/mode=batch,n=1024 | 350 ns | 349 ns .. 351 ns |
| hash to curve, batched | gf2_122-lambda | h2c/binary-lambda.122/mode=batch,n=1024 | 350 ns | 348 ns .. 351 ns |
| hash to curve, batched | gf2_122-w | h2c/binary-w.122/mode=batch,n=1024 | 328 ns | 327 ns .. 328 ns |
| hash to curve, batched | gf2_122-u | h2c/binary-u.122/mode=batch,n=1024 | 391 ns | 390 ns .. 392 ns |
| hash to curve, batched | gf2_122-gls | h2c/binary.122-gls/mode=batch,n=1024 | 309 ns | 308 ns .. 310 ns |
| hash to curve, batched | gf2_122-gls-lambda | h2c/binary-lambda.122-gls/mode=batch,n=1024 | 315 ns | 314 ns .. 315 ns |
| hash to curve, batched | gf2_122-gls-w | h2c/binary-w.122-gls/mode=batch,n=1024 | 311 ns | 310 ns .. 311 ns |
| hash to curve, batched | gf2_122-gls-u | h2c/binary-u.122-gls/mode=batch,n=1024 | 359 ns | 358 ns .. 360 ns |
| hash to curve, batched | edwards127 | h2c/edwards.127/mode=batch,n=1024 | 1.06 µs | 1.06 µs .. 1.07 µs |
| hash to curve, batched | weier127 | h2c/weier.127/mode=batch,n=1024 | 1.03 µs | 1.03 µs .. 1.03 µs |
| hash to curve, batched | weier127-jacobian | h2c/weier-jacobian.127/mode=batch,n=1024 | 1.00 µs | 1.00 µs .. 1.01 µs |
| hash to addend, one at a time | gf2_127-lambda | hash_to_curve/gf2_127-lambda/pornin map x1 to (x, λ) | 567 ns | 566 ns .. 568 ns |
| hash to addend, one at a time | gf2_127-w | hash_to_curve/gf2_127-w/pornin map x1 to (x, λ) | 569 ns | 568 ns .. 569 ns |
| hash to addend, one at a time | gf2_127-u | hash_to_curve/gf2_127-u/pornin map x1 to (u, v) | 598 ns | 597 ns .. 599 ns |
| hash to addend, one at a time | gf2_109-lambda | hash_to_curve/gf2_109-lambda/pornin map x1 to (x, λ) | 3.28 µs | 3.27 µs .. 3.28 µs |
| hash to addend, one at a time | gf2_109-w | hash_to_curve/gf2_109-w/pornin map x1 to (x, λ) | 3.27 µs | 3.27 µs .. 3.28 µs |
| hash to addend, one at a time | gf2_109-u | hash_to_curve/gf2_109-u/pornin map x1 to (u, v) | 3.34 µs | 3.33 µs .. 3.34 µs |
| hash to addend, one at a time | gf2_122-lambda | hash_to_curve/gf2_122-lambda/pornin map x1 to (x, λ) | 801 ns | 799 ns .. 803 ns |
| hash to addend, one at a time | gf2_122-w | hash_to_curve/gf2_122-w/pornin map x1 to (x, λ) | 799 ns | 797 ns .. 800 ns |
| hash to addend, one at a time | gf2_122-u | hash_to_curve/gf2_122-u/pornin map x1 to (u, v) | 857 ns | 855 ns .. 858 ns |
| hash to addend, one at a time | gf2_122-gls-lambda | hash_to_curve/gf2_122-gls-lambda/pornin map x1 to (x, λ) | 788 ns | 787 ns .. 790 ns |
| hash to addend, one at a time | gf2_122-gls-w | hash_to_curve/gf2_122-gls-w/pornin map x1 to (x, λ) | 791 ns | 790 ns .. 793 ns |
| hash to addend, one at a time | gf2_122-gls-u | hash_to_curve/gf2_122-gls-u/pornin map x1 to (u, v) | 843 ns | 841 ns .. 844 ns |
| hash to addend, batched | gf2_127-lambda | hash_to_curve/gf2_127-lambda/try-and-increment to (x, λ), batched | 179 ns | 179 ns .. 180 ns |
| hash to addend, batched | gf2_127-w | hash_to_curve/gf2_127-w/pornin map x1 to (x, λ), batched | 184 ns | 184 ns .. 185 ns |
| hash to addend, batched | gf2_127-u | hash_to_curve/gf2_127-u/pornin map x1 to (u, v), batched | 213 ns | 212 ns .. 213 ns |
| hash to addend, batched | gf2_109-lambda | hash_to_curve/gf2_109-lambda/try-and-increment to (x, λ), batched | 511 ns | 510 ns .. 511 ns |
| hash to addend, batched | gf2_109-w | hash_to_curve/gf2_109-w/pornin map x1 to (x, λ), batched | 522 ns | 522 ns .. 523 ns |
| hash to addend, batched | gf2_109-u | hash_to_curve/gf2_109-u/pornin map x1 to (u, v), batched | 593 ns | 591 ns .. 594 ns |
| hash to addend, batched | gf2_122-lambda | hash_to_curve/gf2_122-lambda/try-and-increment to (x, λ), batched | 361 ns | 349 ns .. 376 ns |
| hash to addend, batched | gf2_122-w | hash_to_curve/gf2_122-w/pornin map x1 to (x, λ), batched | 429 ns | 403 ns .. 454 ns |
| hash to addend, batched | gf2_122-u | hash_to_curve/gf2_122-u/pornin map x1 to (u, v), batched | 622 ns | 603 ns .. 638 ns |
| hash to addend, batched | gf2_122-gls-lambda | hash_to_curve/gf2_122-gls-lambda/try-and-increment to (x, λ), batched | 327 ns | 314 ns .. 341 ns |
| hash to addend, batched | gf2_122-gls-w | hash_to_curve/gf2_122-gls-w/pornin map x1 to (x, λ), batched | 404 ns | 383 ns .. 424 ns |
| hash to addend, batched | gf2_122-gls-u | hash_to_curve/gf2_122-gls-u/pornin map x1 to (u, v), batched | 593 ns | 585 ns .. 599 ns |
Coverage
Benchmarks per hot-path operation and family; an empty cell was not measured.
| curve | hash to curve | prepare | add | subtract | negate | is identity | equals addend | encode | decode | RIBLT | ||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| encode | cells | peel | ||||||||||
| baseline | ||||||||||||
| xorSHA-256 digests XORed: no group, 32 bytes | 2 | 5 | 1 | 1 | ||||||||
| xor-siphashSipHash-2-4 hashes XORed: no group, 8 bytes | 10 | 1 | 1 | |||||||||
| GF(2^127), 16 bytes | ||||||||||||
| gf2_127(X:S:Z:T) extended accumulators, Pornin's formulas | 2 | 2 | 3 | 2 | 1 | 1 | 2 | 2 | 6 | 1 | 1 | |
| gf2_127-lambdaincompleteλ-projective (X:L:Z) accumulators | 4 | 4 | 2 | 1 | 1 | 1 | 2 | 4 | 4 | 6 | 3 | 6 |
| gf2_127-wincompleteλ-projective, w codec: hashes and decodes to λ-affine | 4 | 4 | 2 | 1 | 1 | 1 | 2 | 4 | 4 | 6 | 3 | 6 |
| gf2_127-uunscaled (X:S:Z), w codec, direct addend hashes | 4 | 4 | 2 | 1 | 1 | 1 | 2 | 4 | 4 | 6 | 3 | 6 |
| GF(2^122) = GF(2^61)[u], dense constant, 16 bytes | ||||||||||||
| gf2_122(X:S:Z:T) extended | 2 | 2 | 3 | 2 | 1 | 1 | 2 | 2 | 1 | 1 | 1 | |
| gf2_122-lambdaincompleteλ-projective | 2 | 2 | 2 | 1 | 1 | 1 | 2 | 2 | 1 | 1 | 1 | |
| gf2_122-wincompleteλ-projective, w codec | 2 | 2 | 2 | 1 | 1 | 1 | 2 | 2 | 1 | 1 | 1 | |
| gf2_122-uunscaled (X:S:Z), w codec | 2 | 2 | 2 | 1 | 1 | 1 | 2 | 2 | 1 | 1 | 1 | |
| GF(2^122), constant in GF(2^61) (GLS-shaped), 16 bytes | ||||||||||||
| gf2_122-gls(X:S:Z:T) extended | 2 | 2 | 3 | 1 | 1 | 1 | 2 | 2 | 1 | 1 | 1 | |
| gf2_122-gls-lambdaincompleteλ-projective | 2 | 2 | 2 | 1 | 1 | 1 | 2 | 2 | 1 | 1 | 1 | |
| gf2_122-gls-wincompleteλ-projective, w codec | 2 | 2 | 2 | 1 | 1 | 1 | 2 | 2 | 1 | 1 | 1 | |
| gf2_122-gls-uunscaled (X:S:Z), w codec | 2 | 2 | 2 | 1 | 1 | 1 | 2 | 2 | 1 | 1 | 1 | |
| GF(2^109), 14 bytes | ||||||||||||
| gf2_109(X:S:Z:T) extended | 2 | 2 | 3 | 2 | 1 | 1 | 2 | 2 | 1 | 1 | 1 | |
| gf2_109-lambdaincompleteλ-projective | 2 | 2 | 2 | 1 | 1 | 1 | 2 | 2 | 1 | 1 | 1 | |
| gf2_109-wincompleteλ-projective, w codec | 2 | 2 | 2 | 1 | 1 | 1 | 2 | 2 | 1 | 1 | 1 | |
| gf2_109-uunscaled (X:S:Z), w codec | 2 | 2 | 2 | 1 | 1 | 1 | 2 | 2 | 1 | 1 | 1 | |
| F_p, p = 2^127 − 1, 16 bytes | ||||||||||||
| edwards127a = 1 Edwards, extended += cached | 5 | 4 | 3 | 1 | 2 | 1 | 2 | 4 | 4 | 8 | 5 | 23 |
| weier127short Weierstrass, projective += affine | 4 | 4 | 2 | 1 | 2 | 1 | 2 | 4 | 4 | 6 | 3 | 6 |
| weier127-jacobianincompleteshort Weierstrass, Jacobian += affine | 4 | 4 | 2 | 1 | 1 | 1 | 2 | 4 | 4 | 8 | 5 | 23 |
| F_p, p = 2^107 − 1, 14 bytes | ||||||||||||
| edwards107a = 1 Edwards, extended += cached | ||||||||||||
| weier107short Weierstrass, projective += affine | ||||||||||||
| weier107-jacobianincompleteshort Weierstrass, Jacobian += affine | ||||||||||||
| F_p, p = 2^128 − 275, 16 bytes | ||||||||||||
| twisted128a = −1 twisted Edwards modulo 2-torsion, extended += cached | ||||||||||||
| F_{p²}, p = 2^61 − 1, 16 bytes | ||||||||||||
| edwards61x2a = 1 Edwards, signed-x codec, extended += cached | ||||||||||||
| weier61x2short Weierstrass, signed-x codec, projective += affine | ||||||||||||
| weier61x2-jacobianincompleteshort Weierstrass, signed-x codec, Jacobian += affine | ||||||||||||
| twisted61x2a = −1 Edwards modulo 2-torsion, extended += cached | ||||||||||||
| F_{p²}, p = 2^64 − 59, 16 bytes | ||||||||||||
| twisted64x2a = −1 Edwards modulo 2-torsion, extended += cached | ||||||||||||
| F_{p²}, p = 2^64 − 2^32 + 1, 16 bytes | ||||||||||||
| twisted-goldilocks2a = −1 Edwards modulo 2-torsion, extended += cached | ||||||||||||
| references, 32 and 33 bytes | ||||||||||||
| ristretto255curve25519-dalek | ||||||||||||
| secp256k1libsecp256k1 | ||||||||||||
bold: the best of its column; italic, dotted: tied with the best within the confidence intervals; shading: ratio to the best, pale yellow at 1× to purple at 16× or more; grey: baseline, not compared.
All benchmarks
Every observation: a figure and a table per layer.
field
50 benchmarks
| operation | benchmark | family | mode | time | 95% CI | unit |
|---|---|---|---|---|---|---|
| batch invert | gf2_109/batch invert (product tree) | gf2_109 | batch | 109 ns | 108 ns .. 109 ns | per elem |
| batch invert | gf2_122/batch invert (product tree) | gf2_122 | batch | 74.0 ns | 73.8 ns .. 74.1 ns | per elem |
| batch invert | gf2_127/batch invert (product tree) | gf2_127 | batch | 42.0 ns | 42.0 ns .. 42.1 ns | per elem |
| batch invert | fp127/batch invert (product tree) | fp127 | batch | 5.71 ns | 5.69 ns .. 5.74 ns | per elem |
| halftrace | gf2_109/halftrace | gf2_109 | per-element | 36.8 ns | 36.7 ns .. 36.9 ns | per elem |
| halftrace | gf2_109/halftrace (byte tables) | gf2_109 | per-element | 3.28 ns | 3.27 ns .. 3.29 ns | per elem |
| halftrace | gf2_122/qsolve (z^2 + z = c, 2 base halftraces) | gf2_122 | per-element | 2.39 ns | 2.38 ns .. 2.39 ns | per elem |
| halftrace | gf2_127/halftrace | gf2_127 | per-element | 15.1 ns | 15.1 ns .. 15.2 ns | per elem |
| halftrace | gf2_127/halftrace (byte tables) | gf2_127 | per-element | 3.50 ns | 3.49 ns .. 3.51 ns | per elem |
| halftrace | gf2_127/halftrace (nibble tables) | gf2_127 | per-element | 17.8 ns | 17.7 ns .. 17.8 ns | per elem |
| mul_u2 | gf2_122/mul_u2 (by a^2 = 1 + a) latency (dependent chain) | gf2_122 | latency | 0.26 ns | 0.26 ns .. 0.26 ns | per elem |
| mul_u2 | gf2_122/mul_u2 (by a^2 = 1 + a) throughput (8 chains) | gf2_122 | throughput | 0.13 ns | 0.13 ns .. 0.13 ns | per elem |
| trace | gf2_109/trace | gf2_109 | per-element | 0.45 ns | 0.45 ns .. 0.45 ns | per elem |
| trace | gf2_122/trace | gf2_122 | per-element | 0.34 ns | 0.34 ns .. 0.34 ns | per elem |
| trace | gf2_127/trace | gf2_127 | per-element | 0.34 ns | 0.34 ns .. 0.34 ns | per elem |
| pack | fp127/pack | fp127 | per-element | 0.35 ns | 0.35 ns .. 0.36 ns | per elem |
| normalize | gf2_109/normalize (to_u128) | gf2_109 | per-element | 0.53 ns | 0.53 ns .. 0.53 ns | per elem |
| normalize | gf2_122/normalize (to_u128) | gf2_122 | per-element | 0.70 ns | 0.70 ns .. 0.70 ns | per elem |
| normalize | gf2_127/normalize (to_u128) | gf2_127 | per-element | 0.42 ns | 0.42 ns .. 0.42 ns | per elem |
| unpack | fp127/unpack | fp127 | per-element | 0.57 ns | 0.57 ns .. 0.57 ns | per elem |
| neg | fp127/neg | fp127 | per-element | 0.75 ns | 0.75 ns .. 0.76 ns | per elem |
| add | fp127/add | fp127 | per-element | 0.94 ns | 0.94 ns .. 0.94 ns | per elem |
| square | gf2_109/square latency (dependent chain) | gf2_109 | latency | 26.7 ns | 26.7 ns .. 26.8 ns | per elem |
| square | gf2_109/square throughput (8 chains) | gf2_109 | throughput | 21.8 ns | 21.7 ns .. 21.8 ns | per elem |
| square | gf2_122/square latency (dependent chain) | gf2_122 | latency | 16.7 ns | 16.7 ns .. 16.8 ns | per elem |
| square | gf2_122/square throughput (8 chains) | gf2_122 | throughput | 3.84 ns | 3.83 ns .. 3.85 ns | per elem |
| square | gf2_127/square latency (dependent chain) | gf2_127 | latency | 4.19 ns | 4.18 ns .. 4.20 ns | per elem |
| square | gf2_127/square throughput (8 chains) | gf2_127 | throughput | 2.58 ns | 2.58 ns .. 2.59 ns | per elem |
| square | fp127/square latency (dependent chain) | fp127 | latency | 3.64 ns | 3.63 ns .. 3.65 ns | per elem |
| square | fp127/square throughput (8 chains) | fp127 | throughput | 1.91 ns | 1.91 ns .. 1.92 ns | per elem |
| sqrt | gf2_109/sqrt | gf2_109 | per-element | 19.2 ns | 19.2 ns .. 19.3 ns | per elem |
| sqrt | gf2_122/sqrt | gf2_122 | per-element | 3.41 ns | 3.40 ns .. 3.41 ns | per elem |
| sqrt | gf2_127/sqrt | gf2_127 | per-element | 2.61 ns | 2.60 ns .. 2.62 ns | per elem |
| sqrt | fp127/sqrt (x^(2^125)) | fp127 | per-element | 474 ns | 473 ns .. 475 ns | per elem |
| mul_base | gf2_122/mul_base (by a GF(2^61) constant) latency (dependent chain) | gf2_122 | latency | 20.9 ns | 20.9 ns .. 21.0 ns | per elem |
| mul_base | gf2_122/mul_base (by a GF(2^61) constant) throughput (8 chains) | gf2_122 | throughput | 13.9 ns | 13.8 ns .. 13.9 ns | per elem |
| mul | gf2_109/mul latency (dependent chain) | gf2_109 | latency | 38.9 ns | 38.8 ns .. 39.0 ns | per elem |
| mul | gf2_109/mul throughput (8 chains) | gf2_109 | throughput | 34.7 ns | 34.6 ns .. 34.9 ns | per elem |
| mul | gf2_122/mul latency (dependent chain) | gf2_122 | latency | 29.1 ns | 29.1 ns .. 29.2 ns | per elem |
| mul | gf2_122/mul throughput (8 chains) | gf2_122 | throughput | 24.6 ns | 24.6 ns .. 24.7 ns | per elem |
| mul | gf2_127/mul latency (dependent chain) | gf2_127 | latency | 13.4 ns | 13.4 ns .. 13.5 ns | per elem |
| mul | gf2_127/mul throughput (8 chains) | gf2_127 | throughput | 13.2 ns | 13.2 ns .. 13.3 ns | per elem |
| mul | fp127/mul latency (dependent chain) | fp127 | latency | 3.64 ns | 3.63 ns .. 3.65 ns | per elem |
| mul | fp127/mul throughput (8 chains) | fp127 | throughput | 1.54 ns | 1.54 ns .. 1.54 ns | per elem |
| pow_p34 | fp127/pow_p34 (x^(2^125-1)) | fp127 | per-element | 504 ns | 503 ns .. 505 ns | per elem |
| invert | gf2_109/invert | gf2_109 | per-element | 2.82 µs | 2.82 µs .. 2.83 µs | per elem |
| invert | gf2_122/invert | gf2_122 | per-element | 494 ns | 493 ns .. 495 ns | per elem |
| invert | gf2_127/invert | gf2_127 | per-element | 391 ns | 390 ns .. 392 ns | per elem |
| invert | fp127/invert | fp127 | per-element | 519 ns | 518 ns .. 521 ns | per elem |
| sqrt_ratio | fp127/sqrt_ratio | fp127 | per-element | 525 ns | 523 ns .. 526 ns | per elem |
group ops
277 benchmarks
| operation | benchmark | family | mode | time | 95% CI | unit |
|---|---|---|---|---|---|---|
| prepare | binary.109/mode=batch,n=1024 | gf2_109 | batch | 95.7 ns | 95.5 ns .. 95.9 ns | per elem |
| prepare | binary.109/mode=indep | gf2_109 | per-element | 95.3 ns | 95.1 ns .. 95.4 ns | per elem |
| prepare | binary-lambda.109/mode=batch,n=1024 | gf2_109-lambda | batch | 147 ns | 147 ns .. 147 ns | per elem |
| prepare | binary-lambda.109/mode=indep | gf2_109-lambda | per-element | 2.86 µs | 2.86 µs .. 2.87 µs | per elem |
| prepare | binary-u.109/mode=batch,n=1024 | gf2_109-u | batch | 0.98 ns | 0.97 ns .. 0.99 ns | per elem |
| prepare | binary-u.109/mode=indep | gf2_109-u | per-element | 0.62 ns | 0.62 ns .. 0.62 ns | per elem |
| prepare | binary-w.109/mode=batch,n=1024 | gf2_109-w | batch | 0.97 ns | 0.96 ns .. 0.98 ns | per elem |
| prepare | binary-w.109/mode=indep | gf2_109-w | per-element | 0.62 ns | 0.62 ns .. 0.62 ns | per elem |
| prepare | binary.122/mode=batch,n=1024 | gf2_122 | batch | 63.1 ns | 62.9 ns .. 63.3 ns | per elem |
| prepare | binary.122/mode=indep | gf2_122 | per-element | 64.2 ns | 64.0 ns .. 64.3 ns | per elem |
| prepare | binary.122-gls/mode=batch,n=1024 | gf2_122-gls | batch | 44.3 ns | 44.1 ns .. 44.4 ns | per elem |
| prepare | binary.122-gls/mode=indep | gf2_122-gls | per-element | 44.2 ns | 44.0 ns .. 44.3 ns | per elem |
| prepare | binary-lambda.122-gls/mode=batch,n=1024 | gf2_122-gls-lambda | batch | 101 ns | 100 ns .. 101 ns | per elem |
| prepare | binary-lambda.122-gls/mode=indep | gf2_122-gls-lambda | per-element | 524 ns | 522 ns .. 525 ns | per elem |
| prepare | binary-u.122-gls/mode=batch,n=1024 | gf2_122-gls-u | batch | 1.01 ns | 0.98 ns .. 1.04 ns | per elem |
| prepare | binary-u.122-gls/mode=indep | gf2_122-gls-u | per-element | 0.62 ns | 0.61 ns .. 0.62 ns | per elem |
| prepare | binary-w.122-gls/mode=batch,n=1024 | gf2_122-gls-w | batch | 0.97 ns | 0.96 ns .. 0.99 ns | per elem |
| prepare | binary-w.122-gls/mode=indep | gf2_122-gls-w | per-element | 0.62 ns | 0.62 ns .. 0.62 ns | per elem |
| prepare | binary-lambda.122/mode=batch,n=1024 | gf2_122-lambda | batch | 100 ns | 99.9 ns .. 101 ns | per elem |
| prepare | binary-lambda.122/mode=indep | gf2_122-lambda | per-element | 521 ns | 520 ns .. 523 ns | per elem |
| prepare | binary-u.122/mode=batch,n=1024 | gf2_122-u | batch | 0.99 ns | 0.98 ns .. 0.99 ns | per elem |
| prepare | binary-u.122/mode=indep | gf2_122-u | per-element | 0.62 ns | 0.62 ns .. 0.62 ns | per elem |
| prepare | binary-w.122/mode=batch,n=1024 | gf2_122-w | batch | 0.99 ns | 0.98 ns .. 1.00 ns | per elem |
| prepare | binary-w.122/mode=indep | gf2_122-w | per-element | 0.62 ns | 0.61 ns .. 0.62 ns | per elem |
| prepare | binary.127/mode=batch,n=1024 | gf2_127 | batch | 31.2 ns | 31.2 ns .. 31.3 ns | per elem |
| prepare | binary.127/mode=indep | gf2_127 | per-element | 31.6 ns | 31.5 ns .. 31.6 ns | per elem |
| prepare | binary-lambda.127/mode=batch,n=1024 | gf2_127-lambda | batch | 56.6 ns | 56.5 ns .. 56.8 ns | per elem |
| prepare | binary-lambda.127/mode=batch,n=64 | gf2_127-lambda | batch | 65.7 ns | 65.6 ns .. 65.8 ns | per elem |
| prepare | binary-lambda.127/mode=batch,n=8 | gf2_127-lambda | batch | 115 ns | 115 ns .. 115 ns | per elem |
| prepare | binary-lambda.127/mode=indep | gf2_127-lambda | per-element | 412 ns | 411 ns .. 412 ns | per elem |
| prepare | binary-u.127/mode=batch,n=1024 | gf2_127-u | batch | 0.98 ns | 0.98 ns .. 0.99 ns | per elem |
| prepare | binary-u.127/mode=batch,n=64 | gf2_127-u | batch | 1.01 ns | 1.01 ns .. 1.01 ns | per elem |
| prepare | binary-u.127/mode=batch,n=8 | gf2_127-u | batch | 1.85 ns | 1.84 ns .. 1.85 ns | per elem |
| prepare | binary-u.127/mode=indep | gf2_127-u | per-element | 0.62 ns | 0.62 ns .. 0.62 ns | per elem |
| prepare | binary-w.127/mode=batch,n=1024 | gf2_127-w | batch | 0.97 ns | 0.96 ns .. 0.98 ns | per elem |
| prepare | binary-w.127/mode=batch,n=64 | gf2_127-w | batch | 1.01 ns | 1.01 ns .. 1.01 ns | per elem |
| prepare | binary-w.127/mode=batch,n=8 | gf2_127-w | batch | 1.85 ns | 1.84 ns .. 1.85 ns | per elem |
| prepare | binary-w.127/mode=indep | gf2_127-w | per-element | 0.62 ns | 0.62 ns .. 0.62 ns | per elem |
| prepare | edwards.127/mode=batch,n=1024 | edwards127 | batch | 27.2 ns | 27.2 ns .. 27.3 ns | per elem |
| prepare | edwards.127/mode=batch,n=64 | edwards127 | batch | 37.1 ns | 36.9 ns .. 37.2 ns | per elem |
| prepare | edwards.127/mode=batch,n=8 | edwards127 | batch | 105 ns | 105 ns .. 105 ns | per elem |
| prepare | edwards.127/mode=indep | edwards127 | per-element | 573 ns | 571 ns .. 574 ns | per elem |
| prepare | weier.127/mode=batch,n=1024 | weier127 | batch | 0.45 ns | 0.45 ns .. 0.46 ns | per elem |
| prepare | weier.127/mode=batch,n=64 | weier127 | batch | 0.54 ns | 0.54 ns .. 0.54 ns | per elem |
| prepare | weier.127/mode=batch,n=8 | weier127 | batch | 1.42 ns | 1.41 ns .. 1.43 ns | per elem |
| prepare | weier.127/mode=indep | weier127 | per-element | 0.58 ns | 0.57 ns .. 0.58 ns | per elem |
| prepare | weier-jacobian.127/mode=batch,n=1024 | weier127-jacobian | batch | 0.46 ns | 0.46 ns .. 0.46 ns | per elem |
| prepare | weier-jacobian.127/mode=batch,n=64 | weier127-jacobian | batch | 0.54 ns | 0.54 ns .. 0.55 ns | per elem |
| prepare | weier-jacobian.127/mode=batch,n=8 | weier127-jacobian | batch | 1.41 ns | 1.41 ns .. 1.42 ns | per elem |
| prepare | weier-jacobian.127/mode=indep | weier127-jacobian | per-element | 0.57 ns | 0.57 ns .. 0.58 ns | per elem |
| add | xor-sha256/xor 32B, 1 accumulator | xor | latency | 0.39 ns | 0.39 ns .. 0.39 ns | per elem |
| add | xor-sha256/xor 32B, 8 accumulators | xor | throughput | 0.73 ns | 0.73 ns .. 0.73 ns | per elem |
| add | binary.109/mode=latency | gf2_109 | latency | 403 ns | 403 ns .. 404 ns | per elem |
| add | binary.109/mode=throughput | gf2_109 | throughput | 403 ns | 402 ns .. 404 ns | per elem |
| add | gf2_109/extended += affine, 8 accumulators | gf2_109 | throughput | 504 ns | 500 ns .. 509 ns | per elem |
| add | binary-lambda.109/mode=latency | gf2_109-lambda | latency | 334 ns | 333 ns .. 335 ns | per elem |
| add | binary-lambda.109/mode=throughput | gf2_109-lambda | throughput | 331 ns | 330 ns .. 332 ns | per elem |
| add | binary-u.109/mode=latency | gf2_109-u | latency | 290 ns | 289 ns .. 290 ns | per elem |
| add | binary-u.109/mode=throughput | gf2_109-u | throughput | 289 ns | 289 ns .. 290 ns | per elem |
| add | binary-w.109/mode=latency | gf2_109-w | latency | 335 ns | 334 ns .. 335 ns | per elem |
| add | binary-w.109/mode=throughput | gf2_109-w | throughput | 332 ns | 331 ns .. 332 ns | per elem |
| add | binary.122/mode=latency | gf2_122 | latency | 267 ns | 266 ns .. 268 ns | per elem |
| add | binary.122/mode=throughput | gf2_122 | throughput | 263 ns | 262 ns .. 264 ns | per elem |
| add | gf2_122/extended += affine, 8 accumulators | gf2_122 | throughput | 330 ns | 330 ns .. 331 ns | per elem |
| add | binary.122-gls/mode=latency | gf2_122-gls | latency | 240 ns | 239 ns .. 241 ns | per elem |
| add | binary.122-gls/mode=throughput | gf2_122-gls | throughput | 246 ns | 245 ns .. 247 ns | per elem |
| add | gf2_122-gls/extended += affine, 8 accumulators | gf2_122-gls | throughput | 301 ns | 299 ns .. 303 ns | per elem |
| add | binary-lambda.122-gls/mode=latency | gf2_122-gls-lambda | latency | 219 ns | 219 ns .. 220 ns | per elem |
| add | binary-lambda.122-gls/mode=throughput | gf2_122-gls-lambda | throughput | 216 ns | 215 ns .. 217 ns | per elem |
| add | binary-u.122-gls/mode=latency | gf2_122-gls-u | latency | 183 ns | 183 ns .. 183 ns | per elem |
| add | binary-u.122-gls/mode=throughput | gf2_122-gls-u | throughput | 182 ns | 182 ns .. 183 ns | per elem |
| add | binary-w.122-gls/mode=latency | gf2_122-gls-w | latency | 219 ns | 219 ns .. 220 ns | per elem |
| add | binary-w.122-gls/mode=throughput | gf2_122-gls-w | throughput | 217 ns | 216 ns .. 217 ns | per elem |
| add | binary-lambda.122/mode=latency | gf2_122-lambda | latency | 219 ns | 219 ns .. 220 ns | per elem |
| add | binary-lambda.122/mode=throughput | gf2_122-lambda | throughput | 217 ns | 217 ns .. 217 ns | per elem |
| add | binary-u.122/mode=latency | gf2_122-u | latency | 183 ns | 183 ns .. 184 ns | per elem |
| add | binary-u.122/mode=throughput | gf2_122-u | throughput | 183 ns | 183 ns .. 183 ns | per elem |
| add | binary-w.122/mode=latency | gf2_122-w | latency | 219 ns | 219 ns .. 220 ns | per elem |
| add | binary-w.122/mode=throughput | gf2_122-w | throughput | 211 ns | 209 ns .. 212 ns | per elem |
| add | binary.127/mode=latency | gf2_127 | latency | 156 ns | 155 ns .. 156 ns | per elem |
| add | binary.127/mode=throughput | gf2_127 | throughput | 155 ns | 155 ns .. 155 ns | per elem |
| add | gf2_127/extended += affine, 8 accumulators | gf2_127 | throughput | 193 ns | 193 ns .. 194 ns | per elem |
| add | binary-lambda.127/mode=latency | gf2_127-lambda | latency | 135 ns | 135 ns .. 135 ns | per elem |
| add | binary-lambda.127/mode=throughput | gf2_127-lambda | throughput | 132 ns | 131 ns .. 132 ns | per elem |
| add | binary-u.127/mode=latency | gf2_127-u | latency | 119 ns | 119 ns .. 120 ns | per elem |
| add | binary-u.127/mode=throughput | gf2_127-u | throughput | 116 ns | 116 ns .. 116 ns | per elem |
| add | binary-w.127/mode=latency | gf2_127-w | latency | 135 ns | 135 ns .. 135 ns | per elem |
| add | binary-w.127/mode=throughput | gf2_127-w | throughput | 131 ns | 131 ns .. 131 ns | per elem |
| add | edwards.127/mode=latency | edwards127 | latency | 22.1 ns | 22.0 ns .. 22.1 ns | per elem |
| add | edwards.127/mode=throughput | edwards127 | throughput | 19.9 ns | 19.9 ns .. 19.9 ns | per elem |
| add | edwards127/+= montgomery affine, 8 accumulators | edwards127 | throughput | 40.4 ns | 40.3 ns .. 40.5 ns | per elem |
| add | weier.127/mode=latency | weier127 | latency | 46.2 ns | 46.1 ns .. 46.3 ns | per elem |
| add | weier.127/mode=throughput | weier127 | throughput | 44.7 ns | 44.6 ns .. 44.8 ns | per elem |
| add | weier-jacobian.127/mode=latency | weier127-jacobian | latency | 45.0 ns | 44.8 ns .. 45.1 ns | per elem |
| add | weier-jacobian.127/mode=throughput | weier127-jacobian | throughput | 36.6 ns | 36.5 ns .. 36.8 ns | per elem |
| subtract | binary-lambda.127/mode=throughput | gf2_127-lambda | throughput | 131 ns | 131 ns .. 131 ns | per elem |
| subtract | binary-u.127/mode=throughput | gf2_127-u | throughput | 119 ns | 118 ns .. 119 ns | per elem |
| subtract | binary-w.127/mode=throughput | gf2_127-w | throughput | 131 ns | 131 ns .. 131 ns | per elem |
| subtract | edwards.127/mode=throughput | edwards127 | throughput | 22.7 ns | 22.6 ns .. 22.7 ns | per elem |
| subtract | weier.127/mode=throughput | weier127 | throughput | 46.4 ns | 46.3 ns .. 46.5 ns | per elem |
| subtract | weier-jacobian.127/mode=throughput | weier127-jacobian | throughput | 37.6 ns | 37.5 ns .. 37.6 ns | per elem |
| negate | binary.109 | gf2_109 | per-element | 1.05 ns | 1.05 ns .. 1.05 ns | per elem |
| negate | gf2_109/affine (y += x) | gf2_109 | per-element | 0.69 ns | 0.68 ns .. 0.69 ns | per elem |
| negate | binary-lambda.109 | gf2_109-lambda | per-element | 0.65 ns | 0.64 ns .. 0.65 ns | per elem |
| negate | binary-u.109 | gf2_109-u | per-element | 0.69 ns | 0.69 ns .. 0.69 ns | per elem |
| negate | binary-w.109 | gf2_109-w | per-element | 0.64 ns | 0.64 ns .. 0.65 ns | per elem |
| negate | binary.122 | gf2_122 | per-element | 1.04 ns | 1.04 ns .. 1.05 ns | per elem |
| negate | gf2_122/affine (y += x) | gf2_122 | per-element | 0.69 ns | 0.69 ns .. 0.69 ns | per elem |
| negate | binary.122-gls | gf2_122-gls | per-element | 1.02 ns | 1.02 ns .. 1.02 ns | per elem |
| negate | binary-lambda.122-gls | gf2_122-gls-lambda | per-element | 0.65 ns | 0.64 ns .. 0.65 ns | per elem |
| negate | binary-u.122-gls | gf2_122-gls-u | per-element | 0.69 ns | 0.69 ns .. 0.69 ns | per elem |
| negate | binary-w.122-gls | gf2_122-gls-w | per-element | 0.65 ns | 0.64 ns .. 0.65 ns | per elem |
| negate | binary-lambda.122 | gf2_122-lambda | per-element | 0.65 ns | 0.64 ns .. 0.65 ns | per elem |
| negate | binary-u.122 | gf2_122-u | per-element | 0.69 ns | 0.69 ns .. 0.69 ns | per elem |
| negate | binary-w.122 | gf2_122-w | per-element | 0.64 ns | 0.64 ns .. 0.65 ns | per elem |
| negate | binary.127 | gf2_127 | per-element | 1.05 ns | 1.04 ns .. 1.05 ns | per elem |
| negate | gf2_127/affine (y += x) | gf2_127 | per-element | 0.69 ns | 0.69 ns .. 0.69 ns | per elem |
| negate | binary-lambda.127 | gf2_127-lambda | per-element | 0.64 ns | 0.64 ns .. 0.65 ns | per elem |
| negate | binary-u.127 | gf2_127-u | per-element | 0.68 ns | 0.67 ns .. 0.69 ns | per elem |
| negate | binary-w.127 | gf2_127-w | per-element | 0.65 ns | 0.65 ns .. 0.65 ns | per elem |
| negate | edwards.127 | edwards127 | per-element | 1.40 ns | 1.39 ns .. 1.40 ns | per elem |
| negate | edwards127/extended (-X, -T) | edwards127 | per-element | 1.36 ns | 1.35 ns .. 1.37 ns | per elem |
| negate | weier.127 | weier127 | per-element | 0.76 ns | 0.75 ns .. 0.76 ns | per elem |
| negate | weier127/projective (-Y) | weier127 | per-element | 0.85 ns | 0.85 ns .. 0.85 ns | per elem |
| negate | weier-jacobian.127 | weier127-jacobian | per-element | 0.76 ns | 0.75 ns .. 0.76 ns | per elem |
| is identity | binary.109 | gf2_109 | per-element | 0.59 ns | 0.58 ns .. 0.59 ns | per elem |
| is identity | binary-lambda.109 | gf2_109-lambda | per-element | 0.57 ns | 0.57 ns .. 0.58 ns | per elem |
| is identity | binary-u.109 | gf2_109-u | per-element | 0.58 ns | 0.58 ns .. 0.58 ns | per elem |
| is identity | binary-w.109 | gf2_109-w | per-element | 0.58 ns | 0.58 ns .. 0.58 ns | per elem |
| is identity | binary.122 | gf2_122 | per-element | 0.84 ns | 0.84 ns .. 0.84 ns | per elem |
| is identity | binary.122-gls | gf2_122-gls | per-element | 0.84 ns | 0.84 ns .. 0.84 ns | per elem |
| is identity | binary-lambda.122-gls | gf2_122-gls-lambda | per-element | 0.84 ns | 0.84 ns .. 0.84 ns | per elem |
| is identity | binary-u.122-gls | gf2_122-gls-u | per-element | 0.84 ns | 0.84 ns .. 0.84 ns | per elem |
| is identity | binary-w.122-gls | gf2_122-gls-w | per-element | 0.84 ns | 0.84 ns .. 0.84 ns | per elem |
| is identity | binary-lambda.122 | gf2_122-lambda | per-element | 0.84 ns | 0.84 ns .. 0.84 ns | per elem |
| is identity | binary-u.122 | gf2_122-u | per-element | 0.83 ns | 0.82 ns .. 0.84 ns | per elem |
| is identity | binary-w.122 | gf2_122-w | per-element | 0.84 ns | 0.84 ns .. 0.84 ns | per elem |
| is identity | binary.127 | gf2_127 | per-element | 0.59 ns | 0.59 ns .. 0.60 ns | per elem |
| is identity | binary-lambda.127 | gf2_127-lambda | per-element | 0.55 ns | 0.54 ns .. 0.55 ns | per elem |
| is identity | binary-u.127 | gf2_127-u | per-element | 0.54 ns | 0.54 ns .. 0.55 ns | per elem |
| is identity | binary-w.127 | gf2_127-w | per-element | 0.55 ns | 0.54 ns .. 0.55 ns | per elem |
| is identity | edwards.127 | edwards127 | per-element | 0.34 ns | 0.33 ns .. 0.34 ns | per elem |
| is identity | weier.127 | weier127 | per-element | 0.34 ns | 0.34 ns .. 0.34 ns | per elem |
| is identity | weier-jacobian.127 | weier127-jacobian | per-element | 0.34 ns | 0.34 ns .. 0.34 ns | per elem |
| equals addend | binary.109/mode=mismatch | gf2_109 | mismatch | 72.9 ns | 72.7 ns .. 73.1 ns | per elem |
| equals addend | binary-lambda.109/mode=mismatch | gf2_109-lambda | mismatch | 39.3 ns | 39.2 ns .. 39.4 ns | per elem |
| equals addend | binary-u.109/mode=mismatch | gf2_109-u | mismatch | 115 ns | 115 ns .. 116 ns | per elem |
| equals addend | binary-w.109/mode=mismatch | gf2_109-w | mismatch | 39.4 ns | 39.3 ns .. 39.5 ns | per elem |
| equals addend | binary.122/mode=mismatch | gf2_122 | mismatch | 53.7 ns | 53.5 ns .. 53.9 ns | per elem |
| equals addend | binary.122-gls/mode=mismatch | gf2_122-gls | mismatch | 54.4 ns | 54.3 ns .. 54.5 ns | per elem |
| equals addend | binary-lambda.122-gls/mode=mismatch | gf2_122-gls-lambda | mismatch | 27.8 ns | 27.7 ns .. 27.9 ns | per elem |
| equals addend | binary-u.122-gls/mode=mismatch | gf2_122-gls-u | mismatch | 85.0 ns | 84.8 ns .. 85.2 ns | per elem |
| equals addend | binary-w.122-gls/mode=mismatch | gf2_122-gls-w | mismatch | 27.9 ns | 27.9 ns .. 28.0 ns | per elem |
| equals addend | binary-lambda.122/mode=mismatch | gf2_122-lambda | mismatch | 27.9 ns | 27.8 ns .. 28.0 ns | per elem |
| equals addend | binary-u.122/mode=mismatch | gf2_122-u | mismatch | 84.9 ns | 84.7 ns .. 85.1 ns | per elem |
| equals addend | binary-w.122/mode=mismatch | gf2_122-w | mismatch | 27.8 ns | 27.7 ns .. 27.9 ns | per elem |
| equals addend | binary.127/mode=mismatch | gf2_127 | mismatch | 30.3 ns | 30.3 ns .. 30.4 ns | per elem |
| equals addend | binary-lambda.127/mode=match | gf2_127-lambda | match | 15.1 ns | 15.0 ns .. 15.1 ns | per elem |
| equals addend | binary-lambda.127/mode=mismatch | gf2_127-lambda | mismatch | 15.1 ns | 15.1 ns .. 15.2 ns | per elem |
| equals addend | binary-u.127/mode=match | gf2_127-u | match | 48.6 ns | 48.5 ns .. 48.7 ns | per elem |
| equals addend | binary-u.127/mode=mismatch | gf2_127-u | mismatch | 48.7 ns | 48.6 ns .. 48.8 ns | per elem |
| equals addend | binary-w.127/mode=match | gf2_127-w | match | 15.0 ns | 15.0 ns .. 15.1 ns | per elem |
| equals addend | binary-w.127/mode=mismatch | gf2_127-w | mismatch | 15.1 ns | 15.0 ns .. 15.1 ns | per elem |
| equals addend | edwards.127/mode=match | edwards127 | match | 3.70 ns | 3.68 ns .. 3.72 ns | per elem |
| equals addend | edwards.127/mode=mismatch | edwards127 | mismatch | 1.91 ns | 1.91 ns .. 1.92 ns | per elem |
| equals addend | weier.127/mode=match | weier127 | match | 3.81 ns | 3.80 ns .. 3.82 ns | per elem |
| equals addend | weier.127/mode=mismatch | weier127 | mismatch | 1.98 ns | 1.98 ns .. 1.99 ns | per elem |
| equals addend | weier-jacobian.127/mode=match | weier127-jacobian | match | 8.92 ns | 8.89 ns .. 8.96 ns | per elem |
| equals addend | weier-jacobian.127/mode=mismatch | weier127-jacobian | mismatch | 4.29 ns | 4.28 ns .. 4.31 ns | per elem |
| encode | binary.109/mode=batch,n=1024 | gf2_109 | batch | 306 ns | 305 ns .. 306 ns | per elem |
| encode | binary.109/mode=indep | gf2_109 | per-element | 3.03 µs | 3.02 µs .. 3.03 µs | per elem |
| encode | binary-lambda.109/mode=batch,n=1024 | gf2_109-lambda | batch | 221 ns | 221 ns .. 222 ns | per elem |
| encode | binary-lambda.109/mode=indep | gf2_109-lambda | per-element | 2.95 µs | 2.94 µs .. 2.95 µs | per elem |
| encode | binary-u.109/mode=batch,n=1024 | gf2_109-u | batch | 206 ns | 205 ns .. 207 ns | per elem |
| encode | binary-u.109/mode=indep | gf2_109-u | per-element | 2.95 µs | 2.93 µs .. 2.96 µs | per elem |
| encode | binary-w.109/mode=batch,n=1024 | gf2_109-w | batch | 204 ns | 203 ns .. 204 ns | per elem |
| encode | binary-w.109/mode=indep | gf2_109-w | per-element | 2.90 µs | 2.89 µs .. 2.91 µs | per elem |
| encode | binary.122/mode=batch,n=1024 | gf2_122 | batch | 202 ns | 202 ns .. 203 ns | per elem |
| encode | binary.122/mode=indep | gf2_122 | per-element | 618 ns | 616 ns .. 619 ns | per elem |
| encode | binary.122-gls/mode=batch,n=1024 | gf2_122-gls | batch | 194 ns | 193 ns .. 195 ns | per elem |
| encode | binary.122-gls/mode=indep | gf2_122-gls | per-element | 612 ns | 609 ns .. 614 ns | per elem |
| encode | binary-lambda.122-gls/mode=batch,n=1024 | gf2_122-gls-lambda | batch | 156 ns | 155 ns .. 156 ns | per elem |
| encode | binary-lambda.122-gls/mode=indep | gf2_122-gls-lambda | per-element | 576 ns | 575 ns .. 578 ns | per elem |
| encode | binary-u.122-gls/mode=batch,n=1024 | gf2_122-gls-u | batch | 133 ns | 133 ns .. 133 ns | per elem |
| encode | binary-u.122-gls/mode=indep | gf2_122-gls-u | per-element | 562 ns | 561 ns .. 564 ns | per elem |
| encode | binary-w.122-gls/mode=batch,n=1024 | gf2_122-gls-w | batch | 130 ns | 129 ns .. 130 ns | per elem |
| encode | binary-w.122-gls/mode=indep | gf2_122-gls-w | per-element | 555 ns | 553 ns .. 556 ns | per elem |
| encode | binary-lambda.122/mode=batch,n=1024 | gf2_122-lambda | batch | 156 ns | 155 ns .. 156 ns | per elem |
| encode | binary-lambda.122/mode=indep | gf2_122-lambda | per-element | 573 ns | 572 ns .. 575 ns | per elem |
| encode | binary-u.122/mode=batch,n=1024 | gf2_122-u | batch | 132 ns | 132 ns .. 133 ns | per elem |
| encode | binary-u.122/mode=indep | gf2_122-u | per-element | 564 ns | 563 ns .. 566 ns | per elem |
| encode | binary-w.122/mode=batch,n=1024 | gf2_122-w | batch | 130 ns | 130 ns .. 131 ns | per elem |
| encode | binary-w.122/mode=indep | gf2_122-w | per-element | 551 ns | 550 ns .. 553 ns | per elem |
| encode | binary.127/mode=batch,n=1024 | gf2_127 | batch | 106 ns | 106 ns .. 106 ns | per elem |
| encode | binary.127/mode=indep | gf2_127 | per-element | 462 ns | 461 ns .. 462 ns | per elem |
| encode | binary-lambda.127/mode=batch,n=1024 | gf2_127-lambda | batch | 87.0 ns | 86.8 ns .. 87.1 ns | per elem |
| encode | binary-lambda.127/mode=batch,n=64 | gf2_127-lambda | batch | 95.8 ns | 95.6 ns .. 96.1 ns | per elem |
| encode | binary-lambda.127/mode=batch,n=8 | gf2_127-lambda | batch | 146 ns | 146 ns .. 146 ns | per elem |
| encode | binary-lambda.127/mode=indep | gf2_127-lambda | per-element | 442 ns | 441 ns .. 443 ns | per elem |
| encode | binary-u.127/mode=batch,n=1024 | gf2_127-u | batch | 76.5 ns | 75.9 ns .. 77.2 ns | per elem |
| encode | binary-u.127/mode=batch,n=64 | gf2_127-u | batch | 85.9 ns | 85.7 ns .. 86.1 ns | per elem |
| encode | binary-u.127/mode=batch,n=8 | gf2_127-u | batch | 131 ns | 131 ns .. 131 ns | per elem |
| encode | binary-u.127/mode=indep | gf2_127-u | per-element | 438 ns | 437 ns .. 438 ns | per elem |
| encode | binary-w.127/mode=batch,n=1024 | gf2_127-w | batch | 76.5 ns | 76.3 ns .. 76.6 ns | per elem |
| encode | binary-w.127/mode=batch,n=64 | gf2_127-w | batch | 85.1 ns | 84.9 ns .. 85.4 ns | per elem |
| encode | binary-w.127/mode=batch,n=8 | gf2_127-w | batch | 135 ns | 135 ns .. 136 ns | per elem |
| encode | binary-w.127/mode=indep | gf2_127-w | per-element | 432 ns | 432 ns .. 433 ns | per elem |
| encode | edwards.127/mode=batch,n=1024 | edwards127 | batch | 21.7 ns | 21.7 ns .. 21.7 ns | per elem |
| encode | edwards.127/mode=batch,n=64 | edwards127 | batch | 32.1 ns | 32.0 ns .. 32.1 ns | per elem |
| encode | edwards.127/mode=batch,n=8 | edwards127 | batch | 99.7 ns | 99.3 ns .. 100 ns | per elem |
| encode | edwards.127/mode=indep | edwards127 | per-element | 536 ns | 534 ns .. 538 ns | per elem |
| encode | weier.127/mode=batch,n=1024 | weier127 | batch | 9.97 ns | 9.95 ns .. 9.99 ns | per elem |
| encode | weier.127/mode=batch,n=64 | weier127 | batch | 20.4 ns | 20.3 ns .. 20.4 ns | per elem |
| encode | weier.127/mode=batch,n=8 | weier127 | batch | 85.1 ns | 84.8 ns .. 85.4 ns | per elem |
| encode | weier.127/mode=indep | weier127 | per-element | 527 ns | 526 ns .. 528 ns | per elem |
| encode | weier-jacobian.127/mode=batch,n=1024 | weier127-jacobian | batch | 15.3 ns | 15.3 ns .. 15.4 ns | per elem |
| encode | weier-jacobian.127/mode=batch,n=64 | weier127-jacobian | batch | 25.8 ns | 25.7 ns .. 25.8 ns | per elem |
| encode | weier-jacobian.127/mode=batch,n=8 | weier127-jacobian | batch | 90.0 ns | 89.7 ns .. 90.3 ns | per elem |
| encode | weier-jacobian.127/mode=indep | weier127-jacobian | per-element | 531 ns | 530 ns .. 532 ns | per elem |
| decode | binary.109/mode=batch,n=1024 | gf2_109 | batch | 263 ns | 262 ns .. 263 ns | per elem |
| decode | binary.109/mode=indep | gf2_109 | per-element | 2.98 µs | 2.97 µs .. 2.98 µs | per elem |
| decode | binary-lambda.109/mode=batch,n=1024 | gf2_109-lambda | batch | 263 ns | 262 ns .. 263 ns | per elem |
| decode | binary-lambda.109/mode=indep | gf2_109-lambda | per-element | 2.98 µs | 2.98 µs .. 2.99 µs | per elem |
| decode | binary-u.109/mode=batch,n=1024 | gf2_109-u | batch | 319 ns | 318 ns .. 319 ns | per elem |
| decode | binary-u.109/mode=indep | gf2_109-u | per-element | 3.04 µs | 3.04 µs .. 3.05 µs | per elem |
| decode | binary-w.109/mode=batch,n=1024 | gf2_109-w | batch | 240 ns | 239 ns .. 241 ns | per elem |
| decode | binary-w.109/mode=indep | gf2_109-w | per-element | 2.96 µs | 2.96 µs .. 2.97 µs | per elem |
| decode | binary.122/mode=batch,n=1024 | gf2_122 | batch | 187 ns | 186 ns .. 187 ns | per elem |
| decode | binary.122/mode=indep | gf2_122 | per-element | 607 ns | 606 ns .. 609 ns | per elem |
| decode | binary.122-gls/mode=batch,n=1024 | gf2_122-gls | batch | 162 ns | 162 ns .. 163 ns | per elem |
| decode | binary.122-gls/mode=indep | gf2_122-gls | per-element | 592 ns | 591 ns .. 594 ns | per elem |
| decode | binary-lambda.122-gls/mode=batch,n=1024 | gf2_122-gls-lambda | batch | 163 ns | 162 ns .. 163 ns | per elem |
| decode | binary-lambda.122-gls/mode=indep | gf2_122-gls-lambda | per-element | 599 ns | 595 ns .. 603 ns | per elem |
| decode | binary-u.122-gls/mode=batch,n=1024 | gf2_122-gls-u | batch | 187 ns | 186 ns .. 187 ns | per elem |
| decode | binary-u.122-gls/mode=indep | gf2_122-gls-u | per-element | 639 ns | 637 ns .. 641 ns | per elem |
| decode | binary-w.122-gls/mode=batch,n=1024 | gf2_122-gls-w | batch | 138 ns | 137 ns .. 138 ns | per elem |
| decode | binary-w.122-gls/mode=indep | gf2_122-gls-w | per-element | 591 ns | 589 ns .. 592 ns | per elem |
| decode | binary-lambda.122/mode=batch,n=1024 | gf2_122-lambda | batch | 186 ns | 186 ns .. 187 ns | per elem |
| decode | binary-lambda.122/mode=indep | gf2_122-lambda | per-element | 607 ns | 605 ns .. 608 ns | per elem |
| decode | binary-u.122/mode=batch,n=1024 | gf2_122-u | batch | 204 ns | 204 ns .. 205 ns | per elem |
| decode | binary-u.122/mode=indep | gf2_122-u | per-element | 676 ns | 674 ns .. 677 ns | per elem |
| decode | binary-w.122/mode=batch,n=1024 | gf2_122-w | batch | 153 ns | 153 ns .. 154 ns | per elem |
| decode | binary-w.122/mode=indep | gf2_122-w | per-element | 601 ns | 600 ns .. 603 ns | per elem |
| decode | binary.127/mode=batch,n=1024 | gf2_127 | batch | 88.0 ns | 87.8 ns .. 88.1 ns | per elem |
| decode | binary.127/mode=indep | gf2_127 | per-element | 446 ns | 445 ns .. 447 ns | per elem |
| decode | binary-lambda.127/mode=batch,n=1024 | gf2_127-lambda | batch | 87.9 ns | 87.8 ns .. 88.1 ns | per elem |
| decode | binary-lambda.127/mode=batch,n=64 | gf2_127-lambda | batch | 96.8 ns | 96.6 ns .. 97.0 ns | per elem |
| decode | binary-lambda.127/mode=batch,n=8 | gf2_127-lambda | batch | 149 ns | 149 ns .. 149 ns | per elem |
| decode | binary-lambda.127/mode=indep | gf2_127-lambda | per-element | 447 ns | 446 ns .. 447 ns | per elem |
| decode | binary-u.127/mode=batch,n=1024 | gf2_127-u | batch | 121 ns | 121 ns .. 121 ns | per elem |
| decode | binary-u.127/mode=batch,n=64 | gf2_127-u | batch | 131 ns | 130 ns .. 131 ns | per elem |
| decode | binary-u.127/mode=batch,n=8 | gf2_127-u | batch | 185 ns | 185 ns .. 185 ns | per elem |
| decode | binary-u.127/mode=indep | gf2_127-u | per-element | 479 ns | 478 ns .. 480 ns | per elem |
| decode | binary-w.127/mode=batch,n=1024 | gf2_127-w | batch | 89.2 ns | 89.0 ns .. 89.3 ns | per elem |
| decode | binary-w.127/mode=batch,n=64 | gf2_127-w | batch | 97.8 ns | 97.6 ns .. 97.9 ns | per elem |
| decode | binary-w.127/mode=batch,n=8 | gf2_127-w | batch | 153 ns | 152 ns .. 153 ns | per elem |
| decode | binary-w.127/mode=indep | gf2_127-w | per-element | 447 ns | 446 ns .. 448 ns | per elem |
| decode | edwards.127/mode=batch,n=1024 | edwards127 | batch | 485 ns | 483 ns .. 486 ns | per elem |
| decode | edwards.127/mode=batch,n=64 | edwards127 | batch | 487 ns | 486 ns .. 489 ns | per elem |
| decode | edwards.127/mode=batch,n=8 | edwards127 | batch | 493 ns | 492 ns .. 494 ns | per elem |
| decode | edwards.127/mode=indep | edwards127 | per-element | 485 ns | 484 ns .. 486 ns | per elem |
| decode | weier.127/mode=batch,n=1024 | weier127 | batch | 484 ns | 483 ns .. 485 ns | per elem |
| decode | weier.127/mode=batch,n=64 | weier127 | batch | 482 ns | 481 ns .. 483 ns | per elem |
| decode | weier.127/mode=batch,n=8 | weier127 | batch | 487 ns | 486 ns .. 488 ns | per elem |
| decode | weier.127/mode=indep | weier127 | per-element | 487 ns | 486 ns .. 489 ns | per elem |
| decode | weier-jacobian.127/mode=batch,n=1024 | weier127-jacobian | batch | 483 ns | 482 ns .. 484 ns | per elem |
| decode | weier-jacobian.127/mode=batch,n=64 | weier127-jacobian | batch | 482 ns | 481 ns .. 483 ns | per elem |
| decode | weier-jacobian.127/mode=batch,n=8 | weier127-jacobian | batch | 485 ns | 484 ns .. 486 ns | per elem |
| decode | weier-jacobian.127/mode=indep | weier127-jacobian | per-element | 484 ns | 483 ns .. 486 ns | per elem |
| normalize | gf2_109/normalize, batched | gf2_109 | batch | 305 ns | 303 ns .. 307 ns | per elem |
| normalize | gf2_122/normalize, batched | gf2_122 | batch | 202 ns | 202 ns .. 202 ns | per elem |
| normalize | gf2_122-gls/normalize, batched | gf2_122-gls | batch | 195 ns | 194 ns .. 195 ns | per elem |
| batch sum | gf2_109/batch affine (tree sum) | gf2_109 | batch | 241 ns | 240 ns .. 242 ns | per elem |
| batch sum | gf2_122/batch affine (tree sum) | gf2_122 | batch | 154 ns | 153 ns .. 155 ns | per elem |
| batch sum | gf2_127/batch affine (tree sum) | gf2_127 | batch | 82.9 ns | 82.7 ns .. 83.0 ns | per elem |
| batch sum | edwards127/batch montgomery affine (tree sum) | edwards127 | batch | 30.8 ns | 30.7 ns .. 30.8 ns | per elem |
| batch sum | weier127/batch affine (tree sum) | weier127 | batch | 29.1 ns | 29.1 ns .. 29.2 ns | per elem |
hash to curve
Figure
115 benchmarks
| operation | benchmark | family | mode | time | 95% CI | unit |
|---|---|---|---|---|---|---|
| hash to curve | binary.109/mode=batch,n=1024 | gf2_109 | batch | 518 ns | 517 ns .. 520 ns | per elem |
| hash to curve | binary.109/mode=indep | gf2_109 | per-element | 5.86 µs | 5.85 µs .. 5.87 µs | per elem |
| hash to curve | binary-lambda.109/mode=batch,n=1024 | gf2_109-lambda | batch | 517 ns | 516 ns .. 518 ns | per elem |
| hash to curve | binary-lambda.109/mode=indep | gf2_109-lambda | per-element | 5.87 µs | 5.86 µs .. 5.88 µs | per elem |
| hash to curve | binary-u.109/mode=batch,n=1024 | gf2_109-u | batch | 592 ns | 591 ns .. 593 ns | per elem |
| hash to curve | binary-u.109/mode=indep | gf2_109-u | per-element | 5.87 µs | 5.86 µs .. 5.88 µs | per elem |
| hash to curve | binary-w.109/mode=batch,n=1024 | gf2_109-w | batch | 516 ns | 515 ns .. 517 ns | per elem |
| hash to curve | binary-w.109/mode=indep | gf2_109-w | per-element | 5.78 µs | 5.77 µs .. 5.79 µs | per elem |
| hash to curve | binary.122/mode=batch,n=1024 | gf2_122 | batch | 350 ns | 349 ns .. 351 ns | per elem |
| hash to curve | binary.122/mode=indep | gf2_122 | per-element | 1.16 µs | 1.16 µs .. 1.17 µs | per elem |
| hash to curve | binary.122-gls/mode=batch,n=1024 | gf2_122-gls | batch | 309 ns | 308 ns .. 310 ns | per elem |
| hash to curve | binary.122-gls/mode=indep | gf2_122-gls | per-element | 1.20 µs | 1.20 µs .. 1.21 µs | per elem |
| hash to curve | binary-lambda.122-gls/mode=batch,n=1024 | gf2_122-gls-lambda | batch | 315 ns | 314 ns .. 315 ns | per elem |
| hash to curve | binary-lambda.122-gls/mode=indep | gf2_122-gls-lambda | per-element | 1.18 µs | 1.18 µs .. 1.18 µs | per elem |
| hash to curve | binary-u.122-gls/mode=batch,n=1024 | gf2_122-gls-u | batch | 359 ns | 358 ns .. 360 ns | per elem |
| hash to curve | binary-u.122-gls/mode=indep | gf2_122-gls-u | per-element | 1.25 µs | 1.25 µs .. 1.25 µs | per elem |
| hash to curve | binary-w.122-gls/mode=batch,n=1024 | gf2_122-gls-w | batch | 311 ns | 310 ns .. 311 ns | per elem |
| hash to curve | binary-w.122-gls/mode=indep | gf2_122-gls-w | per-element | 1.24 µs | 1.23 µs .. 1.26 µs | per elem |
| hash to curve | binary-lambda.122/mode=batch,n=1024 | gf2_122-lambda | batch | 350 ns | 348 ns .. 351 ns | per elem |
| hash to curve | binary-lambda.122/mode=indep | gf2_122-lambda | per-element | 1.18 µs | 1.18 µs .. 1.19 µs | per elem |
| hash to curve | binary-u.122/mode=batch,n=1024 | gf2_122-u | batch | 391 ns | 390 ns .. 392 ns | per elem |
| hash to curve | binary-u.122/mode=indep | gf2_122-u | per-element | 1.27 µs | 1.27 µs .. 1.28 µs | per elem |
| hash to curve | binary-w.122/mode=batch,n=1024 | gf2_122-w | batch | 328 ns | 327 ns .. 328 ns | per elem |
| hash to curve | binary-w.122/mode=indep | gf2_122-w | per-element | 1.21 µs | 1.21 µs .. 1.22 µs | per elem |
| hash to curve | binary.127/mode=batch,n=1024 | gf2_127 | batch | 196 ns | 195 ns .. 196 ns | per elem |
| hash to curve | binary.127/mode=indep | gf2_127 | per-element | 890 ns | 889 ns .. 891 ns | per elem |
| hash to curve | binary-lambda.127/mode=batch,n=1024 | gf2_127-lambda | batch | 196 ns | 196 ns .. 196 ns | per elem |
| hash to curve | binary-lambda.127/mode=batch,n=64 | gf2_127-lambda | batch | 247 ns | 247 ns .. 248 ns | per elem |
| hash to curve | binary-lambda.127/mode=batch,n=8 | gf2_127-lambda | batch | 430 ns | 430 ns .. 431 ns | per elem |
| hash to curve | binary-lambda.127/mode=indep | gf2_127-lambda | per-element | 880 ns | 877 ns .. 883 ns | per elem |
| hash to curve | binary-u.127/mode=batch,n=1024 | gf2_127-u | batch | 258 ns | 257 ns .. 258 ns | per elem |
| hash to curve | binary-u.127/mode=batch,n=64 | gf2_127-u | batch | 313 ns | 312 ns .. 313 ns | per elem |
| hash to curve | binary-u.127/mode=batch,n=8 | gf2_127-u | batch | 515 ns | 514 ns .. 516 ns | per elem |
| hash to curve | binary-u.127/mode=indep | gf2_127-u | per-element | 1.00 µs | 1.00 µs .. 1.00 µs | per elem |
| hash to curve | binary-w.127/mode=batch,n=1024 | gf2_127-w | batch | 221 ns | 220 ns .. 222 ns | per elem |
| hash to curve | binary-w.127/mode=batch,n=64 | gf2_127-w | batch | 278 ns | 278 ns .. 279 ns | per elem |
| hash to curve | binary-w.127/mode=batch,n=8 | gf2_127-w | batch | 467 ns | 465 ns .. 469 ns | per elem |
| hash to curve | binary-w.127/mode=indep | gf2_127-w | per-element | 975 ns | 973 ns .. 977 ns | per elem |
| hash to curve | edwards.127/mode=batch,n=1024 | edwards127 | batch | 1.06 µs | 1.06 µs .. 1.07 µs | per elem |
| hash to curve | edwards.127/mode=batch,n=64 | edwards127 | batch | 1.07 µs | 1.06 µs .. 1.07 µs | per elem |
| hash to curve | edwards.127/mode=batch,n=8 | edwards127 | batch | 1.07 µs | 1.07 µs .. 1.08 µs | per elem |
| hash to curve | edwards.127/mode=indep | edwards127 | per-element | 1.07 µs | 1.06 µs .. 1.07 µs | per elem |
| hash to curve | edwards127/edwards-native try-and-increment | edwards127 | per-element | 1.13 µs | 1.13 µs .. 1.14 µs | per elem |
| hash to curve | weier.127/mode=batch,n=1024 | weier127 | batch | 1.03 µs | 1.03 µs .. 1.03 µs | per elem |
| hash to curve | weier.127/mode=batch,n=64 | weier127 | batch | 1.04 µs | 1.03 µs .. 1.04 µs | per elem |
| hash to curve | weier.127/mode=batch,n=8 | weier127 | batch | 1.03 µs | 1.03 µs .. 1.04 µs | per elem |
| hash to curve | weier.127/mode=indep | weier127 | per-element | 1.03 µs | 1.03 µs .. 1.03 µs | per elem |
| hash to curve | weier-jacobian.127/mode=batch,n=1024 | weier127-jacobian | batch | 1.00 µs | 1.00 µs .. 1.01 µs | per elem |
| hash to curve | weier-jacobian.127/mode=batch,n=64 | weier127-jacobian | batch | 1.03 µs | 1.03 µs .. 1.03 µs | per elem |
| hash to curve | weier-jacobian.127/mode=batch,n=8 | weier127-jacobian | batch | 1.03 µs | 1.03 µs .. 1.03 µs | per elem |
| hash to curve | weier-jacobian.127/mode=indep | weier127-jacobian | per-element | 1.03 µs | 1.03 µs .. 1.03 µs | per elem |
| ID to addend | binary-lambda.127/proj=fp127,h2c=pornin-addend,mode=batch,n=1024 | gf2_127-lambda | batch | 162 ns | 162 ns .. 162 ns | per elem |
| ID to addend | binary-lambda.127/proj=fp127,h2c=ti,mode=batch,n=1024 | gf2_127-lambda | batch | 222 ns | 221 ns .. 222 ns | per elem |
| ID to addend | binary-lambda.127/proj=fp127,h2c=ti-addend,mode=batch,n=1024 | gf2_127-lambda | batch | 147 ns | 147 ns .. 148 ns | per elem |
| ID to addend | binary-lambda.127/proj=fp130,h2c=pornin-addend,mode=batch,n=1024 | gf2_127-lambda | batch | 167 ns | 166 ns .. 167 ns | per elem |
| ID to addend | binary-lambda.127/proj=fp130,h2c=ti,mode=batch,n=1024 | gf2_127-lambda | batch | 238 ns | 238 ns .. 239 ns | per elem |
| ID to addend | binary-lambda.127/proj=fp130,h2c=ti-addend,mode=batch,n=1024 | gf2_127-lambda | batch | 165 ns | 165 ns .. 166 ns | per elem |
| ID to addend | binary-lambda.127/proj=gf2_127,h2c=pornin-addend,mode=batch,n=1024 | gf2_127-lambda | batch | 188 ns | 187 ns .. 188 ns | per elem |
| ID to addend | binary-lambda.127/proj=gf2_127,h2c=ti,mode=batch,n=1024 | gf2_127-lambda | batch | 294 ns | 293 ns .. 294 ns | per elem |
| ID to addend | binary-lambda.127/proj=gf2_127,h2c=ti-addend,mode=batch,n=1024 | gf2_127-lambda | batch | 220 ns | 219 ns .. 220 ns | per elem |
| ID to addend | binary-lambda.127/proj=none,h2c=pornin-addend,mode=batch,n=1024 | gf2_127-lambda | batch | 183 ns | 183 ns .. 184 ns | per elem |
| ID to addend | binary-lambda.127/proj=none,h2c=ti,mode=batch,n=1024 | gf2_127-lambda | batch | 250 ns | 249 ns .. 250 ns | per elem |
| ID to addend | binary-lambda.127/proj=none,h2c=ti-addend,mode=batch,n=1024 | gf2_127-lambda | batch | 176 ns | 176 ns .. 177 ns | per elem |
| ID to addend | binary-u.127/proj=fp127,h2c=pornin-addend,mode=batch,n=1024 | gf2_127-u | batch | 191 ns | 190 ns .. 191 ns | per elem |
| ID to addend | binary-u.127/proj=fp127,h2c=ti,mode=batch,n=1024 | gf2_127-u | batch | 209 ns | 208 ns .. 209 ns | per elem |
| ID to addend | binary-u.127/proj=fp130,h2c=pornin-addend,mode=batch,n=1024 | gf2_127-u | batch | 195 ns | 195 ns .. 196 ns | per elem |
| ID to addend | binary-u.127/proj=fp130,h2c=ti,mode=batch,n=1024 | gf2_127-u | batch | 223 ns | 222 ns .. 223 ns | per elem |
| ID to addend | binary-u.127/proj=gf2_127,h2c=pornin-addend,mode=batch,n=1024 | gf2_127-u | batch | 217 ns | 217 ns .. 217 ns | per elem |
| ID to addend | binary-u.127/proj=gf2_127,h2c=ti,mode=batch,n=1024 | gf2_127-u | batch | 279 ns | 278 ns .. 279 ns | per elem |
| ID to addend | binary-u.127/proj=none,h2c=pornin-addend,mode=batch,n=1024 | gf2_127-u | batch | 212 ns | 211 ns .. 212 ns | per elem |
| ID to addend | binary-u.127/proj=none,h2c=ti,mode=batch,n=1024 | gf2_127-u | batch | 246 ns | 246 ns .. 247 ns | per elem |
| ID to addend | binary-w.127/proj=fp127,h2c=pornin-addend,mode=batch,n=1024 | gf2_127-w | batch | 162 ns | 162 ns .. 162 ns | per elem |
| ID to addend | binary-w.127/proj=fp127,h2c=ti,mode=batch,n=1024 | gf2_127-w | batch | 175 ns | 174 ns .. 175 ns | per elem |
| ID to addend | binary-w.127/proj=fp130,h2c=pornin-addend,mode=batch,n=1024 | gf2_127-w | batch | 167 ns | 166 ns .. 167 ns | per elem |
| ID to addend | binary-w.127/proj=fp130,h2c=ti,mode=batch,n=1024 | gf2_127-w | batch | 188 ns | 188 ns .. 189 ns | per elem |
| ID to addend | binary-w.127/proj=gf2_127,h2c=pornin-addend,mode=batch,n=1024 | gf2_127-w | batch | 188 ns | 188 ns .. 189 ns | per elem |
| ID to addend | binary-w.127/proj=gf2_127,h2c=ti,mode=batch,n=1024 | gf2_127-w | batch | 242 ns | 241 ns .. 243 ns | per elem |
| ID to addend | binary-w.127/proj=none,h2c=pornin-addend,mode=batch,n=1024 | gf2_127-w | batch | 183 ns | 183 ns .. 184 ns | per elem |
| ID to addend | binary-w.127/proj=none,h2c=ti,mode=batch,n=1024 | gf2_127-w | batch | 210 ns | 209 ns .. 211 ns | per elem |
| ID to addend | edwards.127/proj=fp127,h2c=elligator2,mode=batch,n=1024 | edwards127 | batch | 1.84 µs | 1.84 µs .. 1.85 µs | per elem |
| ID to addend | edwards.127/proj=fp127,h2c=ti,mode=batch,n=1024 | edwards127 | batch | 1.05 µs | 1.05 µs .. 1.05 µs | per elem |
| ID to addend | edwards.127/proj=fp127,h2c=ti-addend,mode=batch,n=1024 | edwards127 | batch | 1.13 µs | 1.13 µs .. 1.14 µs | per elem |
| ID to addend | edwards.127/proj=fp130,h2c=elligator2,mode=batch,n=1024 | edwards127 | batch | 1.84 µs | 1.83 µs .. 1.85 µs | per elem |
| ID to addend | edwards.127/proj=fp130,h2c=ti,mode=batch,n=1024 | edwards127 | batch | 1.05 µs | 1.04 µs .. 1.05 µs | per elem |
| ID to addend | edwards.127/proj=fp130,h2c=ti-addend,mode=batch,n=1024 | edwards127 | batch | 1.12 µs | 1.12 µs .. 1.13 µs | per elem |
| ID to addend | edwards.127/proj=gf2_127,h2c=elligator2,mode=batch,n=1024 | edwards127 | batch | 1.87 µs | 1.87 µs .. 1.87 µs | per elem |
| ID to addend | edwards.127/proj=gf2_127,h2c=ti,mode=batch,n=1024 | edwards127 | batch | 1.11 µs | 1.11 µs .. 1.12 µs | per elem |
| ID to addend | edwards.127/proj=gf2_127,h2c=ti-addend,mode=batch,n=1024 | edwards127 | batch | 1.17 µs | 1.17 µs .. 1.18 µs | per elem |
| ID to addend | edwards.127/proj=none,h2c=elligator2,mode=batch,n=1024 | edwards127 | batch | 1.89 µs | 1.89 µs .. 1.90 µs | per elem |
| ID to addend | edwards.127/proj=none,h2c=ti,mode=batch,n=1024 | edwards127 | batch | 1.10 µs | 1.10 µs .. 1.11 µs | per elem |
| ID to addend | edwards.127/proj=none,h2c=ti-addend,mode=batch,n=1024 | edwards127 | batch | 1.18 µs | 1.17 µs .. 1.18 µs | per elem |
| ID to addend | weier.127/proj=fp127,h2c=sswu,mode=batch,n=1024 | weier127 | batch | 1.09 µs | 1.09 µs .. 1.09 µs | per elem |
| ID to addend | weier.127/proj=fp127,h2c=ti,mode=batch,n=1024 | weier127 | batch | 965 ns | 963 ns .. 967 ns | per elem |
| ID to addend | weier.127/proj=fp130,h2c=sswu,mode=batch,n=1024 | weier127 | batch | 1.10 µs | 1.09 µs .. 1.10 µs | per elem |
| ID to addend | weier.127/proj=fp130,h2c=ti,mode=batch,n=1024 | weier127 | batch | 1.03 µs | 1.03 µs .. 1.03 µs | per elem |
| ID to addend | weier.127/proj=gf2_127,h2c=sswu,mode=batch,n=1024 | weier127 | batch | 1.12 µs | 1.12 µs .. 1.13 µs | per elem |
| ID to addend | weier.127/proj=gf2_127,h2c=ti,mode=batch,n=1024 | weier127 | batch | 1.08 µs | 1.08 µs .. 1.08 µs | per elem |
| ID to addend | weier.127/proj=none,h2c=sswu,mode=batch,n=1024 | weier127 | batch | 1.12 µs | 1.12 µs .. 1.13 µs | per elem |
| ID to addend | weier.127/proj=none,h2c=ti,mode=batch,n=1024 | weier127 | batch | 1.01 µs | 1.01 µs .. 1.01 µs | per elem |
| ID to addend | weier-jacobian.127/proj=fp127,h2c=sswu,mode=batch,n=1024 | weier127-jacobian | batch | 1.12 µs | 1.11 µs .. 1.13 µs | per elem |
| ID to addend | weier-jacobian.127/proj=fp127,h2c=ti,mode=batch,n=1024 | weier127-jacobian | batch | 987 ns | 984 ns .. 990 ns | per elem |
| ID to addend | weier-jacobian.127/proj=fp130,h2c=sswu,mode=batch,n=1024 | weier127-jacobian | batch | 1.09 µs | 1.09 µs .. 1.10 µs | per elem |
| ID to addend | weier-jacobian.127/proj=fp130,h2c=ti,mode=batch,n=1024 | weier127-jacobian | batch | 1.03 µs | 1.02 µs .. 1.03 µs | per elem |
| ID to addend | weier-jacobian.127/proj=gf2_127,h2c=sswu,mode=batch,n=1024 | weier127-jacobian | batch | 1.12 µs | 1.11 µs .. 1.12 µs | per elem |
| ID to addend | weier-jacobian.127/proj=gf2_127,h2c=ti,mode=batch,n=1024 | weier127-jacobian | batch | 1.08 µs | 1.07 µs .. 1.08 µs | per elem |
| ID to addend | weier-jacobian.127/proj=none,h2c=sswu,mode=batch,n=1024 | weier127-jacobian | batch | 1.12 µs | 1.11 µs .. 1.12 µs | per elem |
| ID to addend | weier-jacobian.127/proj=none,h2c=ti,mode=batch,n=1024 | weier127-jacobian | batch | 1.01 µs | 1.01 µs .. 1.01 µs | per elem |
| hash to addend | gf2_109-lambda/try-and-increment to (x, λ) | gf2_109-lambda | per-element | 5.85 µs | 5.83 µs .. 5.86 µs | per elem |
| hash to addend | gf2_109-lambda/try-and-increment to (x, λ), batched | gf2_109-lambda | batch | 511 ns | 510 ns .. 511 ns | per elem |
| hash to addend | gf2_122-gls-lambda/try-and-increment to (x, λ) | gf2_122-gls-lambda | per-element | 1.16 µs | 1.16 µs .. 1.16 µs | per elem |
| hash to addend | gf2_122-gls-lambda/try-and-increment to (x, λ), batched | gf2_122-gls-lambda | batch | 327 ns | 314 ns .. 341 ns | per elem |
| hash to addend | gf2_122-lambda/try-and-increment to (x, λ) | gf2_122-lambda | per-element | 1.18 µs | 1.17 µs .. 1.18 µs | per elem |
| hash to addend | gf2_122-lambda/try-and-increment to (x, λ), batched | gf2_122-lambda | batch | 361 ns | 349 ns .. 376 ns | per elem |
| hash to addend | gf2_127-lambda/try-and-increment to (x, λ) | gf2_127-lambda | per-element | 870 ns | 869 ns .. 872 ns | per elem |
| hash to addend | gf2_127-lambda/try-and-increment to (x, λ), batched | gf2_127-lambda | batch | 179 ns | 179 ns .. 180 ns | per elem |
comparison maps
Maps from digests to points other than try-and-increment, timed beside it: Pornin’s map on binary curves, Elligator 2 on Edwards curves and simplified SWU on Weierstrass curves, once, and Pornin’s map twice with the points summed; and Pornin’s map taken straight to the unscaled or -affine addend, where it stands for a hash and a prepare together, as try-and-increment to does. One map reaches at most points of , not uniformly. The checksum needs relations to be hard to find among hash outputs within the subset of the group that the hash reaches, not outputs uniform on the group (docs/problem.md, Adversary). Insertion estimates include each measured map with compatible preparation and addition; Pornin already returns an extended binary addend.
Figure
35 benchmarks
| operation | benchmark | family | mode | time | 95% CI | unit |
|---|---|---|---|---|---|---|
| one map to addend | gf2_109-lambda/pornin map x1 to (x, λ) | gf2_109-lambda | per-element | 3.28 µs | 3.27 µs .. 3.28 µs | per elem |
| one map to addend | gf2_109-lambda/pornin map x1 to (x, λ), batched | gf2_109-lambda | batch | 521 ns | 520 ns .. 522 ns | per elem |
| one map to addend | gf2_109-u/pornin map x1 to (u, v) | gf2_109-u | per-element | 3.34 µs | 3.33 µs .. 3.34 µs | per elem |
| one map to addend | gf2_109-u/pornin map x1 to (u, v), batched | gf2_109-u | batch | 593 ns | 591 ns .. 594 ns | per elem |
| one map to addend | gf2_109-w/pornin map x1 to (x, λ) | gf2_109-w | per-element | 3.27 µs | 3.27 µs .. 3.28 µs | per elem |
| one map to addend | gf2_109-w/pornin map x1 to (x, λ), batched | gf2_109-w | batch | 522 ns | 522 ns .. 523 ns | per elem |
| one map to addend | gf2_122-gls-lambda/pornin map x1 to (x, λ) | gf2_122-gls-lambda | per-element | 788 ns | 787 ns .. 790 ns | per elem |
| one map to addend | gf2_122-gls-lambda/pornin map x1 to (x, λ), batched | gf2_122-gls-lambda | batch | 404 ns | 382 ns .. 425 ns | per elem |
| one map to addend | gf2_122-gls-u/pornin map x1 to (u, v) | gf2_122-gls-u | per-element | 843 ns | 841 ns .. 844 ns | per elem |
| one map to addend | gf2_122-gls-u/pornin map x1 to (u, v), batched | gf2_122-gls-u | batch | 593 ns | 585 ns .. 599 ns | per elem |
| one map to addend | gf2_122-gls-w/pornin map x1 to (x, λ) | gf2_122-gls-w | per-element | 791 ns | 790 ns .. 793 ns | per elem |
| one map to addend | gf2_122-gls-w/pornin map x1 to (x, λ), batched | gf2_122-gls-w | batch | 404 ns | 383 ns .. 424 ns | per elem |
| one map to addend | gf2_122-lambda/pornin map x1 to (x, λ) | gf2_122-lambda | per-element | 801 ns | 799 ns .. 803 ns | per elem |
| one map to addend | gf2_122-lambda/pornin map x1 to (x, λ), batched | gf2_122-lambda | batch | 428 ns | 402 ns .. 452 ns | per elem |
| one map to addend | gf2_122-u/pornin map x1 to (u, v) | gf2_122-u | per-element | 857 ns | 855 ns .. 858 ns | per elem |
| one map to addend | gf2_122-u/pornin map x1 to (u, v), batched | gf2_122-u | batch | 622 ns | 603 ns .. 638 ns | per elem |
| one map to addend | gf2_122-w/pornin map x1 to (x, λ) | gf2_122-w | per-element | 799 ns | 797 ns .. 800 ns | per elem |
| one map to addend | gf2_122-w/pornin map x1 to (x, λ), batched | gf2_122-w | batch | 429 ns | 403 ns .. 454 ns | per elem |
| one map to addend | gf2_127-lambda/pornin map x1 to (x, λ) | gf2_127-lambda | per-element | 567 ns | 566 ns .. 568 ns | per elem |
| one map to addend | gf2_127-lambda/pornin map x1 to (x, λ), batched | gf2_127-lambda | batch | 184 ns | 184 ns .. 184 ns | per elem |
| one map to addend | gf2_127-u/pornin map x1 to (u, v) | gf2_127-u | per-element | 598 ns | 597 ns .. 599 ns | per elem |
| one map to addend | gf2_127-u/pornin map x1 to (u, v), batched | gf2_127-u | batch | 213 ns | 212 ns .. 213 ns | per elem |
| one map to addend | gf2_127-w/pornin map x1 to (x, λ) | gf2_127-w | per-element | 569 ns | 568 ns .. 569 ns | per elem |
| one map to addend | gf2_127-w/pornin map x1 to (x, λ), batched | gf2_127-w | batch | 184 ns | 184 ns .. 185 ns | per elem |
| one map | gf2_109/pornin map x1 | gf2_109 | per-element | 3.39 µs | 3.39 µs .. 3.40 µs | per elem |
| one map | gf2_109/pornin map x1, batched | gf2_109 | batch | 636 ns | 635 ns .. 637 ns | per elem |
| one map | gf2_122/pornin map x1 | gf2_122 | per-element | 897 ns | 894 ns .. 899 ns | per elem |
| one map | gf2_122/pornin map x1, batched | gf2_122 | batch | 510 ns | 488 ns .. 539 ns | per elem |
| one map | gf2_122-gls/pornin map x1 | gf2_122-gls | per-element | 865 ns | 864 ns .. 867 ns | per elem |
| one map | gf2_122-gls/pornin map x1, batched | gf2_122-gls | batch | 410 ns | 409 ns .. 410 ns | per elem |
| one map | gf2_127/pornin map x1 | gf2_127 | per-element | 619 ns | 617 ns .. 620 ns | per elem |
| one map | gf2_127/pornin map x1, batched | gf2_127 | batch | 232 ns | 231 ns .. 232 ns | per elem |
| one map | edwards127/elligator2 x1 | edwards127 | per-element | 1.32 µs | 1.32 µs .. 1.32 µs | per elem |
| one map | weier127/sswu x1 | weier127 | per-element | 1.12 µs | 1.12 µs .. 1.13 µs | per elem |
| two maps summed | gf2_127/pornin map x2 | gf2_127 | per-element | 1.35 µs | 1.35 µs .. 1.36 µs | per elem |
RIBLT workload
Ratios against Go riblt-ecmh also include the mapping generator and the port to Rust, which are not attributed to this project (Workload, Comparison with the reference implementations).
Figure
306 benchmarks
| operation | benchmark | family | mode | time | 95% CI | unit |
|---|---|---|---|---|---|---|
| encode (hash + cells) | xor-sha256.64/m=12150,n=3500 | xor | per-element | 195 ns | 195 ns .. 196 ns | per elem |
| encode (hash + cells) | xor-sha256.64/m=1350,n=3500 | xor | per-element | 163 ns | 163 ns .. 164 ns | per elem |
| encode (hash + cells) | xor-sha256.64/m=150,n=3500 | xor | per-element | 138 ns | 138 ns .. 138 ns | per elem |
| encode (hash + cells) | xor-sha256.64/m=20,n=3500 | xor | per-element | 114 ns | 114 ns .. 115 ns | per elem |
| encode (hash + cells) | xor-sha256.64/m=5,n=3500 | xor | per-element | 96.2 ns | 95.9 ns .. 96.4 ns | per elem |
| encode (hash + cells) | xor-siphash.64/m=12150,n=3500 | xor-siphash | per-element | 185 ns | 184 ns .. 185 ns | per elem |
| encode (hash + cells) | xor-siphash.64/m=12150,n=3500,map=mcg64 | xor-siphash | per-element | 181 ns | 180 ns .. 181 ns | per elem |
| encode (hash + cells) | xor-siphash.64/m=1350,n=3500 | xor-siphash | per-element | 153 ns | 153 ns .. 154 ns | per elem |
| encode (hash + cells) | xor-siphash.64/m=1350,n=3500,map=mcg64 | xor-siphash | per-element | 149 ns | 149 ns .. 150 ns | per elem |
| encode (hash + cells) | xor-siphash.64/m=150,n=3500 | xor-siphash | per-element | 127 ns | 127 ns .. 128 ns | per elem |
| encode (hash + cells) | xor-siphash.64/m=150,n=3500,map=mcg64 | xor-siphash | per-element | 123 ns | 123 ns .. 123 ns | per elem |
| encode (hash + cells) | xor-siphash.64/m=20,n=3500 | xor-siphash | per-element | 103 ns | 103 ns .. 104 ns | per elem |
| encode (hash + cells) | xor-siphash.64/m=20,n=3500,map=mcg64 | xor-siphash | per-element | 98.6 ns | 98.3 ns .. 98.9 ns | per elem |
| encode (hash + cells) | xor-siphash.64/m=5,n=3500 | xor-siphash | per-element | 85.3 ns | 85.1 ns .. 85.5 ns | per elem |
| encode (hash + cells) | xor-siphash.64/m=5,n=3500,map=mcg64 | xor-siphash | per-element | 81.5 ns | 81.3 ns .. 81.7 ns | per elem |
| encode (hash + cells) | binary.109/m=1350,n=3500,h2c=ti | gf2_109 | per-element | 6.06 µs | 6.05 µs .. 6.07 µs | per elem |
| encode (hash + cells) | binary-lambda.109/m=1350,n=3500,h2c=ti-addend | gf2_109-lambda | per-element | 4.93 µs | 4.92 µs .. 4.94 µs | per elem |
| encode (hash + cells) | binary-u.109/m=1350,n=3500,h2c=pornin-addend | gf2_109-u | per-element | 4.53 µs | 4.52 µs .. 4.54 µs | per elem |
| encode (hash + cells) | binary-w.109/m=1350,n=3500,h2c=ti | gf2_109-w | per-element | 4.95 µs | 4.94 µs .. 4.96 µs | per elem |
| encode (hash + cells) | binary.122/m=1350,n=3500,h2c=ti | gf2_122 | per-element | 4.12 µs | 4.11 µs .. 4.12 µs | per elem |
| encode (hash + cells) | binary.122-gls/m=1350,n=3500,h2c=ti | gf2_122-gls | per-element | 3.76 µs | 3.75 µs .. 3.76 µs | per elem |
| encode (hash + cells) | binary-lambda.122-gls/m=1350,n=3500,h2c=ti-addend | gf2_122-gls-lambda | per-element | 3.23 µs | 3.22 µs .. 3.24 µs | per elem |
| encode (hash + cells) | binary-u.122-gls/m=1350,n=3500,h2c=ti | gf2_122-gls-u | per-element | 2.90 µs | 2.90 µs .. 2.91 µs | per elem |
| encode (hash + cells) | binary-w.122-gls/m=1350,n=3500,h2c=ti | gf2_122-gls-w | per-element | 3.23 µs | 3.23 µs .. 3.24 µs | per elem |
| encode (hash + cells) | binary-lambda.122/m=1350,n=3500,h2c=ti-addend | gf2_122-lambda | per-element | 3.29 µs | 3.28 µs .. 3.29 µs | per elem |
| encode (hash + cells) | binary-u.122/m=1350,n=3500,h2c=ti | gf2_122-u | per-element | 2.94 µs | 2.93 µs .. 2.95 µs | per elem |
| encode (hash + cells) | binary-w.122/m=1350,n=3500,h2c=ti | gf2_122-w | per-element | 3.27 µs | 3.26 µs .. 3.27 µs | per elem |
| encode (hash + cells) | binary.127/m=12150,n=3500,h2c=ti,map=mcg64 | gf2_127 | per-element | 3.19 µs | 3.19 µs .. 3.19 µs | per elem |
| encode (hash + cells) | binary.127/m=1350,n=3500,h2c=ti | gf2_127 | per-element | 2.43 µs | 2.43 µs .. 2.44 µs | per elem |
| encode (hash + cells) | binary.127/m=1350,n=3500,h2c=ti,map=mcg64 | gf2_127 | per-element | 2.46 µs | 2.45 µs .. 2.46 µs | per elem |
| encode (hash + cells) | binary.127/m=150,n=3500,h2c=ti,map=mcg64 | gf2_127 | per-element | 1.75 µs | 1.75 µs .. 1.75 µs | per elem |
| encode (hash + cells) | binary.127/m=20,n=3500,h2c=ti,map=mcg64 | gf2_127 | per-element | 1.13 µs | 1.12 µs .. 1.13 µs | per elem |
| encode (hash + cells) | binary.127/m=5,n=3500,h2c=ti,map=mcg64 | gf2_127 | per-element | 738 ns | 737 ns .. 740 ns | per elem |
| encode (hash + cells) | binary-lambda.127/m=12150,n=3500,h2c=ti-addend | gf2_127-lambda | per-element | 2.40 µs | 2.40 µs .. 2.41 µs | per elem |
| encode (hash + cells) | binary-lambda.127/m=12150,n=3500,h2c=ti-addend,proj=fp127,mapproj=fp127 | gf2_127-lambda | per-element | 2.29 µs | 2.28 µs .. 2.30 µs | per elem |
| encode (hash + cells) | binary-lambda.127/m=1350,n=3500,h2c=ti-addend | gf2_127-lambda | per-element | 2.04 µs | 2.03 µs .. 2.04 µs | per elem |
| encode (hash + cells) | binary-lambda.127/m=1350,n=3500,h2c=ti-addend,proj=fp127,mapproj=fp127 | gf2_127-lambda | per-element | 1.98 µs | 1.97 µs .. 1.99 µs | per elem |
| encode (hash + cells) | binary-lambda.127/m=5,n=3500,h2c=ti-addend | gf2_127-lambda | per-element | 629 ns | 627 ns .. 630 ns | per elem |
| encode (hash + cells) | binary-lambda.127/m=5,n=3500,h2c=ti-addend,proj=fp127,mapproj=fp127 | gf2_127-lambda | per-element | 571 ns | 569 ns .. 572 ns | per elem |
| encode (hash + cells) | binary-u.127/m=12150,n=3500,h2c=pornin-addend | gf2_127-u | per-element | 2.47 µs | 2.46 µs .. 2.47 µs | per elem |
| encode (hash + cells) | binary-u.127/m=12150,n=3500,h2c=pornin-addend,proj=fp127,mapproj=fp127 | gf2_127-u | per-element | 2.45 µs | 2.45 µs .. 2.45 µs | per elem |
| encode (hash + cells) | binary-u.127/m=1350,n=3500,h2c=pornin-addend | gf2_127-u | per-element | 1.90 µs | 1.89 µs .. 1.91 µs | per elem |
| encode (hash + cells) | binary-u.127/m=1350,n=3500,h2c=pornin-addend,proj=fp127,mapproj=fp127 | gf2_127-u | per-element | 1.89 µs | 1.88 µs .. 1.89 µs | per elem |
| encode (hash + cells) | binary-u.127/m=5,n=3500,h2c=pornin-addend | gf2_127-u | per-element | 615 ns | 614 ns .. 617 ns | per elem |
| encode (hash + cells) | binary-u.127/m=5,n=3500,h2c=pornin-addend,proj=fp127,mapproj=fp127 | gf2_127-u | per-element | 568 ns | 567 ns .. 569 ns | per elem |
| encode (hash + cells) | binary-w.127/m=12150,n=3500,h2c=pornin-addend | gf2_127-w | per-element | 2.40 µs | 2.40 µs .. 2.41 µs | per elem |
| encode (hash + cells) | binary-w.127/m=12150,n=3500,h2c=pornin-addend,proj=fp127,mapproj=fp127 | gf2_127-w | per-element | 2.37 µs | 2.36 µs .. 2.37 µs | per elem |
| encode (hash + cells) | binary-w.127/m=1350,n=3500,h2c=pornin-addend | gf2_127-w | per-element | 2.04 µs | 2.04 µs .. 2.05 µs | per elem |
| encode (hash + cells) | binary-w.127/m=1350,n=3500,h2c=pornin-addend,proj=fp127,mapproj=fp127 | gf2_127-w | per-element | 2.01 µs | 2.01 µs .. 2.02 µs | per elem |
| encode (hash + cells) | binary-w.127/m=5,n=3500,h2c=pornin-addend | gf2_127-w | per-element | 632 ns | 631 ns .. 634 ns | per elem |
| encode (hash + cells) | binary-w.127/m=5,n=3500,h2c=pornin-addend,proj=fp127,mapproj=fp127 | gf2_127-w | per-element | 584 ns | 583 ns .. 585 ns | per elem |
| encode (hash + cells) | edwards.127/m=12150,n=3500,h2c=ti | edwards127 | per-element | 1.53 µs | 1.53 µs .. 1.53 µs | per elem |
| encode (hash + cells) | edwards.127/m=12150,n=3500,h2c=ti,proj=fp130,mapproj=fp127 | edwards127 | per-element | 1.47 µs | 1.47 µs .. 1.47 µs | per elem |
| encode (hash + cells) | edwards.127/m=1350,n=3500,h2c=ti | edwards127 | per-element | 1.42 µs | 1.41 µs .. 1.42 µs | per elem |
| encode (hash + cells) | edwards.127/m=1350,n=3500,h2c=ti,proj=fp130,mapproj=fp127 | edwards127 | per-element | 1.35 µs | 1.35 µs .. 1.36 µs | per elem |
| encode (hash + cells) | edwards.127/m=150,n=3500,h2c=ti | edwards127 | per-element | 1.32 µs | 1.31 µs .. 1.32 µs | per elem |
| encode (hash + cells) | edwards.127/m=20,n=3500,h2c=ti | edwards127 | per-element | 1.24 µs | 1.24 µs .. 1.24 µs | per elem |
| encode (hash + cells) | edwards.127/m=5,n=3500,h2c=ti | edwards127 | per-element | 1.18 µs | 1.18 µs .. 1.19 µs | per elem |
| encode (hash + cells) | edwards.127/m=5,n=3500,h2c=ti,proj=fp130,mapproj=fp127 | edwards127 | per-element | 1.10 µs | 1.10 µs .. 1.10 µs | per elem |
| encode (hash + cells) | weier.127/m=12150,n=3500,h2c=ti | weier127 | per-element | 1.90 µs | 1.90 µs .. 1.91 µs | per elem |
| encode (hash + cells) | weier.127/m=12150,n=3500,h2c=ti,proj=fp127,mapproj=fp127 | weier127 | per-element | 1.84 µs | 1.83 µs .. 1.84 µs | per elem |
| encode (hash + cells) | weier.127/m=1350,n=3500,h2c=ti | weier127 | per-element | 1.68 µs | 1.68 µs .. 1.69 µs | per elem |
| encode (hash + cells) | weier.127/m=1350,n=3500,h2c=ti,proj=fp127,mapproj=fp127 | weier127 | per-element | 1.61 µs | 1.61 µs .. 1.62 µs | per elem |
| encode (hash + cells) | weier.127/m=5,n=3500,h2c=ti | weier127 | per-element | 1.20 µs | 1.20 µs .. 1.21 µs | per elem |
| encode (hash + cells) | weier.127/m=5,n=3500,h2c=ti,proj=fp127,mapproj=fp127 | weier127 | per-element | 1.12 µs | 1.12 µs .. 1.13 µs | per elem |
| encode (hash + cells) | weier-jacobian.127/m=12150,n=3500,h2c=ti | weier127-jacobian | per-element | 1.68 µs | 1.68 µs .. 1.69 µs | per elem |
| encode (hash + cells) | weier-jacobian.127/m=12150,n=3500,h2c=ti,proj=fp127,mapproj=fp127 | weier127-jacobian | per-element | 1.58 µs | 1.57 µs .. 1.58 µs | per elem |
| encode (hash + cells) | weier-jacobian.127/m=1350,n=3500,h2c=ti | weier127-jacobian | per-element | 1.56 µs | 1.56 µs .. 1.57 µs | per elem |
| encode (hash + cells) | weier-jacobian.127/m=1350,n=3500,h2c=ti,proj=fp127,mapproj=fp127 | weier127-jacobian | per-element | 1.49 µs | 1.49 µs .. 1.49 µs | per elem |
| encode (hash + cells) | weier-jacobian.127/m=150,n=3500,h2c=ti | weier127-jacobian | per-element | 1.40 µs | 1.40 µs .. 1.41 µs | per elem |
| encode (hash + cells) | weier-jacobian.127/m=20,n=3500,h2c=ti | weier127-jacobian | per-element | 1.26 µs | 1.26 µs .. 1.27 µs | per elem |
| encode (hash + cells) | weier-jacobian.127/m=5,n=3500,h2c=ti | weier127-jacobian | per-element | 1.17 µs | 1.17 µs .. 1.18 µs | per elem |
| encode (hash + cells) | weier-jacobian.127/m=5,n=3500,h2c=ti,proj=fp127,mapproj=fp127 | weier127-jacobian | per-element | 1.09 µs | 1.09 µs .. 1.10 µs | per elem |
| cell updates | xor-sha256.64/m=1350,n=3500 | xor | per-element | 139 ns | 139 ns .. 139 ns | per elem |
| cell updates | xor-siphash.64/m=1350,n=3500 | xor-siphash | per-element | 139 ns | 139 ns .. 139 ns | per elem |
| cell updates | binary.109/m=1350,n=3500 | gf2_109 | per-element | 5.46 µs | 5.45 µs .. 5.47 µs | per elem |
| cell updates | binary-lambda.109/m=1350,n=3500 | gf2_109-lambda | per-element | 4.45 µs | 4.45 µs .. 4.46 µs | per elem |
| cell updates | binary-u.109/m=1350,n=3500 | gf2_109-u | per-element | 3.95 µs | 3.94 µs .. 3.96 µs | per elem |
| cell updates | binary-w.109/m=1350,n=3500 | gf2_109-w | per-element | 4.43 µs | 4.43 µs .. 4.44 µs | per elem |
| cell updates | binary.122/m=1350,n=3500 | gf2_122 | per-element | 3.68 µs | 3.67 µs .. 3.69 µs | per elem |
| cell updates | binary.122-gls/m=1350,n=3500 | gf2_122-gls | per-element | 3.39 µs | 3.38 µs .. 3.40 µs | per elem |
| cell updates | binary-lambda.122-gls/m=1350,n=3500 | gf2_122-gls-lambda | per-element | 2.94 µs | 2.93 µs .. 2.94 µs | per elem |
| cell updates | binary-u.122-gls/m=1350,n=3500 | gf2_122-gls-u | per-element | 2.55 µs | 2.54 µs .. 2.55 µs | per elem |
| cell updates | binary-w.122-gls/m=1350,n=3500 | gf2_122-gls-w | per-element | 2.92 µs | 2.92 µs .. 2.93 µs | per elem |
| cell updates | binary-lambda.122/m=1350,n=3500 | gf2_122-lambda | per-element | 2.93 µs | 2.93 µs .. 2.94 µs | per elem |
| cell updates | binary-u.122/m=1350,n=3500 | gf2_122-u | per-element | 2.55 µs | 2.54 µs .. 2.56 µs | per elem |
| cell updates | binary-w.122/m=1350,n=3500 | gf2_122-w | per-element | 2.93 µs | 2.92 µs .. 2.94 µs | per elem |
| cell updates | binary.127/m=1350,n=3500 | gf2_127 | per-element | 2.20 µs | 2.20 µs .. 2.21 µs | per elem |
| cell updates | binary-lambda.127/m=12150,n=3500 | gf2_127-lambda | per-element | 2.21 µs | 2.21 µs .. 2.22 µs | per elem |
| cell updates | binary-lambda.127/m=1350,n=3500 | gf2_127-lambda | per-element | 1.86 µs | 1.86 µs .. 1.86 µs | per elem |
| cell updates | binary-lambda.127/m=5,n=3500 | gf2_127-lambda | per-element | 446 ns | 445 ns .. 447 ns | per elem |
| cell updates | binary-u.127/m=12150,n=3500 | gf2_127-u | per-element | 2.25 µs | 2.24 µs .. 2.25 µs | per elem |
| cell updates | binary-u.127/m=1350,n=3500 | gf2_127-u | per-element | 1.70 µs | 1.70 µs .. 1.70 µs | per elem |
| cell updates | binary-u.127/m=5,n=3500 | gf2_127-u | per-element | 404 ns | 403 ns .. 405 ns | per elem |
| cell updates | binary-w.127/m=12150,n=3500 | gf2_127-w | per-element | 2.21 µs | 2.21 µs .. 2.21 µs | per elem |
| cell updates | binary-w.127/m=1350,n=3500 | gf2_127-w | per-element | 1.86 µs | 1.86 µs .. 1.86 µs | per elem |
| cell updates | binary-w.127/m=5,n=3500 | gf2_127-w | per-element | 447 ns | 446 ns .. 448 ns | per elem |
| cell updates | edwards.127/m=12150,n=3500 | edwards127 | per-element | 459 ns | 458 ns .. 461 ns | per elem |
| cell updates | edwards.127/m=1350,n=3500 | edwards127 | per-element | 341 ns | 340 ns .. 341 ns | per elem |
| cell updates | edwards.127/m=150,n=3500 | edwards127 | per-element | 243 ns | 242 ns .. 243 ns | per elem |
| cell updates | edwards.127/m=20,n=3500 | edwards127 | per-element | 162 ns | 162 ns .. 163 ns | per elem |
| cell updates | edwards.127/m=5,n=3500 | edwards127 | per-element | 111 ns | 111 ns .. 112 ns | per elem |
| cell updates | weier.127/m=12150,n=3500 | weier127 | per-element | 875 ns | 873 ns .. 877 ns | per elem |
| cell updates | weier.127/m=1350,n=3500 | weier127 | per-element | 633 ns | 632 ns .. 635 ns | per elem |
| cell updates | weier.127/m=5,n=3500 | weier127 | per-element | 172 ns | 171 ns .. 172 ns | per elem |
| cell updates | weier-jacobian.127/m=12150,n=3500 | weier127-jacobian | per-element | 658 ns | 657 ns .. 660 ns | per elem |
| cell updates | weier-jacobian.127/m=1350,n=3500 | weier127-jacobian | per-element | 534 ns | 533 ns .. 535 ns | per elem |
| cell updates | weier-jacobian.127/m=150,n=3500 | weier127-jacobian | per-element | 377 ns | 376 ns .. 379 ns | per elem |
| cell updates | weier-jacobian.127/m=20,n=3500 | weier127-jacobian | per-element | 234 ns | 233 ns .. 235 ns | per elem |
| cell updates | weier-jacobian.127/m=5,n=3500 | weier127-jacobian | per-element | 147 ns | 146 ns .. 147 ns | per elem |
| peel, per difference | xor-sha256.64/d=1350,m=2700,prefilter=true,batch=true | xor | batch | 670 ns | 664 ns .. 677 ns | per elem |
| peel, per difference | xor-siphash.64/d=1350,m=2700,prefilter=true,batch=true | xor-siphash | batch | 662 ns | 657 ns .. 667 ns | per elem |
| peel, per difference | binary.109/d=1350,m=2700,prefilter=true,batch=true,h2c=ti | gf2_109 | batch | 7.58 µs | 7.54 µs .. 7.61 µs | per elem |
| peel, per difference | binary-lambda.109/d=1350,m=2700,prefilter=true,batch=true,h2c=ti-addend | gf2_109-lambda | batch | 5.97 µs | 5.95 µs .. 6.00 µs | per elem |
| peel, per difference | binary-u.109/d=1350,m=2700,prefilter=true,batch=true,h2c=pornin-addend | gf2_109-u | batch | 5.67 µs | 5.65 µs .. 5.68 µs | per elem |
| peel, per difference | binary-w.109/d=1350,m=2700,prefilter=true,batch=true,h2c=ti | gf2_109-w | batch | 5.91 µs | 5.89 µs .. 5.93 µs | per elem |
| peel, per difference | binary.122/d=1350,m=2700,prefilter=true,batch=true,h2c=ti | gf2_122 | batch | 5.22 µs | 5.21 µs .. 5.23 µs | per elem |
| peel, per difference | binary.122-gls/d=1350,m=2700,prefilter=true,batch=true,h2c=ti | gf2_122-gls | batch | 4.83 µs | 4.81 µs .. 4.86 µs | per elem |
| peel, per difference | binary-lambda.122-gls/d=1350,m=2700,prefilter=true,batch=true,h2c=ti-addend | gf2_122-gls-lambda | batch | 3.99 µs | 3.98 µs .. 4.00 µs | per elem |
| peel, per difference | binary-u.122-gls/d=1350,m=2700,prefilter=true,batch=true,h2c=ti | gf2_122-gls-u | batch | 3.86 µs | 3.85 µs .. 3.87 µs | per elem |
| peel, per difference | binary-w.122-gls/d=1350,m=2700,prefilter=true,batch=true,h2c=ti | gf2_122-gls-w | batch | 3.99 µs | 3.98 µs .. 4.00 µs | per elem |
| peel, per difference | binary-lambda.122/d=1350,m=2700,prefilter=true,batch=true,h2c=ti-addend | gf2_122-lambda | batch | 4.02 µs | 4.01 µs .. 4.03 µs | per elem |
| peel, per difference | binary-u.122/d=1350,m=2700,prefilter=true,batch=true,h2c=ti | gf2_122-u | batch | 3.81 µs | 3.79 µs .. 3.82 µs | per elem |
| peel, per difference | binary-w.122/d=1350,m=2700,prefilter=true,batch=true,h2c=ti | gf2_122-w | batch | 4.00 µs | 4.00 µs .. 4.01 µs | per elem |
| peel, per difference | binary.127/d=1350,m=2700,prefilter=true,batch=true,h2c=ti | gf2_127 | batch | 3.25 µs | 3.24 µs .. 3.26 µs | per elem |
| peel, per difference | binary-lambda.127/d=10000,m=20000,prefilter=true,batch=true,h2c=ti-addend | gf2_127-lambda | batch | 3.51 µs | 3.50 µs .. 3.51 µs | per elem |
| peel, per difference | binary-lambda.127/d=10000,m=20000,prefilter=true,batch=true,h2c=ti-addend,proj=fp127,mapproj=fp127 | gf2_127-lambda | batch | 3.34 µs | 3.34 µs .. 3.35 µs | per elem |
| peel, per difference | binary-lambda.127/d=1350,m=2700,prefilter=true,batch=true,h2c=ti-addend | gf2_127-lambda | batch | 2.73 µs | 2.72 µs .. 2.73 µs | per elem |
| peel, per difference | binary-lambda.127/d=1350,m=2700,prefilter=true,batch=true,h2c=ti-addend,proj=fp127,mapproj=fp127 | gf2_127-lambda | batch | 2.51 µs | 2.51 µs .. 2.52 µs | per elem |
| peel, per difference | binary-lambda.127/d=4,m=8,prefilter=true,batch=true,h2c=ti-addend | gf2_127-lambda | batch | 1.27 µs | 1.26 µs .. 1.27 µs | per elem |
| peel, per difference | binary-lambda.127/d=4,m=8,prefilter=true,batch=true,h2c=ti-addend,proj=fp127,mapproj=fp127 | gf2_127-lambda | batch | 1.06 µs | 1.06 µs .. 1.06 µs | per elem |
| peel, per difference | binary-u.127/d=10000,m=20000,prefilter=true,batch=true,h2c=pornin-addend | gf2_127-u | batch | 3.38 µs | 3.37 µs .. 3.38 µs | per elem |
| peel, per difference | binary-u.127/d=10000,m=20000,prefilter=true,batch=true,h2c=pornin-addend,proj=fp127,mapproj=fp127 | gf2_127-u | batch | 3.28 µs | 3.27 µs .. 3.28 µs | per elem |
| peel, per difference | binary-u.127/d=1350,m=2700,prefilter=true,batch=true,h2c=pornin-addend | gf2_127-u | batch | 2.67 µs | 2.66 µs .. 2.67 µs | per elem |
| peel, per difference | binary-u.127/d=1350,m=2700,prefilter=true,batch=true,h2c=pornin-addend,proj=fp127,mapproj=fp127 | gf2_127-u | batch | 2.49 µs | 2.48 µs .. 2.49 µs | per elem |
| peel, per difference | binary-u.127/d=4,m=8,prefilter=true,batch=true,h2c=pornin-addend | gf2_127-u | batch | 1.16 µs | 1.15 µs .. 1.16 µs | per elem |
| peel, per difference | binary-u.127/d=4,m=8,prefilter=true,batch=true,h2c=pornin-addend,proj=fp127,mapproj=fp127 | gf2_127-u | batch | 1.06 µs | 1.06 µs .. 1.07 µs | per elem |
| peel, per difference | binary-w.127/d=10000,m=20000,prefilter=true,batch=true,h2c=pornin-addend | gf2_127-w | batch | 3.50 µs | 3.49 µs .. 3.50 µs | per elem |
| peel, per difference | binary-w.127/d=10000,m=20000,prefilter=true,batch=true,h2c=pornin-addend,proj=fp127,mapproj=fp127 | gf2_127-w | batch | 3.35 µs | 3.34 µs .. 3.35 µs | per elem |
| peel, per difference | binary-w.127/d=1350,m=2700,prefilter=true,batch=true,h2c=pornin-addend | gf2_127-w | batch | 2.70 µs | 2.70 µs .. 2.71 µs | per elem |
| peel, per difference | binary-w.127/d=1350,m=2700,prefilter=true,batch=true,h2c=pornin-addend,proj=fp127,mapproj=fp127 | gf2_127-w | batch | 2.44 µs | 2.44 µs .. 2.45 µs | per elem |
| peel, per difference | binary-w.127/d=4,m=8,prefilter=true,batch=true,h2c=pornin-addend | gf2_127-w | batch | 980 ns | 977 ns .. 983 ns | per elem |
| peel, per difference | binary-w.127/d=4,m=8,prefilter=true,batch=true,h2c=pornin-addend,proj=fp127,mapproj=fp127 | gf2_127-w | batch | 894 ns | 892 ns .. 896 ns | per elem |
| peel, per difference | edwards.127/d=10000,m=20000,prefilter=false,batch=false,h2c=ti | edwards127 | per-element | 3.73 µs | 3.72 µs .. 3.74 µs | per elem |
| peel, per difference | edwards.127/d=10000,m=20000,prefilter=false,batch=true,h2c=ti | edwards127 | batch | 2.77 µs | 2.77 µs .. 2.78 µs | per elem |
| peel, per difference | edwards.127/d=10000,m=20000,prefilter=true,batch=false,h2c=ti | edwards127 | per-element | 2.80 µs | 2.79 µs .. 2.80 µs | per elem |
| peel, per difference | edwards.127/d=10000,m=20000,prefilter=true,batch=true,h2c=ti | edwards127 | batch | 2.26 µs | 2.25 µs .. 2.26 µs | per elem |
| peel, per difference | edwards.127/d=10000,m=20000,prefilter=true,batch=true,h2c=ti,proj=fp130,mapproj=fp127 | edwards127 | batch | 2.15 µs | 2.14 µs .. 2.15 µs | per elem |
| peel, per difference | edwards.127/d=1350,m=2700,prefilter=false,batch=false,h2c=ti | edwards127 | per-element | 3.48 µs | 3.47 µs .. 3.49 µs | per elem |
| peel, per difference | edwards.127/d=1350,m=2700,prefilter=false,batch=true,h2c=ti | edwards127 | batch | 2.53 µs | 2.52 µs .. 2.53 µs | per elem |
| peel, per difference | edwards.127/d=1350,m=2700,prefilter=true,batch=false,h2c=ti | edwards127 | per-element | 2.51 µs | 2.50 µs .. 2.52 µs | per elem |
| peel, per difference | edwards.127/d=1350,m=2700,prefilter=true,batch=true,h2c=ti | edwards127 | batch | 1.96 µs | 1.95 µs .. 1.96 µs | per elem |
| peel, per difference | edwards.127/d=1350,m=2700,prefilter=true,batch=true,h2c=ti,proj=fp130,mapproj=fp127 | edwards127 | batch | 1.78 µs | 1.78 µs .. 1.78 µs | per elem |
| peel, per difference | edwards.127/d=150,m=300,prefilter=false,batch=false,h2c=ti | edwards127 | per-element | 3.55 µs | 3.54 µs .. 3.56 µs | per elem |
| peel, per difference | edwards.127/d=150,m=300,prefilter=false,batch=true,h2c=ti | edwards127 | batch | 2.60 µs | 2.60 µs .. 2.61 µs | per elem |
| peel, per difference | edwards.127/d=150,m=300,prefilter=true,batch=false,h2c=ti | edwards127 | per-element | 2.38 µs | 2.38 µs .. 2.39 µs | per elem |
| peel, per difference | edwards.127/d=150,m=300,prefilter=true,batch=true,h2c=ti | edwards127 | batch | 1.84 µs | 1.84 µs .. 1.85 µs | per elem |
| peel, per difference | edwards.127/d=20,m=40,prefilter=false,batch=false,h2c=ti | edwards127 | per-element | 2.73 µs | 2.72 µs .. 2.73 µs | per elem |
| peel, per difference | edwards.127/d=20,m=40,prefilter=false,batch=true,h2c=ti | edwards127 | batch | 2.00 µs | 2.00 µs .. 2.01 µs | per elem |
| peel, per difference | edwards.127/d=20,m=40,prefilter=true,batch=false,h2c=ti | edwards127 | per-element | 2.13 µs | 2.13 µs .. 2.14 µs | per elem |
| peel, per difference | edwards.127/d=20,m=40,prefilter=true,batch=true,h2c=ti | edwards127 | batch | 1.68 µs | 1.67 µs .. 1.68 µs | per elem |
| peel, per difference | edwards.127/d=4,m=8,prefilter=false,batch=false,h2c=ti | edwards127 | per-element | 1.74 µs | 1.73 µs .. 1.75 µs | per elem |
| peel, per difference | edwards.127/d=4,m=8,prefilter=false,batch=true,h2c=ti | edwards127 | batch | 1.48 µs | 1.47 µs .. 1.48 µs | per elem |
| peel, per difference | edwards.127/d=4,m=8,prefilter=true,batch=false,h2c=ti | edwards127 | per-element | 1.79 µs | 1.78 µs .. 1.79 µs | per elem |
| peel, per difference | edwards.127/d=4,m=8,prefilter=true,batch=true,h2c=ti | edwards127 | batch | 1.52 µs | 1.52 µs .. 1.53 µs | per elem |
| peel, per difference | edwards.127/d=4,m=8,prefilter=true,batch=true,h2c=ti,proj=fp130,mapproj=fp127 | edwards127 | batch | 2.32 µs | 2.32 µs .. 2.33 µs | per elem |
| peel, per difference | weier.127/d=10000,m=20000,prefilter=true,batch=true,h2c=ti | weier127 | batch | 2.64 µs | 2.63 µs .. 2.65 µs | per elem |
| peel, per difference | weier.127/d=10000,m=20000,prefilter=true,batch=true,h2c=ti,proj=fp127,mapproj=fp127 | weier127 | batch | 2.57 µs | 2.56 µs .. 2.57 µs | per elem |
| peel, per difference | weier.127/d=1350,m=2700,prefilter=true,batch=true,h2c=ti | weier127 | batch | 2.24 µs | 2.24 µs .. 2.25 µs | per elem |
| peel, per difference | weier.127/d=1350,m=2700,prefilter=true,batch=true,h2c=ti,proj=fp127,mapproj=fp127 | weier127 | batch | 2.11 µs | 2.10 µs .. 2.11 µs | per elem |
| peel, per difference | weier.127/d=4,m=8,prefilter=true,batch=true,h2c=ti | weier127 | batch | 1.03 µs | 1.03 µs .. 1.04 µs | per elem |
| peel, per difference | weier.127/d=4,m=8,prefilter=true,batch=true,h2c=ti,proj=fp127,mapproj=fp127 | weier127 | batch | 1.07 µs | 1.07 µs .. 1.08 µs | per elem |
| peel, per difference | weier-jacobian.127/d=10000,m=20000,prefilter=false,batch=false,h2c=ti | weier127-jacobian | per-element | 3.05 µs | 3.04 µs .. 3.05 µs | per elem |
| peel, per difference | weier-jacobian.127/d=10000,m=20000,prefilter=false,batch=true,h2c=ti | weier127-jacobian | batch | 3.04 µs | 3.03 µs .. 3.05 µs | per elem |
| peel, per difference | weier-jacobian.127/d=10000,m=20000,prefilter=true,batch=false,h2c=ti | weier127-jacobian | per-element | 2.52 µs | 2.52 µs .. 2.53 µs | per elem |
| peel, per difference | weier-jacobian.127/d=10000,m=20000,prefilter=true,batch=true,h2c=ti | weier127-jacobian | batch | 2.48 µs | 2.47 µs .. 2.49 µs | per elem |
| peel, per difference | weier-jacobian.127/d=10000,m=20000,prefilter=true,batch=true,h2c=ti,proj=fp127,mapproj=fp127 | weier127-jacobian | batch | 2.33 µs | 2.32 µs .. 2.34 µs | per elem |
| peel, per difference | weier-jacobian.127/d=1350,m=2700,prefilter=false,batch=false,h2c=ti | weier127-jacobian | per-element | 2.70 µs | 2.69 µs .. 2.70 µs | per elem |
| peel, per difference | weier-jacobian.127/d=1350,m=2700,prefilter=false,batch=true,h2c=ti | weier127-jacobian | batch | 2.68 µs | 2.68 µs .. 2.69 µs | per elem |
| peel, per difference | weier-jacobian.127/d=1350,m=2700,prefilter=true,batch=false,h2c=ti | weier127-jacobian | per-element | 2.11 µs | 2.10 µs .. 2.11 µs | per elem |
| peel, per difference | weier-jacobian.127/d=1350,m=2700,prefilter=true,batch=true,h2c=ti | weier127-jacobian | batch | 2.11 µs | 2.11 µs .. 2.12 µs | per elem |
| peel, per difference | weier-jacobian.127/d=1350,m=2700,prefilter=true,batch=true,h2c=ti,proj=fp127,mapproj=fp127 | weier127-jacobian | batch | 1.96 µs | 1.95 µs .. 1.96 µs | per elem |
| peel, per difference | weier-jacobian.127/d=150,m=300,prefilter=false,batch=false,h2c=ti | weier127-jacobian | per-element | 2.63 µs | 2.62 µs .. 2.64 µs | per elem |
| peel, per difference | weier-jacobian.127/d=150,m=300,prefilter=false,batch=true,h2c=ti | weier127-jacobian | batch | 2.58 µs | 2.58 µs .. 2.59 µs | per elem |
| peel, per difference | weier-jacobian.127/d=150,m=300,prefilter=true,batch=false,h2c=ti | weier127-jacobian | per-element | 1.92 µs | 1.91 µs .. 1.92 µs | per elem |
| peel, per difference | weier-jacobian.127/d=150,m=300,prefilter=true,batch=true,h2c=ti | weier127-jacobian | batch | 1.89 µs | 1.89 µs .. 1.90 µs | per elem |
| peel, per difference | weier-jacobian.127/d=20,m=40,prefilter=false,batch=false,h2c=ti | weier127-jacobian | per-element | 2.15 µs | 2.14 µs .. 2.15 µs | per elem |
| peel, per difference | weier-jacobian.127/d=20,m=40,prefilter=false,batch=true,h2c=ti | weier127-jacobian | batch | 2.15 µs | 2.15 µs .. 2.16 µs | per elem |
| peel, per difference | weier-jacobian.127/d=20,m=40,prefilter=true,batch=false,h2c=ti | weier127-jacobian | per-element | 1.59 µs | 1.58 µs .. 1.59 µs | per elem |
| peel, per difference | weier-jacobian.127/d=20,m=40,prefilter=true,batch=true,h2c=ti | weier127-jacobian | batch | 1.59 µs | 1.58 µs .. 1.60 µs | per elem |
| peel, per difference | weier-jacobian.127/d=4,m=8,prefilter=false,batch=false,h2c=ti | weier127-jacobian | per-element | 937 ns | 933 ns .. 941 ns | per elem |
| peel, per difference | weier-jacobian.127/d=4,m=8,prefilter=false,batch=true,h2c=ti | weier127-jacobian | batch | 932 ns | 929 ns .. 935 ns | per elem |
| peel, per difference | weier-jacobian.127/d=4,m=8,prefilter=true,batch=false,h2c=ti | weier127-jacobian | per-element | 967 ns | 964 ns .. 970 ns | per elem |
| peel, per difference | weier-jacobian.127/d=4,m=8,prefilter=true,batch=true,h2c=ti | weier127-jacobian | batch | 981 ns | 977 ns .. 984 ns | per elem |
| peel, per difference | weier-jacobian.127/d=4,m=8,prefilter=true,batch=true,h2c=ti,proj=fp127,mapproj=fp127 | weier127-jacobian | batch | 1.01 µs | 1.00 µs .. 1.01 µs | per elem |
| rateless encode and decode, per difference | xor-sha256.64/d=10 | xor | per-element | 652 ns | 649 ns .. 654 ns | per elem |
| rateless encode and decode, per difference | xor-sha256.64/d=100 | xor | per-element | 1.41 µs | 1.40 µs .. 1.41 µs | per elem |
| rateless encode and decode, per difference | xor-sha256.64/d=1000 | xor | per-element | 2.53 µs | 2.52 µs .. 2.53 µs | per elem |
| rateless encode and decode, per difference | xor-sha256.64/d=10000 | xor | per-element | 4.14 µs | 4.12 µs .. 4.16 µs | per elem |
| rateless encode and decode, per difference | xor-sha256.64/d=100000 | xor | per-element | 6.90 µs | 6.89 µs .. 6.92 µs | per elem |
| rateless encode and decode, per difference | xor-sha256.64/d=20 | xor | per-element | 842 ns | 840 ns .. 844 ns | per elem |
| rateless encode and decode, per difference | xor-sha256.64/d=40 | xor | per-element | 1.05 µs | 1.05 µs .. 1.06 µs | per elem |
| rateless encode and decode, per difference | xor-sha256.64/d=50000 | xor | per-element | 5.65 µs | 5.63 µs .. 5.67 µs | per elem |
| rateless encode and decode, per difference | xor-siphash.64/d=10 | xor-siphash | per-element | 593 ns | 592 ns .. 594 ns | per elem |
| rateless encode and decode, per difference | xor-siphash.64/d=10,map=mcg64 | xor-siphash | per-element | 579 ns | 578 ns .. 580 ns | per elem |
| rateless encode and decode, per difference | xor-siphash.64/d=100 | xor-siphash | per-element | 1.33 µs | 1.33 µs .. 1.34 µs | per elem |
| rateless encode and decode, per difference | xor-siphash.64/d=100,map=mcg64 | xor-siphash | per-element | 1.31 µs | 1.31 µs .. 1.31 µs | per elem |
| rateless encode and decode, per difference | xor-siphash.64/d=1000 | xor-siphash | per-element | 2.45 µs | 2.44 µs .. 2.46 µs | per elem |
| rateless encode and decode, per difference | xor-siphash.64/d=1000,map=mcg64 | xor-siphash | per-element | 2.43 µs | 2.42 µs .. 2.43 µs | per elem |
| rateless encode and decode, per difference | xor-siphash.64/d=10000 | xor-siphash | per-element | 4.06 µs | 4.05 µs .. 4.07 µs | per elem |
| rateless encode and decode, per difference | xor-siphash.64/d=10000,map=chacha8 | xor-siphash | per-element | 4.65 µs | 4.64 µs .. 4.67 µs | per elem |
| rateless encode and decode, per difference | xor-siphash.64/d=10000,map=mcg64 | xor-siphash | per-element | 4.02 µs | 4.01 µs .. 4.04 µs | per elem |
| rateless encode and decode, per difference | xor-siphash.64/d=100000 | xor-siphash | per-element | 6.81 µs | 6.80 µs .. 6.83 µs | per elem |
| rateless encode and decode, per difference | xor-siphash.64/d=100000,map=chacha8 | xor-siphash | per-element | 10.1 µs | 10.1 µs .. 10.1 µs | per elem |
| rateless encode and decode, per difference | xor-siphash.64/d=100000,map=mcg64 | xor-siphash | per-element | 6.33 µs | 6.31 µs .. 6.36 µs | per elem |
| rateless encode and decode, per difference | xor-siphash.64/d=20 | xor-siphash | per-element | 776 ns | 773 ns .. 778 ns | per elem |
| rateless encode and decode, per difference | xor-siphash.64/d=20,map=mcg64 | xor-siphash | per-element | 758 ns | 757 ns .. 760 ns | per elem |
| rateless encode and decode, per difference | xor-siphash.64/d=40 | xor-siphash | per-element | 987 ns | 985 ns .. 988 ns | per elem |
| rateless encode and decode, per difference | xor-siphash.64/d=40,map=mcg64 | xor-siphash | per-element | 960 ns | 957 ns .. 963 ns | per elem |
| rateless encode and decode, per difference | xor-siphash.64/d=50000 | xor-siphash | per-element | 5.58 µs | 5.55 µs .. 5.60 µs | per elem |
| rateless encode and decode, per difference | xor-siphash.64/d=50000,map=mcg64 | xor-siphash | per-element | 5.46 µs | 5.44 µs .. 5.48 µs | per elem |
| rateless encode and decode, per difference | binary.109/d=1000,h2c=ti | gf2_109 | per-element | 44.3 µs | 44.2 µs .. 44.4 µs | per elem |
| rateless encode and decode, per difference | binary-lambda.109/d=1000,h2c=ti-addend | gf2_109-lambda | per-element | 39.1 µs | 39.0 µs .. 39.3 µs | per elem |
| rateless encode and decode, per difference | binary-u.109/d=1000,h2c=pornin-addend | gf2_109-u | per-element | 29.4 µs | 29.3 µs .. 29.4 µs | per elem |
| rateless encode and decode, per difference | binary-w.109/d=1000,h2c=ti | gf2_109-w | per-element | 39.4 µs | 39.3 µs .. 39.5 µs | per elem |
| rateless encode and decode, per difference | binary.122/d=1000,h2c=ti | gf2_122 | per-element | 21.5 µs | 21.4 µs .. 21.6 µs | per elem |
| rateless encode and decode, per difference | binary.122-gls/d=1000,h2c=ti | gf2_122-gls | per-element | 19.8 µs | 19.6 µs .. 20.1 µs | per elem |
| rateless encode and decode, per difference | binary-lambda.122-gls/d=1000,h2c=ti-addend | gf2_122-gls-lambda | per-element | 17.3 µs | 17.2 µs .. 17.3 µs | per elem |
| rateless encode and decode, per difference | binary-u.122-gls/d=1000,h2c=ti | gf2_122-gls-u | per-element | 17.1 µs | 16.8 µs .. 17.4 µs | per elem |
| rateless encode and decode, per difference | binary-w.122-gls/d=1000,h2c=ti | gf2_122-gls-w | per-element | 17.6 µs | 17.5 µs .. 17.7 µs | per elem |
| rateless encode and decode, per difference | binary-lambda.122/d=1000,h2c=ti-addend | gf2_122-lambda | per-element | 18.0 µs | 17.9 µs .. 18.0 µs | per elem |
| rateless encode and decode, per difference | binary-u.122/d=1000,h2c=ti | gf2_122-u | per-element | 17.0 µs | 16.9 µs .. 17.1 µs | per elem |
| rateless encode and decode, per difference | binary-w.122/d=1000,h2c=ti | gf2_122-w | per-element | 18.1 µs | 18.1 µs .. 18.2 µs | per elem |
| rateless encode and decode, per difference | binary.127/d=10,h2c=ti,map=mcg64 | gf2_127 | per-element | 6.00 µs | 5.94 µs .. 6.06 µs | per elem |
| rateless encode and decode, per difference | binary.127/d=100,h2c=ti,map=mcg64 | gf2_127 | per-element | 10.1 µs | 10.1 µs .. 10.2 µs | per elem |
| rateless encode and decode, per difference | binary.127/d=1000,h2c=ti | gf2_127 | per-element | 14.5 µs | 14.5 µs .. 14.5 µs | per elem |
| rateless encode and decode, per difference | binary.127/d=1000,h2c=ti,map=mcg64 | gf2_127 | per-element | 14.5 µs | 14.4 µs .. 14.5 µs | per elem |
| rateless encode and decode, per difference | binary.127/d=10000,h2c=ti,map=chacha8 | gf2_127 | per-element | 20.0 µs | 20.0 µs .. 20.1 µs | per elem |
| rateless encode and decode, per difference | binary.127/d=10000,h2c=ti,map=mcg64 | gf2_127 | per-element | 19.1 µs | 19.0 µs .. 19.2 µs | per elem |
| rateless encode and decode, per difference | binary.127/d=100000,h2c=ti,map=chacha8 | gf2_127 | per-element | 32.2 µs | 32.2 µs .. 32.2 µs | per elem |
| rateless encode and decode, per difference | binary.127/d=100000,h2c=ti,map=mcg64 | gf2_127 | per-element | 28.2 µs | 28.1 µs .. 28.2 µs | per elem |
| rateless encode and decode, per difference | binary.127/d=20,h2c=ti,map=mcg64 | gf2_127 | per-element | 7.36 µs | 7.35 µs .. 7.38 µs | per elem |
| rateless encode and decode, per difference | binary.127/d=40,h2c=ti,map=mcg64 | gf2_127 | per-element | 8.46 µs | 8.37 µs .. 8.53 µs | per elem |
| rateless encode and decode, per difference | binary.127/d=50000,h2c=ti,map=mcg64 | gf2_127 | per-element | 24.2 µs | 24.2 µs .. 24.2 µs | per elem |
| rateless encode and decode, per difference | binary-lambda.127/d=10,h2c=ti-addend | gf2_127-lambda | per-element | 5.16 µs | 5.15 µs .. 5.18 µs | per elem |
| rateless encode and decode, per difference | binary-lambda.127/d=1000,h2c=ti-addend | gf2_127-lambda | per-element | 12.6 µs | 12.6 µs .. 12.6 µs | per elem |
| rateless encode and decode, per difference | binary-lambda.127/d=100000,h2c=ti-addend | gf2_127-lambda | per-element | 25.7 µs | 25.6 µs .. 25.7 µs | per elem |
| rateless encode and decode, per difference | binary-u.127/d=10,h2c=pornin-addend | gf2_127-u | per-element | 4.53 µs | 4.52 µs .. 4.53 µs | per elem |
| rateless encode and decode, per difference | binary-u.127/d=1000,h2c=pornin-addend | gf2_127-u | per-element | 11.2 µs | 11.1 µs .. 11.2 µs | per elem |
| rateless encode and decode, per difference | binary-u.127/d=100000,h2c=pornin-addend | gf2_127-u | per-element | 23.8 µs | 23.7 µs .. 23.8 µs | per elem |
| rateless encode and decode, per difference | binary-w.127/d=10,h2c=pornin-addend | gf2_127-w | per-element | 4.32 µs | 4.31 µs .. 4.33 µs | per elem |
| rateless encode and decode, per difference | binary-w.127/d=1000,h2c=pornin-addend | gf2_127-w | per-element | 11.5 µs | 11.5 µs .. 11.5 µs | per elem |
| rateless encode and decode, per difference | binary-w.127/d=100000,h2c=pornin-addend | gf2_127-w | per-element | 24.4 µs | 24.4 µs .. 24.5 µs | per elem |
| rateless encode and decode, per difference | edwards.127/d=10,h2c=ti | edwards127 | per-element | 4.99 µs | 4.97 µs .. 5.00 µs | per elem |
| rateless encode and decode, per difference | edwards.127/d=100,h2c=ti | edwards127 | per-element | 7.15 µs | 7.12 µs .. 7.18 µs | per elem |
| rateless encode and decode, per difference | edwards.127/d=1000,h2c=ti | edwards127 | per-element | 9.08 µs | 9.06 µs .. 9.10 µs | per elem |
| rateless encode and decode, per difference | edwards.127/d=10000,h2c=ti | edwards127 | per-element | 11.3 µs | 11.3 µs .. 11.4 µs | per elem |
| rateless encode and decode, per difference | edwards.127/d=100000,h2c=ti | edwards127 | per-element | 18.2 µs | 18.2 µs .. 18.3 µs | per elem |
| rateless encode and decode, per difference | edwards.127/d=20,h2c=ti | edwards127 | per-element | 5.71 µs | 5.69 µs .. 5.72 µs | per elem |
| rateless encode and decode, per difference | edwards.127/d=40,h2c=ti | edwards127 | per-element | 6.22 µs | 6.16 µs .. 6.28 µs | per elem |
| rateless encode and decode, per difference | edwards.127/d=50000,h2c=ti | edwards127 | per-element | 14.9 µs | 14.8 µs .. 15.0 µs | per elem |
| rateless encode and decode, per difference | weier.127/d=10,h2c=ti | weier127 | per-element | 4.03 µs | 4.02 µs .. 4.03 µs | per elem |
| rateless encode and decode, per difference | weier.127/d=1000,h2c=ti | weier127 | per-element | 8.46 µs | 8.41 µs .. 8.51 µs | per elem |
| rateless encode and decode, per difference | weier.127/d=100000,h2c=ti | weier127 | per-element | 18.1 µs | 18.1 µs .. 18.1 µs | per elem |
| rateless encode and decode, per difference | weier-jacobian.127/d=10,h2c=ti | weier127-jacobian | per-element | 3.77 µs | 3.76 µs .. 3.78 µs | per elem |
| rateless encode and decode, per difference | weier-jacobian.127/d=100,h2c=ti | weier127-jacobian | per-element | 5.82 µs | 5.80 µs .. 5.84 µs | per elem |
| rateless encode and decode, per difference | weier-jacobian.127/d=1000,h2c=ti | weier127-jacobian | per-element | 7.81 µs | 7.78 µs .. 7.85 µs | per elem |
| rateless encode and decode, per difference | weier-jacobian.127/d=10000,h2c=ti | weier127-jacobian | per-element | 10.3 µs | 10.2 µs .. 10.3 µs | per elem |
| rateless encode and decode, per difference | weier-jacobian.127/d=100000,h2c=ti | weier127-jacobian | per-element | 16.9 µs | 16.9 µs .. 16.9 µs | per elem |
| rateless encode and decode, per difference | weier-jacobian.127/d=20,h2c=ti | weier127-jacobian | per-element | 4.41 µs | 4.39 µs .. 4.42 µs | per elem |
| rateless encode and decode, per difference | weier-jacobian.127/d=40,h2c=ti | weier127-jacobian | per-element | 4.99 µs | 4.98 µs .. 5.01 µs | per elem |
| rateless encode and decode, per difference | weier-jacobian.127/d=50000,h2c=ti | weier127-jacobian | per-element | 13.4 µs | 13.3 µs .. 13.4 µs | per elem |
| mapping, per index | chacha8/next | mapping | per-element | 10.3 ns | 10.3 ns .. 10.3 ns | per elem |
| mapping, per index | mcg64/next | mapping | per-element | 5.67 ns | 5.65 ns .. 5.69 ns | per elem |
| mapping, per index | sha256-ctr/next | mapping | per-element | 8.52 ns | 8.50 ns .. 8.55 ns | per elem |
| mapping, per index | xoshiro256pp/next | mapping | per-element | 5.72 ns | 5.70 ns .. 5.73 ns | per elem |
| mapping, per item | chacha8/item,m=12150 | mapping | per-element | 279 ns | 279 ns .. 279 ns | per elem |
| mapping, per item | chacha8/item,m=1350 | mapping | per-element | 245 ns | 244 ns .. 245 ns | per elem |
| mapping, per item | chacha8/item,m=150 | mapping | per-element | 210 ns | 210 ns .. 210 ns | per elem |
| mapping, per item | chacha8/item,m=20 | mapping | per-element | 177 ns | 177 ns .. 178 ns | per elem |
| mapping, per item | chacha8/item,m=5 | mapping | per-element | 156 ns | 155 ns .. 156 ns | per elem |
| mapping, per item | mcg64/item,m=12150 | mapping | per-element | 42.4 ns | 42.3 ns .. 42.5 ns | per elem |
| mapping, per item | mcg64/item,m=1350 | mapping | per-element | 24.1 ns | 24.0 ns .. 24.2 ns | per elem |
| mapping, per item | mcg64/item,m=150 | mapping | per-element | 13.3 ns | 13.2 ns .. 13.4 ns | per elem |
| mapping, per item | mcg64/item,m=20 | mapping | per-element | 6.50 ns | 6.48 ns .. 6.52 ns | per elem |
| mapping, per item | mcg64/item,m=5 | mapping | per-element | 3.38 ns | 3.34 ns .. 3.43 ns | per elem |
| mapping, per item | sha256-ctr/item,m=12150 | mapping | per-element | 197 ns | 196 ns .. 197 ns | per elem |
| mapping, per item | sha256-ctr/item,m=1350 | mapping | per-element | 159 ns | 159 ns .. 160 ns | per elem |
| mapping, per item | sha256-ctr/item,m=150 | mapping | per-element | 119 ns | 118 ns .. 119 ns | per elem |
| mapping, per item | sha256-ctr/item,m=20 | mapping | per-element | 67.6 ns | 67.2 ns .. 68.0 ns | per elem |
| mapping, per item | sha256-ctr/item,m=5 | mapping | per-element | 35.1 ns | 35.0 ns .. 35.2 ns | per elem |
| mapping, per item | xoshiro256pp/item,m=12150 | mapping | per-element | 57.4 ns | 57.2 ns .. 57.7 ns | per elem |
| mapping, per item | xoshiro256pp/item,m=1350 | mapping | per-element | 36.4 ns | 36.3 ns .. 36.5 ns | per elem |
| mapping, per item | xoshiro256pp/item,m=150 | mapping | per-element | 21.8 ns | 21.7 ns .. 21.8 ns | per elem |
| mapping, per item | xoshiro256pp/item,m=20 | mapping | per-element | 11.1 ns | 11.1 ns .. 11.1 ns | per elem |
| mapping, per item | xoshiro256pp/item,m=5 | mapping | per-element | 5.32 ns | 5.31 ns .. 5.33 ns | per elem |
| map digest of an ID | projection-fp127/digest of id | mapping | per-element | 9.40 ns | 9.37 ns .. 9.43 ns | per elem |
| map digest of an ID | projection-fp130/digest of id | mapping | per-element | 17.3 ns | 17.3 ns .. 17.3 ns | per elem |
| map digest of an ID | projection-gf2_127/digest of id | mapping | per-element | 60.7 ns | 60.6 ns .. 60.8 ns | per elem |
| map digest of an ID | salted-sha256/digest of id | mapping | per-element | 32.9 ns | 32.7 ns .. 33.1 ns | per elem |
| per-salt keys | projection-fp127/keys | mapping | per-element | 261 ns | 260 ns .. 262 ns | per elem |
| per-salt keys | projection-fp130/keys | mapping | per-element | 311 ns | 310 ns .. 312 ns | per elem |
| per-salt keys | projection-gf2_127/keys | mapping | per-element | 363 ns | 362 ns .. 364 ns | per elem |
| per-salt keys | salted-sha256/keys | mapping | per-element | 71.0 ns | 70.8 ns .. 71.2 ns | per elem |
| item ID | sha256/id | xor | per-element | 32.5 ns | 32.4 ns .. 32.6 ns | per elem |
| map digest | salted-sha256/digest | mapping | per-element | 32.7 ns | 32.5 ns .. 32.8 ns | per elem |
digest
Figure
7 benchmarks
| operation | benchmark | family | mode | time | 95% CI | unit |
|---|---|---|---|---|---|---|
| digest | xor-sha256 | xor | per-element | 27.2 ns | 27.1 ns .. 27.3 ns | per elem |
| digest | gf2_109/batch | gf2_109 | batch | 758 ns | 755 ns .. 761 ns | per elem |
| digest | gf2_122/batch | gf2_122 | batch | 555 ns | 552 ns .. 557 ns | per elem |
| digest | gf2_122-gls/batch | gf2_122-gls | batch | 586 ns | 575 ns .. 595 ns | per elem |
| digest | gf2_127/batch | gf2_127 | batch | 283 ns | 281 ns .. 284 ns | per elem |
| digest | edwards127/batch | edwards127 | batch | 1.09 µs | 1.09 µs .. 1.09 µs | per elem |
| digest | weier127/batch | weier127 | batch | 1.07 µs | 1.07 µs .. 1.07 µs | per elem |
Lower bound, every family
One hash plus an addition to each of the cells an item maps to in a sketch of cells (: ; : ; : ; : ; : ), from each family’s fastest hash and addition in any representation, without conversions; the only estimate for families without group-trait benchmarks.
| family | hashing | hash | hash time | add | add time | m=5 | m=20 | m=150 | m=1350 | m=12150 |
|---|---|---|---|---|---|---|---|---|---|---|
| gf2_109 | one at a time | gf2_109/pornin map x1 | 3.39 µs | binary.109/mode=throughput | 403 ns | 4.56 µs | 5.52 µs | 7.09 µs | 8.86 µs | 10.6 µs |
| gf2_109 | batched | binary.109/mode=batch,n=1024 | 518 ns | binary.109/mode=throughput | 403 ns | 1.69 µs | 2.65 µs | 4.22 µs | 5.99 µs | 7.75 µs |
| gf2_109-lambda | one at a time | gf2_109-lambda/pornin map x1 to (x, λ) | 3.28 µs | binary-lambda.109/mode=throughput | 331 ns | 4.24 µs | 5.03 µs | 6.32 µs | 7.77 µs | 9.23 µs |
| gf2_109-lambda | batched | binary-lambda.109/mode=batch,n=1024 | 517 ns | binary-lambda.109/mode=throughput | 331 ns | 1.48 µs | 2.27 µs | 3.56 µs | 5.01 µs | 6.47 µs |
| gf2_109-u | one at a time | gf2_109-u/pornin map x1 to (u, v) | 3.34 µs | binary-u.109/mode=throughput | 289 ns | 4.18 µs | 4.87 µs | 6.00 µs | 7.27 µs | 8.54 µs |
| gf2_109-u | batched | binary-u.109/mode=batch,n=1024 | 592 ns | binary-u.109/mode=throughput | 289 ns | 1.43 µs | 2.12 µs | 3.25 µs | 4.52 µs | 5.79 µs |
| gf2_109-w | one at a time | gf2_109-w/pornin map x1 to (x, λ) | 3.27 µs | binary-w.109/mode=throughput | 332 ns | 4.24 µs | 5.03 µs | 6.33 µs | 7.78 µs | 9.24 µs |
| gf2_109-w | batched | binary-w.109/mode=batch,n=1024 | 516 ns | binary-w.109/mode=throughput | 332 ns | 1.48 µs | 2.27 µs | 3.57 µs | 5.02 µs | 6.48 µs |
| gf2_122 | one at a time | gf2_122/pornin map x1 | 897 ns | binary.122/mode=throughput | 263 ns | 1.66 µs | 2.29 µs | 3.31 µs | 4.47 µs | 5.62 µs |
| gf2_122 | batched | binary.122/mode=batch,n=1024 | 350 ns | binary.122/mode=throughput | 263 ns | 1.11 µs | 1.74 µs | 2.77 µs | 3.92 µs | 5.07 µs |
| gf2_122-gls | one at a time | gf2_122-gls/pornin map x1 | 865 ns | binary.122-gls/mode=latency | 240 ns | 1.56 µs | 2.14 µs | 3.07 µs | 4.12 µs | 5.18 µs |
| gf2_122-gls | batched | binary.122-gls/mode=batch,n=1024 | 309 ns | binary.122-gls/mode=latency | 240 ns | 1.01 µs | 1.58 µs | 2.52 µs | 3.57 µs | 4.62 µs |
| gf2_122-gls-lambda | one at a time | gf2_122-gls-lambda/pornin map x1 to (x, λ) | 788 ns | binary-lambda.122-gls/mode=throughput | 216 ns | 1.42 µs | 1.93 µs | 2.78 µs | 3.72 µs | 4.67 µs |
| gf2_122-gls-lambda | batched | binary-lambda.122-gls/mode=batch,n=1024 | 315 ns | binary-lambda.122-gls/mode=throughput | 216 ns | 942 ns | 1.46 µs | 2.30 µs | 3.25 µs | 4.20 µs |
| gf2_122-gls-u | one at a time | gf2_122-gls-u/pornin map x1 to (u, v) | 843 ns | binary-u.122-gls/mode=throughput | 182 ns | 1.37 µs | 1.81 µs | 2.52 µs | 3.32 µs | 4.12 µs |
| gf2_122-gls-u | batched | binary-u.122-gls/mode=batch,n=1024 | 359 ns | binary-u.122-gls/mode=throughput | 182 ns | 888 ns | 1.32 µs | 2.04 µs | 2.83 µs | 3.64 µs |
| gf2_122-gls-w | one at a time | gf2_122-gls-w/pornin map x1 to (x, λ) | 791 ns | binary-w.122-gls/mode=throughput | 217 ns | 1.42 µs | 1.94 µs | 2.78 µs | 3.73 µs | 4.68 µs |
| gf2_122-gls-w | batched | binary-w.122-gls/mode=batch,n=1024 | 311 ns | binary-w.122-gls/mode=throughput | 217 ns | 939 ns | 1.46 µs | 2.30 µs | 3.25 µs | 4.20 µs |
| gf2_122-lambda | one at a time | gf2_122-lambda/pornin map x1 to (x, λ) | 801 ns | binary-lambda.122/mode=throughput | 217 ns | 1.43 µs | 1.95 µs | 2.80 µs | 3.75 µs | 4.70 µs |
| gf2_122-lambda | batched | binary-lambda.122/mode=batch,n=1024 | 350 ns | binary-lambda.122/mode=throughput | 217 ns | 979 ns | 1.50 µs | 2.35 µs | 3.30 µs | 4.25 µs |
| gf2_122-u | one at a time | gf2_122-u/pornin map x1 to (u, v) | 857 ns | binary-u.122/mode=throughput | 183 ns | 1.39 µs | 1.83 µs | 2.54 µs | 3.34 µs | 4.15 µs |
| gf2_122-u | batched | binary-u.122/mode=batch,n=1024 | 391 ns | binary-u.122/mode=throughput | 183 ns | 922 ns | 1.36 µs | 2.07 µs | 2.88 µs | 3.68 µs |
| gf2_122-w | one at a time | gf2_122-w/pornin map x1 to (x, λ) | 799 ns | binary-w.122/mode=throughput | 211 ns | 1.41 µs | 1.91 µs | 2.74 µs | 3.66 µs | 4.58 µs |
| gf2_122-w | batched | binary-w.122/mode=batch,n=1024 | 328 ns | binary-w.122/mode=throughput | 211 ns | 938 ns | 1.44 µs | 2.26 µs | 3.19 µs | 4.11 µs |
| gf2_127 | one at a time | gf2_127/pornin map x1 | 619 ns | binary.127/mode=throughput | 155 ns | 1.07 µs | 1.44 µs | 2.05 µs | 2.73 µs | 3.41 µs |
| gf2_127 | batched | binary.127/mode=batch,n=1024 | 196 ns | binary.127/mode=throughput | 155 ns | 646 ns | 1.02 µs | 1.62 µs | 2.30 µs | 2.98 µs |
| gf2_127-lambda | one at a time | gf2_127-lambda/pornin map x1 to (x, λ) | 567 ns | binary-lambda.127/mode=throughput | 132 ns | 949 ns | 1.26 µs | 1.78 µs | 2.35 µs | 2.93 µs |
| gf2_127-lambda | batched | gf2_127-lambda/pornin map x1 to (x, λ), batched | 184 ns | binary-lambda.127/mode=throughput | 132 ns | 566 ns | 880 ns | 1.39 µs | 1.97 µs | 2.55 µs |
| gf2_127-u | one at a time | gf2_127-u/pornin map x1 to (u, v) | 598 ns | binary-u.127/mode=throughput | 116 ns | 935 ns | 1.21 µs | 1.67 µs | 2.18 µs | 2.69 µs |
| gf2_127-u | batched | gf2_127-u/pornin map x1 to (u, v), batched | 213 ns | binary-u.127/mode=throughput | 116 ns | 550 ns | 828 ns | 1.28 µs | 1.79 µs | 2.30 µs |
| gf2_127-w | one at a time | gf2_127-w/pornin map x1 to (x, λ) | 569 ns | binary-w.127/mode=throughput | 131 ns | 949 ns | 1.26 µs | 1.77 µs | 2.35 µs | 2.92 µs |
| gf2_127-w | batched | gf2_127-w/pornin map x1 to (x, λ), batched | 184 ns | binary-w.127/mode=throughput | 131 ns | 565 ns | 878 ns | 1.39 µs | 1.96 µs | 2.54 µs |
| edwards127 | one at a time | edwards.127/mode=indep | 1.07 µs | edwards.127/mode=throughput | 19.9 ns | 1.12 µs | 1.17 µs | 1.25 µs | 1.34 µs | 1.42 µs |
| edwards127 | batched | edwards.127/mode=batch,n=1024 | 1.06 µs | edwards.127/mode=throughput | 19.9 ns | 1.12 µs | 1.17 µs | 1.25 µs | 1.33 µs | 1.42 µs |
| weier127 | one at a time | weier.127/mode=indep | 1.03 µs | weier.127/mode=throughput | 44.7 ns | 1.16 µs | 1.27 µs | 1.44 µs | 1.64 µs | 1.83 µs |
| weier127 | batched | weier.127/mode=batch,n=1024 | 1.03 µs | weier.127/mode=throughput | 44.7 ns | 1.16 µs | 1.27 µs | 1.44 µs | 1.64 µs | 1.83 µs |
| weier127-jacobian | one at a time | weier-jacobian.127/mode=indep | 1.03 µs | weier-jacobian.127/mode=throughput | 36.6 ns | 1.14 µs | 1.22 µs | 1.37 µs | 1.53 µs | 1.69 µs |
| weier127-jacobian | batched | weier-jacobian.127/mode=batch,n=1024 | 1.00 µs | weier-jacobian.127/mode=throughput | 36.6 ns | 1.11 µs | 1.20 µs | 1.34 µs | 1.50 µs | 1.66 µs |
Apple M4 · rustc 1.98.1 · RUSTFLAGS=-C target-cpu=generic · ef9e82d39fbf · full profile · 2026-10-08
Benchmark run Intel(R) Xeon(R) W-1390P @ 3.50GHz · x86-64-v3 · full · ef9e82d3
Run Intel(R) Xeon(R) W-1390P @ 3.50GHz · x86-64-v3 · full · ef9e82d3 started 2026-10-08T18:42:23Z on Intel(R) Xeon(R) W-1390P @ 3.50GHz (?, x86_64) and timed commit ef9e82d39fbf06c605e1740360370f0003dc4ca4, built by rustc 1.98.1 (48a229cea 2026-09-01) with RUSTFLAGS -C target-cpu=x86-64-v3 -C target-feature=+pclmulqdq, in the full profile.
1623 benchmarks from run Intel(R) Xeon(R) W-1390P @ 3.50GHz · x86-64-v3 · full · ef9e82d3. Reading a run report explains the values, colours and tags.
Families compared
Each family’s nominal rho, this run’s costs (addition at throughput; hashing, preparation, encoding and decoding batched), the two regimes of Cost in repeated reconciliation for a set of items, a set difference of and a sketch of cells, in which a new item updates cells on average, and the mean time over seeds to find a curve and verify its certificate. Dominance is as defined in Measurement methodology. Additions are 89 to 99% of each rebuilt estimate.
| curve | security | per cell | per new item | per party and round | curve selection | dominated by | ||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| rho | add | encode | decode | hash + prepare | sums retained, | sums rebuilt, , | find | verify | measured method | available tools | ||
| GF(2^127), 16 bytes | ||||||||||||
| gf2_127(X:S:Z:T) extended accumulators, Pornin's formulas; Pornin x1: hash to addend; output already an addend | 62.8 | 19.5 ns (1.48× the best) | 22.7 ns (1.81× the best) | 25.7 ns (1.23× the best) | 103 ns (1.11× the best) | 368 ns (1.33× the best) | 26.7 ms (1.48× the best) | 16.0 ms | 170 µs | agm+sieve | Rust (AGM), PARI | gf2_127-lambda, gf2_127-w |
| gf2_127-lambdaincompleteλ-projective (X:L:Z) accumulators; Pornin x1: hash to addend; output already an addend | 62.8 | 17.6 ns (1.34× the best) | 17.5 ns (1.39× the best) | 24.0 ns (1.15× the best) | 92.7 ns (tied for the best, within noise) | 332 ns (1.20× the best) | 24.1 ms (1.33× the best) | 16.0 ms | 170 µs | agm+sieve | Rust (AGM), PARI | none |
| gf2_127-wincompleteλ-projective, w codec: hashes and decodes to λ-affine; Pornin x1: hash to addend; output already an addend | 62.8 | 17.7 ns (1.34× the best) | 17.0 ns (1.35× the best) | 22.6 ns (1.08× the best) | 92.8 ns (tied for the best, within noise, 1.00×) | 333 ns (1.20× the best) | 24.2 ms (1.34× the best) | 16.0 ms | 170 µs | agm+sieve | Rust (AGM), PARI | none |
| gf2_127-uunscaled (X:S:Z), w codec, direct addend hashes; Pornin x1: hash to addend; output already an addend | 62.8 | 13.2 ns (best) | 12.6 ns (best) | 27.5 ns (1.32× the best) | 98.0 ns (1.06× the best) | 277 ns (best) | 18.1 ms (best) | 16.0 ms | 170 µs | agm+sieve | Rust (AGM), PARI | none |
| GF(2^122) = GF(2^61)[u], dense constant, 16 bytes | ||||||||||||
| gf2_122(X:S:Z:T) extended; Pornin x1: hash to addend; output already an addend | 60.3 | 19.9 ns (1.51× the best) | 22.1 ns (1.76× the best) | 24.0 ns (1.15× the best) | 103 ns (1.11× the best) | 373 ns (1.35× the best) | 27.2 ms (1.51× the best) | 18.1 ms | 126 µs | agm | Rust (AGM), PARI | gf2_127-w |
| gf2_122-lambdaincompleteλ-projective; Pornin x1: hash to addend; output already an addend | 60.3 | 20.2 ns (1.53× the best) | 17.3 ns (1.37× the best) | 24.1 ns (1.15× the best) | 95.0 ns (1.02× the best) | 370 ns (1.33× the best) | 27.6 ms (1.53× the best) | 18.1 ms | 126 µs | agm | Rust (AGM), PARI | gf2_127-w |
| gf2_122-wincompleteλ-projective, w codec; Pornin x1: hash to addend; output already an addend | 60.3 | 20.5 ns (1.55× the best) | 21.2 ns (1.69× the best) | 21.6 ns (1.03× the best) | 95.2 ns (1.03× the best) | 374 ns (1.35× the best) | 28.0 ms (1.55× the best) | 18.1 ms | 126 µs | agm | Rust (AGM), PARI | none |
| gf2_122-uunscaled (X:S:Z), w codec; Pornin x1: hash to addend; output already an addend | 60.3 | 14.3 ns (1.08× the best) | 18.4 ns (1.47× the best) | 26.0 ns (1.24× the best) | 99.3 ns (1.07× the best) | 294 ns (1.06× the best) | 19.6 ms (1.08× the best) | 18.1 ms | 126 µs | agm | Rust (AGM), PARI | none |
| GF(2^122), constant in GF(2^61) (GLS-shaped), 16 bytes | ||||||||||||
| gf2_122-gls(X:S:Z:T) extended; Pornin x1: hash to addend; output already an addend | 59.8 | 19.3 ns (1.46× the best) | 21.1 ns (1.68× the best) | 22.7 ns (1.08× the best) | 101 ns (1.09× the best) | 363 ns (1.31× the best) | 26.4 ms (1.46× the best) | 5.75 ms | 152 µs | agm | Rust (AGM), PARI | none |
| gf2_122-gls-lambdaincompleteλ-projective; Pornin x1: hash to addend; output already an addend | 59.8 | 20.3 ns (1.53× the best) | 17.9 ns (1.42× the best) | 22.6 ns (1.08× the best) | 95.0 ns (1.03× the best) | 370 ns (1.33× the best) | 27.6 ms (1.53× the best) | 5.75 ms | 152 µs | agm | Rust (AGM), PARI | none |
| gf2_122-gls-wincompleteλ-projective, w codec; Pornin x1: hash to addend; output already an addend | 59.8 | 20.3 ns (1.54× the best) | 20.4 ns (1.62× the best) | 20.9 ns (best) | 94.6 ns (1.02× the best) | 370 ns (1.34× the best) | 27.7 ms (1.53× the best) | 5.75 ms | 152 µs | agm | Rust (AGM), PARI | none |
| gf2_122-gls-uunscaled (X:S:Z), w codec; Pornin x1: hash to addend; output already an addend | 59.8 | 13.7 ns (1.04× the best) | 18.0 ns (1.44× the best) | 24.7 ns (1.18× the best) | 97.6 ns (1.05× the best) | 284 ns (1.02× the best) | 18.8 ms (1.04× the best) | 5.75 ms | 152 µs | agm | Rust (AGM), PARI | none |
| GF(2^109), 14 bytes | ||||||||||||
| gf2_109(X:S:Z:T) extended; Pornin x1: hash to addend; output already an addend | 53.8 | 20.4 ns (1.54× the best) | 18.2 ns (1.45× the best) | 26.7 ns (1.28× the best) | 114 ns (1.23× the best) | 390 ns (1.41× the best) | 27.8 ms (1.54× the best) | 20.7 ms | 135 µs | agm+factor | Rust (AGM), PARI | gf2_109-lambda, gf2_122-gls-lambda, gf2_122-lambda, gf2_127-lambda, gf2_127-w |
| gf2_109-lambdaincompleteλ-projective; Pornin x1: hash to addend; output already an addend | 53.8 | 18.9 ns (1.43× the best) | 14.1 ns (1.12× the best) | 26.5 ns (1.27× the best) | 105 ns (1.13× the best) | 361 ns (1.30× the best) | 25.8 ms (1.43× the best) | 20.7 ms | 135 µs | agm+factor | Rust (AGM), PARI | none |
| gf2_109-wincompleteλ-projective, w codec; Pornin x1: hash to addend; output already an addend | 53.8 | 18.9 ns (1.43× the best) | 21.6 ns (1.72× the best) | 24.4 ns (1.17× the best) | 104 ns (1.12× the best) | 361 ns (1.30× the best) | 25.9 ms (1.43× the best) | 20.7 ms | 135 µs | agm+factor | Rust (AGM), PARI | gf2_127-lambda, gf2_127-w |
| gf2_109-uunscaled (X:S:Z), w codec; Pornin x1: hash to addend; output already an addend | 53.8 | 13.5 ns (1.02× the best) | 21.9 ns (1.74× the best) | 27.7 ns (1.33× the best) | 110 ns (1.18× the best) | 293 ns (1.06× the best) | 18.5 ms (1.02× the best) | 20.7 ms | 135 µs | agm+factor | Rust (AGM), PARI | gf2_127-u |
| F_p, p = 2^127 − 1, 16 bytes | ||||||||||||
| edwards127a = 1 Edwards, extended += cached | 62.3 | 27.5 ns (2.08× the best) | 31.9 ns (2.54× the best) | 541 ns (25.90× the best) | 1.28 µs (13.78× the best) | 1.65 µs (5.95× the best) | 39.4 ms (2.18× the best) | 1.08 s | 504 µs | pari+sieve | PARI | gf2_127, gf2_127-lambda, gf2_127-u, gf2_127-w |
| weier127short Weierstrass, projective += affine | 63.3 | 58.7 ns (4.45× the best) | 16.7 ns (1.33× the best) | 539 ns (25.81× the best) | 1.17 µs (12.59× the best) | 1.96 µs (7.08× the best) | 81.6 ms (4.51× the best) | 1.27 s | 278 µs | pari+sieve | PARI | none |
| weier127-jacobianincompleteshort Weierstrass, Jacobian += affine | 63.3 | 48.1 ns (3.64× the best) | 23.6 ns (1.88× the best) | 542 ns (25.93× the best) | 1.16 µs (12.50× the best) | 1.81 µs (6.54× the best) | 67.2 ms (3.72× the best) | 1.27 s | 278 µs | pari+sieve | PARI | none |
| F_p, p = 2^107 − 1, 14 bytes | ||||||||||||
| edwards107a = 1 Edwards, extended += cached | 52.3 | 27.6 ns (2.09× the best) | 35.1 ns (2.80× the best) | 426 ns (20.37× the best) | 954 ns (10.30× the best) | 1.33 µs (4.79× the best) | 39.0 ms (2.16× the best) | Sage | gf2_109, gf2_109-lambda, gf2_109-u, gf2_109-w, gf2_122, gf2_122-gls, gf2_122-gls-lambda, gf2_122-gls-u, gf2_122-gls-w, gf2_122-lambda, gf2_122-u, gf2_122-w, gf2_127, gf2_127-lambda, gf2_127-u, gf2_127-w | |||
| weier107short Weierstrass, projective += affine | 53.3 | 48.6 ns (3.68× the best) | 19.4 ns (1.54× the best) | 422 ns (20.19× the best) | 902 ns (9.73× the best) | 1.56 µs (5.63× the best) | 67.4 ms (3.73× the best) | Sage | gf2_109, gf2_109-lambda, gf2_122-gls-lambda, gf2_122-gls-u, gf2_122-lambda, gf2_122-u, gf2_127-lambda, gf2_127-u, gf2_127-w | |||
| weier107-jacobianincompleteshort Weierstrass, Jacobian += affine | 53.3 | 44.1 ns (3.34× the best) | 25.5 ns (2.03× the best) | 421 ns (20.13× the best) | 894 ns (9.64× the best) | 1.49 µs (5.39× the best) | 61.4 ms (3.40× the best) | Sage | gf2_109, gf2_109-lambda, gf2_109-u, gf2_109-w, gf2_122, gf2_122-gls, gf2_122-gls-lambda, gf2_122-gls-u, gf2_122-gls-w, gf2_122-lambda, gf2_122-u, gf2_122-w, gf2_127, gf2_127-lambda, gf2_127-u, gf2_127-w | |||
| F_p, p = 2^128 − 275, 16 bytes | ||||||||||||
| twisted128a = −1 twisted Edwards modulo 2-torsion, extended += cached | 62.8 | 31.1 ns (2.35× the best) | 22.7 ns (1.81× the best) | 962 ns (46.04× the best) | 1.97 µs (21.28× the best) | 2.39 µs (8.64× the best) | 45.5 ms (2.52× the best) | Sage | gf2_127-lambda, gf2_127-u, gf2_127-w | |||
| F_{p²}, p = 2^61 − 1, 16 bytes | ||||||||||||
| edwards61x2a = 1 Edwards, signed-x codec, extended += cached | 59.8 | 25.8 ns (1.95× the best) | 35.0 ns (2.79× the best) | 441 ns (21.08× the best) | 741 ns (7.99× the best) | 1.09 µs (3.94× the best) | 36.4 ms (2.01× the best) | 577 ms | 257 µs | pari+sieve | PARI | gf2_122, gf2_122-gls, gf2_122-gls-lambda, gf2_122-gls-u, gf2_122-gls-w, gf2_122-lambda, gf2_122-u, gf2_122-w, gf2_127, gf2_127-lambda, gf2_127-u, gf2_127-w |
| weier61x2short Weierstrass, signed-x codec, projective += affine | 60.8 | 50.6 ns (3.83× the best) | 15.3 ns (1.22× the best) | 448 ns (21.43× the best) | 698 ns (7.53× the best) | 1.38 µs (5.00× the best) | 70.0 ms (3.87× the best) | 639 ms | 188 µs | pari+sieve | PARI | gf2_127-u |
| weier61x2-jacobianincompleteshort Weierstrass, signed-x codec, Jacobian += affine | 60.8 | 50.2 ns (3.80× the best) | 24.8 ns (1.97× the best) | 445 ns (21.28× the best) | 699 ns (7.54× the best) | 1.38 µs (4.98× the best) | 69.4 ms (3.84× the best) | 639 ms | 188 µs | pari+sieve | PARI | gf2_127, gf2_127-lambda, gf2_127-u, gf2_127-w |
| twisted61x2a = −1 Edwards modulo 2-torsion, extended += cached | 59.8 | 24.9 ns (1.89× the best) | 14.9 ns (1.19× the best) | 450 ns (21.55× the best) | 719 ns (7.75× the best) | 1.06 µs (3.81× the best) | 35.2 ms (1.95× the best) | 1.28 s | 318 µs | pari+sieve | PARI | gf2_127-u |
| F_{p²}, p = 2^64 − 59, 16 bytes | ||||||||||||
| twisted64x2a = −1 Edwards modulo 2-torsion, extended += cached | 62.8 | 33.3 ns (2.52× the best) | 22.6 ns (1.80× the best) | 647 ns (30.96× the best) | 1.01 µs (10.92× the best) | 1.46 µs (5.28× the best) | 47.1 ms (2.60× the best) | 2.20 s | 552 µs | pari+sieve | PARI | gf2_127-lambda, gf2_127-u, gf2_127-w |
| F_{p²}, p = 2^64 − 2^32 + 1, 16 bytes | ||||||||||||
| twisted-goldilocks2a = −1 Edwards modulo 2-torsion, extended += cached | 62.8 | 28.7 ns (2.18× the best) | 22.9 ns (1.83× the best) | 1.92 µs (92.00× the best) | 2.25 µs (24.24× the best) | 2.64 µs (9.51× the best) | 43.9 ms (2.43× the best) | 2.02 s | 767 µs | pari+sieve | PARI | gf2_127-lambda, gf2_127-u, gf2_127-w |
bold: the best of its column; italic, dotted: tied with the best within the confidence intervals; shading: ratio to the best, pale yellow at 1× to purple at 16× or more; grey: baseline, not compared.
Machine
| Intel(R) Xeon(R) W-1390P @ 3.50GHz · x86-64-v3 · full · ef9e82d3 | |
|---|---|
| CPU | Intel(R) Xeon(R) W-1390P @ 3.50GHz, 16 cores, 126 GiB |
| OS | ? (Linux 6.18.48, x86_64) |
| rustc | rustc 1.98.1 (48a229cea 2026-09-01) |
| RUSTFLAGS | -C target-cpu=x86-64-v3 -C target-feature=+pclmulqdq |
| field backend features | avx2, pclmulqdq, sse4.1 |
| commit | ef9e82d39fbf06c605e1740360370f0003dc4ca4 |
| suites | compare compare107 compare109 compare122 compare_fp2 group riblt agm sieve curvegen |
| profile | full |
| criterion arguments | –warm-up-time 3 –measurement-time 5 –sample-size 100 –nresamples 100000 |
| run | 2026-10-08T18:42:23Z .. 2026-10-08T23:22:43Z |
Load averages by phase while the run timed (Measurement methodology).
| phase | seconds | 1-minute average, mean | runnable, mean | runnable, most |
|---|---|---|---|---|
| idle before | 25 | 1.32 | 0.00 | 0.0 |
| compare | 660 | 1.30 | 1.26 | 3.0 |
| compare107 | 260 | 1.39 | 1.27 | 3.0 |
| compare109 | 260 | 1.45 | 1.13 | 3.0 |
| compare122 | 400 | 1.12 | 1.12 | 2.0 |
| compare_fp2 | 570 | 1.08 | 1.10 | 2.0 |
| group | 3730 | 1.25 | 1.22 | 20.0 |
| group wide | 3055 | 1.25 | 1.17 | 18.0 |
| riblt mapping | 345 | 1.15 | 1.07 | 3.0 |
| riblt plan | 25 | 1.03 | 1.20 | 2.0 |
| riblt | 6660 | 1.16 | 1.13 | 16.0 |
| agm | 85 | 1.16 | 1.06 | 2.0 |
| sieve | 240 | 1.09 | 1.52 | 16.0 |
| curvegen | 90 | 1.04 | 1.11 | 2.0 |
| curvegen searches | 365 | 1.08 | 1.15 | 3.0 |
| idle after | 30 | 0.83 | 0.00 | 0.0 |
Group benchmark plan
Which families the group suite’s second pass timed. Its first pass timed every family’s core rows; from them and the comparison maps, bench-run chose the families whose modeled insertion at was within 50% of the cheapest (lead) and, if none of them was over a field of odd characteristic, the cheapest that was (contrast). The second pass added the batch sweep, subtraction, equality on pure cells and the hashes of IDs (The group plan).
| family | role |
|---|---|
| binary-u.127 | lead |
| binary-u.122-gls | lead |
| binary-u.109 | lead |
| binary-u.122 | lead |
| binary-lambda.127 | lead |
| binary-w.127 | lead |
| binary-lambda.109 | lead |
| binary-w.109 | lead |
| binary.122-gls | lead |
| binary.127 | lead |
| binary-lambda.122 | lead |
| binary-lambda.122-gls | lead |
| binary-w.122-gls | lead |
| binary.122 | lead |
| binary-w.122 | lead |
| binary.109 | lead |
| twisted.61x2 | contrast |
RIBLT benchmark plan
Which RIBLT benchmarks this run generated. Before the RIBLT suite ran, bench-run chose from this run’s group and hash-to-curve results, for each family below, the hash its RIBLT benchmarks use and their scope: every sweep (full), each axis’s endpoints and middle (buffer), or one point of each benchmark (spot); and for full and buffer scope, the field whose projection hashes the family’s IDs cheapest and the one whose projection seeds mappings cheapest, under which it also encodes and peels cells keyed by IDs. The plan records what was measured, not a result; the XOR checksums and ristretto255 are timed in full regardless (The RIBLT plan).
| family | hash | scope | projection | mapping projection |
|---|---|---|---|---|
| binary-lambda.109 | pornin-addend | buffer | gf2_127 | gf2_127 |
| binary-lambda.122 | pornin-addend | buffer | gf2_127 | gf2_127 |
| binary-lambda.122-gls | pornin-addend | buffer | gf2_127 | gf2_127 |
| binary-lambda.127 | pornin-addend | full | gf2_127 | gf2_127 |
| binary-u.109 | pornin-addend | full | gf2_127 | gf2_127 |
| binary-u.122 | pornin-addend | full | gf2_127 | gf2_127 |
| binary-u.122-gls | pornin-addend | full | gf2_127 | gf2_127 |
| binary-u.127 | pornin-addend | full | gf2_127 | gf2_127 |
| binary-w.109 | pornin-addend | buffer | gf2_127 | gf2_127 |
| binary-w.122 | pornin-addend | buffer | gf2_127 | gf2_127 |
| binary-w.122-gls | pornin-addend | buffer | gf2_127 | gf2_127 |
| binary-w.127 | pornin-addend | full | gf2_127 | gf2_127 |
| binary.109 | pornin | buffer | gf2_127 | gf2_127 |
| binary.122 | pornin | buffer | gf2_127 | gf2_127 |
| binary.122-gls | pornin | buffer | gf2_127 | gf2_127 |
| binary.127 | pornin | buffer | gf2_127 | gf2_127 |
| edwards.107 | ti | spot | ||
| edwards.127 | ti | spot | ||
| edwards.61x2 | ti | spot | ||
| twisted.128 | ti | spot | ||
| twisted.61x2 | ti | spot | ||
| twisted.64x2 | ti | spot | ||
| twisted.goldilocks2 | ti | spot | ||
| weier-jacobian.107 | ti | spot | ||
| weier-jacobian.127 | ti | spot | ||
| weier-jacobian.61x2 | ti | spot | ||
| weier.107 | ti | spot | ||
| weier.127 | ti | spot | ||
| weier.61x2 | ti | spot |
Insertion
Modeled insertion per item into a sketch of cells: a hash, a prepare, and an addition to each of the cells the item maps to on average (: ; : ; : ; : ; : ), by compatible recipes (Reading a run report). The references (xor, ristretto255) have no batched hash: they hash one item at a time, add the hash output as is, and are in the figure and the second grid. Each total also counts, the same for every family, the salted SHA-256 map digest and the xoshiro256pp walk through the item’s indices below (riblt.mapping): 78.2 ns at , 101 ns at , 138 ns at , 175 ns at , 211 ns at . The key XOR and count of each cell are not modelled; riblt.cells measures them with the rest of the cell updates.
| curve | per item, once | per cell | per item, into k cells | |||||
|---|---|---|---|---|---|---|---|---|
| hash (batched) | prepare (batched) | add (throughput) | : | : | : | : | : | |
| GF(2^127), 16 bytes | ||||||||
| gf2_127(X:S:Z:T) extended accumulators, Pornin's formulas | 113 ns (1.22× the best) | 6.36 ns (13.70× the best) | 19.5 ns (1.48× the best) | 254 ns (1.18× the best) | 323 ns (1.20× the best) | 437 ns (1.22× the best) | 560 ns (1.24× the best) | 681 ns (1.25× the best) |
| gf2_127compare suitePornin x1: hash to addend; output already an addend | 103 ns (1.11× the best) | in the hash | 19.5 ns (1.48× the best) | 237 ns (1.11× the best) | 307 ns (1.14× the best) | 420 ns (1.18× the best) | 543 ns (1.20× the best) | 664 ns (1.22× the best) |
| gf2_127-lambdaincompleteλ-projective (X:L:Z) accumulators | 114 ns (1.23× the best) | 8.18 ns (17.62× the best) | 17.6 ns (1.34× the best) | 252 ns (1.17× the best) | 316 ns (1.18× the best) | 422 ns (1.18× the best) | 537 ns (1.19× the best) | 650 ns (1.19× the best) |
| gf2_127-lambdaincompletecompare suitehashed straight to : no prepare | 111 ns (1.20× the best) | in the hash | 17.6 ns (1.34× the best) | 241 ns (1.12× the best) | 305 ns (1.14× the best) | 411 ns (1.15× the best) | 526 ns (1.16× the best) | 639 ns (1.17× the best) |
| gf2_127-lambdaincompletecompare suitePornin x1: hash to addend; output already an addend | 92.7 ns (tied for the best, within noise) | in the hash | 17.6 ns (1.34× the best) | 222 ns (1.04× the best) | 287 ns (1.07× the best) | 393 ns (1.10× the best) | 507 ns (1.12× the best) | 620 ns (1.14× the best) |
| gf2_127-wincompleteλ-projective, w codec: hashes and decodes to λ-affine | 119 ns (1.29× the best) | 0.47 ns (1.01× the best) | 17.7 ns (1.34× the best) | 249 ns (1.16× the best) | 314 ns (1.17× the best) | 420 ns (1.18× the best) | 535 ns (1.18× the best) | 648 ns (1.19× the best) |
| gf2_127-wincompletecompare suitePornin x1: hash to addend; output already an addend | 92.8 ns (tied for the best, within noise, 1.00×) | in the hash | 17.7 ns (1.34× the best) | 222 ns (1.04× the best) | 287 ns (1.07× the best) | 393 ns (1.10× the best) | 508 ns (1.12× the best) | 621 ns (1.14× the best) |
| gf2_127-uunscaled (X:S:Z), w codec, direct addend hashes | 125 ns (1.35× the best) | 0.47 ns (1.02× the best) | 13.2 ns (tied for the best, within noise) | 242 ns (1.13× the best) | 296 ns (1.10× the best) | 384 ns (1.08× the best) | 480 ns (1.06× the best) | 573 ns (1.05× the best) |
| gf2_127-ucompare suitePornin x1: hash to addend; output already an addend | 98.0 ns (1.06× the best) | in the hash | 13.2 ns (tied for the best, within noise) | 214 ns (best) | 269 ns (best) | 357 ns (best) | 453 ns (best) | 546 ns (best) |
| GF(2^122) = GF(2^61)[u], dense constant, 16 bytes | ||||||||
| gf2_122(X:S:Z:T) extended | 114 ns (1.23× the best) | 5.01 ns (10.80× the best) | 19.9 ns (1.51× the best) | 255 ns (1.19× the best) | 325 ns (1.21× the best) | 440 ns (1.23× the best) | 565 ns (1.25× the best) | 687 ns (1.26× the best) |
| gf2_122compare suitePornin x1: hash to addend; output already an addend | 103 ns (1.11× the best) | in the hash | 19.9 ns (1.51× the best) | 239 ns (1.11× the best) | 309 ns (1.15× the best) | 424 ns (1.19× the best) | 549 ns (1.21× the best) | 671 ns (1.23× the best) |
| gf2_122-lambdaincompleteλ-projective | 115 ns (1.25× the best) | 8.18 ns (17.61× the best) | 20.2 ns (1.53× the best) | 261 ns (1.21× the best) | 332 ns (1.23× the best) | 448 ns (1.25× the best) | 574 ns (1.27× the best) | 698 ns (1.28× the best) |
| gf2_122-lambdaincompletecompare suitehashed straight to : no prepare | 119 ns (1.29× the best) | in the hash | 20.2 ns (1.53× the best) | 256 ns (1.19× the best) | 327 ns (1.22× the best) | 443 ns (1.24× the best) | 570 ns (1.26× the best) | 694 ns (1.27× the best) |
| gf2_122-lambdaincompletecompare suitePornin x1: hash to addend; output already an addend | 95.0 ns (1.02× the best) | in the hash | 20.2 ns (1.53× the best) | 232 ns (1.08× the best) | 303 ns (1.13× the best) | 419 ns (1.17× the best) | 545 ns (1.20× the best) | 669 ns (1.23× the best) |
| gf2_122-wincompleteλ-projective, w codec | 116 ns (1.25× the best) | 0.47 ns (tied for the best, within noise, 1.00×) | 20.5 ns (1.55× the best) | 254 ns (1.19× the best) | 326 ns (1.21× the best) | 443 ns (1.24× the best) | 570 ns (1.26× the best) | 696 ns (1.27× the best) |
| gf2_122-wincompletecompare suitePornin x1: hash to addend; output already an addend | 95.2 ns (1.03× the best) | in the hash | 20.5 ns (1.55× the best) | 233 ns (1.09× the best) | 305 ns (1.13× the best) | 422 ns (1.18× the best) | 549 ns (1.21× the best) | 674 ns (1.24× the best) |
| gf2_122-uunscaled (X:S:Z), w codec | 127 ns (1.37× the best) | 0.49 ns (1.06× the best) | 14.3 ns (1.08× the best) | 247 ns (1.15× the best) | 304 ns (1.13× the best) | 397 ns (1.11× the best) | 497 ns (1.10× the best) | 595 ns (1.09× the best) |
| gf2_122-ucompare suitePornin x1: hash to addend; output already an addend | 99.3 ns (1.07× the best) | in the hash | 14.3 ns (1.08× the best) | 219 ns (1.02× the best) | 276 ns (1.03× the best) | 369 ns (1.03× the best) | 469 ns (1.04× the best) | 567 ns (1.04× the best) |
| GF(2^122), constant in GF(2^61) (GLS-shaped), 16 bytes | ||||||||
| gf2_122-gls(X:S:Z:T) extended | 116 ns (1.25× the best) | 4.27 ns (9.20× the best) | 19.3 ns (1.46× the best) | 255 ns (1.19× the best) | 324 ns (1.20× the best) | 436 ns (1.22× the best) | 558 ns (1.23× the best) | 678 ns (1.24× the best) |
| gf2_122-glscompare suitePornin x1: hash to addend; output already an addend | 101 ns (1.09× the best) | in the hash | 19.3 ns (1.46× the best) | 236 ns (1.10× the best) | 304 ns (1.13× the best) | 417 ns (1.17× the best) | 539 ns (1.19× the best) | 659 ns (1.21× the best) |
| gf2_122-gls-lambdaincompleteλ-projective | 116 ns (1.25× the best) | 8.11 ns (17.46× the best) | 20.3 ns (1.53× the best) | 261 ns (1.22× the best) | 332 ns (1.23× the best) | 448 ns (1.25× the best) | 574 ns (1.27× the best) | 698 ns (1.28× the best) |
| gf2_122-gls-lambdaincompletecompare suitehashed straight to : no prepare | 121 ns (1.30× the best) | in the hash | 20.3 ns (1.53× the best) | 258 ns (1.20× the best) | 329 ns (1.22× the best) | 445 ns (1.25× the best) | 571 ns (1.26× the best) | 695 ns (1.27× the best) |
| gf2_122-gls-lambdaincompletecompare suitePornin x1: hash to addend; output already an addend | 95.0 ns (1.03× the best) | in the hash | 20.3 ns (1.53× the best) | 232 ns (1.08× the best) | 303 ns (1.13× the best) | 419 ns (1.17× the best) | 545 ns (1.21× the best) | 669 ns (1.23× the best) |
| gf2_122-gls-wincompleteλ-projective, w codec | 116 ns (1.25× the best) | 0.68 ns (1.47× the best) | 20.3 ns (1.54× the best) | 253 ns (1.18× the best) | 325 ns (1.21× the best) | 441 ns (1.23× the best) | 567 ns (1.25× the best) | 692 ns (1.27× the best) |
| gf2_122-gls-wincompletecompare suitePornin x1: hash to addend; output already an addend | 94.6 ns (1.02× the best) | in the hash | 20.3 ns (1.54× the best) | 232 ns (1.08× the best) | 303 ns (1.13× the best) | 419 ns (1.17× the best) | 546 ns (1.21× the best) | 670 ns (1.23× the best) |
| gf2_122-gls-uunscaled (X:S:Z), w codec | 121 ns (1.30× the best) | 0.68 ns (1.46× the best) | 13.7 ns (1.04× the best) | 240 ns (1.12× the best) | 295 ns (1.10× the best) | 386 ns (1.08× the best) | 483 ns (1.07× the best) | 579 ns (1.06× the best) |
| gf2_122-gls-ucompare suitePornin x1: hash to addend; output already an addend | 97.6 ns (1.05× the best) | in the hash | 13.7 ns (1.04× the best) | 216 ns (1.01× the best) | 271 ns (1.01× the best) | 362 ns (1.01× the best) | 459 ns (1.02× the best) | 555 ns (1.02× the best) |
| GF(2^109), 14 bytes | ||||||||
| gf2_109(X:S:Z:T) extended | 126 ns (1.36× the best) | 4.25 ns (9.16× the best) | 20.4 ns (1.54× the best) | 268 ns (1.25× the best) | 339 ns (1.26× the best) | 455 ns (1.28× the best) | 582 ns (1.29× the best) | 707 ns (1.30× the best) |
| gf2_109compare suitePornin x1: hash to addend; output already an addend | 114 ns (1.23× the best) | in the hash | 20.4 ns (1.54× the best) | 251 ns (1.17× the best) | 322 ns (1.20× the best) | 439 ns (1.23× the best) | 566 ns (1.25× the best) | 690 ns (1.27× the best) |
| gf2_109-lambdaincompleteλ-projective | 124 ns (1.34× the best) | 8.13 ns (17.51× the best) | 18.9 ns (1.43× the best) | 266 ns (1.24× the best) | 333 ns (1.24× the best) | 444 ns (1.24× the best) | 564 ns (1.25× the best) | 683 ns (1.25× the best) |
| gf2_109-lambdaincompletecompare suitehashed straight to : no prepare | 131 ns (1.41× the best) | in the hash | 18.9 ns (1.43× the best) | 264 ns (1.23× the best) | 331 ns (1.23× the best) | 442 ns (1.24× the best) | 563 ns (1.24× the best) | 681 ns (1.25× the best) |
| gf2_109-lambdaincompletecompare suitePornin x1: hash to addend; output already an addend | 105 ns (1.13× the best) | in the hash | 18.9 ns (1.43× the best) | 238 ns (1.11× the best) | 305 ns (1.14× the best) | 416 ns (1.17× the best) | 536 ns (1.19× the best) | 655 ns (1.20× the best) |
| gf2_109-wincompleteλ-projective, w codec | 120 ns (1.29× the best) | 0.47 ns (tied for the best, within noise, 1.01×) | 18.9 ns (1.43× the best) | 254 ns (1.18× the best) | 321 ns (1.20× the best) | 432 ns (1.21× the best) | 553 ns (1.22× the best) | 671 ns (1.23× the best) |
| gf2_109-wincompletecompare suitePornin x1: hash to addend; output already an addend | 104 ns (1.12× the best) | in the hash | 18.9 ns (1.43× the best) | 237 ns (1.11× the best) | 305 ns (1.14× the best) | 416 ns (1.16× the best) | 537 ns (1.19× the best) | 655 ns (1.20× the best) |
| gf2_109-uunscaled (X:S:Z), w codec | 125 ns (1.35× the best) | 0.46 ns (tied for the best, within noise) | 13.5 ns (1.02× the best) | 243 ns (1.13× the best) | 298 ns (1.11× the best) | 387 ns (1.08× the best) | 484 ns (1.07× the best) | 578 ns (1.06× the best) |
| gf2_109-ucompare suitePornin x1: hash to addend; output already an addend | 110 ns (1.18× the best) | in the hash | 13.5 ns (1.02× the best) | 227 ns (1.06× the best) | 282 ns (1.05× the best) | 372 ns (1.04× the best) | 468 ns (1.03× the best) | 563 ns (1.03× the best) |
| F_p, p = 2^127 − 1, 16 bytes | ||||||||
| edwards127a = 1 Edwards, extended += cached | 1.24 µs (13.35× the best) | 39.9 ns (86.04× the best) | 27.5 ns (2.08× the best) | 1.44 µs (6.69× the best) | 1.52 µs (5.67× the best) | 1.67 µs (4.67× the best) | 1.83 µs (4.03× the best) | 1.98 µs (3.63× the best) |
| weier127short Weierstrass, projective += affine | 1.17 µs (12.58× the best) | 1.00 ns (2.15× the best) | 58.7 ns (4.45× the best) | 1.42 µs (6.60× the best) | 1.58 µs (5.87× the best) | 1.84 µs (5.16× the best) | 2.14 µs (4.73× the best) | 2.43 µs (4.46× the best) |
| weier127-jacobianincompleteshort Weierstrass, Jacobian += affine | 1.16 µs (12.49× the best) | 0.99 ns (2.13× the best) | 48.1 ns (3.64× the best) | 1.38 µs (6.42× the best) | 1.51 µs (5.64× the best) | 1.74 µs (4.87× the best) | 1.99 µs (4.39× the best) | 2.23 µs (4.09× the best) |
| F_p, p = 2^107 − 1, 14 bytes | ||||||||
| edwards107a = 1 Edwards, extended += cached | 916 ns (9.89× the best) | 37.9 ns (81.74× the best) | 27.6 ns (2.09× the best) | 1.11 µs (5.19× the best) | 1.20 µs (4.47× the best) | 1.35 µs (3.77× the best) | 1.50 µs (3.32× the best) | 1.66 µs (3.04× the best) |
| weier107short Weierstrass, projective += affine | 901 ns (9.72× the best) | 0.63 ns (1.35× the best) | 48.6 ns (3.68× the best) | 1.12 µs (5.23× the best) | 1.26 µs (4.69× the best) | 1.49 µs (4.16× the best) | 1.74 µs (3.84× the best) | 1.98 µs (3.64× the best) |
| weier107-jacobianincompleteshort Weierstrass, Jacobian += affine | 893 ns (9.63× the best) | 0.63 ns (1.35× the best) | 44.1 ns (3.34× the best) | 1.10 µs (5.13× the best) | 1.23 µs (4.57× the best) | 1.44 µs (4.02× the best) | 1.67 µs (3.69× the best) | 1.90 µs (3.48× the best) |
| F_p, p = 2^128 − 275, 16 bytes | ||||||||
| twisted128a = −1 twisted Edwards modulo 2-torsion, extended += cached | 1.96 µs (21.15× the best) | 12.7 ns (27.29× the best) | 31.1 ns (2.35× the best) | 2.14 µs (9.98× the best) | 2.24 µs (8.33× the best) | 2.40 µs (6.71× the best) | 2.57 µs (5.68× the best) | 2.74 µs (5.02× the best) |
| F_{p²}, p = 2^61 − 1, 16 bytes | ||||||||
| edwards61x2a = 1 Edwards, signed-x codec, extended += cached | 706 ns (7.62× the best) | 34.9 ns (75.23× the best) | 25.8 ns (1.95× the best) | 894 ns (4.17× the best) | 978 ns (3.64× the best) | 1.12 µs (3.12× the best) | 1.27 µs (2.80× the best) | 1.41 µs (2.59× the best) |
| weier61x2short Weierstrass, signed-x codec, projective += affine | 698 ns (7.53× the best) | 0.52 ns (1.13× the best) | 50.6 ns (3.83× the best) | 923 ns (4.30× the best) | 1.07 µs (3.97× the best) | 1.30 µs (3.64× the best) | 1.56 µs (3.45× the best) | 1.82 µs (3.33× the best) |
| weier61x2-jacobianincompleteshort Weierstrass, signed-x codec, Jacobian += affine | 698 ns (7.53× the best) | 0.52 ns (1.12× the best) | 50.2 ns (3.80× the best) | 922 ns (4.30× the best) | 1.06 µs (3.96× the best) | 1.30 µs (3.63× the best) | 1.55 µs (3.44× the best) | 1.81 µs (3.32× the best) |
| twisted61x2a = −1 Edwards modulo 2-torsion, extended += cached | 711 ns (7.67× the best) | 7.93 ns (17.07× the best) | 24.9 ns (1.89× the best) | 869 ns (4.05× the best) | 951 ns (3.54× the best) | 1.09 µs (3.04× the best) | 1.23 µs (2.72× the best) | 1.38 µs (2.52× the best) |
| F_{p²}, p = 2^64 − 59, 16 bytes | ||||||||
| twisted64x2a = −1 Edwards modulo 2-torsion, extended += cached | 1.00 µs (10.83× the best) | 8.79 ns (18.94× the best) | 33.3 ns (2.52× the best) | 1.19 µs (5.53× the best) | 1.29 µs (4.80× the best) | 1.46 µs (4.08× the best) | 1.64 µs (3.62× the best) | 1.82 µs (3.34× the best) |
| F_{p²}, p = 2^64 − 2^32 + 1, 16 bytes | ||||||||
| twisted-goldilocks2a = −1 Edwards modulo 2-torsion, extended += cached | 2.24 µs (24.14× the best) | 9.54 ns (20.55× the best) | 28.7 ns (2.18× the best) | 2.41 µs (11.23× the best) | 2.50 µs (9.30× the best) | 2.65 µs (7.42× the best) | 2.81 µs (6.21× the best) | 2.97 µs (5.45× the best) |
bold: the best of its column; italic, dotted: tied with the best within the confidence intervals; shading: ratio to the best, pale yellow at 1× to purple at 16× or more; grey: baseline, not compared.
Hashing and preparing one item at a time
| curve | per item, once | per cell | per item, into k cells | |||||
|---|---|---|---|---|---|---|---|---|
| hash (alone) | prepare (alone) | add (throughput) | : | : | : | : | : | |
| baseline | ||||||||
| xorcompare suitehash output added as is: no prepare | 53.4 ns | in the hash | 0.45 ns | 133 ns | 157 ns | 195 ns | 235 ns | 272 ns |
| GF(2^127), 16 bytes | ||||||||
| gf2_127(X:S:Z:T) extended accumulators, Pornin's formulas | 366 ns (1.50× the best) | 6.38 ns (14.85× the best) | 19.5 ns (1.48× the best) | 508 ns (1.39× the best) | 577 ns (1.37× the best) | 690 ns (1.36× the best) | 813 ns (1.35× the best) | 934 ns (1.34× the best) |
| gf2_127compare suitePornin x2: hash to addend; output already an addend | 452 ns (1.85× the best) | in the hash | 19.5 ns (1.48× the best) | 587 ns (1.61× the best) | 656 ns (1.56× the best) | 770 ns (1.51× the best) | 893 ns (1.48× the best) | 1.01 µs (1.45× the best) |
| gf2_127compare suitePornin x1: hash to addend; output already an addend | 256 ns (1.05× the best) | in the hash | 19.5 ns (1.48× the best) | 391 ns (1.07× the best) | 460 ns (1.10× the best) | 574 ns (1.13× the best) | 697 ns (1.15× the best) | 818 ns (1.17× the best) |
| gf2_127-lambdaincompleteλ-projective (X:L:Z) accumulators | 394 ns (1.62× the best) | 129 ns (299.16× the best) | 17.6 ns (1.34× the best) | 652 ns (1.78× the best) | 717 ns (1.71× the best) | 823 ns (1.62× the best) | 938 ns (1.55× the best) | 1.05 µs (1.51× the best) |
| gf2_127-lambdaincompletecompare suitehashed straight to : no prepare | 369 ns (1.52× the best) | in the hash | 17.6 ns (1.34× the best) | 499 ns (1.36× the best) | 563 ns (1.34× the best) | 669 ns (1.32× the best) | 784 ns (1.30× the best) | 897 ns (1.29× the best) |
| gf2_127-lambdaincompletecompare suitePornin x1: hash to addend; output already an addend | 245 ns (tied for the best, within noise, 1.00×) | in the hash | 17.6 ns (1.34× the best) | 374 ns (1.02× the best) | 439 ns (1.05× the best) | 545 ns (1.07× the best) | 660 ns (1.09× the best) | 772 ns (1.11× the best) |
| gf2_127-wincompleteλ-projective, w codec: hashes and decodes to λ-affine | 392 ns (1.61× the best) | 0.45 ns (tied for the best, within noise, 1.06×) | 17.7 ns (1.34× the best) | 522 ns (1.43× the best) | 587 ns (1.40× the best) | 693 ns (1.36× the best) | 808 ns (1.34× the best) | 921 ns (1.32× the best) |
| gf2_127-wincompletecompare suitePornin x1: hash to addend; output already an addend | 244 ns (tied for the best, within noise) | in the hash | 17.7 ns (1.34× the best) | 373 ns (1.02× the best) | 438 ns (1.04× the best) | 544 ns (1.07× the best) | 659 ns (1.09× the best) | 772 ns (1.11× the best) |
| gf2_127-uunscaled (X:S:Z), w codec, direct addend hashes | 401 ns (1.65× the best) | 0.48 ns (1.13× the best) | 13.2 ns (tied for the best, within noise) | 518 ns (1.42× the best) | 573 ns (1.36× the best) | 661 ns (1.30× the best) | 756 ns (1.25× the best) | 850 ns (1.22× the best) |
| gf2_127-ucompare suitePornin x1: hash to addend; output already an addend | 249 ns (1.02× the best) | in the hash | 13.2 ns (tied for the best, within noise) | 366 ns (best) | 420 ns (best) | 508 ns (best) | 604 ns (best) | 697 ns (best) |
| GF(2^122) = GF(2^61)[u], dense constant, 16 bytes | ||||||||
| gf2_122(X:S:Z:T) extended | 670 ns (2.75× the best) | 4.91 ns (11.42× the best) | 19.9 ns (1.51× the best) | 811 ns (2.22× the best) | 881 ns (2.10× the best) | 996 ns (1.96× the best) | 1.12 µs (1.86× the best) | 1.24 µs (1.78× the best) |
| gf2_122compare suitePornin x1: hash to addend; output already an addend | 392 ns (1.61× the best) | in the hash | 19.9 ns (1.51× the best) | 528 ns (1.44× the best) | 598 ns (1.42× the best) | 713 ns (1.40× the best) | 837 ns (1.39× the best) | 960 ns (1.38× the best) |
| gf2_122-lambdaincompleteλ-projective | 679 ns (2.78× the best) | 251 ns (583.32× the best) | 20.2 ns (1.53× the best) | 1.07 µs (2.92× the best) | 1.14 µs (2.71× the best) | 1.25 µs (2.47× the best) | 1.38 µs (2.29× the best) | 1.50 µs (2.16× the best) |
| gf2_122-lambdaincompletecompare suitehashed straight to : no prepare | 672 ns (2.76× the best) | in the hash | 20.2 ns (1.53× the best) | 809 ns (2.21× the best) | 880 ns (2.10× the best) | 996 ns (1.96× the best) | 1.12 µs (1.86× the best) | 1.25 µs (1.79× the best) |
| gf2_122-lambdaincompletecompare suitePornin x1: hash to addend; output already an addend | 381 ns (1.56× the best) | in the hash | 20.2 ns (1.53× the best) | 518 ns (1.42× the best) | 589 ns (1.40× the best) | 705 ns (1.39× the best) | 831 ns (1.38× the best) | 956 ns (1.37× the best) |
| gf2_122-wincompleteλ-projective, w codec | 654 ns (2.69× the best) | 0.44 ns (tied for the best, within noise, 1.02×) | 20.5 ns (1.55× the best) | 793 ns (2.17× the best) | 864 ns (2.06× the best) | 981 ns (1.93× the best) | 1.11 µs (1.84× the best) | 1.23 µs (1.77× the best) |
| gf2_122-wincompletecompare suitePornin x1: hash to addend; output already an addend | 381 ns (1.56× the best) | in the hash | 20.5 ns (1.55× the best) | 519 ns (1.42× the best) | 590 ns (1.41× the best) | 707 ns (1.39× the best) | 835 ns (1.38× the best) | 960 ns (1.38× the best) |
| gf2_122-uunscaled (X:S:Z), w codec | 674 ns (2.77× the best) | 0.50 ns (1.15× the best) | 14.3 ns (1.08× the best) | 794 ns (2.17× the best) | 851 ns (2.03× the best) | 944 ns (1.86× the best) | 1.04 µs (1.73× the best) | 1.14 µs (1.64× the best) |
| gf2_122-ucompare suitePornin x1: hash to addend; output already an addend | 391 ns (1.60× the best) | in the hash | 14.3 ns (1.08× the best) | 511 ns (1.40× the best) | 567 ns (1.35× the best) | 660 ns (1.30× the best) | 761 ns (1.26× the best) | 859 ns (1.23× the best) |
| GF(2^122), constant in GF(2^61) (GLS-shaped), 16 bytes | ||||||||
| gf2_122-gls(X:S:Z:T) extended | 697 ns (2.86× the best) | 4.22 ns (9.82× the best) | 19.3 ns (1.46× the best) | 835 ns (2.28× the best) | 904 ns (2.15× the best) | 1.02 µs (2.00× the best) | 1.14 µs (1.89× the best) | 1.26 µs (1.81× the best) |
| gf2_122-glscompare suitePornin x1: hash to addend; output already an addend | 394 ns (1.62× the best) | in the hash | 19.3 ns (1.46× the best) | 529 ns (1.45× the best) | 597 ns (1.42× the best) | 710 ns (1.40× the best) | 832 ns (1.38× the best) | 952 ns (1.37× the best) |
| gf2_122-gls-lambdaincompleteλ-projective | 692 ns (2.84× the best) | 249 ns (579.08× the best) | 20.3 ns (1.53× the best) | 1.08 µs (2.95× the best) | 1.15 µs (2.74× the best) | 1.26 µs (2.49× the best) | 1.39 µs (2.30× the best) | 1.52 µs (2.17× the best) |
| gf2_122-gls-lambdaincompletecompare suitehashed straight to : no prepare | 679 ns (2.79× the best) | in the hash | 20.3 ns (1.53× the best) | 816 ns (2.23× the best) | 887 ns (2.11× the best) | 1.00 µs (1.97× the best) | 1.13 µs (1.87× the best) | 1.25 µs (1.80× the best) |
| gf2_122-gls-lambdaincompletecompare suitePornin x1: hash to addend; output already an addend | 385 ns (1.58× the best) | in the hash | 20.3 ns (1.53× the best) | 522 ns (1.43× the best) | 593 ns (1.41× the best) | 709 ns (1.39× the best) | 835 ns (1.38× the best) | 959 ns (1.38× the best) |
| gf2_122-gls-wincompleteλ-projective, w codec | 659 ns (2.70× the best) | 0.43 ns (tied for the best, within noise) | 20.3 ns (1.54× the best) | 796 ns (2.18× the best) | 867 ns (2.07× the best) | 984 ns (1.94× the best) | 1.11 µs (1.84× the best) | 1.23 µs (1.77× the best) |
| gf2_122-gls-wincompletecompare suitePornin x1: hash to addend; output already an addend | 385 ns (1.58× the best) | in the hash | 20.3 ns (1.54× the best) | 522 ns (1.43× the best) | 593 ns (1.41× the best) | 709 ns (1.40× the best) | 836 ns (1.38× the best) | 960 ns (1.38× the best) |
| gf2_122-gls-uunscaled (X:S:Z), w codec | 678 ns (2.78× the best) | 0.44 ns (tied for the best, within noise, 1.01×) | 13.7 ns (1.04× the best) | 796 ns (2.18× the best) | 852 ns (2.03× the best) | 942 ns (1.85× the best) | 1.04 µs (1.72× the best) | 1.14 µs (1.63× the best) |
| gf2_122-gls-ucompare suitePornin x1: hash to addend; output already an addend | 390 ns (1.60× the best) | in the hash | 13.7 ns (1.04× the best) | 508 ns (1.39× the best) | 563 ns (1.34× the best) | 654 ns (1.29× the best) | 751 ns (1.24× the best) | 847 ns (1.22× the best) |
| GF(2^109), 14 bytes | ||||||||
| gf2_109(X:S:Z:T) extended | 1.16 µs (4.77× the best) | 4.23 ns (9.85× the best) | 20.4 ns (1.54× the best) | 1.31 µs (3.57× the best) | 1.38 µs (3.28× the best) | 1.49 µs (2.94× the best) | 1.62 µs (2.68× the best) | 1.74 µs (2.50× the best) |
| gf2_109compare suitePornin x1: hash to addend; output already an addend | 675 ns (2.77× the best) | in the hash | 20.4 ns (1.54× the best) | 812 ns (2.22× the best) | 883 ns (2.10× the best) | 1000 ns (1.97× the best) | 1.13 µs (1.87× the best) | 1.25 µs (1.80× the best) |
| gf2_109-lambdaincompleteλ-projective | 1.16 µs (4.76× the best) | 503 ns (1170.41× the best) | 18.9 ns (1.43× the best) | 1.80 µs (4.91× the best) | 1.86 µs (4.44× the best) | 1.97 µs (3.89× the best) | 2.10 µs (3.47× the best) | 2.21 µs (3.18× the best) |
| gf2_109-lambdaincompletecompare suitehashed straight to : no prepare | 1.17 µs (4.78× the best) | in the hash | 18.9 ns (1.43× the best) | 1.30 µs (3.55× the best) | 1.37 µs (3.26× the best) | 1.48 µs (2.91× the best) | 1.60 µs (2.65× the best) | 1.72 µs (2.46× the best) |
| gf2_109-lambdaincompletecompare suitePornin x1: hash to addend; output already an addend | 655 ns (2.69× the best) | in the hash | 18.9 ns (1.43× the best) | 788 ns (2.16× the best) | 856 ns (2.04× the best) | 967 ns (1.90× the best) | 1.09 µs (1.80× the best) | 1.21 µs (1.73× the best) |
| gf2_109-wincompleteλ-projective, w codec | 1.14 µs (4.66× the best) | 0.44 ns (tied for the best, within noise, 1.02×) | 18.9 ns (1.43× the best) | 1.27 µs (3.47× the best) | 1.34 µs (3.19× the best) | 1.45 µs (2.85× the best) | 1.57 µs (2.60× the best) | 1.69 µs (2.42× the best) |
| gf2_109-wincompletecompare suitePornin x1: hash to addend; output already an addend | 652 ns (2.67× the best) | in the hash | 18.9 ns (1.43× the best) | 785 ns (2.15× the best) | 853 ns (2.03× the best) | 964 ns (1.90× the best) | 1.08 µs (1.80× the best) | 1.20 µs (1.73× the best) |
| gf2_109-uunscaled (X:S:Z), w codec | 1.15 µs (4.73× the best) | 0.48 ns (1.12× the best) | 13.5 ns (1.02× the best) | 1.27 µs (3.48× the best) | 1.33 µs (3.16× the best) | 1.42 µs (2.79× the best) | 1.51 µs (2.51× the best) | 1.61 µs (2.31× the best) |
| gf2_109-ucompare suitePornin x1: hash to addend; output already an addend | 657 ns (2.70× the best) | in the hash | 13.5 ns (1.02× the best) | 775 ns (2.12× the best) | 830 ns (1.98× the best) | 919 ns (1.81× the best) | 1.02 µs (1.68× the best) | 1.11 µs (1.59× the best) |
| F_p, p = 2^127 − 1, 16 bytes | ||||||||
| edwards127a = 1 Edwards, extended += cached | 1.22 µs (5.02× the best) | 663 ns (1543.72× the best) | 27.5 ns (2.08× the best) | 2.04 µs (5.59× the best) | 2.13 µs (5.08× the best) | 2.28 µs (4.48× the best) | 2.44 µs (4.03× the best) | 2.59 µs (3.72× the best) |
| edwards127compare suiteElligator 2 x1: hash + prepare | 1.51 µs (6.18× the best) | 663 ns (1543.72× the best) | 27.5 ns (2.08× the best) | 2.33 µs (6.37× the best) | 2.42 µs (5.76× the best) | 2.56 µs (5.04× the best) | 2.72 µs (4.50× the best) | 2.88 µs (4.13× the best) |
| weier127short Weierstrass, projective += affine | 1.16 µs (4.76× the best) | 0.81 ns (1.89× the best) | 58.7 ns (4.45× the best) | 1.41 µs (3.86× the best) | 1.57 µs (3.75× the best) | 1.84 µs (3.62× the best) | 2.13 µs (3.53× the best) | 2.43 µs (3.48× the best) |
| weier127compare suiteSSWU x1: hash + prepare | 1.29 µs (5.29× the best) | 0.81 ns (1.89× the best) | 58.7 ns (4.45× the best) | 1.54 µs (4.21× the best) | 1.70 µs (4.05× the best) | 1.97 µs (3.87× the best) | 2.26 µs (3.75× the best) | 2.56 µs (3.67× the best) |
| weier127-jacobianincompleteshort Weierstrass, Jacobian += affine | 1.15 µs (4.74× the best) | 0.81 ns (1.88× the best) | 48.1 ns (3.64× the best) | 1.37 µs (3.76× the best) | 1.51 µs (3.60× the best) | 1.74 µs (3.41× the best) | 1.98 µs (3.29× the best) | 2.23 µs (3.20× the best) |
| F_p, p = 2^107 − 1, 14 bytes | ||||||||
| edwards107a = 1 Edwards, extended += cached | 919 ns (3.77× the best) | 632 ns (1471.60× the best) | 27.6 ns (2.09× the best) | 1.71 µs (4.68× the best) | 1.80 µs (4.28× the best) | 1.94 µs (3.82× the best) | 2.10 µs (3.48× the best) | 2.26 µs (3.24× the best) |
| edwards107compare suiteElligator 2 x1: hash + prepare | 1.28 µs (5.25× the best) | 632 ns (1471.60× the best) | 27.6 ns (2.09× the best) | 2.07 µs (5.66× the best) | 2.16 µs (5.14× the best) | 2.30 µs (4.53× the best) | 2.46 µs (4.08× the best) | 2.62 µs (3.76× the best) |
| weier107short Weierstrass, projective += affine | 892 ns (3.66× the best) | 0.82 ns (1.90× the best) | 48.6 ns (3.68× the best) | 1.11 µs (3.04× the best) | 1.25 µs (2.98× the best) | 1.48 µs (2.91× the best) | 1.73 µs (2.86× the best) | 1.98 µs (2.84× the best) |
| weier107compare suiteSSWU x1: hash + prepare | 1.26 µs (5.16× the best) | 0.82 ns (1.90× the best) | 48.6 ns (3.68× the best) | 1.48 µs (4.04× the best) | 1.62 µs (3.85× the best) | 1.84 µs (3.63× the best) | 2.09 µs (3.47× the best) | 2.34 µs (3.36× the best) |
| weier107-jacobianincompleteshort Weierstrass, Jacobian += affine | 886 ns (3.63× the best) | 0.81 ns (1.88× the best) | 44.1 ns (3.34× the best) | 1.09 µs (2.99× the best) | 1.22 µs (2.91× the best) | 1.43 µs (2.81× the best) | 1.66 µs (2.75× the best) | 1.89 µs (2.71× the best) |
| F_p, p = 2^128 − 275, 16 bytes | ||||||||
| twisted128a = −1 twisted Edwards modulo 2-torsion, extended += cached | 1.97 µs (8.07× the best) | 12.5 ns (29.04× the best) | 31.1 ns (2.35× the best) | 2.15 µs (5.87× the best) | 2.24 µs (5.35× the best) | 2.40 µs (4.73× the best) | 2.58 µs (4.27× the best) | 2.75 µs (3.94× the best) |
| twisted128compare suiteElligator 2 x1: hash + prepare | 3.32 µs (13.64× the best) | 12.5 ns (29.04× the best) | 31.1 ns (2.35× the best) | 3.51 µs (9.59× the best) | 3.60 µs (8.58× the best) | 3.76 µs (7.40× the best) | 3.93 µs (6.52× the best) | 4.11 µs (5.89× the best) |
| F_{p²}, p = 2^61 − 1, 16 bytes | ||||||||
| edwards61x2a = 1 Edwards, signed-x codec, extended += cached | 707 ns (2.90× the best) | 236 ns (548.53× the best) | 25.8 ns (1.95× the best) | 1.10 µs (3.00× the best) | 1.18 µs (2.81× the best) | 1.32 µs (2.59× the best) | 1.47 µs (2.43× the best) | 1.62 µs (2.32× the best) |
| edwards61x2compare suiteElligator 2 x1: hash + prepare | 792 ns (3.25× the best) | 236 ns (548.53× the best) | 25.8 ns (1.95× the best) | 1.18 µs (3.23× the best) | 1.26 µs (3.01× the best) | 1.40 µs (2.76× the best) | 1.55 µs (2.57× the best) | 1.70 µs (2.44× the best) |
| weier61x2short Weierstrass, signed-x codec, projective += affine | 696 ns (2.85× the best) | 0.44 ns (tied for the best, within noise, 1.03×) | 50.6 ns (3.83× the best) | 921 ns (2.52× the best) | 1.06 µs (2.54× the best) | 1.30 µs (2.56× the best) | 1.56 µs (2.58× the best) | 1.82 µs (2.60× the best) |
| weier61x2compare suiteSSWU x1: hash + prepare | 812 ns (3.33× the best) | 0.44 ns (tied for the best, within noise, 1.03×) | 50.6 ns (3.83× the best) | 1.04 µs (2.84× the best) | 1.18 µs (2.81× the best) | 1.42 µs (2.78× the best) | 1.67 µs (2.77× the best) | 1.93 µs (2.77× the best) |
| weier61x2-jacobianincompleteshort Weierstrass, signed-x codec, Jacobian += affine | 702 ns (2.88× the best) | 0.44 ns (tied for the best, within noise, 1.02×) | 50.2 ns (3.80× the best) | 926 ns (2.53× the best) | 1.07 µs (2.55× the best) | 1.30 µs (2.56× the best) | 1.56 µs (2.58× the best) | 1.81 µs (2.60× the best) |
| twisted61x2a = −1 Edwards modulo 2-torsion, extended += cached | 706 ns (2.90× the best) | 8.07 ns (18.77× the best) | 24.9 ns (1.89× the best) | 865 ns (2.37× the best) | 947 ns (2.26× the best) | 1.08 µs (2.13× the best) | 1.23 µs (2.03× the best) | 1.37 µs (1.97× the best) |
| twisted61x2compare suiteElligator 2 x1: hash + prepare | 981 ns (4.03× the best) | 8.07 ns (18.77× the best) | 24.9 ns (1.89× the best) | 1.14 µs (3.12× the best) | 1.22 µs (2.91× the best) | 1.36 µs (2.67× the best) | 1.50 µs (2.49× the best) | 1.65 µs (2.36× the best) |
| F_{p²}, p = 2^64 − 59, 16 bytes | ||||||||
| twisted64x2a = −1 Edwards modulo 2-torsion, extended += cached | 1.00 µs (4.11× the best) | 8.75 ns (20.37× the best) | 33.3 ns (2.52× the best) | 1.19 µs (3.24× the best) | 1.29 µs (3.07× the best) | 1.45 µs (2.86× the best) | 1.64 µs (2.71× the best) | 1.82 µs (2.61× the best) |
| twisted64x2compare suiteElligator 2 x1: hash + prepare | 1.38 µs (5.67× the best) | 8.75 ns (20.37× the best) | 33.3 ns (2.52× the best) | 1.56 µs (4.28× the best) | 1.67 µs (3.97× the best) | 1.83 µs (3.61× the best) | 2.02 µs (3.34× the best) | 2.20 µs (3.15× the best) |
| F_{p²}, p = 2^64 − 2^32 + 1, 16 bytes | ||||||||
| twisted-goldilocks2a = −1 Edwards modulo 2-torsion, extended += cached | 2.21 µs (9.09× the best) | 9.45 ns (22.00× the best) | 28.7 ns (2.18× the best) | 2.39 µs (6.53× the best) | 2.48 µs (5.90× the best) | 2.63 µs (5.17× the best) | 2.79 µs (4.62× the best) | 2.95 µs (4.23× the best) |
| twisted-goldilocks2compare suiteElligator 2 x1: hash + prepare | 2.75 µs (11.30× the best) | 9.45 ns (22.00× the best) | 28.7 ns (2.18× the best) | 2.92 µs (8.00× the best) | 3.02 µs (7.18× the best) | 3.16 µs (6.23× the best) | 3.33 µs (5.51× the best) | 3.49 µs (5.01× the best) |
| references, 32 and 33 bytes | ||||||||
| ristretto255compare suitehash output added as is: no prepare | 6.03 µs (24.75× the best) | in the hash | 116 ns (8.76× the best) | 6.45 µs (17.63× the best) | 6.75 µs (16.07× the best) | 7.23 µs (14.23× the best) | 7.78 µs (12.89× the best) | 8.32 µs (11.94× the best) |
bold: the best of its column; italic, dotted: tied with the best within the confidence intervals; shading: ratio to the best, pale yellow at 1× to purple at 16× or more; grey: baseline, not compared.
Batching
Batched against individual time per element. The inversions-shared column divides the saving by the difference between individual and batched field inversion; it also absorbs allocation and control flow.
| curve | hash to curve | prepare | encode | decode | ||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| alone | batched | faster by | inversions shared | alone | batched | faster by | inversions shared | alone | batched | faster by | inversions shared | alone | batched | faster by | inversions shared | |
| GF(2^127), 16 bytes | ||||||||||||||||
| gf2_127(X:S:Z:T) extended accumulators, Pornin's formulas | 366 ns | 113 ns (best) | 3.2× | 2.2 | 6.38 ns | 6.36 ns (13.70× the best) | 1.0× | 0 | 151 ns | 22.7 ns (1.81× the best) | 6.6× | 1.1 | 164 ns | 25.7 ns (1.23× the best) | 6.4× | 1.2 |
| gf2_127-lambdaincompleteλ-projective (X:L:Z) accumulators | 394 ns | 114 ns (1.01× the best) | 3.5× | 2.4 | 129 ns | 8.18 ns (17.62× the best) | 15.7× | 1 | 140 ns | 17.5 ns (1.39× the best) | 8.0× | 1 | 155 ns | 24.0 ns (1.15× the best) | 6.4× | 1.1 |
| gf2_127-wincompleteλ-projective, w codec: hashes and decodes to λ-affine | 392 ns | 119 ns (1.06× the best) | 3.3× | 2.3 | 0.45 ns | 0.47 ns (1.01× the best) | 1.0× | 0 | 139 ns | 17.0 ns (1.35× the best) | 8.2× | 1 | 155 ns | 22.6 ns (1.08× the best) | 6.9× | 1.1 |
| gf2_127-uunscaled (X:S:Z), w codec, direct addend hashes | 401 ns | 125 ns (1.11× the best) | 3.2× | 2.3 | 0.48 ns | 0.47 ns (1.02× the best) | 1.0× | 0 | 137 ns | 12.6 ns (best) | 10.9× | 1.1 | 162 ns | 27.5 ns (1.32× the best) | 5.9× | 1.1 |
| GF(2^122) = GF(2^61)[u], dense constant, 16 bytes | ||||||||||||||||
| gf2_122(X:S:Z:T) extended | 670 ns | 114 ns (1.01× the best) | 5.9× | 2.4 | 4.91 ns | 5.01 ns (10.80× the best) | 1.0× | 0 | 294 ns | 22.1 ns (1.76× the best) | 13.3× | 1.2 | 313 ns | 24.0 ns (1.15× the best) | 13.0× | 1.2 |
| gf2_122-lambdaincompleteλ-projective | 679 ns | 115 ns (1.02× the best) | 5.9× | 2.4 | 251 ns | 8.18 ns (17.61× the best) | 30.7× | 1 | 287 ns | 17.3 ns (1.37× the best) | 16.6× | 1.2 | 314 ns | 24.1 ns (1.15× the best) | 13.0× | 1.2 |
| gf2_122-wincompleteλ-projective, w codec | 654 ns | 116 ns (1.03× the best) | 5.6× | 2.3 | 0.44 ns | 0.47 ns (1.00× the best) | 0.9× | 0 | 302 ns | 21.2 ns (1.69× the best) | 14.2× | 1.2 | 307 ns | 21.6 ns (1.03× the best) | 14.2× | 1.2 |
| gf2_122-uunscaled (X:S:Z), w codec | 674 ns | 127 ns (1.12× the best) | 5.3× | 2.4 | 0.50 ns | 0.49 ns (1.06× the best) | 1.0× | 0 | 305 ns | 18.4 ns (1.47× the best) | 16.5× | 1.2 | 317 ns | 26.0 ns (1.24× the best) | 12.2× | 1.3 |
| GF(2^122), constant in GF(2^61) (GLS-shaped), 16 bytes | ||||||||||||||||
| gf2_122-gls(X:S:Z:T) extended | 697 ns | 116 ns (1.03× the best) | 6.0× | 2.5 | 4.22 ns | 4.27 ns (9.20× the best) | 1.0× | 0 | 293 ns | 21.1 ns (1.68× the best) | 13.9× | 1.2 | 313 ns | 22.7 ns (1.08× the best) | 13.8× | 1.2 |
| gf2_122-gls-lambdaincompleteλ-projective | 692 ns | 116 ns (1.03× the best) | 6.0× | 2.5 | 249 ns | 8.11 ns (17.46× the best) | 30.7× | 1 | 297 ns | 17.9 ns (1.42× the best) | 16.6× | 1.2 | 311 ns | 22.6 ns (1.08× the best) | 13.8× | 1.2 |
| gf2_122-gls-wincompleteλ-projective, w codec | 659 ns | 116 ns (1.03× the best) | 5.7× | 2.3 | 0.43 ns | 0.68 ns (1.47× the best) | 0.6× | 0 | 297 ns | 20.4 ns (1.62× the best) | 14.6× | 1.2 | 305 ns | 20.9 ns (best) | 14.6× | 1.2 |
| gf2_122-gls-uunscaled (X:S:Z), w codec | 678 ns | 121 ns (1.07× the best) | 5.6× | 2.4 | 0.44 ns | 0.68 ns (1.46× the best) | 0.6× | 0 | 297 ns | 18.0 ns (1.44× the best) | 16.5× | 1.2 | 313 ns | 24.7 ns (1.18× the best) | 12.6× | 1.2 |
| GF(2^109), 14 bytes | ||||||||||||||||
| gf2_109(X:S:Z:T) extended | 1.16 µs | 126 ns (1.12× the best) | 9.2× | 2.1 | 4.23 ns | 4.25 ns (9.16× the best) | 1.0× | 0 | 538 ns | 18.2 ns (1.45× the best) | 29.6× | 1.1 | 554 ns | 26.7 ns (1.28× the best) | 20.7× | 1.1 |
| gf2_109-lambdaincompleteλ-projective | 1.16 µs | 124 ns (1.10× the best) | 9.3× | 2.1 | 503 ns | 8.13 ns (17.51× the best) | 61.9× | 1 | 530 ns | 14.1 ns (1.12× the best) | 37.5× | 1.1 | 549 ns | 26.5 ns (1.27× the best) | 20.8× | 1.1 |
| gf2_109-wincompleteλ-projective, w codec | 1.14 µs | 120 ns (1.06× the best) | 9.5× | 2.1 | 0.44 ns | 0.47 ns (1.01× the best) | 0.9× | 0 | 540 ns | 21.6 ns (1.72× the best) | 24.9× | 1.1 | 555 ns | 24.4 ns (1.17× the best) | 22.8× | 1.1 |
| gf2_109-uunscaled (X:S:Z), w codec | 1.15 µs | 125 ns (1.11× the best) | 9.2× | 2.1 | 0.48 ns | 0.46 ns (best) | 1.0× | 0 | 546 ns | 21.9 ns (1.74× the best) | 24.9× | 1.1 | 555 ns | 27.7 ns (1.33× the best) | 20.0× | 1.1 |
| F_p, p = 2^127 − 1, 16 bytes | ||||||||||||||||
| edwards127a = 1 Edwards, extended += cached | 1.22 µs | 1.24 µs (10.98× the best) | 1.0× | 0 | 663 ns | 39.9 ns (86.04× the best) | 16.6× | 1.1 | 610 ns | 31.9 ns (2.54× the best) | 19.1× | 1 | 540 ns | 541 ns (25.90× the best) | 1.0× | 0 |
| weier127short Weierstrass, projective += affine | 1.16 µs | 1.17 µs (10.34× the best) | 1.0× | 0 | 0.81 ns | 1.00 ns (2.15× the best) | 0.8× | 0 | 593 ns | 16.7 ns (1.33× the best) | 35.4× | 1 | 541 ns | 539 ns (25.81× the best) | 1.0× | 0 |
| weier127-jacobianincompleteshort Weierstrass, Jacobian += affine | 1.15 µs | 1.16 µs (10.27× the best) | 1.0× | 0 | 0.81 ns | 0.99 ns (2.13× the best) | 0.8× | 0 | 605 ns | 23.6 ns (1.88× the best) | 25.6× | 1 | 543 ns | 542 ns (25.93× the best) | 1.0× | 0 |
| F_p, p = 2^107 − 1, 14 bytes | ||||||||||||||||
| edwards107a = 1 Edwards, extended += cached | 919 ns | 916 ns (8.13× the best) | 1.0× | 0 | 632 ns | 37.9 ns (81.74× the best) | 16.7× | 1.1 | 600 ns | 35.1 ns (2.80× the best) | 17.1× | 1 | 424 ns | 426 ns (20.37× the best) | 1.0× | 0 |
| weier107short Weierstrass, projective += affine | 892 ns | 901 ns (8.00× the best) | 1.0× | 0 | 0.82 ns | 0.63 ns (1.35× the best) | 1.3× | 0 | 582 ns | 19.4 ns (1.54× the best) | 30.0× | 1 | 421 ns | 422 ns (20.19× the best) | 1.0× | 0 |
| weier107-jacobianincompleteshort Weierstrass, Jacobian += affine | 886 ns | 893 ns (7.92× the best) | 1.0× | 0 | 0.81 ns | 0.63 ns (1.35× the best) | 1.3× | 0 | 580 ns | 25.5 ns (2.03× the best) | 22.7× | 1 | 419 ns | 421 ns (20.13× the best) | 1.0× | 0 |
| F_p, p = 2^128 − 275, 16 bytes | ||||||||||||||||
| twisted128a = −1 twisted Edwards modulo 2-torsion, extended += cached | 1.97 µs | 1.96 µs (17.39× the best) | 1.0× | 12.5 ns | 12.7 ns (27.29× the best) | 1.0× | 943 ns | 22.7 ns (1.81× the best) | 41.6× | 960 ns | 962 ns (46.04× the best) | 1.0× | ||||
| F_{p²}, p = 2^61 − 1, 16 bytes | ||||||||||||||||
| edwards61x2a = 1 Edwards, signed-x codec, extended += cached | 707 ns | 706 ns (6.26× the best) | 1.0× | 0 | 236 ns | 34.9 ns (75.23× the best) | 6.7× | 1.2 | 203 ns | 35.0 ns (2.79× the best) | 5.8× | 1 | 437 ns | 441 ns (21.08× the best) | 1.0× | 0 |
| weier61x2short Weierstrass, signed-x codec, projective += affine | 696 ns | 698 ns (6.19× the best) | 1.0× | 0 | 0.44 ns | 0.52 ns (1.13× the best) | 0.8× | 0 | 190 ns | 15.3 ns (1.22× the best) | 12.4× | 1 | 441 ns | 448 ns (21.43× the best) | 1.0× | 0 |
| weier61x2-jacobianincompleteshort Weierstrass, signed-x codec, Jacobian += affine | 702 ns | 698 ns (6.19× the best) | 1.0× | 0 | 0.44 ns | 0.52 ns (1.12× the best) | 0.8× | 0 | 198 ns | 24.8 ns (1.97× the best) | 8.0× | 1 | 440 ns | 445 ns (21.28× the best) | 1.0× | 0 |
| twisted61x2a = −1 Edwards modulo 2-torsion, extended += cached | 706 ns | 711 ns (6.31× the best) | 1.0× | 0 | 8.07 ns | 7.93 ns (17.07× the best) | 1.0× | 0 | 189 ns | 14.9 ns (1.19× the best) | 12.7× | 1 | 448 ns | 450 ns (21.55× the best) | 1.0× | 0 |
| F_{p²}, p = 2^64 − 59, 16 bytes | ||||||||||||||||
| twisted64x2a = −1 Edwards modulo 2-torsion, extended += cached | 1.00 µs | 1.00 µs (8.91× the best) | 1.0× | 0 | 8.75 ns | 8.79 ns (18.94× the best) | 1.0× | 0 | 267 ns | 22.6 ns (1.80× the best) | 11.8× | 1.1 | 650 ns | 647 ns (30.96× the best) | 1.0× | 0 |
| F_{p²}, p = 2^64 − 2^32 + 1, 16 bytes | ||||||||||||||||
| twisted-goldilocks2a = −1 Edwards modulo 2-torsion, extended += cached | 2.21 µs | 2.24 µs (19.85× the best) | 1.0× | -0.1 | 9.45 ns | 9.54 ns (20.55× the best) | 1.0× | 0 | 316 ns | 22.9 ns (1.83× the best) | 13.8× | 1 | 1.91 µs | 1.92 µs (92.00× the best) | 1.0× | 0 |
bold: the best of its column; italic, dotted: tied with the best within the confidence intervals; shading: ratio to the best, pale yellow at 1× to purple at 16× or more; grey: baseline, not compared.
Time per element against batch size.
| curve | hash to curve | prepare | encode | decode | ||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| alone | alone | alone | alone | |||||||||||||
| GF(2^127), 16 bytes | ||||||||||||||||
| gf2_127(X:S:Z:T) extended accumulators, Pornin's formulas | 366 ns (best) | 200 ns (best) | 137 ns (tied for the best, within noise) | 113 ns (best) | 6.38 ns (14.85× the best) | 6.72 ns (6.28× the best) | 6.55 ns (8.70× the best) | 6.36 ns (13.70× the best) | 151 ns (1.10× the best) | 46.0 ns (1.20× the best) | 25.6 ns (1.57× the best) | 22.7 ns (1.81× the best) | 164 ns (1.06× the best) | 54.2 ns (tied for the best, within noise) | 29.6 ns (1.03× the best) | 25.7 ns (1.23× the best) |
| gf2_127-lambdaincompleteλ-projective (X:L:Z) accumulators | 394 ns (1.08× the best) | 204 ns (1.02× the best) | 137 ns (tied for the best, within noise, 1.00×) | 114 ns (1.01× the best) | 129 ns (299.16× the best) | 32.8 ns (30.61× the best) | 12.7 ns (16.85× the best) | 8.18 ns (17.62× the best) | 140 ns (1.02× the best) | 42.0 ns (1.10× the best) | 21.8 ns (1.34× the best) | 17.5 ns (1.39× the best) | 155 ns (tied for the best, within noise, 1.00×) | 54.2 ns (tied for the best, within noise, 1.00×) | 29.7 ns (1.03× the best) | 24.0 ns (1.15× the best) |
| gf2_127-wincompleteλ-projective, w codec: hashes and decodes to λ-affine | 392 ns (1.07× the best) | 219 ns (1.09× the best) | 145 ns (1.06× the best) | 119 ns (1.06× the best) | 0.45 ns (tied for the best, within noise, 1.06×) | 1.10 ns (1.03× the best) | 0.79 ns (1.06× the best) | 0.47 ns (1.01× the best) | 139 ns (1.02× the best) | 42.1 ns (1.10× the best) | 21.8 ns (1.34× the best) | 17.0 ns (1.35× the best) | 155 ns (tied for the best, within noise) | 55.2 ns (1.02× the best) | 28.8 ns (best) | 22.6 ns (1.08× the best) |
| gf2_127-uunscaled (X:S:Z), w codec, direct addend hashes | 401 ns (1.10× the best) | 225 ns (1.13× the best) | 153 ns (1.11× the best) | 125 ns (1.11× the best) | 0.48 ns (1.13× the best) | 1.08 ns (1.01× the best) | 0.81 ns (1.07× the best) | 0.47 ns (1.02× the best) | 137 ns (best) | 38.2 ns (best) | 16.3 ns (best) | 12.6 ns (best) | 162 ns (1.04× the best) | 57.6 ns (1.06× the best) | 32.8 ns (1.14× the best) | 27.5 ns (1.32× the best) |
| GF(2^122) = GF(2^61)[u], dense constant, 16 bytes | ||||||||||||||||
| gf2_122(X:S:Z:T) extended | 670 ns (1.83× the best) | 293 ns (1.47× the best) | 155 ns (1.13× the best) | 114 ns (1.01× the best) | 4.91 ns (11.42× the best) | 5.62 ns (5.25× the best) | 5.44 ns (7.22× the best) | 5.01 ns (10.80× the best) | 294 ns (2.15× the best) | 66.6 ns (1.74× the best) | 28.9 ns (1.78× the best) | 22.1 ns (1.76× the best) | 313 ns (2.02× the best) | 73.5 ns (1.36× the best) | 32.4 ns (1.13× the best) | 24.0 ns (1.15× the best) |
| gf2_122-lambdaincompleteλ-projective | 679 ns (1.85× the best) | 294 ns (1.47× the best) | 156 ns (1.14× the best) | 115 ns (1.02× the best) | 251 ns (583.32× the best) | 53.6 ns (50.04× the best) | 15.2 ns (20.19× the best) | 8.18 ns (17.61× the best) | 287 ns (2.10× the best) | 61.7 ns (1.62× the best) | 24.1 ns (1.48× the best) | 17.3 ns (1.37× the best) | 314 ns (2.03× the best) | 73.1 ns (1.35× the best) | 32.2 ns (1.12× the best) | 24.1 ns (1.15× the best) |
| gf2_122-wincompleteλ-projective, w codec | 654 ns (1.79× the best) | 294 ns (1.47× the best) | 156 ns (1.14× the best) | 116 ns (1.03× the best) | 0.44 ns (tied for the best, within noise, 1.02×) | 1.09 ns (1.01× the best) | 0.75 ns (best) | 0.47 ns (tied for the best, within noise, 1.00×) | 302 ns (2.20× the best) | 64.3 ns (1.68× the best) | 27.0 ns (1.66× the best) | 21.2 ns (1.69× the best) | 307 ns (1.98× the best) | 70.9 ns (1.31× the best) | 29.8 ns (1.03× the best) | 21.6 ns (1.03× the best) |
| gf2_122-uunscaled (X:S:Z), w codec | 674 ns (1.84× the best) | 301 ns (1.51× the best) | 164 ns (1.20× the best) | 127 ns (1.12× the best) | 0.50 ns (1.15× the best) | 1.08 ns (1.01× the best) | 0.82 ns (1.08× the best) | 0.49 ns (1.06× the best) | 305 ns (2.23× the best) | 61.3 ns (1.61× the best) | 22.5 ns (1.38× the best) | 18.4 ns (1.47× the best) | 317 ns (2.05× the best) | 74.7 ns (1.38× the best) | 33.6 ns (1.17× the best) | 26.0 ns (1.24× the best) |
| GF(2^122), constant in GF(2^61) (GLS-shaped), 16 bytes | ||||||||||||||||
| gf2_122-gls(X:S:Z:T) extended | 697 ns (1.90× the best) | 308 ns (1.54× the best) | 161 ns (1.18× the best) | 116 ns (1.03× the best) | 4.22 ns (9.82× the best) | 4.83 ns (4.51× the best) | 4.54 ns (6.03× the best) | 4.27 ns (9.20× the best) | 293 ns (2.14× the best) | 65.6 ns (1.72× the best) | 27.9 ns (1.72× the best) | 21.1 ns (1.68× the best) | 313 ns (2.02× the best) | 71.5 ns (1.32× the best) | 31.0 ns (1.08× the best) | 22.7 ns (1.08× the best) |
| gf2_122-gls-lambdaincompleteλ-projective | 692 ns (1.89× the best) | 306 ns (1.53× the best) | 161 ns (1.18× the best) | 116 ns (1.03× the best) | 249 ns (579.08× the best) | 53.4 ns (49.89× the best) | 15.1 ns (20.10× the best) | 8.11 ns (17.46× the best) | 297 ns (2.17× the best) | 62.1 ns (1.62× the best) | 24.5 ns (1.51× the best) | 17.9 ns (1.42× the best) | 311 ns (2.01× the best) | 73.7 ns (1.36× the best) | 32.1 ns (1.11× the best) | 22.6 ns (1.08× the best) |
| gf2_122-gls-wincompleteλ-projective, w codec | 659 ns (1.80× the best) | 303 ns (1.52× the best) | 161 ns (1.17× the best) | 116 ns (1.03× the best) | 0.43 ns (tied for the best, within noise) | 1.08 ns (1.01× the best) | 0.83 ns (1.10× the best) | 0.68 ns (1.47× the best) | 297 ns (2.17× the best) | 64.9 ns (1.70× the best) | 27.2 ns (1.68× the best) | 20.4 ns (1.62× the best) | 305 ns (1.97× the best) | 70.1 ns (1.29× the best) | 29.1 ns (1.01× the best) | 20.9 ns (best) |
| gf2_122-gls-uunscaled (X:S:Z), w codec | 678 ns (1.85× the best) | 298 ns (1.49× the best) | 165 ns (1.21× the best) | 121 ns (1.07× the best) | 0.44 ns (tied for the best, within noise, 1.01×) | 1.07 ns (best) | 0.83 ns (1.10× the best) | 0.68 ns (1.46× the best) | 297 ns (2.17× the best) | 61.2 ns (1.60× the best) | 22.5 ns (1.38× the best) | 18.0 ns (1.44× the best) | 313 ns (2.02× the best) | 73.8 ns (1.36× the best) | 32.9 ns (1.14× the best) | 24.7 ns (1.18× the best) |
| GF(2^109), 14 bytes | ||||||||||||||||
| gf2_109(X:S:Z:T) extended | 1.16 µs (3.18× the best) | 431 ns (2.16× the best) | 195 ns (1.42× the best) | 126 ns (1.12× the best) | 4.23 ns (9.85× the best) | 4.88 ns (4.56× the best) | 4.65 ns (6.18× the best) | 4.25 ns (9.16× the best) | 538 ns (3.93× the best) | 94.4 ns (2.47× the best) | 28.6 ns (1.76× the best) | 18.2 ns (1.45× the best) | 554 ns (3.58× the best) | 108 ns (2.00× the best) | 38.7 ns (1.34× the best) | 26.7 ns (1.28× the best) |
| gf2_109-lambdaincompleteλ-projective | 1.16 µs (3.17× the best) | 431 ns (2.16× the best) | 195 ns (1.42× the best) | 124 ns (1.10× the best) | 503 ns (1170.41× the best) | 82.7 ns (77.22× the best) | 18.8 ns (24.92× the best) | 8.13 ns (17.51× the best) | 530 ns (3.87× the best) | 90.0 ns (2.36× the best) | 24.8 ns (1.53× the best) | 14.1 ns (1.12× the best) | 549 ns (3.55× the best) | 109 ns (2.00× the best) | 39.1 ns (1.36× the best) | 26.5 ns (1.27× the best) |
| gf2_109-wincompleteλ-projective, w codec | 1.14 µs (3.10× the best) | 413 ns (2.07× the best) | 183 ns (1.33× the best) | 120 ns (1.06× the best) | 0.44 ns (tied for the best, within noise, 1.02×) | 1.08 ns (1.01× the best) | 0.82 ns (1.08× the best) | 0.47 ns (tied for the best, within noise, 1.01×) | 540 ns (3.94× the best) | 96.0 ns (2.51× the best) | 32.5 ns (2.00× the best) | 21.6 ns (1.72× the best) | 555 ns (3.59× the best) | 105 ns (1.95× the best) | 36.8 ns (1.28× the best) | 24.4 ns (1.17× the best) |
| gf2_109-uunscaled (X:S:Z), w codec | 1.15 µs (3.15× the best) | 417 ns (2.09× the best) | 189 ns (1.38× the best) | 125 ns (1.11× the best) | 0.48 ns (1.12× the best) | 1.08 ns (1.01× the best) | 0.79 ns (1.05× the best) | 0.46 ns (tied for the best, within noise) | 546 ns (3.99× the best) | 97.1 ns (2.54× the best) | 31.7 ns (1.95× the best) | 21.9 ns (1.74× the best) | 555 ns (3.59× the best) | 109 ns (2.01× the best) | 40.3 ns (1.40× the best) | 27.7 ns (1.33× the best) |
| F_p, p = 2^127 − 1, 16 bytes | ||||||||||||||||
| edwards127a = 1 Edwards, extended += cached | 1.22 µs (3.34× the best) | 1.24 µs (10.98× the best) | 663 ns (1543.72× the best) | 39.9 ns (86.04× the best) | 610 ns (4.45× the best) | 31.9 ns (2.54× the best) | 540 ns (3.49× the best) | 541 ns (25.90× the best) | ||||||||
| weier127short Weierstrass, projective += affine | 1.16 µs (3.17× the best) | 1.17 µs (10.34× the best) | 0.81 ns (1.89× the best) | 1.00 ns (2.15× the best) | 593 ns (4.33× the best) | 16.7 ns (1.33× the best) | 541 ns (3.50× the best) | 539 ns (25.81× the best) | ||||||||
| weier127-jacobianincompleteshort Weierstrass, Jacobian += affine | 1.15 µs (3.15× the best) | 1.16 µs (10.27× the best) | 0.81 ns (1.88× the best) | 0.99 ns (2.13× the best) | 605 ns (4.42× the best) | 23.6 ns (1.88× the best) | 543 ns (3.51× the best) | 542 ns (25.93× the best) | ||||||||
| F_p, p = 2^107 − 1, 14 bytes | ||||||||||||||||
| edwards107a = 1 Edwards, extended += cached | 919 ns (2.51× the best) | 916 ns (8.13× the best) | 632 ns (1471.60× the best) | 37.9 ns (81.74× the best) | 600 ns (4.38× the best) | 35.1 ns (2.80× the best) | 424 ns (2.74× the best) | 426 ns (20.37× the best) | ||||||||
| weier107short Weierstrass, projective += affine | 892 ns (2.44× the best) | 901 ns (8.00× the best) | 0.82 ns (1.90× the best) | 0.63 ns (1.35× the best) | 582 ns (4.25× the best) | 19.4 ns (1.54× the best) | 421 ns (2.72× the best) | 422 ns (20.19× the best) | ||||||||
| weier107-jacobianincompleteshort Weierstrass, Jacobian += affine | 886 ns (2.42× the best) | 893 ns (7.92× the best) | 0.81 ns (1.88× the best) | 0.63 ns (1.35× the best) | 580 ns (4.23× the best) | 25.5 ns (2.03× the best) | 419 ns (2.71× the best) | 421 ns (20.13× the best) | ||||||||
| F_p, p = 2^128 − 275, 16 bytes | ||||||||||||||||
| twisted128a = −1 twisted Edwards modulo 2-torsion, extended += cached | 1.97 µs (5.37× the best) | 1.96 µs (17.39× the best) | 12.5 ns (29.04× the best) | 12.7 ns (27.29× the best) | 943 ns (6.89× the best) | 22.7 ns (1.81× the best) | 960 ns (6.21× the best) | 962 ns (46.04× the best) | ||||||||
| F_{p²}, p = 2^61 − 1, 16 bytes | ||||||||||||||||
| edwards61x2a = 1 Edwards, signed-x codec, extended += cached | 707 ns (1.93× the best) | 706 ns (6.26× the best) | 236 ns (548.53× the best) | 34.9 ns (75.23× the best) | 203 ns (1.48× the best) | 35.0 ns (2.79× the best) | 437 ns (2.83× the best) | 441 ns (21.08× the best) | ||||||||
| weier61x2short Weierstrass, signed-x codec, projective += affine | 696 ns (1.90× the best) | 698 ns (6.19× the best) | 0.44 ns (tied for the best, within noise, 1.03×) | 0.52 ns (1.13× the best) | 190 ns (1.39× the best) | 15.3 ns (1.22× the best) | 441 ns (2.85× the best) | 448 ns (21.43× the best) | ||||||||
| weier61x2-jacobianincompleteshort Weierstrass, signed-x codec, Jacobian += affine | 702 ns (1.92× the best) | 698 ns (6.19× the best) | 0.44 ns (tied for the best, within noise, 1.02×) | 0.52 ns (1.12× the best) | 198 ns (1.45× the best) | 24.8 ns (1.97× the best) | 440 ns (2.84× the best) | 445 ns (21.28× the best) | ||||||||
| twisted61x2a = −1 Edwards modulo 2-torsion, extended += cached | 706 ns (1.93× the best) | 703 ns (3.52× the best) | 703 ns (5.13× the best) | 711 ns (6.31× the best) | 8.07 ns (18.77× the best) | 8.59 ns (8.02× the best) | 8.39 ns (11.15× the best) | 7.93 ns (17.07× the best) | 189 ns (1.38× the best) | 49.3 ns (1.29× the best) | 21.1 ns (1.30× the best) | 14.9 ns (1.19× the best) | 448 ns (2.90× the best) | 448 ns (8.27× the best) | 447 ns (15.52× the best) | 450 ns (21.55× the best) |
| F_{p²}, p = 2^64 − 59, 16 bytes | ||||||||||||||||
| twisted64x2a = −1 Edwards modulo 2-torsion, extended += cached | 1.00 µs (2.74× the best) | 1.00 µs (8.91× the best) | 8.75 ns (20.37× the best) | 8.79 ns (18.94× the best) | 267 ns (1.95× the best) | 22.6 ns (1.80× the best) | 650 ns (4.20× the best) | 647 ns (30.96× the best) | ||||||||
| F_{p²}, p = 2^64 − 2^32 + 1, 16 bytes | ||||||||||||||||
| twisted-goldilocks2a = −1 Edwards modulo 2-torsion, extended += cached | 2.21 µs (6.05× the best) | 2.24 µs (19.85× the best) | 9.45 ns (22.00× the best) | 9.54 ns (20.55× the best) | 316 ns (2.31× the best) | 22.9 ns (1.83× the best) | 1.91 µs (12.36× the best) | 1.92 µs (92.00× the best) | ||||||||
bold: the best of its column; italic, dotted: tied with the best within the confidence intervals; shading: ratio to the best, pale yellow at 1× to purple at 16× or more; grey: baseline, not compared.
Costs by lifetime
What an insertion into cells keyed by IDs costs by how long each part stays valid, for each family the RIBLT suite timed so (proj=): the ID once per item; the curve and each hash’s keys once per salt; the hash to the addend, the mapping’s seed and its walk once per salt and item; and the addition, encoding and decoding of each cell. Salted SHA-256 hashes the ID anew under each salt; each projection, the checksum’s and the mapping’s in fields chosen apart, multiplies its halves by the salt’s keys. The last row is the measured encoding of n = 3500 items into m = 1350 cells, per item: by salted SHA-256 of the items themselves, and by projections of their IDs, computed beforehand (Costs by lifetime).
binary.109, pornin, checksum projected in , mapping in
| lifetime | term | salted SHA-256 | projection |
|---|---|---|---|
| per item | ID, the item’s SHA-256 | 50.2 ns | 50.2 ns |
| per salt | accept the curve | 74.4 µs | 74.4 µs |
| per salt | checksum keys | 127 ns | 375 ns |
| per salt | mapping keys | 127 ns | 375 ns |
| per salt and item | hash to the addend | 113 ns | 63.8 ns |
| per salt and item | mapping seed | 51.4 ns | 9.67 ns |
| per salt and item | mapping walk below m = 1350 | 124 ns | 124 ns |
| per cell | add | 20.4 ns | 20.4 ns |
| per cell | encode | 18.2 ns | 18.2 ns |
| per cell | decode | 26.7 ns | 26.7 ns |
| measured | insertion per item, k = 13.57 cells | 513 ns | 418 ns |
binary-lambda.109, pornin-addend, checksum projected in , mapping in
| lifetime | term | salted SHA-256 | projection |
|---|---|---|---|
| per item | ID, the item’s SHA-256 | 50.2 ns | 50.2 ns |
| per salt | accept the curve | 74.4 µs | 74.4 µs |
| per salt | checksum keys | 127 ns | 375 ns |
| per salt | mapping keys | 127 ns | 375 ns |
| per salt and item | hash to the addend | 105 ns | 55.7 ns |
| per salt and item | mapping seed | 51.4 ns | 9.67 ns |
| per salt and item | mapping walk below m = 1350 | 124 ns | 124 ns |
| per cell | add | 18.9 ns | 18.9 ns |
| per cell | encode | 14.1 ns | 14.1 ns |
| per cell | decode | 26.5 ns | 26.5 ns |
| measured | insertion per item, k = 13.57 cells | 488 ns | 395 ns |
binary-u.109, pornin-addend, checksum projected in , mapping in
| lifetime | term | salted SHA-256 | projection |
|---|---|---|---|
| per item | ID, the item’s SHA-256 | 50.2 ns | 50.2 ns |
| per salt | accept the curve | 74.4 µs | 74.4 µs |
| per salt | checksum keys | 127 ns | 375 ns |
| per salt | mapping keys | 127 ns | 375 ns |
| per salt and item | hash to the addend | 110 ns | 60.6 ns |
| per salt and item | mapping seed | 51.4 ns | 9.67 ns |
| per salt and item | mapping walk below m = 1350 | 124 ns | 124 ns |
| per cell | add | 13.5 ns | 13.5 ns |
| per cell | encode | 21.9 ns | 21.9 ns |
| per cell | decode | 27.7 ns | 27.7 ns |
| measured | insertion per item, k = 13.57 cells | 422 ns | 331 ns |
binary-w.109, pornin-addend, checksum projected in , mapping in
| lifetime | term | salted SHA-256 | projection |
|---|---|---|---|
| per item | ID, the item’s SHA-256 | 50.2 ns | 50.2 ns |
| per salt | accept the curve | 74.4 µs | 74.4 µs |
| per salt | checksum keys | 127 ns | 375 ns |
| per salt | mapping keys | 127 ns | 375 ns |
| per salt and item | hash to the addend | 105 ns | 56.3 ns |
| per salt and item | mapping seed | 51.4 ns | 9.67 ns |
| per salt and item | mapping walk below m = 1350 | 124 ns | 124 ns |
| per cell | add | 18.9 ns | 18.9 ns |
| per cell | encode | 21.6 ns | 21.6 ns |
| per cell | decode | 24.4 ns | 24.4 ns |
| measured | insertion per item, k = 13.57 cells | 490 ns | 397 ns |
binary.122, pornin, checksum projected in , mapping in
| lifetime | term | salted SHA-256 | projection |
|---|---|---|---|
| per item | ID, the item’s SHA-256 | 50.2 ns | 50.2 ns |
| per salt | accept the curve | 70.1 µs | 70.1 µs |
| per salt | checksum keys | 127 ns | 375 ns |
| per salt | mapping keys | 127 ns | 375 ns |
| per salt and item | hash to the addend | 103 ns | 53.4 ns |
| per salt and item | mapping seed | 51.4 ns | 9.67 ns |
| per salt and item | mapping walk below m = 1350 | 124 ns | 124 ns |
| per cell | add | 19.9 ns | 19.9 ns |
| per cell | encode | 22.1 ns | 22.1 ns |
| per cell | decode | 24.0 ns | 24.0 ns |
| measured | insertion per item, k = 13.57 cells | 537 ns | 435 ns |
binary.122-gls, pornin, checksum projected in , mapping in
| lifetime | term | salted SHA-256 | projection |
|---|---|---|---|
| per item | ID, the item’s SHA-256 | 50.2 ns | 50.2 ns |
| per salt | accept the curve | 78.3 µs | 78.3 µs |
| per salt | checksum keys | 127 ns | 375 ns |
| per salt | mapping keys | 127 ns | 375 ns |
| per salt and item | hash to the addend | 100 ns | 51.7 ns |
| per salt and item | mapping seed | 51.4 ns | 9.67 ns |
| per salt and item | mapping walk below m = 1350 | 124 ns | 124 ns |
| per cell | add | 19.3 ns | 19.3 ns |
| per cell | encode | 21.1 ns | 21.1 ns |
| per cell | decode | 22.7 ns | 22.7 ns |
| measured | insertion per item, k = 13.57 cells | 509 ns | 408 ns |
binary-lambda.122-gls, pornin-addend, checksum projected in , mapping in
| lifetime | term | salted SHA-256 | projection |
|---|---|---|---|
| per item | ID, the item’s SHA-256 | 50.2 ns | 50.2 ns |
| per salt | accept the curve | 78.3 µs | 78.3 µs |
| per salt | checksum keys | 127 ns | 375 ns |
| per salt | mapping keys | 127 ns | 375 ns |
| per salt and item | hash to the addend | 95.2 ns | 46.1 ns |
| per salt and item | mapping seed | 51.4 ns | 9.67 ns |
| per salt and item | mapping walk below m = 1350 | 124 ns | 124 ns |
| per cell | add | 20.3 ns | 20.3 ns |
| per cell | encode | 17.9 ns | 17.9 ns |
| per cell | decode | 22.6 ns | 22.6 ns |
| measured | insertion per item, k = 13.57 cells | 501 ns | 400 ns |
binary-u.122-gls, pornin-addend, checksum projected in , mapping in
| lifetime | term | salted SHA-256 | projection |
|---|---|---|---|
| per item | ID, the item’s SHA-256 | 50.2 ns | 50.2 ns |
| per salt | accept the curve | 78.3 µs | 78.3 µs |
| per salt | checksum keys | 127 ns | 375 ns |
| per salt | mapping keys | 127 ns | 375 ns |
| per salt and item | hash to the addend | 99.5 ns | 50.1 ns |
| per salt and item | mapping seed | 51.4 ns | 9.67 ns |
| per salt and item | mapping walk below m = 1350 | 124 ns | 124 ns |
| per cell | add | 13.7 ns | 13.7 ns |
| per cell | encode | 18.0 ns | 18.0 ns |
| per cell | decode | 24.7 ns | 24.7 ns |
| measured | insertion per item, k = 13.57 cells | 432 ns | 333 ns |
binary-w.122-gls, pornin-addend, checksum projected in , mapping in
| lifetime | term | salted SHA-256 | projection |
|---|---|---|---|
| per item | ID, the item’s SHA-256 | 50.2 ns | 50.2 ns |
| per salt | accept the curve | 78.3 µs | 78.3 µs |
| per salt | checksum keys | 127 ns | 375 ns |
| per salt | mapping keys | 127 ns | 375 ns |
| per salt and item | hash to the addend | 95.1 ns | 46.4 ns |
| per salt and item | mapping seed | 51.4 ns | 9.67 ns |
| per salt and item | mapping walk below m = 1350 | 124 ns | 124 ns |
| per cell | add | 20.3 ns | 20.3 ns |
| per cell | encode | 20.4 ns | 20.4 ns |
| per cell | decode | 20.9 ns | 20.9 ns |
| measured | insertion per item, k = 13.57 cells | 498 ns | 402 ns |
binary-lambda.122, pornin-addend, checksum projected in , mapping in
| lifetime | term | salted SHA-256 | projection |
|---|---|---|---|
| per item | ID, the item’s SHA-256 | 50.2 ns | 50.2 ns |
| per salt | accept the curve | 70.1 µs | 70.1 µs |
| per salt | checksum keys | 127 ns | 375 ns |
| per salt | mapping keys | 127 ns | 375 ns |
| per salt and item | hash to the addend | 95.8 ns | 46.4 ns |
| per salt and item | mapping seed | 51.4 ns | 9.67 ns |
| per salt and item | mapping walk below m = 1350 | 124 ns | 124 ns |
| per cell | add | 20.2 ns | 20.2 ns |
| per cell | encode | 17.3 ns | 17.3 ns |
| per cell | decode | 24.1 ns | 24.1 ns |
| measured | insertion per item, k = 13.57 cells | 505 ns | 403 ns |
binary-u.122, pornin-addend, checksum projected in , mapping in
| lifetime | term | salted SHA-256 | projection |
|---|---|---|---|
| per item | ID, the item’s SHA-256 | 50.2 ns | 50.2 ns |
| per salt | accept the curve | 70.1 µs | 70.1 µs |
| per salt | checksum keys | 127 ns | 375 ns |
| per salt | mapping keys | 127 ns | 375 ns |
| per salt and item | hash to the addend | 100 ns | 50.3 ns |
| per salt and item | mapping seed | 51.4 ns | 9.67 ns |
| per salt and item | mapping walk below m = 1350 | 124 ns | 124 ns |
| per cell | add | 14.3 ns | 14.3 ns |
| per cell | encode | 18.4 ns | 18.4 ns |
| per cell | decode | 26.0 ns | 26.0 ns |
| measured | insertion per item, k = 13.57 cells | 436 ns | 332 ns |
binary-w.122, pornin-addend, checksum projected in , mapping in
| lifetime | term | salted SHA-256 | projection |
|---|---|---|---|
| per item | ID, the item’s SHA-256 | 50.2 ns | 50.2 ns |
| per salt | accept the curve | 70.1 µs | 70.1 µs |
| per salt | checksum keys | 127 ns | 375 ns |
| per salt | mapping keys | 127 ns | 375 ns |
| per salt and item | hash to the addend | 95.3 ns | 46.6 ns |
| per salt and item | mapping seed | 51.4 ns | 9.67 ns |
| per salt and item | mapping walk below m = 1350 | 124 ns | 124 ns |
| per cell | add | 20.5 ns | 20.5 ns |
| per cell | encode | 21.2 ns | 21.2 ns |
| per cell | decode | 21.6 ns | 21.6 ns |
| measured | insertion per item, k = 13.57 cells | 504 ns | 409 ns |
binary.127, pornin, checksum projected in , mapping in
| lifetime | term | salted SHA-256 | projection |
|---|---|---|---|
| per item | ID, the item’s SHA-256 | 50.2 ns | 50.2 ns |
| per salt | accept the curve | 69.9 µs | 69.9 µs |
| per salt | checksum keys | 127 ns | 375 ns |
| per salt | mapping keys | 127 ns | 375 ns |
| per salt and item | hash to the addend | 101 ns | 51.6 ns |
| per salt and item | mapping seed | 51.4 ns | 9.67 ns |
| per salt and item | mapping walk below m = 1350 | 124 ns | 124 ns |
| per cell | add | 19.5 ns | 19.5 ns |
| per cell | encode | 22.7 ns | 22.7 ns |
| per cell | decode | 25.7 ns | 25.7 ns |
| measured | insertion per item, k = 13.57 cells | 503 ns | 412 ns |
binary-lambda.127, pornin-addend, checksum projected in , mapping in
| lifetime | term | salted SHA-256 | projection |
|---|---|---|---|
| per item | ID, the item’s SHA-256 | 50.2 ns | 50.2 ns |
| per salt | accept the curve | 69.9 µs | 69.9 µs |
| per salt | checksum keys | 127 ns | 375 ns |
| per salt | mapping keys | 127 ns | 375 ns |
| per salt and item | hash to the addend | 93.0 ns | 43.9 ns |
| per salt and item | mapping seed | 51.4 ns | 9.67 ns |
| per salt and item | mapping walk below m = 1350 | 124 ns | 124 ns |
| per cell | add | 17.6 ns | 17.6 ns |
| per cell | encode | 17.5 ns | 17.5 ns |
| per cell | decode | 24.0 ns | 24.0 ns |
| measured | insertion per item, k = 13.57 cells | 474 ns | 379 ns |
binary-u.127, pornin-addend, checksum projected in , mapping in
| lifetime | term | salted SHA-256 | projection |
|---|---|---|---|
| per item | ID, the item’s SHA-256 | 50.2 ns | 50.2 ns |
| per salt | accept the curve | 69.9 µs | 69.9 µs |
| per salt | checksum keys | 127 ns | 375 ns |
| per salt | mapping keys | 127 ns | 375 ns |
| per salt and item | hash to the addend | 98.7 ns | 49.2 ns |
| per salt and item | mapping seed | 51.4 ns | 9.67 ns |
| per salt and item | mapping walk below m = 1350 | 124 ns | 124 ns |
| per cell | add | 13.2 ns | 13.2 ns |
| per cell | encode | 12.6 ns | 12.6 ns |
| per cell | decode | 27.5 ns | 27.5 ns |
| measured | insertion per item, k = 13.57 cells | 414 ns | 320 ns |
binary-w.127, pornin-addend, checksum projected in , mapping in
| lifetime | term | salted SHA-256 | projection |
|---|---|---|---|
| per item | ID, the item’s SHA-256 | 50.2 ns | 50.2 ns |
| per salt | accept the curve | 69.9 µs | 69.9 µs |
| per salt | checksum keys | 127 ns | 375 ns |
| per salt | mapping keys | 127 ns | 375 ns |
| per salt and item | hash to the addend | 93.0 ns | 45.8 ns |
| per salt and item | mapping seed | 51.4 ns | 9.67 ns |
| per salt and item | mapping walk below m = 1350 | 124 ns | 124 ns |
| per cell | add | 17.7 ns | 17.7 ns |
| per cell | encode | 17.0 ns | 17.0 ns |
| per cell | decode | 22.6 ns | 22.6 ns |
| measured | insertion per item, k = 13.57 cells | 476 ns | 380 ns |
Curve selection
Curve selection as this run timed it, once per seed (16 seeds): find searches a seed’s candidates for an acceptable curve; prove searches them again and certifies each rejection and the acceptance; verify checks that certificate. The figure shows each family’s method that finds fastest, a bar at the seeds’ mean in a box from the fastest seed to the slowest, and how the prover’s time divides among the search’s phases; the table lists every method (Parameter selection and verification). Accepting a curve (69.9 µs to 91.2 µs, curvegen/verify_accept) includes the embedding-degree bound, a baby-step giant-step search for with , which alone takes 42.1 µs to 44.4 µs (curvegen/embedding), 49% to 62% of it; rejected candidates do not reach it.
| family | method | shown | seeds | candidates | point counts (prove) | find | prove | verify | counting, of prove |
|---|---|---|---|---|---|---|---|---|---|
| edwards127 | pari+sieve | yes | 16 | 202.9 | 16.4 | 1.08 s | 1.49 s | 504 µs | 88% |
| edwards61x2 | pari+sieve | yes | 16 | 122.7 | 10.7 | 577 ms | 813 ms | 257 µs | 89% |
| gf2_109 | agm | 16 | 50.1 | 50.1 | 20.8 ms | 21.3 ms | 157 µs | 97% | |
| gf2_109 | agm+factor | yes | 16 | 50.1 | 50.1 | 20.7 ms | 30.8 ms | 135 µs | 68% |
| gf2_109 | pari | 16 | 50.1 | 50.1 | 101 ms | 109 ms | 141 µs | 91% | |
| gf2_122 | agm | yes | 16 | 39.5 | 39.5 | 18.1 ms | 17.7 ms | 126 µs | 96% |
| gf2_122 | pari | 16 | 39.5 | 39.5 | 115 ms | 116 ms | 130 µs | 99% | |
| gf2_122-gls | agm | yes | 16 | 47.2 | 47.2 | 5.75 ms | 6.31 ms | 152 µs | 87% |
| gf2_122-gls | pari | 16 | 47.2 | 47.2 | 136 ms | 137 ms | 150 µs | 99% | |
| gf2_127 | agm+sieve | yes | 16 | 83.6 | 25.1 | 16.0 ms | 15.7 ms | 170 µs | 75% |
| gf2_127 | pari | 16 | 83.6 | 83.6 | 295 ms | 335 ms | 135 µs | 88% | |
| twisted-goldilocks2 | pari+sieve | yes | 16 | 306.9 | 28.4 | 2.02 s | 2.78 s | 767 µs | 89% |
| twisted61x2 | pari+sieve | yes | 16 | 247.9 | 22.4 | 1.28 s | 1.71 s | 318 µs | 89% |
| twisted64x2 | pari+sieve | yes | 16 | 347.1 | 28.2 | 2.20 s | 2.92 s | 552 µs | 88% |
| weier127 | pari+sieve | yes | 16 | 179.0 | 19.6 | 1.27 s | 1.76 s | 278 µs | 88% |
| weier61x2 | pari+sieve | yes | 16 | 97.5 | 11.1 | 639 ms | 859 ms | 188 µs | 88% |
Group operations
The fastest measurement of each operation and mode per family, the hashes over every construction; rows grouped by field.
| curve | hash to curve | hash to addend | prepare | add | subtract | negate | is identity | equals addend | encode | decode | |||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| alone | batched | alone | batched | alone | batched | throughput | latency | match | mismatch | alone | batched | alone | batched | ||||
| baseline | |||||||||||||||||
| xorSHA-256 digests XORed: no group, 32 bytes | 53.4 ns | 0.45 ns | 0.26 ns | ||||||||||||||
| GF(2^127), 16 bytes | |||||||||||||||||
| gf2_127(X:S:Z:T) extended accumulators, Pornin's formulas | 256 ns (best) | 103 ns (1.01× the best) | 6.38 ns (14.85× the best) | 6.36 ns (13.70× the best) | 19.5 ns (1.48× the best) | 19.9 ns (1.36× the best) | 18.6 ns (1.42× the best) | 0.56 ns (1.01× the best) | 1.02 ns (2.53× the best) | 3.97 ns (1.01× the best) | 4.25 ns (1.43× the best) | 151 ns (1.10× the best) | 22.7 ns (1.81× the best) | 164 ns (1.06× the best) | 25.7 ns (1.23× the best) | ||
| gf2_127-lambdaincompleteλ-projective (X:L:Z) accumulators | 394 ns (1.54× the best) | 114 ns (1.13× the best) | 245 ns (tied for the best, within noise, 1.00×) | 92.7 ns (tied for the best, within noise) | 129 ns (299.16× the best) | 8.18 ns (17.62× the best) | 17.6 ns (1.34× the best) | 24.4 ns (1.67× the best) | 17.6 ns (1.35× the best) | 0.56 ns (tied for the best, within noise, 1.01×) | 0.82 ns (2.05× the best) | 3.95 ns (tied for the best, within noise) | 4.05 ns (1.36× the best) | 140 ns (1.02× the best) | 17.5 ns (1.39× the best) | 155 ns (tied for the best, within noise, 1.00×) | 24.0 ns (1.15× the best) |
| gf2_127-wincompleteλ-projective, w codec: hashes and decodes to λ-affine | 392 ns (1.53× the best) | 119 ns (1.18× the best) | 244 ns (tied for the best, within noise) | 92.8 ns (tied for the best, within noise, 1.00×) | 0.45 ns (tied for the best, within noise, 1.06×) | 0.47 ns (1.01× the best) | 17.7 ns (1.34× the best) | 24.4 ns (1.67× the best) | 17.7 ns (1.35× the best) | 0.56 ns (tied for the best, within noise, 1.01×) | 0.82 ns (2.03× the best) | 4.04 ns (1.02× the best) | 4.05 ns (1.36× the best) | 139 ns (1.02× the best) | 17.0 ns (1.35× the best) | 155 ns (tied for the best, within noise) | 22.6 ns (1.08× the best) |
| gf2_127-uunscaled (X:S:Z), w codec, direct addend hashes | 401 ns (1.57× the best) | 125 ns (1.23× the best) | 249 ns (1.02× the best) | 98.0 ns (1.06× the best) | 0.48 ns (1.13× the best) | 0.47 ns (1.02× the best) | 13.2 ns (best) | 14.6 ns (best) | 13.1 ns (best) | 0.56 ns (tied for the best, within noise, 1.01×) | 0.83 ns (2.07× the best) | 6.31 ns (1.60× the best) | 6.44 ns (2.17× the best) | 137 ns (best) | 12.6 ns (best) | 162 ns (1.04× the best) | 27.5 ns (1.32× the best) |
| GF(2^122) = GF(2^61)[u], dense constant, 16 bytes | |||||||||||||||||
| gf2_122(X:S:Z:T) extended | 392 ns (1.53× the best) | 103 ns (1.01× the best) | 4.91 ns (11.42× the best) | 5.01 ns (10.80× the best) | 19.9 ns (1.51× the best) | 21.3 ns (1.46× the best) | 20.1 ns (1.54× the best) | 0.56 ns (tied for the best, within noise) | 0.87 ns (2.17× the best) | 4.07 ns (1.03× the best) | 4.05 ns (1.36× the best) | 294 ns (2.15× the best) | 22.1 ns (1.76× the best) | 313 ns (2.02× the best) | 24.0 ns (1.15× the best) | ||
| gf2_122-lambdaincompleteλ-projective | 679 ns (2.65× the best) | 115 ns (1.14× the best) | 381 ns (1.56× the best) | 95.0 ns (1.02× the best) | 251 ns (583.32× the best) | 8.18 ns (17.61× the best) | 20.2 ns (1.53× the best) | 28.0 ns (1.92× the best) | 20.5 ns (1.57× the best) | 0.56 ns (1.01× the best) | 0.81 ns (2.02× the best) | 4.21 ns (1.07× the best) | 4.23 ns (1.42× the best) | 287 ns (2.10× the best) | 17.3 ns (1.37× the best) | 314 ns (2.03× the best) | 24.1 ns (1.15× the best) |
| gf2_122-wincompleteλ-projective, w codec | 654 ns (2.56× the best) | 116 ns (1.15× the best) | 381 ns (1.56× the best) | 95.2 ns (1.03× the best) | 0.44 ns (tied for the best, within noise, 1.02×) | 0.47 ns (tied for the best, within noise, 1.00×) | 20.5 ns (1.55× the best) | 27.9 ns (1.91× the best) | 20.5 ns (1.57× the best) | 0.58 ns (1.04× the best) | 0.84 ns (2.09× the best) | 4.23 ns (1.07× the best) | 4.41 ns (1.49× the best) | 302 ns (2.20× the best) | 21.2 ns (1.69× the best) | 307 ns (1.98× the best) | 21.6 ns (1.03× the best) |
| gf2_122-uunscaled (X:S:Z), w codec | 674 ns (2.63× the best) | 127 ns (1.25× the best) | 391 ns (1.60× the best) | 99.3 ns (1.07× the best) | 0.50 ns (1.15× the best) | 0.49 ns (1.06× the best) | 14.3 ns (1.08× the best) | 16.7 ns (1.15× the best) | 13.9 ns (1.06× the best) | 0.58 ns (1.03× the best) | 0.85 ns (2.10× the best) | 5.59 ns (1.42× the best) | 5.97 ns (2.01× the best) | 305 ns (2.23× the best) | 18.4 ns (1.47× the best) | 317 ns (2.05× the best) | 26.0 ns (1.24× the best) |
| GF(2^122), constant in GF(2^61) (GLS-shaped), 16 bytes | |||||||||||||||||
| gf2_122-gls(X:S:Z:T) extended | 394 ns (1.54× the best) | 101 ns (best) | 4.22 ns (9.82× the best) | 4.27 ns (9.20× the best) | 19.3 ns (1.46× the best) | 20.6 ns (1.41× the best) | 19.5 ns (1.49× the best) | 1.17 ns (2.10× the best) | 0.87 ns (2.17× the best) | 4.06 ns (1.03× the best) | 4.08 ns (1.37× the best) | 293 ns (2.14× the best) | 21.1 ns (1.68× the best) | 313 ns (2.02× the best) | 22.7 ns (1.08× the best) | ||
| gf2_122-gls-lambdaincompleteλ-projective | 692 ns (2.70× the best) | 116 ns (1.14× the best) | 385 ns (1.58× the best) | 95.0 ns (1.03× the best) | 249 ns (579.08× the best) | 8.11 ns (17.46× the best) | 20.3 ns (1.53× the best) | 28.0 ns (1.92× the best) | 20.4 ns (1.56× the best) | 0.57 ns (1.03× the best) | 0.80 ns (2.00× the best) | 4.20 ns (1.06× the best) | 4.37 ns (1.47× the best) | 297 ns (2.17× the best) | 17.9 ns (1.42× the best) | 311 ns (2.01× the best) | 22.6 ns (1.08× the best) |
| gf2_122-gls-wincompleteλ-projective, w codec | 659 ns (2.57× the best) | 116 ns (1.14× the best) | 385 ns (1.58× the best) | 94.6 ns (1.02× the best) | 0.43 ns (tied for the best, within noise) | 0.68 ns (1.47× the best) | 20.3 ns (1.54× the best) | 28.1 ns (1.93× the best) | 20.5 ns (1.56× the best) | 0.56 ns (tied for the best, within noise, 1.01×) | 0.81 ns (2.01× the best) | 4.23 ns (1.07× the best) | 4.26 ns (1.43× the best) | 297 ns (2.17× the best) | 20.4 ns (1.62× the best) | 305 ns (1.97× the best) | 20.9 ns (best) |
| gf2_122-gls-uunscaled (X:S:Z), w codec | 678 ns (2.65× the best) | 121 ns (1.19× the best) | 390 ns (1.60× the best) | 97.6 ns (1.05× the best) | 0.44 ns (tied for the best, within noise, 1.01×) | 0.68 ns (1.46× the best) | 13.7 ns (1.04× the best) | 16.2 ns (1.11× the best) | 14.0 ns (1.07× the best) | 0.56 ns (tied for the best, within noise, 1.01×) | 0.80 ns (2.00× the best) | 5.60 ns (1.42× the best) | 5.64 ns (1.90× the best) | 297 ns (2.17× the best) | 18.0 ns (1.44× the best) | 313 ns (2.02× the best) | 24.7 ns (1.18× the best) |
| GF(2^109), 14 bytes | |||||||||||||||||
| gf2_109(X:S:Z:T) extended | 675 ns (2.63× the best) | 114 ns (1.12× the best) | 4.23 ns (9.85× the best) | 4.25 ns (9.16× the best) | 20.4 ns (1.54× the best) | 22.2 ns (1.52× the best) | 20.7 ns (1.58× the best) | 0.56 ns (tied for the best, within noise, 1.01×) | 0.94 ns (2.34× the best) | 4.05 ns (1.03× the best) | 4.07 ns (1.37× the best) | 538 ns (3.93× the best) | 18.2 ns (1.45× the best) | 554 ns (3.58× the best) | 26.7 ns (1.28× the best) | ||
| gf2_109-lambdaincompleteλ-projective | 1.16 µs (4.53× the best) | 124 ns (1.23× the best) | 655 ns (2.69× the best) | 105 ns (1.13× the best) | 503 ns (1170.41× the best) | 8.13 ns (17.51× the best) | 18.9 ns (1.43× the best) | 28.2 ns (1.94× the best) | 19.1 ns (1.46× the best) | 0.56 ns (tied for the best, within noise, 1.00×) | 0.80 ns (1.99× the best) | 3.96 ns (tied for the best, within noise, 1.00×) | 3.94 ns (1.33× the best) | 530 ns (3.87× the best) | 14.1 ns (1.12× the best) | 549 ns (3.55× the best) | 26.5 ns (1.27× the best) |
| gf2_109-wincompleteλ-projective, w codec | 1.14 µs (4.44× the best) | 120 ns (1.18× the best) | 652 ns (2.67× the best) | 104 ns (1.12× the best) | 0.44 ns (tied for the best, within noise, 1.02×) | 0.47 ns (tied for the best, within noise, 1.01×) | 18.9 ns (1.43× the best) | 28.3 ns (1.94× the best) | 19.2 ns (1.46× the best) | 0.57 ns (1.01× the best) | 0.80 ns (1.99× the best) | 4.16 ns (1.05× the best) | 4.13 ns (1.39× the best) | 540 ns (3.94× the best) | 21.6 ns (1.72× the best) | 555 ns (3.59× the best) | 24.4 ns (1.17× the best) |
| gf2_109-uunscaled (X:S:Z), w codec | 1.15 µs (4.51× the best) | 125 ns (1.23× the best) | 657 ns (2.70× the best) | 110 ns (1.18× the best) | 0.48 ns (1.12× the best) | 0.46 ns (tied for the best, within noise) | 13.5 ns (1.02× the best) | 15.7 ns (1.08× the best) | 13.6 ns (1.04× the best) | 0.56 ns (tied for the best, within noise, 1.01×) | 0.80 ns (1.99× the best) | 5.84 ns (1.48× the best) | 5.82 ns (1.96× the best) | 546 ns (3.99× the best) | 21.9 ns (1.74× the best) | 555 ns (3.59× the best) | 27.7 ns (1.33× the best) |
| F_p, p = 2^127 − 1, 16 bytes | |||||||||||||||||
| edwards127a = 1 Edwards, extended += cached | 1.22 µs (4.78× the best) | 1.24 µs (12.21× the best) | 663 ns (1543.72× the best) | 39.9 ns (86.04× the best) | 27.5 ns (2.08× the best) | 35.8 ns (2.46× the best) | 1.98 ns (3.55× the best) | 1.30 ns (3.24× the best) | 3.16 ns (1.06× the best) | 610 ns (4.45× the best) | 31.9 ns (2.54× the best) | 540 ns (3.49× the best) | 541 ns (25.90× the best) | ||||
| weier127short Weierstrass, projective += affine | 1.16 µs (4.53× the best) | 1.17 µs (11.50× the best) | 0.81 ns (1.89× the best) | 1.00 ns (2.15× the best) | 58.7 ns (4.45× the best) | 63.9 ns (4.38× the best) | 1.10 ns (1.97× the best) | 0.40 ns (tied for the best, within noise, 1.01×) | 3.53 ns (1.19× the best) | 593 ns (4.33× the best) | 16.7 ns (1.33× the best) | 541 ns (3.50× the best) | 539 ns (25.81× the best) | ||||
| weier127-jacobianincompleteshort Weierstrass, Jacobian += affine | 1.15 µs (4.51× the best) | 1.16 µs (11.42× the best) | 0.81 ns (1.88× the best) | 0.99 ns (2.13× the best) | 48.1 ns (3.64× the best) | 56.6 ns (3.89× the best) | 1.10 ns (1.97× the best) | 0.40 ns (1.01× the best) | 6.60 ns (2.22× the best) | 605 ns (4.42× the best) | 23.6 ns (1.88× the best) | 543 ns (3.51× the best) | 542 ns (25.93× the best) | ||||
| F_p, p = 2^107 − 1, 14 bytes | |||||||||||||||||
| edwards107a = 1 Edwards, extended += cached | 919 ns (3.59× the best) | 916 ns (9.04× the best) | 632 ns (1471.60× the best) | 37.9 ns (81.74× the best) | 27.6 ns (2.09× the best) | 32.6 ns (2.24× the best) | 1.40 ns (2.51× the best) | 1.18 ns (2.94× the best) | 4.93 ns (1.66× the best) | 600 ns (4.38× the best) | 35.1 ns (2.80× the best) | 424 ns (2.74× the best) | 426 ns (20.37× the best) | ||||
| weier107short Weierstrass, projective += affine | 892 ns (3.48× the best) | 901 ns (8.89× the best) | 0.82 ns (1.90× the best) | 0.63 ns (1.35× the best) | 48.6 ns (3.68× the best) | 53.9 ns (3.70× the best) | 0.82 ns (1.47× the best) | 0.91 ns (2.25× the best) | 5.81 ns (1.96× the best) | 582 ns (4.25× the best) | 19.4 ns (1.54× the best) | 421 ns (2.72× the best) | 422 ns (20.19× the best) | ||||
| weier107-jacobianincompleteshort Weierstrass, Jacobian += affine | 886 ns (3.46× the best) | 893 ns (8.81× the best) | 0.81 ns (1.88× the best) | 0.63 ns (1.35× the best) | 44.1 ns (3.34× the best) | 50.9 ns (3.49× the best) | 0.82 ns (1.48× the best) | 0.90 ns (2.24× the best) | 9.23 ns (3.11× the best) | 580 ns (4.23× the best) | 25.5 ns (2.03× the best) | 419 ns (2.71× the best) | 421 ns (20.13× the best) | ||||
| F_p, p = 2^128 − 275, 16 bytes | |||||||||||||||||
| twisted128a = −1 twisted Edwards modulo 2-torsion, extended += cached | 1.97 µs (7.68× the best) | 1.96 µs (19.34× the best) | 12.5 ns (29.04× the best) | 12.7 ns (27.29× the best) | 31.1 ns (2.35× the best) | 36.3 ns (2.49× the best) | 1.15 ns (2.06× the best) | 0.50 ns (1.25× the best) | 9.45 ns (3.18× the best) | 943 ns (6.89× the best) | 22.7 ns (1.81× the best) | 960 ns (6.21× the best) | 962 ns (46.04× the best) | ||||
| F_{p²}, p = 2^61 − 1, 16 bytes | |||||||||||||||||
| edwards61x2a = 1 Edwards, signed-x codec, extended += cached | 707 ns (2.76× the best) | 706 ns (6.97× the best) | 236 ns (548.53× the best) | 34.9 ns (75.23× the best) | 25.8 ns (1.95× the best) | 29.6 ns (2.03× the best) | 0.78 ns (1.39× the best) | 0.54 ns (1.34× the best) | 2.97 ns (best) | 203 ns (1.48× the best) | 35.0 ns (2.79× the best) | 437 ns (2.83× the best) | 441 ns (21.08× the best) | ||||
| weier61x2short Weierstrass, signed-x codec, projective += affine | 696 ns (2.72× the best) | 698 ns (6.89× the best) | 0.44 ns (tied for the best, within noise, 1.03×) | 0.52 ns (1.13× the best) | 50.6 ns (3.83× the best) | 57.1 ns (3.92× the best) | 0.57 ns (1.02× the best) | 0.41 ns (1.01× the best) | 3.33 ns (1.12× the best) | 190 ns (1.39× the best) | 15.3 ns (1.22× the best) | 441 ns (2.85× the best) | 448 ns (21.43× the best) | ||||
| weier61x2-jacobianincompleteshort Weierstrass, signed-x codec, Jacobian += affine | 702 ns (2.74× the best) | 698 ns (6.89× the best) | 0.44 ns (tied for the best, within noise, 1.02×) | 0.52 ns (1.12× the best) | 50.2 ns (3.80× the best) | 57.2 ns (3.92× the best) | 0.57 ns (1.02× the best) | 0.40 ns (tied for the best, within noise) | 7.98 ns (2.69× the best) | 198 ns (1.45× the best) | 24.8 ns (1.97× the best) | 440 ns (2.84× the best) | 445 ns (21.28× the best) | ||||
| twisted61x2a = −1 Edwards modulo 2-torsion, extended += cached | 706 ns (2.76× the best) | 711 ns (7.01× the best) | 8.07 ns (18.77× the best) | 7.93 ns (17.07× the best) | 24.9 ns (1.89× the best) | 28.4 ns (1.95× the best) | 25.2 ns (1.92× the best) | 0.73 ns (1.32× the best) | 0.50 ns (1.24× the best) | 8.55 ns (2.17× the best) | 8.85 ns (2.98× the best) | 189 ns (1.38× the best) | 14.9 ns (1.19× the best) | 448 ns (2.90× the best) | 450 ns (21.55× the best) | ||
| F_{p²}, p = 2^64 − 59, 16 bytes | |||||||||||||||||
| twisted64x2a = −1 Edwards modulo 2-torsion, extended += cached | 1.00 µs (3.91× the best) | 1.00 µs (9.90× the best) | 8.75 ns (20.37× the best) | 8.79 ns (18.94× the best) | 33.3 ns (2.52× the best) | 37.9 ns (2.60× the best) | 0.73 ns (1.32× the best) | 0.50 ns (1.25× the best) | 7.68 ns (2.59× the best) | 267 ns (1.95× the best) | 22.6 ns (1.80× the best) | 650 ns (4.20× the best) | 647 ns (30.96× the best) | ||||
| F_{p²}, p = 2^64 − 2^32 + 1, 16 bytes | |||||||||||||||||
| twisted-goldilocks2a = −1 Edwards modulo 2-torsion, extended += cached | 2.21 µs (8.65× the best) | 2.24 µs (22.07× the best) | 9.45 ns (22.00× the best) | 9.54 ns (20.55× the best) | 28.7 ns (2.18× the best) | 29.4 ns (2.02× the best) | 1.32 ns (2.36× the best) | 0.60 ns (1.48× the best) | 9.42 ns (3.17× the best) | 316 ns (2.31× the best) | 22.9 ns (1.83× the best) | 1.91 µs (12.36× the best) | 1.92 µs (92.00× the best) | ||||
| references, 32 and 33 bytes | |||||||||||||||||
| ristretto255curve25519-dalek | 6.03 µs (23.55× the best) | 116 ns (8.76× the best) | 117 ns (8.05× the best) | 113 ns (8.62× the best) | 6.47 ns (11.61× the best) | ||||||||||||
| secp256k1libsecp256k1 | 6.16 µs (24.04× the best) | 24.7 ns (44.31× the best) | |||||||||||||||
bold: the best of its column; italic, dotted: tied with the best within the confidence intervals; shading: ratio to the best, pale yellow at 1× to purple at 16× or more; grey: baseline, not compared.
Field operations
Per field; batched inversion per element of a batch of 1024.
| field | mul | square | add | sqrt | sqrt ratio | halftrace | invert | pack | unpack | |||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| throughput | latency | throughput | latency | alone | batched | |||||||
| binary | ||||||||||||
| gf2_127F_2[z]/(z^127 + z^63 + 1) | 1.43 ns (1.04× the best) | 3.50 ns (1.07× the best) | 0.65 ns (best) | 2.18 ns (best) | xor | 1.70 ns (best) | 5.16 ns (1.34× the best) | 123 ns (best) | 5.41 ns (1.03× the best) | |||
| gf2_122GF(2^61)[u]/(u^2 + u + 1) | 1.38 ns (1.01× the best) | 4.56 ns (1.40× the best) | 1.17 ns (1.80× the best) | 4.33 ns (1.99× the best) | xor | 3.98 ns (2.34× the best) | 3.86 ns (best) | 238 ns (1.93× the best) | 5.23 ns (best) | |||
| gf2_109F_2[z]/(z^109 + z^5 + z^4 + z^2 + 1) | 1.37 ns (best) | 5.13 ns (1.57× the best) | 0.81 ns (1.24× the best) | 3.88 ns (1.78× the best) | xor | 6.93 ns (4.09× the best) | 4.02 ns (1.04× the best) | 491 ns (3.99× the best) | 5.36 ns (1.03× the best) | |||
| prime | ||||||||||||
| fp127p = 2^127 − 1 | 2.69 ns (1.96× the best) | 4.31 ns (1.32× the best) | 2.30 ns (3.52× the best) | 4.26 ns (1.96× the best) | 1.00 ns (1.67× the best) | 523 ns (308.39× the best) | 592 ns (2.01× the best) | 577 ns (4.68× the best) | 10.2 ns (1.95× the best) | 0.38 ns (1.06× the best) | 0.70 ns (tied for the best, within noise) | |
| fp107p = 2^107 − 1 | 2.55 ns (1.86× the best) | 3.97 ns (1.22× the best) | 2.13 ns (3.27× the best) | 3.60 ns (1.65× the best) | 0.62 ns (1.04× the best) | 422 ns (248.72× the best) | 597 ns (2.03× the best) | 571 ns (4.63× the best) | 10.1 ns (1.92× the best) | 0.82 ns (2.27× the best) | 0.73 ns (1.05× the best) | |
| fp128p = 2^128 − 275, for twisted128 | 3.82 ns (2.79× the best) | 6.73 ns (2.06× the best) | 3.64 ns (5.58× the best) | 6.54 ns (3.00× the best) | 0.72 ns (1.19× the best) | 891 ns (524.78× the best) | 937 ns (3.18× the best) | 918 ns (7.45× the best) | 0.36 ns (tied for the best, within noise) | 0.70 ns (tied for the best, within noise, 1.00×) | ||
| quadratic extensions of prime fields | ||||||||||||
| fp61x2GF(p^2) = F_p[i]/(i^2 + 1), p = 2^61 − 1 | 2.54 ns (1.85× the best) | 5.37 ns (1.65× the best) | 2.38 ns (3.64× the best) | 5.90 ns (2.71× the best) | 0.61 ns (1.02× the best) | 298 ns (175.83× the best) | 295 ns (best) | 176 ns (1.43× the best) | 8.60 ns (1.64× the best) | 0.50 ns (1.38× the best) | 0.99 ns (1.42× the best) | |
| fp64x2GF(p^2) = F_p[i]/(i^2 − 2), p = 2^64 − 59 | 3.82 ns (2.79× the best) | 4.99 ns (1.53× the best) | 3.70 ns (5.67× the best) | 4.76 ns (2.19× the best) | 0.60 ns (best) | 431 ns (254.15× the best) | 431 ns (1.46× the best) | 241 ns (1.96× the best) | 13.6 ns (2.59× the best) | 0.37 ns (tied for the best, within noise, 1.01×) | 0.70 ns (tied for the best, within noise) | |
| goldilocks2GF(p^2) = F_p[i]/(i^2 − 7), p = 2^64 − 2^32 + 1 | 2.67 ns (1.94× the best) | 3.26 ns (best) | 2.59 ns (3.96× the best) | 3.59 ns (1.65× the best) | 0.69 ns (1.15× the best) | 996 ns (586.74× the best) | 950 ns (3.23× the best) | 304 ns (2.47× the best) | 8.96 ns (1.71× the best) | 0.69 ns (1.92× the best) | 0.70 ns (tied for the best, within noise) | |
bold: the best of its column; italic, dotted: tied with the best within the confidence intervals; shading: ratio to the best, pale yellow at 1× to purple at 16× or more; grey: baseline, not compared.
Which bench each cell is
| operation | curve | bench | time | 95% CI |
|---|---|---|---|---|
| field mul, throughput | gf2_127 | field/gf2_127/mul throughput (8 chains) | 1.43 ns | 1.42 ns .. 1.43 ns |
| field mul, throughput | gf2_109 | field/gf2_109/mul throughput (8 chains) | 1.37 ns | 1.37 ns .. 1.38 ns |
| field mul, throughput | gf2_122 | field/gf2_122/mul throughput (8 chains) | 1.38 ns | 1.38 ns .. 1.38 ns |
| field mul, throughput | fp127 | field/fp127/mul throughput (8 chains) | 2.69 ns | 2.68 ns .. 2.70 ns |
| field mul, throughput | fp107 | field/fp107 schoolbook/mul throughput (8 chains) | 2.55 ns | 2.55 ns .. 2.56 ns |
| field mul, throughput | fp128 | field/fp128/mul throughput (8 chains) | 3.82 ns | 3.82 ns .. 3.83 ns |
| field mul, throughput | fp61x2 | field/fp61x2/mul throughput (8 chains) | 2.54 ns | 2.54 ns .. 2.55 ns |
| field mul, throughput | fp64x2 | field/fp64x2/mul throughput (8 chains) | 3.82 ns | 3.82 ns .. 3.83 ns |
| field mul, throughput | goldilocks2 | field/goldilocks2/mul throughput (8 chains) | 2.67 ns | 2.66 ns .. 2.68 ns |
| field mul, latency | gf2_127 | field/gf2_127/mul latency (dependent chain) | 3.50 ns | 3.49 ns .. 3.51 ns |
| field mul, latency | gf2_109 | field/gf2_109/mul latency (dependent chain) | 5.13 ns | 5.10 ns .. 5.16 ns |
| field mul, latency | gf2_122 | field/gf2_122/mul latency (dependent chain) | 4.56 ns | 4.54 ns .. 4.57 ns |
| field mul, latency | fp127 | field/fp127/mul latency (dependent chain) | 4.31 ns | 4.29 ns .. 4.32 ns |
| field mul, latency | fp107 | field/fp107/mul latency (dependent chain) | 3.97 ns | 3.96 ns .. 3.98 ns |
| field mul, latency | fp128 | field/fp128/mul latency (dependent chain) | 6.73 ns | 6.71 ns .. 6.74 ns |
| field mul, latency | fp61x2 | field/fp61x2/mul latency (dependent chain) | 5.37 ns | 5.36 ns .. 5.39 ns |
| field mul, latency | fp64x2 | field/fp64x2/mul latency (dependent chain) | 4.99 ns | 4.99 ns .. 5.01 ns |
| field mul, latency | goldilocks2 | field/goldilocks2/mul latency (dependent chain) | 3.26 ns | 3.25 ns .. 3.27 ns |
| field square, throughput | gf2_127 | field/gf2_127/square throughput (8 chains) | 0.65 ns | 0.65 ns .. 0.65 ns |
| field square, throughput | gf2_109 | field/gf2_109/square throughput (8 chains) | 0.81 ns | 0.81 ns .. 0.81 ns |
| field square, throughput | gf2_122 | field/gf2_122/square throughput (8 chains) | 1.17 ns | 1.17 ns .. 1.18 ns |
| field square, throughput | fp127 | field/fp127/square throughput (8 chains) | 2.30 ns | 2.29 ns .. 2.31 ns |
| field square, throughput | fp107 | field/fp107/square throughput (8 chains) | 2.13 ns | 2.13 ns .. 2.14 ns |
| field square, throughput | fp128 | field/fp128/square throughput (8 chains) | 3.64 ns | 3.63 ns .. 3.65 ns |
| field square, throughput | fp61x2 | field/fp61x2/square throughput (8 chains) | 2.38 ns | 2.37 ns .. 2.38 ns |
| field square, throughput | fp64x2 | field/fp64x2/square throughput (8 chains) | 3.70 ns | 3.69 ns .. 3.71 ns |
| field square, throughput | goldilocks2 | field/goldilocks2/square throughput (8 chains) | 2.59 ns | 2.58 ns .. 2.60 ns |
| field square, latency | gf2_127 | field/gf2_127/square latency (dependent chain) | 2.18 ns | 2.17 ns .. 2.19 ns |
| field square, latency | gf2_109 | field/gf2_109/square latency (dependent chain) | 3.88 ns | 3.87 ns .. 3.89 ns |
| field square, latency | gf2_122 | field/gf2_122/square latency (dependent chain) | 4.33 ns | 4.32 ns .. 4.34 ns |
| field square, latency | fp127 | field/fp127/square latency (dependent chain) | 4.26 ns | 4.25 ns .. 4.27 ns |
| field square, latency | fp107 | field/fp107/square latency (dependent chain) | 3.60 ns | 3.59 ns .. 3.60 ns |
| field square, latency | fp128 | field/fp128/square latency (dependent chain) | 6.54 ns | 6.52 ns .. 6.56 ns |
| field square, latency | fp61x2 | field/fp61x2/square latency (dependent chain) | 5.90 ns | 5.88 ns .. 5.92 ns |
| field square, latency | fp64x2 | field/fp64x2/square latency (dependent chain) | 4.76 ns | 4.75 ns .. 4.77 ns |
| field square, latency | goldilocks2 | field/goldilocks2/square latency (dependent chain) | 3.59 ns | 3.58 ns .. 3.60 ns |
| field add | fp127 | field/fp127/add | 1.00 ns | 0.99 ns .. 1.01 ns |
| field add | fp107 | field/fp107/add | 0.62 ns | 0.62 ns .. 0.63 ns |
| field add | fp128 | field/fp128/add | 0.72 ns | 0.71 ns .. 0.72 ns |
| field add | fp61x2 | field/fp61x2/add | 0.61 ns | 0.61 ns .. 0.61 ns |
| field add | fp64x2 | field/fp64x2/add | 0.60 ns | 0.60 ns .. 0.60 ns |
| field add | goldilocks2 | field/goldilocks2/add | 0.69 ns | 0.69 ns .. 0.70 ns |
| field sqrt | gf2_127 | field/gf2_127/sqrt | 1.70 ns | 1.69 ns .. 1.70 ns |
| field sqrt | gf2_109 | field/gf2_109/sqrt | 6.93 ns | 6.92 ns .. 6.95 ns |
| field sqrt | gf2_122 | field/gf2_122/sqrt | 3.98 ns | 3.97 ns .. 3.98 ns |
| field sqrt | fp127 | field/fp127/sqrt (x^(2^125)) | 523 ns | 523 ns .. 524 ns |
| field sqrt | fp107 | field/fp107/sqrt (x^(2^105)) | 422 ns | 420 ns .. 425 ns |
| field sqrt | fp128 | field/fp128/sqrt | 891 ns | 888 ns .. 893 ns |
| field sqrt | fp61x2 | field/fp61x2/sqrt | 298 ns | 298 ns .. 299 ns |
| field sqrt | fp64x2 | field/fp64x2/sqrt | 431 ns | 430 ns .. 432 ns |
| field sqrt | goldilocks2 | field/goldilocks2/sqrt | 996 ns | 993 ns .. 998 ns |
| field sqrt ratio | fp127 | field/fp127/sqrt_ratio | 592 ns | 590 ns .. 593 ns |
| field sqrt ratio | fp107 | field/fp107/sqrt_ratio | 597 ns | 593 ns .. 601 ns |
| field sqrt ratio | fp128 | field/fp128/sqrt_ratio | 937 ns | 936 ns .. 939 ns |
| field sqrt ratio | fp61x2 | field/fp61x2/sqrt_ratio | 295 ns | 294 ns .. 295 ns |
| field sqrt ratio | fp64x2 | field/fp64x2/sqrt_ratio | 431 ns | 430 ns .. 432 ns |
| field sqrt ratio | goldilocks2 | field/goldilocks2/sqrt_ratio | 950 ns | 948 ns .. 952 ns |
| field halftrace | gf2_127 | field/gf2_127/halftrace (byte tables) | 5.16 ns | 5.12 ns .. 5.23 ns |
| field halftrace | gf2_109 | field/gf2_109/halftrace (byte tables) | 4.02 ns | 4.01 ns .. 4.03 ns |
| field halftrace | gf2_122 | field/gf2_122/qsolve (z^2 + z = c, 2 base halftraces) | 3.86 ns | 3.84 ns .. 3.88 ns |
| field invert, one at a time | gf2_127 | field/gf2_127/invert | 123 ns | 123 ns .. 124 ns |
| field invert, one at a time | gf2_109 | field/gf2_109/invert | 491 ns | 490 ns .. 493 ns |
| field invert, one at a time | gf2_122 | field/gf2_122/invert | 238 ns | 238 ns .. 239 ns |
| field invert, one at a time | fp127 | field/fp127/invert | 577 ns | 576 ns .. 578 ns |
| field invert, one at a time | fp107 | field/fp107/invert | 571 ns | 566 ns .. 576 ns |
| field invert, one at a time | fp128 | field/fp128/invert | 918 ns | 916 ns .. 922 ns |
| field invert, one at a time | fp61x2 | field/fp61x2/invert | 176 ns | 176 ns .. 176 ns |
| field invert, one at a time | fp64x2 | field/fp64x2/invert | 241 ns | 241 ns .. 242 ns |
| field invert, one at a time | goldilocks2 | field/goldilocks2/invert | 304 ns | 303 ns .. 305 ns |
| field invert, batched | gf2_127 | field/gf2_127/batch invert (product tree) | 5.41 ns | 5.36 ns .. 5.45 ns |
| field invert, batched | gf2_109 | field/gf2_109/batch invert (product tree) | 5.36 ns | 5.34 ns .. 5.38 ns |
| field invert, batched | gf2_122 | field/gf2_122/batch invert (product tree) | 5.23 ns | 5.21 ns .. 5.25 ns |
| field invert, batched | fp127 | field/fp127/batch invert (product tree) | 10.2 ns | 10.1 ns .. 10.3 ns |
| field invert, batched | fp107 | field/fp107/batch invert (product tree) | 10.1 ns | 10.0 ns .. 10.1 ns |
| field invert, batched | fp61x2 | field/fp61x2/batch invert (product tree) | 8.60 ns | 8.58 ns .. 8.62 ns |
| field invert, batched | fp64x2 | field/fp64x2/batch invert (product tree) | 13.6 ns | 13.5 ns .. 13.6 ns |
| field invert, batched | goldilocks2 | field/goldilocks2/batch invert (product tree) | 8.96 ns | 8.93 ns .. 9.00 ns |
| field pack | fp127 | field/fp127/pack | 0.38 ns | 0.38 ns .. 0.39 ns |
| field pack | fp107 | field/fp107/pack | 0.82 ns | 0.82 ns .. 0.83 ns |
| field pack | fp128 | field/fp128/pack | 0.36 ns | 0.36 ns .. 0.37 ns |
| field pack | fp61x2 | field/fp61x2/pack | 0.50 ns | 0.50 ns .. 0.50 ns |
| field pack | fp64x2 | field/fp64x2/pack | 0.37 ns | 0.36 ns .. 0.37 ns |
| field pack | goldilocks2 | field/goldilocks2/pack | 0.69 ns | 0.69 ns .. 0.70 ns |
| field unpack | fp127 | field/fp127/unpack | 0.70 ns | 0.70 ns .. 0.70 ns |
| field unpack | fp107 | field/fp107/unpack | 0.73 ns | 0.73 ns .. 0.73 ns |
| field unpack | fp128 | field/fp128/unpack | 0.70 ns | 0.70 ns .. 0.70 ns |
| field unpack | fp61x2 | field/fp61x2/unpack | 0.99 ns | 0.99 ns .. 1.00 ns |
| field unpack | fp64x2 | field/fp64x2/unpack | 0.70 ns | 0.70 ns .. 0.70 ns |
| field unpack | goldilocks2 | field/goldilocks2/unpack | 0.70 ns | 0.70 ns .. 0.70 ns |
| point add, throughput | xor | add/xor-sha256/xor 32B, 8 accumulators | 0.45 ns | 0.43 ns .. 0.46 ns |
| point add, throughput | gf2_127 | group.add/binary.127/mode=throughput | 19.5 ns | 19.5 ns .. 19.6 ns |
| point add, throughput | gf2_127-lambda | group.add/binary-lambda.127/mode=throughput | 17.6 ns | 17.6 ns .. 17.7 ns |
| point add, throughput | gf2_127-w | group.add/binary-w.127/mode=throughput | 17.7 ns | 17.6 ns .. 17.7 ns |
| point add, throughput | gf2_127-u | group.add/binary-u.127/mode=throughput | 13.2 ns | 13.2 ns .. 13.2 ns |
| point add, throughput | gf2_109 | group.add/binary.109/mode=throughput | 20.4 ns | 20.3 ns .. 20.4 ns |
| point add, throughput | gf2_109-lambda | group.add/binary-lambda.109/mode=throughput | 18.9 ns | 18.9 ns .. 18.9 ns |
| point add, throughput | gf2_109-w | group.add/binary-w.109/mode=throughput | 18.9 ns | 18.9 ns .. 19.0 ns |
| point add, throughput | gf2_109-u | group.add/binary-u.109/mode=throughput | 13.5 ns | 13.5 ns .. 13.5 ns |
| point add, throughput | gf2_122 | group.add/binary.122/mode=throughput | 19.9 ns | 19.9 ns .. 20.0 ns |
| point add, throughput | gf2_122-lambda | group.add/binary-lambda.122/mode=throughput | 20.2 ns | 20.2 ns .. 20.3 ns |
| point add, throughput | gf2_122-w | group.add/binary-w.122/mode=throughput | 20.5 ns | 20.4 ns .. 20.6 ns |
| point add, throughput | gf2_122-u | group.add/binary-u.122/mode=throughput | 14.3 ns | 14.3 ns .. 14.4 ns |
| point add, throughput | gf2_122-gls | group.add/binary.122-gls/mode=throughput | 19.3 ns | 19.2 ns .. 19.4 ns |
| point add, throughput | gf2_122-gls-lambda | group.add/binary-lambda.122-gls/mode=throughput | 20.3 ns | 20.2 ns .. 20.3 ns |
| point add, throughput | gf2_122-gls-w | group.add/binary-w.122-gls/mode=throughput | 20.3 ns | 20.2 ns .. 20.4 ns |
| point add, throughput | gf2_122-gls-u | group.add/binary-u.122-gls/mode=throughput | 13.7 ns | 13.7 ns .. 13.8 ns |
| point add, throughput | edwards127 | group.add/edwards.127/mode=throughput | 27.5 ns | 27.4 ns .. 27.6 ns |
| point add, throughput | edwards107 | group.add/edwards.107/mode=throughput | 27.6 ns | 27.5 ns .. 27.7 ns |
| point add, throughput | twisted128 | group.add/twisted.128/mode=throughput | 31.1 ns | 31.0 ns .. 31.2 ns |
| point add, throughput | weier127 | group.add/weier.127/mode=throughput | 58.7 ns | 58.5 ns .. 58.9 ns |
| point add, throughput | weier127-jacobian | group.add/weier-jacobian.127/mode=throughput | 48.1 ns | 48.0 ns .. 48.2 ns |
| point add, throughput | weier107 | group.add/weier.107/mode=throughput | 48.6 ns | 48.4 ns .. 48.8 ns |
| point add, throughput | weier107-jacobian | group.add/weier-jacobian.107/mode=throughput | 44.1 ns | 44.0 ns .. 44.3 ns |
| point add, throughput | edwards61x2 | group.add/edwards.61x2/mode=throughput | 25.8 ns | 25.7 ns .. 25.9 ns |
| point add, throughput | weier61x2 | group.add/weier.61x2/mode=throughput | 50.6 ns | 50.4 ns .. 50.7 ns |
| point add, throughput | weier61x2-jacobian | group.add/weier-jacobian.61x2/mode=throughput | 50.2 ns | 50.1 ns .. 50.3 ns |
| point add, throughput | twisted61x2 | group.add/twisted.61x2/mode=throughput | 24.9 ns | 24.8 ns .. 25.0 ns |
| point add, throughput | twisted64x2 | group.add/twisted.64x2/mode=throughput | 33.3 ns | 33.2 ns .. 33.4 ns |
| point add, throughput | twisted-goldilocks2 | group.add/twisted.goldilocks2/mode=throughput | 28.7 ns | 28.7 ns .. 28.8 ns |
| point add, throughput | ristretto255 | add/ristretto255/+=, 8 accumulators | 116 ns | 115 ns .. 116 ns |
| point add, latency | xor | add/xor-sha256/xor 32B, 1 accumulator | 0.26 ns | 0.25 ns .. 0.26 ns |
| point add, latency | gf2_127 | group.add/binary.127/mode=latency | 19.9 ns | 19.8 ns .. 20.0 ns |
| point add, latency | gf2_127-lambda | group.add/binary-lambda.127/mode=latency | 24.4 ns | 24.3 ns .. 24.5 ns |
| point add, latency | gf2_127-w | group.add/binary-w.127/mode=latency | 24.4 ns | 24.3 ns .. 24.4 ns |
| point add, latency | gf2_127-u | group.add/binary-u.127/mode=latency | 14.6 ns | 14.5 ns .. 14.6 ns |
| point add, latency | gf2_109 | group.add/binary.109/mode=latency | 22.2 ns | 22.1 ns .. 22.2 ns |
| point add, latency | gf2_109-lambda | group.add/binary-lambda.109/mode=latency | 28.2 ns | 28.2 ns .. 28.3 ns |
| point add, latency | gf2_109-w | group.add/binary-w.109/mode=latency | 28.3 ns | 28.2 ns .. 28.4 ns |
| point add, latency | gf2_109-u | group.add/binary-u.109/mode=latency | 15.7 ns | 15.7 ns .. 15.7 ns |
| point add, latency | gf2_122 | group.add/binary.122/mode=latency | 21.3 ns | 21.2 ns .. 21.3 ns |
| point add, latency | gf2_122-lambda | group.add/binary-lambda.122/mode=latency | 28.0 ns | 27.9 ns .. 28.1 ns |
| point add, latency | gf2_122-w | group.add/binary-w.122/mode=latency | 27.9 ns | 27.8 ns .. 28.0 ns |
| point add, latency | gf2_122-u | group.add/binary-u.122/mode=latency | 16.7 ns | 16.6 ns .. 16.8 ns |
| point add, latency | gf2_122-gls | group.add/binary.122-gls/mode=latency | 20.6 ns | 20.5 ns .. 20.6 ns |
| point add, latency | gf2_122-gls-lambda | group.add/binary-lambda.122-gls/mode=latency | 28.0 ns | 27.9 ns .. 28.1 ns |
| point add, latency | gf2_122-gls-w | group.add/binary-w.122-gls/mode=latency | 28.1 ns | 28.0 ns .. 28.1 ns |
| point add, latency | gf2_122-gls-u | group.add/binary-u.122-gls/mode=latency | 16.2 ns | 16.1 ns .. 16.3 ns |
| point add, latency | edwards127 | group.add/edwards.127/mode=latency | 35.8 ns | 35.7 ns .. 35.9 ns |
| point add, latency | edwards107 | group.add/edwards.107/mode=latency | 32.6 ns | 32.5 ns .. 32.7 ns |
| point add, latency | twisted128 | group.add/twisted.128/mode=latency | 36.3 ns | 36.2 ns .. 36.4 ns |
| point add, latency | weier127 | group.add/weier.127/mode=latency | 63.9 ns | 63.7 ns .. 64.0 ns |
| point add, latency | weier127-jacobian | group.add/weier-jacobian.127/mode=latency | 56.6 ns | 56.4 ns .. 56.9 ns |
| point add, latency | weier107 | group.add/weier.107/mode=latency | 53.9 ns | 53.4 ns .. 54.2 ns |
| point add, latency | weier107-jacobian | group.add/weier-jacobian.107/mode=latency | 50.9 ns | 50.8 ns .. 51.1 ns |
| point add, latency | edwards61x2 | group.add/edwards.61x2/mode=latency | 29.6 ns | 29.5 ns .. 29.7 ns |
| point add, latency | weier61x2 | group.add/weier.61x2/mode=latency | 57.1 ns | 57.0 ns .. 57.2 ns |
| point add, latency | weier61x2-jacobian | group.add/weier-jacobian.61x2/mode=latency | 57.2 ns | 57.0 ns .. 57.3 ns |
| point add, latency | twisted61x2 | group.add/twisted.61x2/mode=latency | 28.4 ns | 28.3 ns .. 28.5 ns |
| point add, latency | twisted64x2 | group.add/twisted.64x2/mode=latency | 37.9 ns | 37.7 ns .. 38.0 ns |
| point add, latency | twisted-goldilocks2 | group.add/twisted.goldilocks2/mode=latency | 29.4 ns | 29.3 ns .. 29.4 ns |
| point add, latency | ristretto255 | add/ristretto255/+=, 1 accumulator | 117 ns | 117 ns .. 118 ns |
| point subtract | gf2_127 | group.sub/binary.127/mode=throughput | 18.6 ns | 18.6 ns .. 18.7 ns |
| point subtract | gf2_127-lambda | group.sub/binary-lambda.127/mode=throughput | 17.6 ns | 17.6 ns .. 17.7 ns |
| point subtract | gf2_127-w | group.sub/binary-w.127/mode=throughput | 17.7 ns | 17.6 ns .. 17.7 ns |
| point subtract | gf2_127-u | group.sub/binary-u.127/mode=throughput | 13.1 ns | 13.1 ns .. 13.1 ns |
| point subtract | gf2_109 | group.sub/binary.109/mode=throughput | 20.7 ns | 20.6 ns .. 20.7 ns |
| point subtract | gf2_109-lambda | group.sub/binary-lambda.109/mode=throughput | 19.1 ns | 19.0 ns .. 19.2 ns |
| point subtract | gf2_109-w | group.sub/binary-w.109/mode=throughput | 19.2 ns | 19.1 ns .. 19.2 ns |
| point subtract | gf2_109-u | group.sub/binary-u.109/mode=throughput | 13.6 ns | 13.6 ns .. 13.7 ns |
| point subtract | gf2_122 | group.sub/binary.122/mode=throughput | 20.1 ns | 20.1 ns .. 20.2 ns |
| point subtract | gf2_122-lambda | group.sub/binary-lambda.122/mode=throughput | 20.5 ns | 20.4 ns .. 20.6 ns |
| point subtract | gf2_122-w | group.sub/binary-w.122/mode=throughput | 20.5 ns | 20.5 ns .. 20.6 ns |
| point subtract | gf2_122-u | group.sub/binary-u.122/mode=throughput | 13.9 ns | 13.9 ns .. 13.9 ns |
| point subtract | gf2_122-gls | group.sub/binary.122-gls/mode=throughput | 19.5 ns | 19.5 ns .. 19.6 ns |
| point subtract | gf2_122-gls-lambda | group.sub/binary-lambda.122-gls/mode=throughput | 20.4 ns | 20.4 ns .. 20.5 ns |
| point subtract | gf2_122-gls-w | group.sub/binary-w.122-gls/mode=throughput | 20.5 ns | 20.5 ns .. 20.5 ns |
| point subtract | gf2_122-gls-u | group.sub/binary-u.122-gls/mode=throughput | 14.0 ns | 13.9 ns .. 14.0 ns |
| point subtract | twisted61x2 | group.sub/twisted.61x2/mode=throughput | 25.2 ns | 25.2 ns .. 25.2 ns |
| point subtract | ristretto255 | add/ristretto255/-=, 8 accumulators | 113 ns | 112 ns .. 113 ns |
| point negate | gf2_127 | negate/gf2_127/affine (y += x) | 0.56 ns | 0.56 ns .. 0.57 ns |
| point negate | gf2_127-lambda | group.neg/binary-lambda.127 | 0.56 ns | 0.56 ns .. 0.56 ns |
| point negate | gf2_127-w | group.neg/binary-w.127 | 0.56 ns | 0.56 ns .. 0.56 ns |
| point negate | gf2_127-u | group.neg/binary-u.127 | 0.56 ns | 0.56 ns .. 0.56 ns |
| point negate | gf2_109 | negate/gf2_109/affine (y += x) | 0.56 ns | 0.56 ns .. 0.56 ns |
| point negate | gf2_109-lambda | group.neg/binary-lambda.109 | 0.56 ns | 0.56 ns .. 0.56 ns |
| point negate | gf2_109-w | group.neg/binary-w.109 | 0.57 ns | 0.56 ns .. 0.57 ns |
| point negate | gf2_109-u | group.neg/binary-u.109 | 0.56 ns | 0.56 ns .. 0.57 ns |
| point negate | gf2_122 | negate/gf2_122/affine (y += x) | 0.56 ns | 0.55 ns .. 0.56 ns |
| point negate | gf2_122-lambda | group.neg/binary-lambda.122 | 0.56 ns | 0.56 ns .. 0.57 ns |
| point negate | gf2_122-w | group.neg/binary-w.122 | 0.58 ns | 0.57 ns .. 0.58 ns |
| point negate | gf2_122-u | group.neg/binary-u.122 | 0.58 ns | 0.57 ns .. 0.58 ns |
| point negate | gf2_122-gls | group.neg/binary.122-gls | 1.17 ns | 1.16 ns .. 1.17 ns |
| point negate | gf2_122-gls-lambda | group.neg/binary-lambda.122-gls | 0.57 ns | 0.57 ns .. 0.58 ns |
| point negate | gf2_122-gls-w | group.neg/binary-w.122-gls | 0.56 ns | 0.56 ns .. 0.56 ns |
| point negate | gf2_122-gls-u | group.neg/binary-u.122-gls | 0.56 ns | 0.56 ns .. 0.56 ns |
| point negate | edwards127 | group.neg/edwards.127 | 1.98 ns | 1.97 ns .. 1.98 ns |
| point negate | edwards107 | group.neg/edwards.107 | 1.40 ns | 1.39 ns .. 1.40 ns |
| point negate | twisted128 | group.neg/twisted.128 | 1.15 ns | 1.14 ns .. 1.15 ns |
| point negate | weier127 | group.neg/weier.127 | 1.10 ns | 1.09 ns .. 1.10 ns |
| point negate | weier127-jacobian | group.neg/weier-jacobian.127 | 1.10 ns | 1.10 ns .. 1.10 ns |
| point negate | weier107 | group.neg/weier.107 | 0.82 ns | 0.82 ns .. 0.82 ns |
| point negate | weier107-jacobian | group.neg/weier-jacobian.107 | 0.82 ns | 0.82 ns .. 0.83 ns |
| point negate | edwards61x2 | group.neg/edwards.61x2 | 0.78 ns | 0.77 ns .. 0.78 ns |
| point negate | weier61x2 | group.neg/weier.61x2 | 0.57 ns | 0.57 ns .. 0.57 ns |
| point negate | weier61x2-jacobian | group.neg/weier-jacobian.61x2 | 0.57 ns | 0.57 ns .. 0.57 ns |
| point negate | twisted61x2 | group.neg/twisted.61x2 | 0.73 ns | 0.71 ns .. 0.76 ns |
| point negate | twisted64x2 | group.neg/twisted.64x2 | 0.73 ns | 0.71 ns .. 0.76 ns |
| point negate | twisted-goldilocks2 | group.neg/twisted.goldilocks2 | 1.32 ns | 1.31 ns .. 1.32 ns |
| point negate | ristretto255 | negate/ristretto255/-P | 6.47 ns | 6.38 ns .. 6.56 ns |
| point negate | secp256k1 | negate/secp256k1/PublicKey::negate | 24.7 ns | 24.5 ns .. 24.8 ns |
| point prepare, one at a time | gf2_127 | group.prepare/binary.127/mode=indep | 6.38 ns | 6.33 ns .. 6.42 ns |
| point prepare, one at a time | gf2_127-lambda | group.prepare/binary-lambda.127/mode=indep | 129 ns | 128 ns .. 129 ns |
| point prepare, one at a time | gf2_127-w | group.prepare/binary-w.127/mode=indep | 0.45 ns | 0.44 ns .. 0.47 ns |
| point prepare, one at a time | gf2_127-u | group.prepare/binary-u.127/mode=indep | 0.48 ns | 0.46 ns .. 0.51 ns |
| point prepare, one at a time | gf2_109 | group.prepare/binary.109/mode=indep | 4.23 ns | 4.22 ns .. 4.24 ns |
| point prepare, one at a time | gf2_109-lambda | group.prepare/binary-lambda.109/mode=indep | 503 ns | 502 ns .. 504 ns |
| point prepare, one at a time | gf2_109-w | group.prepare/binary-w.109/mode=indep | 0.44 ns | 0.42 ns .. 0.46 ns |
| point prepare, one at a time | gf2_109-u | group.prepare/binary-u.109/mode=indep | 0.48 ns | 0.45 ns .. 0.51 ns |
| point prepare, one at a time | gf2_122 | group.prepare/binary.122/mode=indep | 4.91 ns | 4.90 ns .. 4.92 ns |
| point prepare, one at a time | gf2_122-lambda | group.prepare/binary-lambda.122/mode=indep | 251 ns | 250 ns .. 251 ns |
| point prepare, one at a time | gf2_122-w | group.prepare/binary-w.122/mode=indep | 0.44 ns | 0.42 ns .. 0.46 ns |
| point prepare, one at a time | gf2_122-u | group.prepare/binary-u.122/mode=indep | 0.50 ns | 0.47 ns .. 0.52 ns |
| point prepare, one at a time | gf2_122-gls | group.prepare/binary.122-gls/mode=indep | 4.22 ns | 4.20 ns .. 4.25 ns |
| point prepare, one at a time | gf2_122-gls-lambda | group.prepare/binary-lambda.122-gls/mode=indep | 249 ns | 248 ns .. 250 ns |
| point prepare, one at a time | gf2_122-gls-w | group.prepare/binary-w.122-gls/mode=indep | 0.43 ns | 0.42 ns .. 0.45 ns |
| point prepare, one at a time | gf2_122-gls-u | group.prepare/binary-u.122-gls/mode=indep | 0.44 ns | 0.42 ns .. 0.45 ns |
| point prepare, one at a time | edwards127 | group.prepare/edwards.127/mode=indep | 663 ns | 662 ns .. 664 ns |
| point prepare, one at a time | edwards107 | group.prepare/edwards.107/mode=indep | 632 ns | 630 ns .. 634 ns |
| point prepare, one at a time | twisted128 | group.prepare/twisted.128/mode=indep | 12.5 ns | 12.4 ns .. 12.5 ns |
| point prepare, one at a time | weier127 | group.prepare/weier.127/mode=indep | 0.81 ns | 0.81 ns .. 0.82 ns |
| point prepare, one at a time | weier127-jacobian | group.prepare/weier-jacobian.127/mode=indep | 0.81 ns | 0.81 ns .. 0.81 ns |
| point prepare, one at a time | weier107 | group.prepare/weier.107/mode=indep | 0.82 ns | 0.81 ns .. 0.82 ns |
| point prepare, one at a time | weier107-jacobian | group.prepare/weier-jacobian.107/mode=indep | 0.81 ns | 0.80 ns .. 0.81 ns |
| point prepare, one at a time | edwards61x2 | group.prepare/edwards.61x2/mode=indep | 236 ns | 235 ns .. 236 ns |
| point prepare, one at a time | weier61x2 | group.prepare/weier.61x2/mode=indep | 0.44 ns | 0.43 ns .. 0.46 ns |
| point prepare, one at a time | weier61x2-jacobian | group.prepare/weier-jacobian.61x2/mode=indep | 0.44 ns | 0.42 ns .. 0.46 ns |
| point prepare, one at a time | twisted61x2 | group.prepare/twisted.61x2/mode=indep | 8.07 ns | 8.02 ns .. 8.11 ns |
| point prepare, one at a time | twisted64x2 | group.prepare/twisted.64x2/mode=indep | 8.75 ns | 8.71 ns .. 8.79 ns |
| point prepare, one at a time | twisted-goldilocks2 | group.prepare/twisted.goldilocks2/mode=indep | 9.45 ns | 9.41 ns .. 9.50 ns |
| point prepare, batched | gf2_127 | group.prepare/binary.127/mode=batch,n=1024 | 6.36 ns | 6.31 ns .. 6.42 ns |
| point prepare, batched | gf2_127-lambda | group.prepare/binary-lambda.127/mode=batch,n=1024 | 8.18 ns | 8.16 ns .. 8.20 ns |
| point prepare, batched | gf2_127-w | group.prepare/binary-w.127/mode=batch,n=1024 | 0.47 ns | 0.47 ns .. 0.47 ns |
| point prepare, batched | gf2_127-u | group.prepare/binary-u.127/mode=batch,n=1024 | 0.47 ns | 0.47 ns .. 0.47 ns |
| point prepare, batched | gf2_109 | group.prepare/binary.109/mode=batch,n=1024 | 4.25 ns | 4.24 ns .. 4.27 ns |
| point prepare, batched | gf2_109-lambda | group.prepare/binary-lambda.109/mode=batch,n=1024 | 8.13 ns | 8.10 ns .. 8.16 ns |
| point prepare, batched | gf2_109-w | group.prepare/binary-w.109/mode=batch,n=1024 | 0.47 ns | 0.46 ns .. 0.47 ns |
| point prepare, batched | gf2_109-u | group.prepare/binary-u.109/mode=batch,n=1024 | 0.46 ns | 0.46 ns .. 0.47 ns |
| point prepare, batched | gf2_122 | group.prepare/binary.122/mode=batch,n=1024 | 5.01 ns | 5.00 ns .. 5.03 ns |
| point prepare, batched | gf2_122-lambda | group.prepare/binary-lambda.122/mode=batch,n=1024 | 8.18 ns | 8.16 ns .. 8.19 ns |
| point prepare, batched | gf2_122-w | group.prepare/binary-w.122/mode=batch,n=1024 | 0.47 ns | 0.46 ns .. 0.47 ns |
| point prepare, batched | gf2_122-u | group.prepare/binary-u.122/mode=batch,n=1024 | 0.49 ns | 0.49 ns .. 0.50 ns |
| point prepare, batched | gf2_122-gls | group.prepare/binary.122-gls/mode=batch,n=1024 | 4.27 ns | 4.26 ns .. 4.29 ns |
| point prepare, batched | gf2_122-gls-lambda | group.prepare/binary-lambda.122-gls/mode=batch,n=1024 | 8.11 ns | 8.08 ns .. 8.14 ns |
| point prepare, batched | gf2_122-gls-w | group.prepare/binary-w.122-gls/mode=batch,n=1024 | 0.68 ns | 0.68 ns .. 0.68 ns |
| point prepare, batched | gf2_122-gls-u | group.prepare/binary-u.122-gls/mode=batch,n=1024 | 0.68 ns | 0.68 ns .. 0.68 ns |
| point prepare, batched | edwards127 | group.prepare/edwards.127/mode=batch,n=1024 | 39.9 ns | 39.9 ns .. 40.0 ns |
| point prepare, batched | edwards107 | group.prepare/edwards.107/mode=batch,n=1024 | 37.9 ns | 37.8 ns .. 38.1 ns |
| point prepare, batched | twisted128 | group.prepare/twisted.128/mode=batch,n=1024 | 12.7 ns | 12.6 ns .. 12.7 ns |
| point prepare, batched | weier127 | group.prepare/weier.127/mode=batch,n=1024 | 1.00 ns | 0.99 ns .. 1.00 ns |
| point prepare, batched | weier127-jacobian | group.prepare/weier-jacobian.127/mode=batch,n=1024 | 0.99 ns | 0.98 ns .. 0.99 ns |
| point prepare, batched | weier107 | group.prepare/weier.107/mode=batch,n=1024 | 0.63 ns | 0.62 ns .. 0.63 ns |
| point prepare, batched | weier107-jacobian | group.prepare/weier-jacobian.107/mode=batch,n=1024 | 0.63 ns | 0.62 ns .. 0.63 ns |
| point prepare, batched | edwards61x2 | group.prepare/edwards.61x2/mode=batch,n=1024 | 34.9 ns | 34.8 ns .. 35.1 ns |
| point prepare, batched | weier61x2 | group.prepare/weier.61x2/mode=batch,n=1024 | 0.52 ns | 0.52 ns .. 0.53 ns |
| point prepare, batched | weier61x2-jacobian | group.prepare/weier-jacobian.61x2/mode=batch,n=1024 | 0.52 ns | 0.52 ns .. 0.52 ns |
| point prepare, batched | twisted61x2 | group.prepare/twisted.61x2/mode=batch,n=1024 | 7.93 ns | 7.89 ns .. 7.96 ns |
| point prepare, batched | twisted64x2 | group.prepare/twisted.64x2/mode=batch,n=1024 | 8.79 ns | 8.76 ns .. 8.82 ns |
| point prepare, batched | twisted-goldilocks2 | group.prepare/twisted.goldilocks2/mode=batch,n=1024 | 9.54 ns | 9.49 ns .. 9.59 ns |
| is identity | gf2_127 | group.is_identity/binary.127 | 1.02 ns | 1.01 ns .. 1.02 ns |
| is identity | gf2_127-lambda | group.is_identity/binary-lambda.127 | 0.82 ns | 0.82 ns .. 0.83 ns |
| is identity | gf2_127-w | group.is_identity/binary-w.127 | 0.82 ns | 0.81 ns .. 0.82 ns |
| is identity | gf2_127-u | group.is_identity/binary-u.127 | 0.83 ns | 0.83 ns .. 0.84 ns |
| is identity | gf2_109 | group.is_identity/binary.109 | 0.94 ns | 0.94 ns .. 0.94 ns |
| is identity | gf2_109-lambda | group.is_identity/binary-lambda.109 | 0.80 ns | 0.80 ns .. 0.80 ns |
| is identity | gf2_109-w | group.is_identity/binary-w.109 | 0.80 ns | 0.80 ns .. 0.80 ns |
| is identity | gf2_109-u | group.is_identity/binary-u.109 | 0.80 ns | 0.80 ns .. 0.80 ns |
| is identity | gf2_122 | group.is_identity/binary.122 | 0.87 ns | 0.87 ns .. 0.88 ns |
| is identity | gf2_122-lambda | group.is_identity/binary-lambda.122 | 0.81 ns | 0.81 ns .. 0.81 ns |
| is identity | gf2_122-w | group.is_identity/binary-w.122 | 0.84 ns | 0.83 ns .. 0.85 ns |
| is identity | gf2_122-u | group.is_identity/binary-u.122 | 0.85 ns | 0.84 ns .. 0.85 ns |
| is identity | gf2_122-gls | group.is_identity/binary.122-gls | 0.87 ns | 0.87 ns .. 0.88 ns |
| is identity | gf2_122-gls-lambda | group.is_identity/binary-lambda.122-gls | 0.80 ns | 0.80 ns .. 0.81 ns |
| is identity | gf2_122-gls-w | group.is_identity/binary-w.122-gls | 0.81 ns | 0.81 ns .. 0.81 ns |
| is identity | gf2_122-gls-u | group.is_identity/binary-u.122-gls | 0.80 ns | 0.80 ns .. 0.80 ns |
| is identity | edwards127 | group.is_identity/edwards.127 | 1.30 ns | 1.30 ns .. 1.31 ns |
| is identity | edwards107 | group.is_identity/edwards.107 | 1.18 ns | 1.18 ns .. 1.19 ns |
| is identity | twisted128 | group.is_identity/twisted.128 | 0.50 ns | 0.50 ns .. 0.50 ns |
| is identity | weier127 | group.is_identity/weier.127 | 0.40 ns | 0.40 ns .. 0.41 ns |
| is identity | weier127-jacobian | group.is_identity/weier-jacobian.127 | 0.40 ns | 0.40 ns .. 0.41 ns |
| is identity | weier107 | group.is_identity/weier.107 | 0.91 ns | 0.90 ns .. 0.91 ns |
| is identity | weier107-jacobian | group.is_identity/weier-jacobian.107 | 0.90 ns | 0.90 ns .. 0.90 ns |
| is identity | edwards61x2 | group.is_identity/edwards.61x2 | 0.54 ns | 0.53 ns .. 0.55 ns |
| is identity | weier61x2 | group.is_identity/weier.61x2 | 0.41 ns | 0.40 ns .. 0.41 ns |
| is identity | weier61x2-jacobian | group.is_identity/weier-jacobian.61x2 | 0.40 ns | 0.40 ns .. 0.40 ns |
| is identity | twisted61x2 | group.is_identity/twisted.61x2 | 0.50 ns | 0.50 ns .. 0.50 ns |
| is identity | twisted64x2 | group.is_identity/twisted.64x2 | 0.50 ns | 0.50 ns .. 0.51 ns |
| is identity | twisted-goldilocks2 | group.is_identity/twisted.goldilocks2 | 0.60 ns | 0.59 ns .. 0.60 ns |
| equals addend, match | gf2_127 | group.equals/binary.127/mode=match | 3.97 ns | 3.96 ns .. 3.98 ns |
| equals addend, match | gf2_127-lambda | group.equals/binary-lambda.127/mode=match | 3.95 ns | 3.94 ns .. 3.96 ns |
| equals addend, match | gf2_127-w | group.equals/binary-w.127/mode=match | 4.04 ns | 4.03 ns .. 4.04 ns |
| equals addend, match | gf2_127-u | group.equals/binary-u.127/mode=match | 6.31 ns | 6.29 ns .. 6.33 ns |
| equals addend, match | gf2_109 | group.equals/binary.109/mode=match | 4.05 ns | 4.04 ns .. 4.06 ns |
| equals addend, match | gf2_109-lambda | group.equals/binary-lambda.109/mode=match | 3.96 ns | 3.94 ns .. 3.97 ns |
| equals addend, match | gf2_109-w | group.equals/binary-w.109/mode=match | 4.16 ns | 4.15 ns .. 4.18 ns |
| equals addend, match | gf2_109-u | group.equals/binary-u.109/mode=match | 5.84 ns | 5.83 ns .. 5.86 ns |
| equals addend, match | gf2_122 | group.equals/binary.122/mode=match | 4.07 ns | 4.05 ns .. 4.08 ns |
| equals addend, match | gf2_122-lambda | group.equals/binary-lambda.122/mode=match | 4.21 ns | 4.20 ns .. 4.23 ns |
| equals addend, match | gf2_122-w | group.equals/binary-w.122/mode=match | 4.23 ns | 4.22 ns .. 4.24 ns |
| equals addend, match | gf2_122-u | group.equals/binary-u.122/mode=match | 5.59 ns | 5.58 ns .. 5.60 ns |
| equals addend, match | gf2_122-gls | group.equals/binary.122-gls/mode=match | 4.06 ns | 4.05 ns .. 4.07 ns |
| equals addend, match | gf2_122-gls-lambda | group.equals/binary-lambda.122-gls/mode=match | 4.20 ns | 4.19 ns .. 4.21 ns |
| equals addend, match | gf2_122-gls-w | group.equals/binary-w.122-gls/mode=match | 4.23 ns | 4.22 ns .. 4.25 ns |
| equals addend, match | gf2_122-gls-u | group.equals/binary-u.122-gls/mode=match | 5.60 ns | 5.58 ns .. 5.61 ns |
| equals addend, match | twisted61x2 | group.equals/twisted.61x2/mode=match | 8.55 ns | 8.54 ns .. 8.57 ns |
| equals addend, mismatch | gf2_127 | group.equals/binary.127/mode=mismatch | 4.25 ns | 4.21 ns .. 4.30 ns |
| equals addend, mismatch | gf2_127-lambda | group.equals/binary-lambda.127/mode=mismatch | 4.05 ns | 4.04 ns .. 4.06 ns |
| equals addend, mismatch | gf2_127-w | group.equals/binary-w.127/mode=mismatch | 4.05 ns | 4.04 ns .. 4.06 ns |
| equals addend, mismatch | gf2_127-u | group.equals/binary-u.127/mode=mismatch | 6.44 ns | 6.41 ns .. 6.46 ns |
| equals addend, mismatch | gf2_109 | group.equals/binary.109/mode=mismatch | 4.07 ns | 4.06 ns .. 4.08 ns |
| equals addend, mismatch | gf2_109-lambda | group.equals/binary-lambda.109/mode=mismatch | 3.94 ns | 3.93 ns .. 3.95 ns |
| equals addend, mismatch | gf2_109-w | group.equals/binary-w.109/mode=mismatch | 4.13 ns | 4.12 ns .. 4.14 ns |
| equals addend, mismatch | gf2_109-u | group.equals/binary-u.109/mode=mismatch | 5.82 ns | 5.81 ns .. 5.83 ns |
| equals addend, mismatch | gf2_122 | group.equals/binary.122/mode=mismatch | 4.05 ns | 4.04 ns .. 4.06 ns |
| equals addend, mismatch | gf2_122-lambda | group.equals/binary-lambda.122/mode=mismatch | 4.23 ns | 4.22 ns .. 4.24 ns |
| equals addend, mismatch | gf2_122-w | group.equals/binary-w.122/mode=mismatch | 4.41 ns | 4.38 ns .. 4.45 ns |
| equals addend, mismatch | gf2_122-u | group.equals/binary-u.122/mode=mismatch | 5.97 ns | 5.92 ns .. 6.03 ns |
| equals addend, mismatch | gf2_122-gls | group.equals/binary.122-gls/mode=mismatch | 4.08 ns | 4.06 ns .. 4.10 ns |
| equals addend, mismatch | gf2_122-gls-lambda | group.equals/binary-lambda.122-gls/mode=mismatch | 4.37 ns | 4.35 ns .. 4.39 ns |
| equals addend, mismatch | gf2_122-gls-w | group.equals/binary-w.122-gls/mode=mismatch | 4.26 ns | 4.24 ns .. 4.28 ns |
| equals addend, mismatch | gf2_122-gls-u | group.equals/binary-u.122-gls/mode=mismatch | 5.64 ns | 5.62 ns .. 5.65 ns |
| equals addend, mismatch | edwards127 | group.equals/edwards.127/mode=mismatch | 3.16 ns | 3.15 ns .. 3.17 ns |
| equals addend, mismatch | edwards107 | group.equals/edwards.107/mode=mismatch | 4.93 ns | 4.91 ns .. 4.95 ns |
| equals addend, mismatch | twisted128 | group.equals/twisted.128/mode=mismatch | 9.45 ns | 9.43 ns .. 9.47 ns |
| equals addend, mismatch | weier127 | group.equals/weier.127/mode=mismatch | 3.53 ns | 3.52 ns .. 3.54 ns |
| equals addend, mismatch | weier127-jacobian | group.equals/weier-jacobian.127/mode=mismatch | 6.60 ns | 6.58 ns .. 6.62 ns |
| equals addend, mismatch | weier107 | group.equals/weier.107/mode=mismatch | 5.81 ns | 5.80 ns .. 5.83 ns |
| equals addend, mismatch | weier107-jacobian | group.equals/weier-jacobian.107/mode=mismatch | 9.23 ns | 9.20 ns .. 9.26 ns |
| equals addend, mismatch | edwards61x2 | group.equals/edwards.61x2/mode=mismatch | 2.97 ns | 2.96 ns .. 2.98 ns |
| equals addend, mismatch | weier61x2 | group.equals/weier.61x2/mode=mismatch | 3.33 ns | 3.32 ns .. 3.34 ns |
| equals addend, mismatch | weier61x2-jacobian | group.equals/weier-jacobian.61x2/mode=mismatch | 7.98 ns | 7.93 ns .. 8.03 ns |
| equals addend, mismatch | twisted61x2 | group.equals/twisted.61x2/mode=mismatch | 8.85 ns | 8.79 ns .. 8.91 ns |
| equals addend, mismatch | twisted64x2 | group.equals/twisted.64x2/mode=mismatch | 7.68 ns | 7.65 ns .. 7.71 ns |
| equals addend, mismatch | twisted-goldilocks2 | group.equals/twisted.goldilocks2/mode=mismatch | 9.42 ns | 9.36 ns .. 9.50 ns |
| encode, one at a time | gf2_127 | group.encode/binary.127/mode=indep | 151 ns | 149 ns .. 152 ns |
| encode, one at a time | gf2_127-lambda | group.encode/binary-lambda.127/mode=indep | 140 ns | 140 ns .. 141 ns |
| encode, one at a time | gf2_127-w | group.encode/binary-w.127/mode=indep | 139 ns | 139 ns .. 140 ns |
| encode, one at a time | gf2_127-u | group.encode/binary-u.127/mode=indep | 137 ns | 137 ns .. 137 ns |
| encode, one at a time | gf2_109 | group.encode/binary.109/mode=indep | 538 ns | 537 ns .. 540 ns |
| encode, one at a time | gf2_109-lambda | group.encode/binary-lambda.109/mode=indep | 530 ns | 529 ns .. 532 ns |
| encode, one at a time | gf2_109-w | group.encode/binary-w.109/mode=indep | 540 ns | 539 ns .. 541 ns |
| encode, one at a time | gf2_109-u | group.encode/binary-u.109/mode=indep | 546 ns | 545 ns .. 548 ns |
| encode, one at a time | gf2_122 | group.encode/binary.122/mode=indep | 294 ns | 294 ns .. 295 ns |
| encode, one at a time | gf2_122-lambda | group.encode/binary-lambda.122/mode=indep | 287 ns | 286 ns .. 288 ns |
| encode, one at a time | gf2_122-w | group.encode/binary-w.122/mode=indep | 302 ns | 300 ns .. 303 ns |
| encode, one at a time | gf2_122-u | group.encode/binary-u.122/mode=indep | 305 ns | 304 ns .. 306 ns |
| encode, one at a time | gf2_122-gls | group.encode/binary.122-gls/mode=indep | 293 ns | 293 ns .. 294 ns |
| encode, one at a time | gf2_122-gls-lambda | group.encode/binary-lambda.122-gls/mode=indep | 297 ns | 296 ns .. 297 ns |
| encode, one at a time | gf2_122-gls-w | group.encode/binary-w.122-gls/mode=indep | 297 ns | 296 ns .. 297 ns |
| encode, one at a time | gf2_122-gls-u | group.encode/binary-u.122-gls/mode=indep | 297 ns | 296 ns .. 299 ns |
| encode, one at a time | edwards127 | group.encode/edwards.127/mode=indep | 610 ns | 608 ns .. 611 ns |
| encode, one at a time | edwards107 | group.encode/edwards.107/mode=indep | 600 ns | 599 ns .. 601 ns |
| encode, one at a time | twisted128 | group.encode/twisted.128/mode=indep | 943 ns | 942 ns .. 946 ns |
| encode, one at a time | weier127 | group.encode/weier.127/mode=indep | 593 ns | 591 ns .. 594 ns |
| encode, one at a time | weier127-jacobian | group.encode/weier-jacobian.127/mode=indep | 605 ns | 602 ns .. 609 ns |
| encode, one at a time | weier107 | group.encode/weier.107/mode=indep | 582 ns | 579 ns .. 584 ns |
| encode, one at a time | weier107-jacobian | group.encode/weier-jacobian.107/mode=indep | 580 ns | 578 ns .. 581 ns |
| encode, one at a time | edwards61x2 | group.encode/edwards.61x2/mode=indep | 203 ns | 202 ns .. 203 ns |
| encode, one at a time | weier61x2 | group.encode/weier.61x2/mode=indep | 190 ns | 190 ns .. 191 ns |
| encode, one at a time | weier61x2-jacobian | group.encode/weier-jacobian.61x2/mode=indep | 198 ns | 198 ns .. 199 ns |
| encode, one at a time | twisted61x2 | group.encode/twisted.61x2/mode=indep | 189 ns | 189 ns .. 190 ns |
| encode, one at a time | twisted64x2 | group.encode/twisted.64x2/mode=indep | 267 ns | 266 ns .. 268 ns |
| encode, one at a time | twisted-goldilocks2 | group.encode/twisted.goldilocks2/mode=indep | 316 ns | 316 ns .. 316 ns |
| encode, batched | gf2_127 | group.encode/binary.127/mode=batch,n=1024 | 22.7 ns | 22.5 ns .. 23.0 ns |
| encode, batched | gf2_127-lambda | group.encode/binary-lambda.127/mode=batch,n=1024 | 17.5 ns | 17.4 ns .. 17.5 ns |
| encode, batched | gf2_127-w | group.encode/binary-w.127/mode=batch,n=1024 | 17.0 ns | 17.0 ns .. 17.1 ns |
| encode, batched | gf2_127-u | group.encode/binary-u.127/mode=batch,n=1024 | 12.6 ns | 12.5 ns .. 12.6 ns |
| encode, batched | gf2_109 | group.encode/binary.109/mode=batch,n=1024 | 18.2 ns | 18.1 ns .. 18.3 ns |
| encode, batched | gf2_109-lambda | group.encode/binary-lambda.109/mode=batch,n=1024 | 14.1 ns | 14.1 ns .. 14.2 ns |
| encode, batched | gf2_109-w | group.encode/binary-w.109/mode=batch,n=1024 | 21.6 ns | 21.6 ns .. 21.7 ns |
| encode, batched | gf2_109-u | group.encode/binary-u.109/mode=batch,n=1024 | 21.9 ns | 21.9 ns .. 22.0 ns |
| encode, batched | gf2_122 | group.encode/binary.122/mode=batch,n=1024 | 22.1 ns | 22.0 ns .. 22.1 ns |
| encode, batched | gf2_122-lambda | group.encode/binary-lambda.122/mode=batch,n=1024 | 17.3 ns | 17.2 ns .. 17.3 ns |
| encode, batched | gf2_122-w | group.encode/binary-w.122/mode=batch,n=1024 | 21.2 ns | 21.0 ns .. 21.4 ns |
| encode, batched | gf2_122-u | group.encode/binary-u.122/mode=batch,n=1024 | 18.4 ns | 18.3 ns .. 18.5 ns |
| encode, batched | gf2_122-gls | group.encode/binary.122-gls/mode=batch,n=1024 | 21.1 ns | 21.0 ns .. 21.2 ns |
| encode, batched | gf2_122-gls-lambda | group.encode/binary-lambda.122-gls/mode=batch,n=1024 | 17.9 ns | 17.8 ns .. 17.9 ns |
| encode, batched | gf2_122-gls-w | group.encode/binary-w.122-gls/mode=batch,n=1024 | 20.4 ns | 20.3 ns .. 20.5 ns |
| encode, batched | gf2_122-gls-u | group.encode/binary-u.122-gls/mode=batch,n=1024 | 18.0 ns | 18.0 ns .. 18.1 ns |
| encode, batched | edwards127 | group.encode/edwards.127/mode=batch,n=1024 | 31.9 ns | 31.8 ns .. 32.0 ns |
| encode, batched | edwards107 | group.encode/edwards.107/mode=batch,n=1024 | 35.1 ns | 35.0 ns .. 35.4 ns |
| encode, batched | twisted128 | group.encode/twisted.128/mode=batch,n=1024 | 22.7 ns | 22.7 ns .. 22.8 ns |
| encode, batched | weier127 | group.encode/weier.127/mode=batch,n=1024 | 16.7 ns | 16.7 ns .. 16.8 ns |
| encode, batched | weier127-jacobian | group.encode/weier-jacobian.127/mode=batch,n=1024 | 23.6 ns | 23.5 ns .. 23.7 ns |
| encode, batched | weier107 | group.encode/weier.107/mode=batch,n=1024 | 19.4 ns | 19.3 ns .. 19.5 ns |
| encode, batched | weier107-jacobian | group.encode/weier-jacobian.107/mode=batch,n=1024 | 25.5 ns | 25.4 ns .. 25.6 ns |
| encode, batched | edwards61x2 | group.encode/edwards.61x2/mode=batch,n=1024 | 35.0 ns | 34.9 ns .. 35.1 ns |
| encode, batched | weier61x2 | group.encode/weier.61x2/mode=batch,n=1024 | 15.3 ns | 15.2 ns .. 15.3 ns |
| encode, batched | weier61x2-jacobian | group.encode/weier-jacobian.61x2/mode=batch,n=1024 | 24.8 ns | 24.7 ns .. 24.9 ns |
| encode, batched | twisted61x2 | group.encode/twisted.61x2/mode=batch,n=1024 | 14.9 ns | 14.9 ns .. 15.0 ns |
| encode, batched | twisted64x2 | group.encode/twisted.64x2/mode=batch,n=1024 | 22.6 ns | 22.5 ns .. 22.7 ns |
| encode, batched | twisted-goldilocks2 | group.encode/twisted.goldilocks2/mode=batch,n=1024 | 22.9 ns | 22.9 ns .. 23.0 ns |
| decode, one at a time | gf2_127 | group.decode/binary.127/mode=indep | 164 ns | 163 ns .. 164 ns |
| decode, one at a time | gf2_127-lambda | group.decode/binary-lambda.127/mode=indep | 155 ns | 154 ns .. 155 ns |
| decode, one at a time | gf2_127-w | group.decode/binary-w.127/mode=indep | 155 ns | 154 ns .. 155 ns |
| decode, one at a time | gf2_127-u | group.decode/binary-u.127/mode=indep | 162 ns | 161 ns .. 162 ns |
| decode, one at a time | gf2_109 | group.decode/binary.109/mode=indep | 554 ns | 553 ns .. 556 ns |
| decode, one at a time | gf2_109-lambda | group.decode/binary-lambda.109/mode=indep | 549 ns | 548 ns .. 551 ns |
| decode, one at a time | gf2_109-w | group.decode/binary-w.109/mode=indep | 555 ns | 553 ns .. 556 ns |
| decode, one at a time | gf2_109-u | group.decode/binary-u.109/mode=indep | 555 ns | 555 ns .. 556 ns |
| decode, one at a time | gf2_122 | group.decode/binary.122/mode=indep | 313 ns | 312 ns .. 313 ns |
| decode, one at a time | gf2_122-lambda | group.decode/binary-lambda.122/mode=indep | 314 ns | 313 ns .. 314 ns |
| decode, one at a time | gf2_122-w | group.decode/binary-w.122/mode=indep | 307 ns | 306 ns .. 308 ns |
| decode, one at a time | gf2_122-u | group.decode/binary-u.122/mode=indep | 317 ns | 315 ns .. 319 ns |
| decode, one at a time | gf2_122-gls | group.decode/binary.122-gls/mode=indep | 313 ns | 312 ns .. 313 ns |
| decode, one at a time | gf2_122-gls-lambda | group.decode/binary-lambda.122-gls/mode=indep | 311 ns | 310 ns .. 312 ns |
| decode, one at a time | gf2_122-gls-w | group.decode/binary-w.122-gls/mode=indep | 305 ns | 304 ns .. 306 ns |
| decode, one at a time | gf2_122-gls-u | group.decode/binary-u.122-gls/mode=indep | 313 ns | 311 ns .. 314 ns |
| decode, one at a time | edwards127 | group.decode/edwards.127/mode=indep | 540 ns | 539 ns .. 541 ns |
| decode, one at a time | edwards107 | group.decode/edwards.107/mode=indep | 424 ns | 423 ns .. 426 ns |
| decode, one at a time | twisted128 | group.decode/twisted.128/mode=indep | 960 ns | 959 ns .. 962 ns |
| decode, one at a time | weier127 | group.decode/weier.127/mode=indep | 541 ns | 540 ns .. 543 ns |
| decode, one at a time | weier127-jacobian | group.decode/weier-jacobian.127/mode=indep | 543 ns | 541 ns .. 545 ns |
| decode, one at a time | weier107 | group.decode/weier.107/mode=indep | 421 ns | 420 ns .. 422 ns |
| decode, one at a time | weier107-jacobian | group.decode/weier-jacobian.107/mode=indep | 419 ns | 418 ns .. 421 ns |
| decode, one at a time | edwards61x2 | group.decode/edwards.61x2/mode=indep | 437 ns | 436 ns .. 439 ns |
| decode, one at a time | weier61x2 | group.decode/weier.61x2/mode=indep | 441 ns | 440 ns .. 442 ns |
| decode, one at a time | weier61x2-jacobian | group.decode/weier-jacobian.61x2/mode=indep | 440 ns | 439 ns .. 441 ns |
| decode, one at a time | twisted61x2 | group.decode/twisted.61x2/mode=indep | 448 ns | 447 ns .. 449 ns |
| decode, one at a time | twisted64x2 | group.decode/twisted.64x2/mode=indep | 650 ns | 648 ns .. 652 ns |
| decode, one at a time | twisted-goldilocks2 | group.decode/twisted.goldilocks2/mode=indep | 1.91 µs | 1.91 µs .. 1.91 µs |
| decode, batched | gf2_127 | group.decode/binary.127/mode=batch,n=1024 | 25.7 ns | 25.6 ns .. 25.7 ns |
| decode, batched | gf2_127-lambda | group.decode/binary-lambda.127/mode=batch,n=1024 | 24.0 ns | 24.0 ns .. 24.1 ns |
| decode, batched | gf2_127-w | group.decode/binary-w.127/mode=batch,n=1024 | 22.6 ns | 22.5 ns .. 22.6 ns |
| decode, batched | gf2_127-u | group.decode/binary-u.127/mode=batch,n=1024 | 27.5 ns | 27.5 ns .. 27.6 ns |
| decode, batched | gf2_109 | group.decode/binary.109/mode=batch,n=1024 | 26.7 ns | 26.6 ns .. 26.8 ns |
| decode, batched | gf2_109-lambda | group.decode/binary-lambda.109/mode=batch,n=1024 | 26.5 ns | 26.4 ns .. 26.5 ns |
| decode, batched | gf2_109-w | group.decode/binary-w.109/mode=batch,n=1024 | 24.4 ns | 24.3 ns .. 24.4 ns |
| decode, batched | gf2_109-u | group.decode/binary-u.109/mode=batch,n=1024 | 27.7 ns | 27.7 ns .. 27.8 ns |
| decode, batched | gf2_122 | group.decode/binary.122/mode=batch,n=1024 | 24.0 ns | 23.9 ns .. 24.1 ns |
| decode, batched | gf2_122-lambda | group.decode/binary-lambda.122/mode=batch,n=1024 | 24.1 ns | 24.0 ns .. 24.1 ns |
| decode, batched | gf2_122-w | group.decode/binary-w.122/mode=batch,n=1024 | 21.6 ns | 21.5 ns .. 21.7 ns |
| decode, batched | gf2_122-u | group.decode/binary-u.122/mode=batch,n=1024 | 26.0 ns | 25.8 ns .. 26.2 ns |
| decode, batched | gf2_122-gls | group.decode/binary.122-gls/mode=batch,n=1024 | 22.7 ns | 22.6 ns .. 22.7 ns |
| decode, batched | gf2_122-gls-lambda | group.decode/binary-lambda.122-gls/mode=batch,n=1024 | 22.6 ns | 22.6 ns .. 22.7 ns |
| decode, batched | gf2_122-gls-w | group.decode/binary-w.122-gls/mode=batch,n=1024 | 20.9 ns | 20.8 ns .. 21.0 ns |
| decode, batched | gf2_122-gls-u | group.decode/binary-u.122-gls/mode=batch,n=1024 | 24.7 ns | 24.6 ns .. 24.8 ns |
| decode, batched | edwards127 | group.decode/edwards.127/mode=batch,n=1024 | 541 ns | 540 ns .. 543 ns |
| decode, batched | edwards107 | group.decode/edwards.107/mode=batch,n=1024 | 426 ns | 424 ns .. 427 ns |
| decode, batched | twisted128 | group.decode/twisted.128/mode=batch,n=1024 | 962 ns | 960 ns .. 965 ns |
| decode, batched | weier127 | group.decode/weier.127/mode=batch,n=1024 | 539 ns | 538 ns .. 541 ns |
| decode, batched | weier127-jacobian | group.decode/weier-jacobian.127/mode=batch,n=1024 | 542 ns | 541 ns .. 543 ns |
| decode, batched | weier107 | group.decode/weier.107/mode=batch,n=1024 | 422 ns | 421 ns .. 423 ns |
| decode, batched | weier107-jacobian | group.decode/weier-jacobian.107/mode=batch,n=1024 | 421 ns | 420 ns .. 422 ns |
| decode, batched | edwards61x2 | group.decode/edwards.61x2/mode=batch,n=1024 | 441 ns | 439 ns .. 442 ns |
| decode, batched | weier61x2 | group.decode/weier.61x2/mode=batch,n=1024 | 448 ns | 447 ns .. 449 ns |
| decode, batched | weier61x2-jacobian | group.decode/weier-jacobian.61x2/mode=batch,n=1024 | 445 ns | 444 ns .. 446 ns |
| decode, batched | twisted61x2 | group.decode/twisted.61x2/mode=batch,n=1024 | 450 ns | 449 ns .. 451 ns |
| decode, batched | twisted64x2 | group.decode/twisted.64x2/mode=batch,n=1024 | 647 ns | 646 ns .. 649 ns |
| decode, batched | twisted-goldilocks2 | group.decode/twisted.goldilocks2/mode=batch,n=1024 | 1.92 µs | 1.92 µs .. 1.93 µs |
| hash to curve, one at a time | xor | hash_to_curve/sha256 (XOR baseline) | 53.4 ns | 52.9 ns .. 53.9 ns |
| hash to curve, one at a time | gf2_127 | hash_to_curve/gf2_127/pornin map x1 | 256 ns | 254 ns .. 258 ns |
| hash to curve, one at a time | gf2_127-lambda | h2c/binary-lambda.127/mode=indep | 394 ns | 392 ns .. 396 ns |
| hash to curve, one at a time | gf2_127-w | h2c/binary-w.127/mode=indep | 392 ns | 391 ns .. 393 ns |
| hash to curve, one at a time | gf2_127-u | h2c/binary-u.127/mode=indep | 401 ns | 400 ns .. 403 ns |
| hash to curve, one at a time | gf2_109 | hash_to_curve/gf2_109/pornin map x1 | 675 ns | 673 ns .. 677 ns |
| hash to curve, one at a time | gf2_109-lambda | h2c/binary-lambda.109/mode=indep | 1.16 µs | 1.16 µs .. 1.16 µs |
| hash to curve, one at a time | gf2_109-w | h2c/binary-w.109/mode=indep | 1.14 µs | 1.13 µs .. 1.14 µs |
| hash to curve, one at a time | gf2_109-u | h2c/binary-u.109/mode=indep | 1.15 µs | 1.15 µs .. 1.16 µs |
| hash to curve, one at a time | gf2_122 | hash_to_curve/gf2_122/pornin map x1 | 392 ns | 391 ns .. 393 ns |
| hash to curve, one at a time | gf2_122-lambda | h2c/binary-lambda.122/mode=indep | 679 ns | 677 ns .. 680 ns |
| hash to curve, one at a time | gf2_122-w | h2c/binary-w.122/mode=indep | 654 ns | 653 ns .. 656 ns |
| hash to curve, one at a time | gf2_122-u | h2c/binary-u.122/mode=indep | 674 ns | 672 ns .. 676 ns |
| hash to curve, one at a time | gf2_122-gls | hash_to_curve/gf2_122-gls/pornin map x1 | 394 ns | 393 ns .. 395 ns |
| hash to curve, one at a time | gf2_122-gls-lambda | h2c/binary-lambda.122-gls/mode=indep | 692 ns | 688 ns .. 696 ns |
| hash to curve, one at a time | gf2_122-gls-w | h2c/binary-w.122-gls/mode=indep | 659 ns | 658 ns .. 660 ns |
| hash to curve, one at a time | gf2_122-gls-u | h2c/binary-u.122-gls/mode=indep | 678 ns | 676 ns .. 680 ns |
| hash to curve, one at a time | edwards127 | h2c/edwards.127/mode=indep | 1.22 µs | 1.22 µs .. 1.23 µs |
| hash to curve, one at a time | edwards107 | h2c/edwards.107/mode=indep | 919 ns | 916 ns .. 922 ns |
| hash to curve, one at a time | twisted128 | h2c/twisted.128/mode=indep | 1.97 µs | 1.96 µs .. 1.97 µs |
| hash to curve, one at a time | weier127 | h2c/weier.127/mode=indep | 1.16 µs | 1.16 µs .. 1.16 µs |
| hash to curve, one at a time | weier127-jacobian | h2c/weier-jacobian.127/mode=indep | 1.15 µs | 1.15 µs .. 1.16 µs |
| hash to curve, one at a time | weier107 | h2c/weier.107/mode=indep | 892 ns | 890 ns .. 895 ns |
| hash to curve, one at a time | weier107-jacobian | h2c/weier-jacobian.107/mode=indep | 886 ns | 884 ns .. 888 ns |
| hash to curve, one at a time | edwards61x2 | h2c/edwards.61x2/mode=indep | 707 ns | 705 ns .. 708 ns |
| hash to curve, one at a time | weier61x2 | h2c/weier.61x2/mode=indep | 696 ns | 694 ns .. 697 ns |
| hash to curve, one at a time | weier61x2-jacobian | h2c/weier-jacobian.61x2/mode=indep | 702 ns | 700 ns .. 704 ns |
| hash to curve, one at a time | twisted61x2 | h2c/twisted.61x2/mode=indep | 706 ns | 704 ns .. 708 ns |
| hash to curve, one at a time | twisted64x2 | h2c/twisted.64x2/mode=indep | 1.00 µs | 999 ns .. 1.01 µs |
| hash to curve, one at a time | twisted-goldilocks2 | h2c/twisted.goldilocks2/mode=indep | 2.21 µs | 2.21 µs .. 2.22 µs |
| hash to curve, one at a time | ristretto255 | hash_to_curve/ristretto255/hash_from_bytes<Sha512> | 6.03 µs | 6.02 µs .. 6.05 µs |
| hash to curve, one at a time | secp256k1 | hash_to_curve/secp256k1/ellswift decode | 6.16 µs | 6.14 µs .. 6.18 µs |
| hash to curve, batched | gf2_127 | hash_to_curve/gf2_127/pornin map x1, batched | 103 ns | 102 ns .. 103 ns |
| hash to curve, batched | gf2_127-lambda | h2c/binary-lambda.127/mode=batch,n=1024 | 114 ns | 114 ns .. 115 ns |
| hash to curve, batched | gf2_127-w | h2c/binary-w.127/mode=batch,n=1024 | 119 ns | 119 ns .. 120 ns |
| hash to curve, batched | gf2_127-u | h2c/binary-u.127/mode=batch,n=1024 | 125 ns | 124 ns .. 125 ns |
| hash to curve, batched | gf2_109 | hash_to_curve/gf2_109/pornin map x1, batched | 114 ns | 113 ns .. 114 ns |
| hash to curve, batched | gf2_109-lambda | h2c/binary-lambda.109/mode=batch,n=1024 | 124 ns | 124 ns .. 125 ns |
| hash to curve, batched | gf2_109-w | h2c/binary-w.109/mode=batch,n=1024 | 120 ns | 119 ns .. 121 ns |
| hash to curve, batched | gf2_109-u | h2c/binary-u.109/mode=batch,n=1024 | 125 ns | 125 ns .. 125 ns |
| hash to curve, batched | gf2_122 | hash_to_curve/gf2_122/pornin map x1, batched | 103 ns | 102 ns .. 103 ns |
| hash to curve, batched | gf2_122-lambda | h2c/binary-lambda.122/mode=batch,n=1024 | 115 ns | 115 ns .. 116 ns |
| hash to curve, batched | gf2_122-w | h2c/binary-w.122/mode=batch,n=1024 | 116 ns | 116 ns .. 117 ns |
| hash to curve, batched | gf2_122-u | h2c/binary-u.122/mode=batch,n=1024 | 127 ns | 125 ns .. 128 ns |
| hash to curve, batched | gf2_122-gls | hash_to_curve/gf2_122-gls/pornin map x1, batched | 101 ns | 101 ns .. 102 ns |
| hash to curve, batched | gf2_122-gls-lambda | h2c/binary-lambda.122-gls/mode=batch,n=1024 | 116 ns | 115 ns .. 116 ns |
| hash to curve, batched | gf2_122-gls-w | h2c/binary-w.122-gls/mode=batch,n=1024 | 116 ns | 115 ns .. 116 ns |
| hash to curve, batched | gf2_122-gls-u | h2c/binary-u.122-gls/mode=batch,n=1024 | 121 ns | 120 ns .. 121 ns |
| hash to curve, batched | edwards127 | h2c/edwards.127/mode=batch,n=1024 | 1.24 µs | 1.23 µs .. 1.24 µs |
| hash to curve, batched | edwards107 | h2c/edwards.107/mode=batch,n=1024 | 916 ns | 914 ns .. 919 ns |
| hash to curve, batched | twisted128 | h2c/twisted.128/mode=batch,n=1024 | 1.96 µs | 1.96 µs .. 1.96 µs |
| hash to curve, batched | weier127 | h2c/weier.127/mode=batch,n=1024 | 1.17 µs | 1.16 µs .. 1.17 µs |
| hash to curve, batched | weier127-jacobian | h2c/weier-jacobian.127/mode=batch,n=1024 | 1.16 µs | 1.16 µs .. 1.16 µs |
| hash to curve, batched | weier107 | h2c/weier.107/mode=batch,n=1024 | 901 ns | 899 ns .. 904 ns |
| hash to curve, batched | weier107-jacobian | h2c/weier-jacobian.107/mode=batch,n=1024 | 893 ns | 891 ns .. 895 ns |
| hash to curve, batched | edwards61x2 | h2c/edwards.61x2/mode=batch,n=1024 | 706 ns | 704 ns .. 708 ns |
| hash to curve, batched | weier61x2 | h2c/weier.61x2/mode=batch,n=1024 | 698 ns | 696 ns .. 700 ns |
| hash to curve, batched | weier61x2-jacobian | h2c/weier-jacobian.61x2/mode=batch,n=1024 | 698 ns | 696 ns .. 700 ns |
| hash to curve, batched | twisted61x2 | h2c/twisted.61x2/mode=batch,n=1024 | 711 ns | 708 ns .. 713 ns |
| hash to curve, batched | twisted64x2 | h2c/twisted.64x2/mode=batch,n=1024 | 1.00 µs | 1.00 µs .. 1.01 µs |
| hash to curve, batched | twisted-goldilocks2 | h2c/twisted.goldilocks2/mode=batch,n=1024 | 2.24 µs | 2.23 µs .. 2.24 µs |
| hash to addend, one at a time | gf2_127-lambda | hash_to_curve/gf2_127-lambda/pornin map x1 to (x, λ) | 245 ns | 244 ns .. 246 ns |
| hash to addend, one at a time | gf2_127-w | hash_to_curve/gf2_127-w/pornin map x1 to (x, λ) | 244 ns | 243 ns .. 245 ns |
| hash to addend, one at a time | gf2_127-u | hash_to_curve/gf2_127-u/pornin map x1 to (u, v) | 249 ns | 248 ns .. 250 ns |
| hash to addend, one at a time | gf2_109-lambda | hash_to_curve/gf2_109-lambda/pornin map x1 to (x, λ) | 655 ns | 653 ns .. 657 ns |
| hash to addend, one at a time | gf2_109-w | hash_to_curve/gf2_109-w/pornin map x1 to (x, λ) | 652 ns | 650 ns .. 653 ns |
| hash to addend, one at a time | gf2_109-u | hash_to_curve/gf2_109-u/pornin map x1 to (u, v) | 657 ns | 656 ns .. 659 ns |
| hash to addend, one at a time | gf2_122-lambda | hash_to_curve/gf2_122-lambda/pornin map x1 to (x, λ) | 381 ns | 380 ns .. 382 ns |
| hash to addend, one at a time | gf2_122-w | hash_to_curve/gf2_122-w/pornin map x1 to (x, λ) | 381 ns | 380 ns .. 382 ns |
| hash to addend, one at a time | gf2_122-u | hash_to_curve/gf2_122-u/pornin map x1 to (u, v) | 391 ns | 390 ns .. 392 ns |
| hash to addend, one at a time | gf2_122-gls-lambda | hash_to_curve/gf2_122-gls-lambda/pornin map x1 to (x, λ) | 385 ns | 384 ns .. 386 ns |
| hash to addend, one at a time | gf2_122-gls-w | hash_to_curve/gf2_122-gls-w/pornin map x1 to (x, λ) | 385 ns | 384 ns .. 386 ns |
| hash to addend, one at a time | gf2_122-gls-u | hash_to_curve/gf2_122-gls-u/pornin map x1 to (u, v) | 390 ns | 389 ns .. 390 ns |
| hash to addend, batched | gf2_127-lambda | hash_to_curve/gf2_127-lambda/pornin map x1 to (x, λ), batched | 92.7 ns | 92.4 ns .. 93.0 ns |
| hash to addend, batched | gf2_127-w | hash_to_curve/gf2_127-w/pornin map x1 to (x, λ), batched | 92.8 ns | 92.4 ns .. 93.2 ns |
| hash to addend, batched | gf2_127-u | hash_to_curve/gf2_127-u/pornin map x1 to (u, v), batched | 98.0 ns | 97.4 ns .. 98.6 ns |
| hash to addend, batched | gf2_109-lambda | hash_to_curve/gf2_109-lambda/pornin map x1 to (x, λ), batched | 105 ns | 104 ns .. 105 ns |
| hash to addend, batched | gf2_109-w | hash_to_curve/gf2_109-w/pornin map x1 to (x, λ), batched | 104 ns | 104 ns .. 104 ns |
| hash to addend, batched | gf2_109-u | hash_to_curve/gf2_109-u/pornin map x1 to (u, v), batched | 110 ns | 109 ns .. 110 ns |
| hash to addend, batched | gf2_122-lambda | hash_to_curve/gf2_122-lambda/pornin map x1 to (x, λ), batched | 95.0 ns | 94.7 ns .. 95.2 ns |
| hash to addend, batched | gf2_122-w | hash_to_curve/gf2_122-w/pornin map x1 to (x, λ), batched | 95.2 ns | 95.0 ns .. 95.5 ns |
| hash to addend, batched | gf2_122-u | hash_to_curve/gf2_122-u/pornin map x1 to (u, v), batched | 99.3 ns | 99.0 ns .. 99.5 ns |
| hash to addend, batched | gf2_122-gls-lambda | hash_to_curve/gf2_122-gls-lambda/pornin map x1 to (x, λ), batched | 95.0 ns | 94.7 ns .. 95.4 ns |
| hash to addend, batched | gf2_122-gls-w | hash_to_curve/gf2_122-gls-w/pornin map x1 to (x, λ), batched | 94.6 ns | 94.4 ns .. 94.9 ns |
| hash to addend, batched | gf2_122-gls-u | hash_to_curve/gf2_122-gls-u/pornin map x1 to (u, v), batched | 97.6 ns | 97.4 ns .. 97.8 ns |
Coverage
Benchmarks per hot-path operation and family; an empty cell was not measured.
| curve | hash to curve | prepare | add | subtract | negate | is identity | equals addend | encode | decode | RIBLT | ||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| encode | cells | peel | ||||||||||
| baseline | ||||||||||||
| xorSHA-256 digests XORed: no group, 32 bytes | 1 | 2 | 5 | 1 | 1 | |||||||
| xor-siphashSipHash-2-4 hashes XORed: no group, 8 bytes | 10 | 1 | 1 | |||||||||
| GF(2^127), 16 bytes | ||||||||||||
| gf2_127(X:S:Z:T) extended accumulators, Pornin's formulas | 4 | 4 | 3 | 1 | 2 | 1 | 2 | 4 | 4 | 11 | 3 | 6 |
| gf2_127-lambdaincompleteλ-projective (X:L:Z) accumulators | 4 | 4 | 2 | 1 | 1 | 1 | 2 | 4 | 4 | 8 | 5 | 23 |
| gf2_127-wincompleteλ-projective, w codec: hashes and decodes to λ-affine | 4 | 4 | 2 | 1 | 1 | 1 | 2 | 4 | 4 | 8 | 5 | 23 |
| gf2_127-uunscaled (X:S:Z), w codec, direct addend hashes | 4 | 4 | 2 | 1 | 1 | 1 | 2 | 4 | 4 | 8 | 5 | 23 |
| GF(2^122) = GF(2^61)[u], dense constant, 16 bytes | ||||||||||||
| gf2_122(X:S:Z:T) extended | 4 | 4 | 3 | 1 | 2 | 1 | 2 | 4 | 4 | 6 | 3 | 6 |
| gf2_122-lambdaincompleteλ-projective | 4 | 4 | 2 | 1 | 1 | 1 | 2 | 4 | 4 | 6 | 3 | 6 |
| gf2_122-wincompleteλ-projective, w codec | 4 | 4 | 2 | 1 | 1 | 1 | 2 | 4 | 4 | 6 | 3 | 6 |
| gf2_122-uunscaled (X:S:Z), w codec | 4 | 4 | 2 | 1 | 1 | 1 | 2 | 4 | 4 | 8 | 5 | 23 |
| GF(2^122), constant in GF(2^61) (GLS-shaped), 16 bytes | ||||||||||||
| gf2_122-gls(X:S:Z:T) extended | 4 | 4 | 3 | 1 | 1 | 1 | 2 | 4 | 4 | 6 | 3 | 6 |
| gf2_122-gls-lambdaincompleteλ-projective | 4 | 4 | 2 | 1 | 1 | 1 | 2 | 4 | 4 | 6 | 3 | 6 |
| gf2_122-gls-wincompleteλ-projective, w codec | 4 | 4 | 2 | 1 | 1 | 1 | 2 | 4 | 4 | 6 | 3 | 6 |
| gf2_122-gls-uunscaled (X:S:Z), w codec | 4 | 4 | 2 | 1 | 1 | 1 | 2 | 4 | 4 | 8 | 5 | 23 |
| GF(2^109), 14 bytes | ||||||||||||
| gf2_109(X:S:Z:T) extended | 4 | 4 | 3 | 1 | 2 | 1 | 2 | 4 | 4 | 6 | 3 | 6 |
| gf2_109-lambdaincompleteλ-projective | 4 | 4 | 2 | 1 | 1 | 1 | 2 | 4 | 4 | 6 | 3 | 6 |
| gf2_109-wincompleteλ-projective, w codec | 4 | 4 | 2 | 1 | 1 | 1 | 2 | 4 | 4 | 6 | 3 | 6 |
| gf2_109-uunscaled (X:S:Z), w codec | 4 | 4 | 2 | 1 | 1 | 1 | 2 | 4 | 4 | 8 | 5 | 23 |
| F_p, p = 2^127 − 1, 16 bytes | ||||||||||||
| edwards127a = 1 Edwards, extended += cached | 3 | 2 | 3 | 2 | 1 | 1 | 2 | 2 | 1 | 1 | 1 | |
| weier127short Weierstrass, projective += affine | 2 | 2 | 2 | 2 | 1 | 1 | 2 | 2 | 1 | 1 | 1 | |
| weier127-jacobianincompleteshort Weierstrass, Jacobian += affine | 2 | 2 | 2 | 1 | 1 | 1 | 2 | 2 | 1 | 1 | 1 | |
| F_p, p = 2^107 − 1, 14 bytes | ||||||||||||
| edwards107a = 1 Edwards, extended += cached | 3 | 2 | 3 | 2 | 1 | 1 | 2 | 2 | 1 | 1 | 1 | |
| weier107short Weierstrass, projective += affine | 2 | 2 | 2 | 2 | 1 | 1 | 2 | 2 | 1 | 1 | 1 | |
| weier107-jacobianincompleteshort Weierstrass, Jacobian += affine | 2 | 2 | 2 | 1 | 1 | 1 | 2 | 2 | 1 | 1 | 1 | |
| F_p, p = 2^128 − 275, 16 bytes | ||||||||||||
| twisted128a = −1 twisted Edwards modulo 2-torsion, extended += cached | 2 | 2 | 2 | 1 | 1 | 1 | 2 | 2 | 1 | 1 | 1 | |
| F_{p²}, p = 2^61 − 1, 16 bytes | ||||||||||||
| edwards61x2a = 1 Edwards, signed-x codec, extended += cached | 2 | 2 | 2 | 1 | 1 | 1 | 2 | 2 | 1 | 1 | 1 | |
| weier61x2short Weierstrass, signed-x codec, projective += affine | 2 | 2 | 2 | 1 | 1 | 1 | 2 | 2 | 1 | 1 | 1 | |
| weier61x2-jacobianincompleteshort Weierstrass, signed-x codec, Jacobian += affine | 2 | 2 | 2 | 1 | 1 | 1 | 2 | 2 | 1 | 1 | 1 | |
| twisted61x2a = −1 Edwards modulo 2-torsion, extended += cached | 4 | 4 | 2 | 1 | 1 | 1 | 2 | 4 | 4 | 1 | 1 | 1 |
| F_{p²}, p = 2^64 − 59, 16 bytes | ||||||||||||
| twisted64x2a = −1 Edwards modulo 2-torsion, extended += cached | 2 | 2 | 2 | 1 | 1 | 1 | 2 | 2 | 1 | 1 | 1 | |
| F_{p²}, p = 2^64 − 2^32 + 1, 16 bytes | ||||||||||||
| twisted-goldilocks2a = −1 Edwards modulo 2-torsion, extended += cached | 2 | 2 | 2 | 1 | 1 | 1 | 2 | 2 | 1 | 1 | 1 | |
| references, 32 and 33 bytes | ||||||||||||
| ristretto255curve25519-dalek | 1 | 2 | 1 | 1 | 10 | 1 | 1 | |||||
| secp256k1libsecp256k1 | 2 | 1 | ||||||||||
bold: the best of its column; italic, dotted: tied with the best within the confidence intervals; shading: ratio to the best, pale yellow at 1× to purple at 16× or more; grey: baseline, not compared.
All benchmarks
Every observation: a figure and a table per layer.
field
116 benchmarks
| operation | benchmark | family | mode | time | 95% CI | unit |
|---|---|---|---|---|---|---|
| batch invert | gf2_109/batch invert (product tree) | gf2_109 | batch | 5.36 ns | 5.34 ns .. 5.38 ns | per elem |
| batch invert | gf2_122/batch invert (product tree) | gf2_122 | batch | 5.23 ns | 5.21 ns .. 5.25 ns | per elem |
| batch invert | gf2_127/batch invert (product tree) | gf2_127 | batch | 5.41 ns | 5.36 ns .. 5.45 ns | per elem |
| batch invert | fp107/batch invert (product tree) | fp107 | batch | 10.1 ns | 10.0 ns .. 10.1 ns | per elem |
| batch invert | fp127/batch invert (product tree) | fp127 | batch | 10.2 ns | 10.1 ns .. 10.3 ns | per elem |
| batch invert | fp61x2/batch invert (product tree) | fp61x2 | batch | 8.60 ns | 8.58 ns .. 8.62 ns | per elem |
| batch invert | fp64x2/batch invert (product tree) | fp64x2 | batch | 13.6 ns | 13.5 ns .. 13.6 ns | per elem |
| batch invert | goldilocks2/batch invert (product tree) | goldilocks2 | batch | 8.96 ns | 8.93 ns .. 9.00 ns | per elem |
| halftrace | gf2_109/halftrace | gf2_109 | per-element | 43.9 ns | 43.7 ns .. 44.0 ns | per elem |
| halftrace | gf2_109/halftrace (byte tables) | gf2_109 | per-element | 4.02 ns | 4.01 ns .. 4.03 ns | per elem |
| halftrace | gf2_122/qsolve (z^2 + z = c, 2 base halftraces) | gf2_122 | per-element | 3.86 ns | 3.84 ns .. 3.88 ns | per elem |
| halftrace | gf2_127/halftrace | gf2_127 | per-element | 22.3 ns | 22.3 ns .. 22.4 ns | per elem |
| halftrace | gf2_127/halftrace (byte tables) | gf2_127 | per-element | 5.16 ns | 5.12 ns .. 5.23 ns | per elem |
| halftrace | gf2_127/halftrace (nibble tables) | gf2_127 | per-element | 24.7 ns | 24.7 ns .. 24.8 ns | per elem |
| mul_u2 | gf2_122/mul_u2 (by a^2 = 1 + a) latency (dependent chain) | gf2_122 | latency | 0.14 ns | 0.14 ns .. 0.14 ns | per elem |
| mul_u2 | gf2_122/mul_u2 (by a^2 = 1 + a) throughput (8 chains) | gf2_122 | throughput | 0.21 ns | 0.21 ns .. 0.21 ns | per elem |
| pack | fp107/pack | fp107 | per-element | 0.82 ns | 0.82 ns .. 0.83 ns | per elem |
| pack | fp127/pack | fp127 | per-element | 0.38 ns | 0.38 ns .. 0.39 ns | per elem |
| pack | fp128/pack | fp128 | per-element | 0.36 ns | 0.36 ns .. 0.37 ns | per elem |
| pack | fp61x2/pack | fp61x2 | per-element | 0.50 ns | 0.50 ns .. 0.50 ns | per elem |
| pack | fp64x2/pack | fp64x2 | per-element | 0.37 ns | 0.36 ns .. 0.37 ns | per elem |
| pack | goldilocks2/pack | goldilocks2 | per-element | 0.69 ns | 0.69 ns .. 0.70 ns | per elem |
| trace | gf2_109/trace | gf2_109 | per-element | 0.60 ns | 0.60 ns .. 0.60 ns | per elem |
| trace | gf2_122/trace | gf2_122 | per-element | 0.40 ns | 0.40 ns .. 0.40 ns | per elem |
| trace | gf2_127/trace | gf2_127 | per-element | 0.50 ns | 0.50 ns .. 0.50 ns | per elem |
| neg | fp107/neg | fp107 | per-element | 0.59 ns | 0.59 ns .. 0.59 ns | per elem |
| neg | fp127/neg | fp127 | per-element | 0.89 ns | 0.89 ns .. 0.90 ns | per elem |
| neg | fp128/neg | fp128 | per-element | 0.59 ns | 0.59 ns .. 0.60 ns | per elem |
| neg | fp61x2/neg | fp61x2 | per-element | 0.41 ns | 0.40 ns .. 0.41 ns | per elem |
| neg | fp64x2/neg | fp64x2 | per-element | 0.41 ns | 0.40 ns .. 0.41 ns | per elem |
| neg | goldilocks2/neg | goldilocks2 | per-element | 0.60 ns | 0.60 ns .. 0.61 ns | per elem |
| add | fp107/add | fp107 | per-element | 0.62 ns | 0.62 ns .. 0.63 ns | per elem |
| add | fp127/add | fp127 | per-element | 1.00 ns | 0.99 ns .. 1.01 ns | per elem |
| add | fp128/add | fp128 | per-element | 0.72 ns | 0.71 ns .. 0.72 ns | per elem |
| add | fp61x2/add | fp61x2 | per-element | 0.61 ns | 0.61 ns .. 0.61 ns | per elem |
| add | fp64x2/add | fp64x2 | per-element | 0.60 ns | 0.60 ns .. 0.60 ns | per elem |
| add | goldilocks2/add | goldilocks2 | per-element | 0.69 ns | 0.69 ns .. 0.70 ns | per elem |
| unpack | fp107/unpack | fp107 | per-element | 0.73 ns | 0.73 ns .. 0.73 ns | per elem |
| unpack | fp127/unpack | fp127 | per-element | 0.70 ns | 0.70 ns .. 0.70 ns | per elem |
| unpack | fp128/unpack | fp128 | per-element | 0.70 ns | 0.70 ns .. 0.70 ns | per elem |
| unpack | fp61x2/unpack | fp61x2 | per-element | 0.99 ns | 0.99 ns .. 1.00 ns | per elem |
| unpack | fp64x2/unpack | fp64x2 | per-element | 0.70 ns | 0.70 ns .. 0.70 ns | per elem |
| unpack | goldilocks2/unpack | goldilocks2 | per-element | 0.70 ns | 0.70 ns .. 0.70 ns | per elem |
| sub | fp128/sub | fp128 | per-element | 0.79 ns | 0.79 ns .. 0.79 ns | per elem |
| sub | fp61x2/sub | fp61x2 | per-element | 0.80 ns | 0.80 ns .. 0.80 ns | per elem |
| sub | fp64x2/sub | fp64x2 | per-element | 0.59 ns | 0.59 ns .. 0.60 ns | per elem |
| sub | goldilocks2/sub | goldilocks2 | per-element | 0.70 ns | 0.69 ns .. 0.70 ns | per elem |
| normalize | gf2_109/normalize (to_u128) | gf2_109 | per-element | 0.79 ns | 0.79 ns .. 0.80 ns | per elem |
| normalize | gf2_122/normalize (to_u128) | gf2_122 | per-element | 1.38 ns | 1.38 ns .. 1.39 ns | per elem |
| normalize | gf2_127/normalize (to_u128) | gf2_127 | per-element | 0.50 ns | 0.50 ns .. 0.50 ns | per elem |
| mul_base | gf2_122/mul_base (by a GF(2^61) constant) latency (dependent chain) | gf2_122 | latency | 3.72 ns | 3.71 ns .. 3.73 ns | per elem |
| mul_base | gf2_122/mul_base (by a GF(2^61) constant) throughput (8 chains) | gf2_122 | throughput | 1.17 ns | 1.17 ns .. 1.17 ns | per elem |
| square | gf2_109/square latency (dependent chain) | gf2_109 | latency | 3.88 ns | 3.87 ns .. 3.89 ns | per elem |
| square | gf2_109/square throughput (8 chains) | gf2_109 | throughput | 0.81 ns | 0.81 ns .. 0.81 ns | per elem |
| square | gf2_122/square latency (dependent chain) | gf2_122 | latency | 4.33 ns | 4.32 ns .. 4.34 ns | per elem |
| square | gf2_122/square throughput (8 chains) | gf2_122 | throughput | 1.17 ns | 1.17 ns .. 1.18 ns | per elem |
| square | gf2_127/square latency (dependent chain) | gf2_127 | latency | 2.18 ns | 2.17 ns .. 2.19 ns | per elem |
| square | gf2_127/square throughput (8 chains) | gf2_127 | throughput | 0.65 ns | 0.65 ns .. 0.65 ns | per elem |
| square | fp107/square latency (dependent chain) | fp107 | latency | 3.60 ns | 3.59 ns .. 3.60 ns | per elem |
| square | fp107/square throughput (8 chains) | fp107 | throughput | 2.13 ns | 2.13 ns .. 2.14 ns | per elem |
| square | fp127/square latency (dependent chain) | fp127 | latency | 4.26 ns | 4.25 ns .. 4.27 ns | per elem |
| square | fp127/square throughput (8 chains) | fp127 | throughput | 2.30 ns | 2.29 ns .. 2.31 ns | per elem |
| square | fp128/square latency (dependent chain) | fp128 | latency | 6.54 ns | 6.52 ns .. 6.56 ns | per elem |
| square | fp128/square throughput (8 chains) | fp128 | throughput | 3.64 ns | 3.63 ns .. 3.65 ns | per elem |
| square | fp61x2/square latency (dependent chain) | fp61x2 | latency | 5.90 ns | 5.88 ns .. 5.92 ns | per elem |
| square | fp61x2/square throughput (8 chains) | fp61x2 | throughput | 2.38 ns | 2.37 ns .. 2.38 ns | per elem |
| square | fp64x2/square latency (dependent chain) | fp64x2 | latency | 4.76 ns | 4.75 ns .. 4.77 ns | per elem |
| square | fp64x2/square throughput (8 chains) | fp64x2 | throughput | 3.70 ns | 3.69 ns .. 3.71 ns | per elem |
| square | goldilocks2/square latency (dependent chain) | goldilocks2 | latency | 3.59 ns | 3.58 ns .. 3.60 ns | per elem |
| square | goldilocks2/square throughput (8 chains) | goldilocks2 | throughput | 2.59 ns | 2.58 ns .. 2.60 ns | per elem |
| mul | gf2_109/mul latency (dependent chain) | gf2_109 | latency | 5.13 ns | 5.10 ns .. 5.16 ns | per elem |
| mul | gf2_109/mul throughput (8 chains) | gf2_109 | throughput | 1.37 ns | 1.37 ns .. 1.38 ns | per elem |
| mul | gf2_122/mul latency (dependent chain) | gf2_122 | latency | 4.56 ns | 4.54 ns .. 4.57 ns | per elem |
| mul | gf2_122/mul throughput (8 chains) | gf2_122 | throughput | 1.38 ns | 1.38 ns .. 1.38 ns | per elem |
| mul | gf2_127/mul latency (dependent chain) | gf2_127 | latency | 3.50 ns | 3.49 ns .. 3.51 ns | per elem |
| mul | gf2_127/mul throughput (8 chains) | gf2_127 | throughput | 1.43 ns | 1.42 ns .. 1.43 ns | per elem |
| mul | fp107 schoolbook/mul latency (dependent chain) | fp107 | latency | 3.98 ns | 3.98 ns .. 3.99 ns | per elem |
| mul | fp107 schoolbook/mul throughput (8 chains) | fp107 | throughput | 2.55 ns | 2.55 ns .. 2.56 ns | per elem |
| mul | fp107/mul latency (dependent chain) | fp107 | latency | 3.97 ns | 3.96 ns .. 3.98 ns | per elem |
| mul | fp107/mul throughput (8 chains) | fp107 | throughput | 2.64 ns | 2.61 ns .. 2.66 ns | per elem |
| mul | fp127/mul latency (dependent chain) | fp127 | latency | 4.31 ns | 4.29 ns .. 4.32 ns | per elem |
| mul | fp127/mul throughput (8 chains) | fp127 | throughput | 2.69 ns | 2.68 ns .. 2.70 ns | per elem |
| mul | fp128/mul latency (dependent chain) | fp128 | latency | 6.73 ns | 6.71 ns .. 6.74 ns | per elem |
| mul | fp128/mul throughput (8 chains) | fp128 | throughput | 3.82 ns | 3.82 ns .. 3.83 ns | per elem |
| mul | fp61x2/mul latency (dependent chain) | fp61x2 | latency | 5.37 ns | 5.36 ns .. 5.39 ns | per elem |
| mul | fp61x2/mul throughput (8 chains) | fp61x2 | throughput | 2.54 ns | 2.54 ns .. 2.55 ns | per elem |
| mul | fp64x2/mul latency (dependent chain) | fp64x2 | latency | 4.99 ns | 4.99 ns .. 5.01 ns | per elem |
| mul | fp64x2/mul throughput (8 chains) | fp64x2 | throughput | 3.82 ns | 3.82 ns .. 3.83 ns | per elem |
| mul | goldilocks2/mul latency (dependent chain) | goldilocks2 | latency | 3.26 ns | 3.25 ns .. 3.27 ns | per elem |
| mul | goldilocks2/mul throughput (8 chains) | goldilocks2 | throughput | 2.67 ns | 2.66 ns .. 2.68 ns | per elem |
| invert | gf2_109/invert | gf2_109 | per-element | 491 ns | 490 ns .. 493 ns | per elem |
| invert | gf2_122/invert | gf2_122 | per-element | 238 ns | 238 ns .. 239 ns | per elem |
| invert | gf2_127/invert | gf2_127 | per-element | 123 ns | 123 ns .. 124 ns | per elem |
| invert | fp107/invert | fp107 | per-element | 571 ns | 566 ns .. 576 ns | per elem |
| invert | fp127/invert | fp127 | per-element | 577 ns | 576 ns .. 578 ns | per elem |
| invert | fp128/invert | fp128 | per-element | 918 ns | 916 ns .. 922 ns | per elem |
| invert | fp61x2/invert | fp61x2 | per-element | 176 ns | 176 ns .. 176 ns | per elem |
| invert | fp64x2/invert | fp64x2 | per-element | 241 ns | 241 ns .. 242 ns | per elem |
| invert | goldilocks2/invert | goldilocks2 | per-element | 304 ns | 303 ns .. 305 ns | per elem |
| sqrt | gf2_109/sqrt | gf2_109 | per-element | 6.93 ns | 6.92 ns .. 6.95 ns | per elem |
| sqrt | gf2_122/sqrt | gf2_122 | per-element | 3.98 ns | 3.97 ns .. 3.98 ns | per elem |
| sqrt | gf2_127/sqrt | gf2_127 | per-element | 1.70 ns | 1.69 ns .. 1.70 ns | per elem |
| sqrt | fp107/sqrt (x^(2^105)) | fp107 | per-element | 422 ns | 420 ns .. 425 ns | per elem |
| sqrt | fp127/sqrt (x^(2^125)) | fp127 | per-element | 523 ns | 523 ns .. 524 ns | per elem |
| sqrt | fp128/sqrt | fp128 | per-element | 891 ns | 888 ns .. 893 ns | per elem |
| sqrt | fp61x2/sqrt | fp61x2 | per-element | 298 ns | 298 ns .. 299 ns | per elem |
| sqrt | fp64x2/sqrt | fp64x2 | per-element | 431 ns | 430 ns .. 432 ns | per elem |
| sqrt | goldilocks2/sqrt | goldilocks2 | per-element | 996 ns | 993 ns .. 998 ns | per elem |
| pow_p34 | fp107/pow_p34 (x^(2^105-1)) | fp107 | per-element | 570 ns | 569 ns .. 571 ns | per elem |
| pow_p34 | fp127/pow_p34 (x^(2^125-1)) | fp127 | per-element | 579 ns | 575 ns .. 582 ns | per elem |
| sqrt_ratio | fp107/sqrt_ratio | fp107 | per-element | 597 ns | 593 ns .. 601 ns | per elem |
| sqrt_ratio | fp127/sqrt_ratio | fp127 | per-element | 592 ns | 590 ns .. 593 ns | per elem |
| sqrt_ratio | fp128/sqrt_ratio | fp128 | per-element | 937 ns | 936 ns .. 939 ns | per elem |
| sqrt_ratio | fp61x2/sqrt_ratio | fp61x2 | per-element | 295 ns | 294 ns .. 295 ns | per elem |
| sqrt_ratio | fp64x2/sqrt_ratio | fp64x2 | per-element | 431 ns | 430 ns .. 432 ns | per elem |
| sqrt_ratio | goldilocks2/sqrt_ratio | goldilocks2 | per-element | 950 ns | 948 ns .. 952 ns | per elem |
group ops
486 benchmarks
| operation | benchmark | family | mode | time | 95% CI | unit |
|---|---|---|---|---|---|---|
| prepare | binary.109/mode=batch,n=1024 | gf2_109 | batch | 4.25 ns | 4.24 ns .. 4.27 ns | per elem |
| prepare | binary.109/mode=batch,n=64 | gf2_109 | batch | 4.65 ns | 4.64 ns .. 4.66 ns | per elem |
| prepare | binary.109/mode=batch,n=8 | gf2_109 | batch | 4.88 ns | 4.87 ns .. 4.89 ns | per elem |
| prepare | binary.109/mode=indep | gf2_109 | per-element | 4.23 ns | 4.22 ns .. 4.24 ns | per elem |
| prepare | binary-lambda.109/mode=batch,n=1024 | gf2_109-lambda | batch | 8.13 ns | 8.10 ns .. 8.16 ns | per elem |
| prepare | binary-lambda.109/mode=batch,n=64 | gf2_109-lambda | batch | 18.8 ns | 18.7 ns .. 18.8 ns | per elem |
| prepare | binary-lambda.109/mode=batch,n=8 | gf2_109-lambda | batch | 82.7 ns | 82.4 ns .. 83.0 ns | per elem |
| prepare | binary-lambda.109/mode=indep | gf2_109-lambda | per-element | 503 ns | 502 ns .. 504 ns | per elem |
| prepare | binary-u.109/mode=batch,n=1024 | gf2_109-u | batch | 0.46 ns | 0.46 ns .. 0.47 ns | per elem |
| prepare | binary-u.109/mode=batch,n=64 | gf2_109-u | batch | 0.79 ns | 0.79 ns .. 0.80 ns | per elem |
| prepare | binary-u.109/mode=batch,n=8 | gf2_109-u | batch | 1.08 ns | 1.08 ns .. 1.09 ns | per elem |
| prepare | binary-u.109/mode=indep | gf2_109-u | per-element | 0.48 ns | 0.45 ns .. 0.51 ns | per elem |
| prepare | binary-w.109/mode=batch,n=1024 | gf2_109-w | batch | 0.47 ns | 0.46 ns .. 0.47 ns | per elem |
| prepare | binary-w.109/mode=batch,n=64 | gf2_109-w | batch | 0.82 ns | 0.81 ns .. 0.82 ns | per elem |
| prepare | binary-w.109/mode=batch,n=8 | gf2_109-w | batch | 1.08 ns | 1.08 ns .. 1.09 ns | per elem |
| prepare | binary-w.109/mode=indep | gf2_109-w | per-element | 0.44 ns | 0.42 ns .. 0.46 ns | per elem |
| prepare | binary.122/mode=batch,n=1024 | gf2_122 | batch | 5.01 ns | 5.00 ns .. 5.03 ns | per elem |
| prepare | binary.122/mode=batch,n=64 | gf2_122 | batch | 5.44 ns | 5.42 ns .. 5.46 ns | per elem |
| prepare | binary.122/mode=batch,n=8 | gf2_122 | batch | 5.62 ns | 5.60 ns .. 5.63 ns | per elem |
| prepare | binary.122/mode=indep | gf2_122 | per-element | 4.91 ns | 4.90 ns .. 4.92 ns | per elem |
| prepare | binary.122-gls/mode=batch,n=1024 | gf2_122-gls | batch | 4.27 ns | 4.26 ns .. 4.29 ns | per elem |
| prepare | binary.122-gls/mode=batch,n=64 | gf2_122-gls | batch | 4.54 ns | 4.53 ns .. 4.55 ns | per elem |
| prepare | binary.122-gls/mode=batch,n=8 | gf2_122-gls | batch | 4.83 ns | 4.82 ns .. 4.84 ns | per elem |
| prepare | binary.122-gls/mode=indep | gf2_122-gls | per-element | 4.22 ns | 4.20 ns .. 4.25 ns | per elem |
| prepare | binary-lambda.122-gls/mode=batch,n=1024 | gf2_122-gls-lambda | batch | 8.11 ns | 8.08 ns .. 8.14 ns | per elem |
| prepare | binary-lambda.122-gls/mode=batch,n=64 | gf2_122-gls-lambda | batch | 15.1 ns | 15.1 ns .. 15.2 ns | per elem |
| prepare | binary-lambda.122-gls/mode=batch,n=8 | gf2_122-gls-lambda | batch | 53.4 ns | 53.3 ns .. 53.6 ns | per elem |
| prepare | binary-lambda.122-gls/mode=indep | gf2_122-gls-lambda | per-element | 249 ns | 248 ns .. 250 ns | per elem |
| prepare | binary-u.122-gls/mode=batch,n=1024 | gf2_122-gls-u | batch | 0.68 ns | 0.68 ns .. 0.68 ns | per elem |
| prepare | binary-u.122-gls/mode=batch,n=64 | gf2_122-gls-u | batch | 0.83 ns | 0.82 ns .. 0.83 ns | per elem |
| prepare | binary-u.122-gls/mode=batch,n=8 | gf2_122-gls-u | batch | 1.07 ns | 1.07 ns .. 1.07 ns | per elem |
| prepare | binary-u.122-gls/mode=indep | gf2_122-gls-u | per-element | 0.44 ns | 0.42 ns .. 0.45 ns | per elem |
| prepare | binary-w.122-gls/mode=batch,n=1024 | gf2_122-gls-w | batch | 0.68 ns | 0.68 ns .. 0.68 ns | per elem |
| prepare | binary-w.122-gls/mode=batch,n=64 | gf2_122-gls-w | batch | 0.83 ns | 0.82 ns .. 0.83 ns | per elem |
| prepare | binary-w.122-gls/mode=batch,n=8 | gf2_122-gls-w | batch | 1.08 ns | 1.08 ns .. 1.08 ns | per elem |
| prepare | binary-w.122-gls/mode=indep | gf2_122-gls-w | per-element | 0.43 ns | 0.42 ns .. 0.45 ns | per elem |
| prepare | binary-lambda.122/mode=batch,n=1024 | gf2_122-lambda | batch | 8.18 ns | 8.16 ns .. 8.19 ns | per elem |
| prepare | binary-lambda.122/mode=batch,n=64 | gf2_122-lambda | batch | 15.2 ns | 15.1 ns .. 15.3 ns | per elem |
| prepare | binary-lambda.122/mode=batch,n=8 | gf2_122-lambda | batch | 53.6 ns | 53.2 ns .. 54.0 ns | per elem |
| prepare | binary-lambda.122/mode=indep | gf2_122-lambda | per-element | 251 ns | 250 ns .. 251 ns | per elem |
| prepare | binary-u.122/mode=batch,n=1024 | gf2_122-u | batch | 0.49 ns | 0.49 ns .. 0.50 ns | per elem |
| prepare | binary-u.122/mode=batch,n=64 | gf2_122-u | batch | 0.82 ns | 0.82 ns .. 0.82 ns | per elem |
| prepare | binary-u.122/mode=batch,n=8 | gf2_122-u | batch | 1.08 ns | 1.08 ns .. 1.08 ns | per elem |
| prepare | binary-u.122/mode=indep | gf2_122-u | per-element | 0.50 ns | 0.47 ns .. 0.52 ns | per elem |
| prepare | binary-w.122/mode=batch,n=1024 | gf2_122-w | batch | 0.47 ns | 0.46 ns .. 0.47 ns | per elem |
| prepare | binary-w.122/mode=batch,n=64 | gf2_122-w | batch | 0.75 ns | 0.75 ns .. 0.76 ns | per elem |
| prepare | binary-w.122/mode=batch,n=8 | gf2_122-w | batch | 1.09 ns | 1.08 ns .. 1.09 ns | per elem |
| prepare | binary-w.122/mode=indep | gf2_122-w | per-element | 0.44 ns | 0.42 ns .. 0.46 ns | per elem |
| prepare | binary.127/mode=batch,n=1024 | gf2_127 | batch | 6.36 ns | 6.31 ns .. 6.42 ns | per elem |
| prepare | binary.127/mode=batch,n=64 | gf2_127 | batch | 6.55 ns | 6.52 ns .. 6.59 ns | per elem |
| prepare | binary.127/mode=batch,n=8 | gf2_127 | batch | 6.72 ns | 6.69 ns .. 6.76 ns | per elem |
| prepare | binary.127/mode=indep | gf2_127 | per-element | 6.38 ns | 6.33 ns .. 6.42 ns | per elem |
| prepare | binary-lambda.127/mode=batch,n=1024 | gf2_127-lambda | batch | 8.18 ns | 8.16 ns .. 8.20 ns | per elem |
| prepare | binary-lambda.127/mode=batch,n=64 | gf2_127-lambda | batch | 12.7 ns | 12.7 ns .. 12.7 ns | per elem |
| prepare | binary-lambda.127/mode=batch,n=8 | gf2_127-lambda | batch | 32.8 ns | 32.7 ns .. 32.8 ns | per elem |
| prepare | binary-lambda.127/mode=indep | gf2_127-lambda | per-element | 129 ns | 128 ns .. 129 ns | per elem |
| prepare | binary-u.127/mode=batch,n=1024 | gf2_127-u | batch | 0.47 ns | 0.47 ns .. 0.47 ns | per elem |
| prepare | binary-u.127/mode=batch,n=64 | gf2_127-u | batch | 0.81 ns | 0.81 ns .. 0.81 ns | per elem |
| prepare | binary-u.127/mode=batch,n=8 | gf2_127-u | batch | 1.08 ns | 1.08 ns .. 1.08 ns | per elem |
| prepare | binary-u.127/mode=indep | gf2_127-u | per-element | 0.48 ns | 0.46 ns .. 0.51 ns | per elem |
| prepare | binary-w.127/mode=batch,n=1024 | gf2_127-w | batch | 0.47 ns | 0.47 ns .. 0.47 ns | per elem |
| prepare | binary-w.127/mode=batch,n=64 | gf2_127-w | batch | 0.79 ns | 0.79 ns .. 0.80 ns | per elem |
| prepare | binary-w.127/mode=batch,n=8 | gf2_127-w | batch | 1.10 ns | 1.09 ns .. 1.11 ns | per elem |
| prepare | binary-w.127/mode=indep | gf2_127-w | per-element | 0.45 ns | 0.44 ns .. 0.47 ns | per elem |
| prepare | edwards.107/mode=batch,n=1024 | edwards107 | batch | 37.9 ns | 37.8 ns .. 38.1 ns | per elem |
| prepare | edwards.107/mode=indep | edwards107 | per-element | 632 ns | 630 ns .. 634 ns | per elem |
| prepare | edwards.127/mode=batch,n=1024 | edwards127 | batch | 39.9 ns | 39.9 ns .. 40.0 ns | per elem |
| prepare | edwards.127/mode=indep | edwards127 | per-element | 663 ns | 662 ns .. 664 ns | per elem |
| prepare | edwards.61x2/mode=batch,n=1024 | edwards61x2 | batch | 34.9 ns | 34.8 ns .. 35.1 ns | per elem |
| prepare | edwards.61x2/mode=indep | edwards61x2 | per-element | 236 ns | 235 ns .. 236 ns | per elem |
| prepare | twisted.goldilocks2/mode=batch,n=1024 | twisted-goldilocks2 | batch | 9.54 ns | 9.49 ns .. 9.59 ns | per elem |
| prepare | twisted.goldilocks2/mode=indep | twisted-goldilocks2 | per-element | 9.45 ns | 9.41 ns .. 9.50 ns | per elem |
| prepare | twisted.128/mode=batch,n=1024 | twisted128 | batch | 12.7 ns | 12.6 ns .. 12.7 ns | per elem |
| prepare | twisted.128/mode=indep | twisted128 | per-element | 12.5 ns | 12.4 ns .. 12.5 ns | per elem |
| prepare | twisted.61x2/mode=batch,n=1024 | twisted61x2 | batch | 7.93 ns | 7.89 ns .. 7.96 ns | per elem |
| prepare | twisted.61x2/mode=batch,n=64 | twisted61x2 | batch | 8.39 ns | 8.35 ns .. 8.43 ns | per elem |
| prepare | twisted.61x2/mode=batch,n=8 | twisted61x2 | batch | 8.59 ns | 8.56 ns .. 8.63 ns | per elem |
| prepare | twisted.61x2/mode=indep | twisted61x2 | per-element | 8.07 ns | 8.02 ns .. 8.11 ns | per elem |
| prepare | twisted.64x2/mode=batch,n=1024 | twisted64x2 | batch | 8.79 ns | 8.76 ns .. 8.82 ns | per elem |
| prepare | twisted.64x2/mode=indep | twisted64x2 | per-element | 8.75 ns | 8.71 ns .. 8.79 ns | per elem |
| prepare | weier.107/mode=batch,n=1024 | weier107 | batch | 0.63 ns | 0.62 ns .. 0.63 ns | per elem |
| prepare | weier.107/mode=indep | weier107 | per-element | 0.82 ns | 0.81 ns .. 0.82 ns | per elem |
| prepare | weier-jacobian.107/mode=batch,n=1024 | weier107-jacobian | batch | 0.63 ns | 0.62 ns .. 0.63 ns | per elem |
| prepare | weier-jacobian.107/mode=indep | weier107-jacobian | per-element | 0.81 ns | 0.80 ns .. 0.81 ns | per elem |
| prepare | weier.127/mode=batch,n=1024 | weier127 | batch | 1.00 ns | 0.99 ns .. 1.00 ns | per elem |
| prepare | weier.127/mode=indep | weier127 | per-element | 0.81 ns | 0.81 ns .. 0.82 ns | per elem |
| prepare | weier-jacobian.127/mode=batch,n=1024 | weier127-jacobian | batch | 0.99 ns | 0.98 ns .. 0.99 ns | per elem |
| prepare | weier-jacobian.127/mode=indep | weier127-jacobian | per-element | 0.81 ns | 0.81 ns .. 0.81 ns | per elem |
| prepare | weier.61x2/mode=batch,n=1024 | weier61x2 | batch | 0.52 ns | 0.52 ns .. 0.53 ns | per elem |
| prepare | weier.61x2/mode=indep | weier61x2 | per-element | 0.44 ns | 0.43 ns .. 0.46 ns | per elem |
| prepare | weier-jacobian.61x2/mode=batch,n=1024 | weier61x2-jacobian | batch | 0.52 ns | 0.52 ns .. 0.52 ns | per elem |
| prepare | weier-jacobian.61x2/mode=indep | weier61x2-jacobian | per-element | 0.44 ns | 0.42 ns .. 0.46 ns | per elem |
| add | xor-sha256/xor 32B, 1 accumulator | xor | latency | 0.26 ns | 0.25 ns .. 0.26 ns | per elem |
| add | xor-sha256/xor 32B, 8 accumulators | xor | throughput | 0.45 ns | 0.43 ns .. 0.46 ns | per elem |
| add | binary.109/mode=latency | gf2_109 | latency | 22.2 ns | 22.1 ns .. 22.2 ns | per elem |
| add | binary.109/mode=throughput | gf2_109 | throughput | 20.4 ns | 20.3 ns .. 20.4 ns | per elem |
| add | gf2_109/extended += affine, 8 accumulators | gf2_109 | throughput | 24.7 ns | 24.6 ns .. 24.7 ns | per elem |
| add | binary-lambda.109/mode=latency | gf2_109-lambda | latency | 28.2 ns | 28.2 ns .. 28.3 ns | per elem |
| add | binary-lambda.109/mode=throughput | gf2_109-lambda | throughput | 18.9 ns | 18.9 ns .. 18.9 ns | per elem |
| add | binary-u.109/mode=latency | gf2_109-u | latency | 15.7 ns | 15.7 ns .. 15.7 ns | per elem |
| add | binary-u.109/mode=throughput | gf2_109-u | throughput | 13.5 ns | 13.5 ns .. 13.5 ns | per elem |
| add | binary-w.109/mode=latency | gf2_109-w | latency | 28.3 ns | 28.2 ns .. 28.4 ns | per elem |
| add | binary-w.109/mode=throughput | gf2_109-w | throughput | 18.9 ns | 18.9 ns .. 19.0 ns | per elem |
| add | binary.122/mode=latency | gf2_122 | latency | 21.3 ns | 21.2 ns .. 21.3 ns | per elem |
| add | binary.122/mode=throughput | gf2_122 | throughput | 19.9 ns | 19.9 ns .. 20.0 ns | per elem |
| add | gf2_122/extended += affine, 8 accumulators | gf2_122 | throughput | 25.4 ns | 25.3 ns .. 25.5 ns | per elem |
| add | binary.122-gls/mode=latency | gf2_122-gls | latency | 20.6 ns | 20.5 ns .. 20.6 ns | per elem |
| add | binary.122-gls/mode=throughput | gf2_122-gls | throughput | 19.3 ns | 19.2 ns .. 19.4 ns | per elem |
| add | gf2_122-gls/extended += affine, 8 accumulators | gf2_122-gls | throughput | 23.3 ns | 23.2 ns .. 23.3 ns | per elem |
| add | binary-lambda.122-gls/mode=latency | gf2_122-gls-lambda | latency | 28.0 ns | 27.9 ns .. 28.1 ns | per elem |
| add | binary-lambda.122-gls/mode=throughput | gf2_122-gls-lambda | throughput | 20.3 ns | 20.2 ns .. 20.3 ns | per elem |
| add | binary-u.122-gls/mode=latency | gf2_122-gls-u | latency | 16.2 ns | 16.1 ns .. 16.3 ns | per elem |
| add | binary-u.122-gls/mode=throughput | gf2_122-gls-u | throughput | 13.7 ns | 13.7 ns .. 13.8 ns | per elem |
| add | binary-w.122-gls/mode=latency | gf2_122-gls-w | latency | 28.1 ns | 28.0 ns .. 28.1 ns | per elem |
| add | binary-w.122-gls/mode=throughput | gf2_122-gls-w | throughput | 20.3 ns | 20.2 ns .. 20.4 ns | per elem |
| add | binary-lambda.122/mode=latency | gf2_122-lambda | latency | 28.0 ns | 27.9 ns .. 28.1 ns | per elem |
| add | binary-lambda.122/mode=throughput | gf2_122-lambda | throughput | 20.2 ns | 20.2 ns .. 20.3 ns | per elem |
| add | binary-u.122/mode=latency | gf2_122-u | latency | 16.7 ns | 16.6 ns .. 16.8 ns | per elem |
| add | binary-u.122/mode=throughput | gf2_122-u | throughput | 14.3 ns | 14.3 ns .. 14.4 ns | per elem |
| add | binary-w.122/mode=latency | gf2_122-w | latency | 27.9 ns | 27.8 ns .. 28.0 ns | per elem |
| add | binary-w.122/mode=throughput | gf2_122-w | throughput | 20.5 ns | 20.4 ns .. 20.6 ns | per elem |
| add | binary.127/mode=latency | gf2_127 | latency | 19.9 ns | 19.8 ns .. 20.0 ns | per elem |
| add | binary.127/mode=throughput | gf2_127 | throughput | 19.5 ns | 19.5 ns .. 19.6 ns | per elem |
| add | gf2_127/extended += affine, 8 accumulators | gf2_127 | throughput | 23.1 ns | 23.0 ns .. 23.1 ns | per elem |
| add | binary-lambda.127/mode=latency | gf2_127-lambda | latency | 24.4 ns | 24.3 ns .. 24.5 ns | per elem |
| add | binary-lambda.127/mode=throughput | gf2_127-lambda | throughput | 17.6 ns | 17.6 ns .. 17.7 ns | per elem |
| add | binary-u.127/mode=latency | gf2_127-u | latency | 14.6 ns | 14.5 ns .. 14.6 ns | per elem |
| add | binary-u.127/mode=throughput | gf2_127-u | throughput | 13.2 ns | 13.2 ns .. 13.2 ns | per elem |
| add | binary-w.127/mode=latency | gf2_127-w | latency | 24.4 ns | 24.3 ns .. 24.4 ns | per elem |
| add | binary-w.127/mode=throughput | gf2_127-w | throughput | 17.7 ns | 17.6 ns .. 17.7 ns | per elem |
| add | edwards.107/mode=latency | edwards107 | latency | 32.6 ns | 32.5 ns .. 32.7 ns | per elem |
| add | edwards.107/mode=throughput | edwards107 | throughput | 27.6 ns | 27.5 ns .. 27.7 ns | per elem |
| add | edwards107/+= montgomery affine, 8 accumulators | edwards107 | throughput | 45.9 ns | 45.7 ns .. 46.2 ns | per elem |
| add | edwards.127/mode=latency | edwards127 | latency | 35.8 ns | 35.7 ns .. 35.9 ns | per elem |
| add | edwards.127/mode=throughput | edwards127 | throughput | 27.5 ns | 27.4 ns .. 27.6 ns | per elem |
| add | edwards127/+= montgomery affine, 8 accumulators | edwards127 | throughput | 48.1 ns | 48.0 ns .. 48.3 ns | per elem |
| add | edwards.61x2/mode=latency | edwards61x2 | latency | 29.6 ns | 29.5 ns .. 29.7 ns | per elem |
| add | edwards.61x2/mode=throughput | edwards61x2 | throughput | 25.8 ns | 25.7 ns .. 25.9 ns | per elem |
| add | twisted.goldilocks2/mode=latency | twisted-goldilocks2 | latency | 29.4 ns | 29.3 ns .. 29.4 ns | per elem |
| add | twisted.goldilocks2/mode=throughput | twisted-goldilocks2 | throughput | 28.7 ns | 28.7 ns .. 28.8 ns | per elem |
| add | twisted.128/mode=latency | twisted128 | latency | 36.3 ns | 36.2 ns .. 36.4 ns | per elem |
| add | twisted.128/mode=throughput | twisted128 | throughput | 31.1 ns | 31.0 ns .. 31.2 ns | per elem |
| add | twisted.61x2/mode=latency | twisted61x2 | latency | 28.4 ns | 28.3 ns .. 28.5 ns | per elem |
| add | twisted.61x2/mode=throughput | twisted61x2 | throughput | 24.9 ns | 24.8 ns .. 25.0 ns | per elem |
| add | twisted.64x2/mode=latency | twisted64x2 | latency | 37.9 ns | 37.7 ns .. 38.0 ns | per elem |
| add | twisted.64x2/mode=throughput | twisted64x2 | throughput | 33.3 ns | 33.2 ns .. 33.4 ns | per elem |
| add | weier.107/mode=latency | weier107 | latency | 53.9 ns | 53.4 ns .. 54.2 ns | per elem |
| add | weier.107/mode=throughput | weier107 | throughput | 48.6 ns | 48.4 ns .. 48.8 ns | per elem |
| add | weier-jacobian.107/mode=latency | weier107-jacobian | latency | 50.9 ns | 50.8 ns .. 51.1 ns | per elem |
| add | weier-jacobian.107/mode=throughput | weier107-jacobian | throughput | 44.1 ns | 44.0 ns .. 44.3 ns | per elem |
| add | weier.127/mode=latency | weier127 | latency | 63.9 ns | 63.7 ns .. 64.0 ns | per elem |
| add | weier.127/mode=throughput | weier127 | throughput | 58.7 ns | 58.5 ns .. 58.9 ns | per elem |
| add | weier-jacobian.127/mode=latency | weier127-jacobian | latency | 56.6 ns | 56.4 ns .. 56.9 ns | per elem |
| add | weier-jacobian.127/mode=throughput | weier127-jacobian | throughput | 48.1 ns | 48.0 ns .. 48.2 ns | per elem |
| add | weier.61x2/mode=latency | weier61x2 | latency | 57.1 ns | 57.0 ns .. 57.2 ns | per elem |
| add | weier.61x2/mode=throughput | weier61x2 | throughput | 50.6 ns | 50.4 ns .. 50.7 ns | per elem |
| add | weier-jacobian.61x2/mode=latency | weier61x2-jacobian | latency | 57.2 ns | 57.0 ns .. 57.3 ns | per elem |
| add | weier-jacobian.61x2/mode=throughput | weier61x2-jacobian | throughput | 50.2 ns | 50.1 ns .. 50.3 ns | per elem |
| add | ristretto255/+=, 1 accumulator | ristretto255 | latency | 117 ns | 117 ns .. 118 ns | per elem |
| add | ristretto255/+=, 8 accumulators | ristretto255 | throughput | 116 ns | 115 ns .. 116 ns | per elem |
| subtract | binary.109/mode=throughput | gf2_109 | throughput | 20.7 ns | 20.6 ns .. 20.7 ns | per elem |
| subtract | binary-lambda.109/mode=throughput | gf2_109-lambda | throughput | 19.1 ns | 19.0 ns .. 19.2 ns | per elem |
| subtract | binary-u.109/mode=throughput | gf2_109-u | throughput | 13.6 ns | 13.6 ns .. 13.7 ns | per elem |
| subtract | binary-w.109/mode=throughput | gf2_109-w | throughput | 19.2 ns | 19.1 ns .. 19.2 ns | per elem |
| subtract | binary.122/mode=throughput | gf2_122 | throughput | 20.1 ns | 20.1 ns .. 20.2 ns | per elem |
| subtract | binary.122-gls/mode=throughput | gf2_122-gls | throughput | 19.5 ns | 19.5 ns .. 19.6 ns | per elem |
| subtract | binary-lambda.122-gls/mode=throughput | gf2_122-gls-lambda | throughput | 20.4 ns | 20.4 ns .. 20.5 ns | per elem |
| subtract | binary-u.122-gls/mode=throughput | gf2_122-gls-u | throughput | 14.0 ns | 13.9 ns .. 14.0 ns | per elem |
| subtract | binary-w.122-gls/mode=throughput | gf2_122-gls-w | throughput | 20.5 ns | 20.5 ns .. 20.5 ns | per elem |
| subtract | binary-lambda.122/mode=throughput | gf2_122-lambda | throughput | 20.5 ns | 20.4 ns .. 20.6 ns | per elem |
| subtract | binary-u.122/mode=throughput | gf2_122-u | throughput | 13.9 ns | 13.9 ns .. 13.9 ns | per elem |
| subtract | binary-w.122/mode=throughput | gf2_122-w | throughput | 20.5 ns | 20.5 ns .. 20.6 ns | per elem |
| subtract | binary.127/mode=throughput | gf2_127 | throughput | 18.6 ns | 18.6 ns .. 18.7 ns | per elem |
| subtract | binary-lambda.127/mode=throughput | gf2_127-lambda | throughput | 17.6 ns | 17.6 ns .. 17.7 ns | per elem |
| subtract | binary-u.127/mode=throughput | gf2_127-u | throughput | 13.1 ns | 13.1 ns .. 13.1 ns | per elem |
| subtract | binary-w.127/mode=throughput | gf2_127-w | throughput | 17.7 ns | 17.6 ns .. 17.7 ns | per elem |
| subtract | twisted.61x2/mode=throughput | twisted61x2 | throughput | 25.2 ns | 25.2 ns .. 25.2 ns | per elem |
| subtract | ristretto255/-=, 8 accumulators | ristretto255 | throughput | 113 ns | 112 ns .. 113 ns | per elem |
| negate | binary.109 | gf2_109 | per-element | 1.17 ns | 1.17 ns .. 1.18 ns | per elem |
| negate | gf2_109/affine (y += x) | gf2_109 | per-element | 0.56 ns | 0.56 ns .. 0.56 ns | per elem |
| negate | binary-lambda.109 | gf2_109-lambda | per-element | 0.56 ns | 0.56 ns .. 0.56 ns | per elem |
| negate | binary-u.109 | gf2_109-u | per-element | 0.56 ns | 0.56 ns .. 0.57 ns | per elem |
| negate | binary-w.109 | gf2_109-w | per-element | 0.57 ns | 0.56 ns .. 0.57 ns | per elem |
| negate | binary.122 | gf2_122 | per-element | 1.18 ns | 1.17 ns .. 1.19 ns | per elem |
| negate | gf2_122/affine (y += x) | gf2_122 | per-element | 0.56 ns | 0.55 ns .. 0.56 ns | per elem |
| negate | binary.122-gls | gf2_122-gls | per-element | 1.17 ns | 1.16 ns .. 1.17 ns | per elem |
| negate | binary-lambda.122-gls | gf2_122-gls-lambda | per-element | 0.57 ns | 0.57 ns .. 0.58 ns | per elem |
| negate | binary-u.122-gls | gf2_122-gls-u | per-element | 0.56 ns | 0.56 ns .. 0.56 ns | per elem |
| negate | binary-w.122-gls | gf2_122-gls-w | per-element | 0.56 ns | 0.56 ns .. 0.56 ns | per elem |
| negate | binary-lambda.122 | gf2_122-lambda | per-element | 0.56 ns | 0.56 ns .. 0.57 ns | per elem |
| negate | binary-u.122 | gf2_122-u | per-element | 0.58 ns | 0.57 ns .. 0.58 ns | per elem |
| negate | binary-w.122 | gf2_122-w | per-element | 0.58 ns | 0.57 ns .. 0.58 ns | per elem |
| negate | binary.127 | gf2_127 | per-element | 1.20 ns | 1.19 ns .. 1.21 ns | per elem |
| negate | gf2_127/affine (y += x) | gf2_127 | per-element | 0.56 ns | 0.56 ns .. 0.57 ns | per elem |
| negate | binary-lambda.127 | gf2_127-lambda | per-element | 0.56 ns | 0.56 ns .. 0.56 ns | per elem |
| negate | binary-u.127 | gf2_127-u | per-element | 0.56 ns | 0.56 ns .. 0.56 ns | per elem |
| negate | binary-w.127 | gf2_127-w | per-element | 0.56 ns | 0.56 ns .. 0.56 ns | per elem |
| negate | edwards.107 | edwards107 | per-element | 1.40 ns | 1.39 ns .. 1.40 ns | per elem |
| negate | edwards107/extended (-X, -T) | edwards107 | per-element | 1.74 ns | 1.74 ns .. 1.75 ns | per elem |
| negate | edwards.127 | edwards127 | per-element | 1.98 ns | 1.97 ns .. 1.98 ns | per elem |
| negate | edwards127/extended (-X, -T) | edwards127 | per-element | 2.17 ns | 2.16 ns .. 2.18 ns | per elem |
| negate | edwards.61x2 | edwards61x2 | per-element | 0.78 ns | 0.77 ns .. 0.78 ns | per elem |
| negate | twisted.goldilocks2 | twisted-goldilocks2 | per-element | 1.32 ns | 1.31 ns .. 1.32 ns | per elem |
| negate | twisted.128 | twisted128 | per-element | 1.15 ns | 1.14 ns .. 1.15 ns | per elem |
| negate | twisted.61x2 | twisted61x2 | per-element | 0.73 ns | 0.71 ns .. 0.76 ns | per elem |
| negate | twisted.64x2 | twisted64x2 | per-element | 0.73 ns | 0.71 ns .. 0.76 ns | per elem |
| negate | weier.107 | weier107 | per-element | 0.82 ns | 0.82 ns .. 0.82 ns | per elem |
| negate | weier107/projective (-Y) | weier107 | per-element | 1.18 ns | 1.17 ns .. 1.19 ns | per elem |
| negate | weier-jacobian.107 | weier107-jacobian | per-element | 0.82 ns | 0.82 ns .. 0.83 ns | per elem |
| negate | weier.127 | weier127 | per-element | 1.10 ns | 1.09 ns .. 1.10 ns | per elem |
| negate | weier127/projective (-Y) | weier127 | per-element | 1.19 ns | 1.18 ns .. 1.19 ns | per elem |
| negate | weier-jacobian.127 | weier127-jacobian | per-element | 1.10 ns | 1.10 ns .. 1.10 ns | per elem |
| negate | weier.61x2 | weier61x2 | per-element | 0.57 ns | 0.57 ns .. 0.57 ns | per elem |
| negate | weier-jacobian.61x2 | weier61x2-jacobian | per-element | 0.57 ns | 0.57 ns .. 0.57 ns | per elem |
| negate | ristretto255/-P | ristretto255 | per-element | 6.47 ns | 6.38 ns .. 6.56 ns | per elem |
| negate | secp256k1/PublicKey::negate | secp256k1 | per-element | 24.7 ns | 24.5 ns .. 24.8 ns | per elem |
| is identity | binary.109 | gf2_109 | per-element | 0.94 ns | 0.94 ns .. 0.94 ns | per elem |
| is identity | binary-lambda.109 | gf2_109-lambda | per-element | 0.80 ns | 0.80 ns .. 0.80 ns | per elem |
| is identity | binary-u.109 | gf2_109-u | per-element | 0.80 ns | 0.80 ns .. 0.80 ns | per elem |
| is identity | binary-w.109 | gf2_109-w | per-element | 0.80 ns | 0.80 ns .. 0.80 ns | per elem |
| is identity | binary.122 | gf2_122 | per-element | 0.87 ns | 0.87 ns .. 0.88 ns | per elem |
| is identity | binary.122-gls | gf2_122-gls | per-element | 0.87 ns | 0.87 ns .. 0.88 ns | per elem |
| is identity | binary-lambda.122-gls | gf2_122-gls-lambda | per-element | 0.80 ns | 0.80 ns .. 0.81 ns | per elem |
| is identity | binary-u.122-gls | gf2_122-gls-u | per-element | 0.80 ns | 0.80 ns .. 0.80 ns | per elem |
| is identity | binary-w.122-gls | gf2_122-gls-w | per-element | 0.81 ns | 0.81 ns .. 0.81 ns | per elem |
| is identity | binary-lambda.122 | gf2_122-lambda | per-element | 0.81 ns | 0.81 ns .. 0.81 ns | per elem |
| is identity | binary-u.122 | gf2_122-u | per-element | 0.85 ns | 0.84 ns .. 0.85 ns | per elem |
| is identity | binary-w.122 | gf2_122-w | per-element | 0.84 ns | 0.83 ns .. 0.85 ns | per elem |
| is identity | binary.127 | gf2_127 | per-element | 1.02 ns | 1.01 ns .. 1.02 ns | per elem |
| is identity | binary-lambda.127 | gf2_127-lambda | per-element | 0.82 ns | 0.82 ns .. 0.83 ns | per elem |
| is identity | binary-u.127 | gf2_127-u | per-element | 0.83 ns | 0.83 ns .. 0.84 ns | per elem |
| is identity | binary-w.127 | gf2_127-w | per-element | 0.82 ns | 0.81 ns .. 0.82 ns | per elem |
| is identity | edwards.107 | edwards107 | per-element | 1.18 ns | 1.18 ns .. 1.19 ns | per elem |
| is identity | edwards.127 | edwards127 | per-element | 1.30 ns | 1.30 ns .. 1.31 ns | per elem |
| is identity | edwards.61x2 | edwards61x2 | per-element | 0.54 ns | 0.53 ns .. 0.55 ns | per elem |
| is identity | twisted.goldilocks2 | twisted-goldilocks2 | per-element | 0.60 ns | 0.59 ns .. 0.60 ns | per elem |
| is identity | twisted.128 | twisted128 | per-element | 0.50 ns | 0.50 ns .. 0.50 ns | per elem |
| is identity | twisted.61x2 | twisted61x2 | per-element | 0.50 ns | 0.50 ns .. 0.50 ns | per elem |
| is identity | twisted.64x2 | twisted64x2 | per-element | 0.50 ns | 0.50 ns .. 0.51 ns | per elem |
| is identity | weier.107 | weier107 | per-element | 0.91 ns | 0.90 ns .. 0.91 ns | per elem |
| is identity | weier-jacobian.107 | weier107-jacobian | per-element | 0.90 ns | 0.90 ns .. 0.90 ns | per elem |
| is identity | weier.127 | weier127 | per-element | 0.40 ns | 0.40 ns .. 0.41 ns | per elem |
| is identity | weier-jacobian.127 | weier127-jacobian | per-element | 0.40 ns | 0.40 ns .. 0.41 ns | per elem |
| is identity | weier.61x2 | weier61x2 | per-element | 0.41 ns | 0.40 ns .. 0.41 ns | per elem |
| is identity | weier-jacobian.61x2 | weier61x2-jacobian | per-element | 0.40 ns | 0.40 ns .. 0.40 ns | per elem |
| equals addend | binary.109/mode=match | gf2_109 | match | 4.05 ns | 4.04 ns .. 4.06 ns | per elem |
| equals addend | binary.109/mode=mismatch | gf2_109 | mismatch | 4.07 ns | 4.06 ns .. 4.08 ns | per elem |
| equals addend | binary-lambda.109/mode=match | gf2_109-lambda | match | 3.96 ns | 3.94 ns .. 3.97 ns | per elem |
| equals addend | binary-lambda.109/mode=mismatch | gf2_109-lambda | mismatch | 3.94 ns | 3.93 ns .. 3.95 ns | per elem |
| equals addend | binary-u.109/mode=match | gf2_109-u | match | 5.84 ns | 5.83 ns .. 5.86 ns | per elem |
| equals addend | binary-u.109/mode=mismatch | gf2_109-u | mismatch | 5.82 ns | 5.81 ns .. 5.83 ns | per elem |
| equals addend | binary-w.109/mode=match | gf2_109-w | match | 4.16 ns | 4.15 ns .. 4.18 ns | per elem |
| equals addend | binary-w.109/mode=mismatch | gf2_109-w | mismatch | 4.13 ns | 4.12 ns .. 4.14 ns | per elem |
| equals addend | binary.122/mode=match | gf2_122 | match | 4.07 ns | 4.05 ns .. 4.08 ns | per elem |
| equals addend | binary.122/mode=mismatch | gf2_122 | mismatch | 4.05 ns | 4.04 ns .. 4.06 ns | per elem |
| equals addend | binary.122-gls/mode=match | gf2_122-gls | match | 4.06 ns | 4.05 ns .. 4.07 ns | per elem |
| equals addend | binary.122-gls/mode=mismatch | gf2_122-gls | mismatch | 4.08 ns | 4.06 ns .. 4.10 ns | per elem |
| equals addend | binary-lambda.122-gls/mode=match | gf2_122-gls-lambda | match | 4.20 ns | 4.19 ns .. 4.21 ns | per elem |
| equals addend | binary-lambda.122-gls/mode=mismatch | gf2_122-gls-lambda | mismatch | 4.37 ns | 4.35 ns .. 4.39 ns | per elem |
| equals addend | binary-u.122-gls/mode=match | gf2_122-gls-u | match | 5.60 ns | 5.58 ns .. 5.61 ns | per elem |
| equals addend | binary-u.122-gls/mode=mismatch | gf2_122-gls-u | mismatch | 5.64 ns | 5.62 ns .. 5.65 ns | per elem |
| equals addend | binary-w.122-gls/mode=match | gf2_122-gls-w | match | 4.23 ns | 4.22 ns .. 4.25 ns | per elem |
| equals addend | binary-w.122-gls/mode=mismatch | gf2_122-gls-w | mismatch | 4.26 ns | 4.24 ns .. 4.28 ns | per elem |
| equals addend | binary-lambda.122/mode=match | gf2_122-lambda | match | 4.21 ns | 4.20 ns .. 4.23 ns | per elem |
| equals addend | binary-lambda.122/mode=mismatch | gf2_122-lambda | mismatch | 4.23 ns | 4.22 ns .. 4.24 ns | per elem |
| equals addend | binary-u.122/mode=match | gf2_122-u | match | 5.59 ns | 5.58 ns .. 5.60 ns | per elem |
| equals addend | binary-u.122/mode=mismatch | gf2_122-u | mismatch | 5.97 ns | 5.92 ns .. 6.03 ns | per elem |
| equals addend | binary-w.122/mode=match | gf2_122-w | match | 4.23 ns | 4.22 ns .. 4.24 ns | per elem |
| equals addend | binary-w.122/mode=mismatch | gf2_122-w | mismatch | 4.41 ns | 4.38 ns .. 4.45 ns | per elem |
| equals addend | binary.127/mode=match | gf2_127 | match | 3.97 ns | 3.96 ns .. 3.98 ns | per elem |
| equals addend | binary.127/mode=mismatch | gf2_127 | mismatch | 4.25 ns | 4.21 ns .. 4.30 ns | per elem |
| equals addend | binary-lambda.127/mode=match | gf2_127-lambda | match | 3.95 ns | 3.94 ns .. 3.96 ns | per elem |
| equals addend | binary-lambda.127/mode=mismatch | gf2_127-lambda | mismatch | 4.05 ns | 4.04 ns .. 4.06 ns | per elem |
| equals addend | binary-u.127/mode=match | gf2_127-u | match | 6.31 ns | 6.29 ns .. 6.33 ns | per elem |
| equals addend | binary-u.127/mode=mismatch | gf2_127-u | mismatch | 6.44 ns | 6.41 ns .. 6.46 ns | per elem |
| equals addend | binary-w.127/mode=match | gf2_127-w | match | 4.04 ns | 4.03 ns .. 4.04 ns | per elem |
| equals addend | binary-w.127/mode=mismatch | gf2_127-w | mismatch | 4.05 ns | 4.04 ns .. 4.06 ns | per elem |
| equals addend | edwards.107/mode=mismatch | edwards107 | mismatch | 4.93 ns | 4.91 ns .. 4.95 ns | per elem |
| equals addend | edwards.127/mode=mismatch | edwards127 | mismatch | 3.16 ns | 3.15 ns .. 3.17 ns | per elem |
| equals addend | edwards.61x2/mode=mismatch | edwards61x2 | mismatch | 2.97 ns | 2.96 ns .. 2.98 ns | per elem |
| equals addend | twisted.goldilocks2/mode=mismatch | twisted-goldilocks2 | mismatch | 9.42 ns | 9.36 ns .. 9.50 ns | per elem |
| equals addend | twisted.128/mode=mismatch | twisted128 | mismatch | 9.45 ns | 9.43 ns .. 9.47 ns | per elem |
| equals addend | twisted.61x2/mode=match | twisted61x2 | match | 8.55 ns | 8.54 ns .. 8.57 ns | per elem |
| equals addend | twisted.61x2/mode=mismatch | twisted61x2 | mismatch | 8.85 ns | 8.79 ns .. 8.91 ns | per elem |
| equals addend | twisted.64x2/mode=mismatch | twisted64x2 | mismatch | 7.68 ns | 7.65 ns .. 7.71 ns | per elem |
| equals addend | weier.107/mode=mismatch | weier107 | mismatch | 5.81 ns | 5.80 ns .. 5.83 ns | per elem |
| equals addend | weier-jacobian.107/mode=mismatch | weier107-jacobian | mismatch | 9.23 ns | 9.20 ns .. 9.26 ns | per elem |
| equals addend | weier.127/mode=mismatch | weier127 | mismatch | 3.53 ns | 3.52 ns .. 3.54 ns | per elem |
| equals addend | weier-jacobian.127/mode=mismatch | weier127-jacobian | mismatch | 6.60 ns | 6.58 ns .. 6.62 ns | per elem |
| equals addend | weier.61x2/mode=mismatch | weier61x2 | mismatch | 3.33 ns | 3.32 ns .. 3.34 ns | per elem |
| equals addend | weier-jacobian.61x2/mode=mismatch | weier61x2-jacobian | mismatch | 7.98 ns | 7.93 ns .. 8.03 ns | per elem |
| encode | binary.109/mode=batch,n=1024 | gf2_109 | batch | 18.2 ns | 18.1 ns .. 18.3 ns | per elem |
| encode | binary.109/mode=batch,n=64 | gf2_109 | batch | 28.6 ns | 28.6 ns .. 28.7 ns | per elem |
| encode | binary.109/mode=batch,n=8 | gf2_109 | batch | 94.4 ns | 93.7 ns .. 95.4 ns | per elem |
| encode | binary.109/mode=indep | gf2_109 | per-element | 538 ns | 537 ns .. 540 ns | per elem |
| encode | binary-lambda.109/mode=batch,n=1024 | gf2_109-lambda | batch | 14.1 ns | 14.1 ns .. 14.2 ns | per elem |
| encode | binary-lambda.109/mode=batch,n=64 | gf2_109-lambda | batch | 24.8 ns | 24.7 ns .. 24.9 ns | per elem |
| encode | binary-lambda.109/mode=batch,n=8 | gf2_109-lambda | batch | 90.0 ns | 89.7 ns .. 90.3 ns | per elem |
| encode | binary-lambda.109/mode=indep | gf2_109-lambda | per-element | 530 ns | 529 ns .. 532 ns | per elem |
| encode | binary-u.109/mode=batch,n=1024 | gf2_109-u | batch | 21.9 ns | 21.9 ns .. 22.0 ns | per elem |
| encode | binary-u.109/mode=batch,n=64 | gf2_109-u | batch | 31.7 ns | 31.6 ns .. 31.8 ns | per elem |
| encode | binary-u.109/mode=batch,n=8 | gf2_109-u | batch | 97.1 ns | 96.8 ns .. 97.4 ns | per elem |
| encode | binary-u.109/mode=indep | gf2_109-u | per-element | 546 ns | 545 ns .. 548 ns | per elem |
| encode | binary-w.109/mode=batch,n=1024 | gf2_109-w | batch | 21.6 ns | 21.6 ns .. 21.7 ns | per elem |
| encode | binary-w.109/mode=batch,n=64 | gf2_109-w | batch | 32.5 ns | 32.4 ns .. 32.6 ns | per elem |
| encode | binary-w.109/mode=batch,n=8 | gf2_109-w | batch | 96.0 ns | 95.7 ns .. 96.3 ns | per elem |
| encode | binary-w.109/mode=indep | gf2_109-w | per-element | 540 ns | 539 ns .. 541 ns | per elem |
| encode | binary.122/mode=batch,n=1024 | gf2_122 | batch | 22.1 ns | 22.0 ns .. 22.1 ns | per elem |
| encode | binary.122/mode=batch,n=64 | gf2_122 | batch | 28.9 ns | 28.8 ns .. 29.0 ns | per elem |
| encode | binary.122/mode=batch,n=8 | gf2_122 | batch | 66.6 ns | 66.4 ns .. 66.8 ns | per elem |
| encode | binary.122/mode=indep | gf2_122 | per-element | 294 ns | 294 ns .. 295 ns | per elem |
| encode | binary.122-gls/mode=batch,n=1024 | gf2_122-gls | batch | 21.1 ns | 21.0 ns .. 21.2 ns | per elem |
| encode | binary.122-gls/mode=batch,n=64 | gf2_122-gls | batch | 27.9 ns | 27.8 ns .. 28.0 ns | per elem |
| encode | binary.122-gls/mode=batch,n=8 | gf2_122-gls | batch | 65.6 ns | 65.5 ns .. 65.8 ns | per elem |
| encode | binary.122-gls/mode=indep | gf2_122-gls | per-element | 293 ns | 293 ns .. 294 ns | per elem |
| encode | binary-lambda.122-gls/mode=batch,n=1024 | gf2_122-gls-lambda | batch | 17.9 ns | 17.8 ns .. 17.9 ns | per elem |
| encode | binary-lambda.122-gls/mode=batch,n=64 | gf2_122-gls-lambda | batch | 24.5 ns | 24.4 ns .. 24.6 ns | per elem |
| encode | binary-lambda.122-gls/mode=batch,n=8 | gf2_122-gls-lambda | batch | 62.1 ns | 62.0 ns .. 62.2 ns | per elem |
| encode | binary-lambda.122-gls/mode=indep | gf2_122-gls-lambda | per-element | 297 ns | 296 ns .. 297 ns | per elem |
| encode | binary-u.122-gls/mode=batch,n=1024 | gf2_122-gls-u | batch | 18.0 ns | 18.0 ns .. 18.1 ns | per elem |
| encode | binary-u.122-gls/mode=batch,n=64 | gf2_122-gls-u | batch | 22.5 ns | 22.5 ns .. 22.5 ns | per elem |
| encode | binary-u.122-gls/mode=batch,n=8 | gf2_122-gls-u | batch | 61.2 ns | 61.0 ns .. 61.4 ns | per elem |
| encode | binary-u.122-gls/mode=indep | gf2_122-gls-u | per-element | 297 ns | 296 ns .. 299 ns | per elem |
| encode | binary-w.122-gls/mode=batch,n=1024 | gf2_122-gls-w | batch | 20.4 ns | 20.3 ns .. 20.5 ns | per elem |
| encode | binary-w.122-gls/mode=batch,n=64 | gf2_122-gls-w | batch | 27.2 ns | 27.2 ns .. 27.3 ns | per elem |
| encode | binary-w.122-gls/mode=batch,n=8 | gf2_122-gls-w | batch | 64.9 ns | 64.7 ns .. 65.0 ns | per elem |
| encode | binary-w.122-gls/mode=indep | gf2_122-gls-w | per-element | 297 ns | 296 ns .. 297 ns | per elem |
| encode | binary-lambda.122/mode=batch,n=1024 | gf2_122-lambda | batch | 17.3 ns | 17.2 ns .. 17.3 ns | per elem |
| encode | binary-lambda.122/mode=batch,n=64 | gf2_122-lambda | batch | 24.1 ns | 24.0 ns .. 24.1 ns | per elem |
| encode | binary-lambda.122/mode=batch,n=8 | gf2_122-lambda | batch | 61.7 ns | 61.6 ns .. 61.9 ns | per elem |
| encode | binary-lambda.122/mode=indep | gf2_122-lambda | per-element | 287 ns | 286 ns .. 288 ns | per elem |
| encode | binary-u.122/mode=batch,n=1024 | gf2_122-u | batch | 18.4 ns | 18.3 ns .. 18.5 ns | per elem |
| encode | binary-u.122/mode=batch,n=64 | gf2_122-u | batch | 22.5 ns | 22.4 ns .. 22.5 ns | per elem |
| encode | binary-u.122/mode=batch,n=8 | gf2_122-u | batch | 61.3 ns | 61.2 ns .. 61.5 ns | per elem |
| encode | binary-u.122/mode=indep | gf2_122-u | per-element | 305 ns | 304 ns .. 306 ns | per elem |
| encode | binary-w.122/mode=batch,n=1024 | gf2_122-w | batch | 21.2 ns | 21.0 ns .. 21.4 ns | per elem |
| encode | binary-w.122/mode=batch,n=64 | gf2_122-w | batch | 27.0 ns | 26.8 ns .. 27.1 ns | per elem |
| encode | binary-w.122/mode=batch,n=8 | gf2_122-w | batch | 64.3 ns | 64.1 ns .. 64.5 ns | per elem |
| encode | binary-w.122/mode=indep | gf2_122-w | per-element | 302 ns | 300 ns .. 303 ns | per elem |
| encode | binary.127/mode=batch,n=1024 | gf2_127 | batch | 22.7 ns | 22.5 ns .. 23.0 ns | per elem |
| encode | binary.127/mode=batch,n=64 | gf2_127 | batch | 25.6 ns | 25.5 ns .. 25.6 ns | per elem |
| encode | binary.127/mode=batch,n=8 | gf2_127 | batch | 46.0 ns | 45.9 ns .. 46.1 ns | per elem |
| encode | binary.127/mode=indep | gf2_127 | per-element | 151 ns | 149 ns .. 152 ns | per elem |
| encode | binary-lambda.127/mode=batch,n=1024 | gf2_127-lambda | batch | 17.5 ns | 17.4 ns .. 17.5 ns | per elem |
| encode | binary-lambda.127/mode=batch,n=64 | gf2_127-lambda | batch | 21.8 ns | 21.7 ns .. 21.8 ns | per elem |
| encode | binary-lambda.127/mode=batch,n=8 | gf2_127-lambda | batch | 42.0 ns | 41.9 ns .. 42.1 ns | per elem |
| encode | binary-lambda.127/mode=indep | gf2_127-lambda | per-element | 140 ns | 140 ns .. 141 ns | per elem |
| encode | binary-u.127/mode=batch,n=1024 | gf2_127-u | batch | 12.6 ns | 12.5 ns .. 12.6 ns | per elem |
| encode | binary-u.127/mode=batch,n=64 | gf2_127-u | batch | 16.3 ns | 16.2 ns .. 16.3 ns | per elem |
| encode | binary-u.127/mode=batch,n=8 | gf2_127-u | batch | 38.2 ns | 38.1 ns .. 38.3 ns | per elem |
| encode | binary-u.127/mode=indep | gf2_127-u | per-element | 137 ns | 137 ns .. 137 ns | per elem |
| encode | binary-w.127/mode=batch,n=1024 | gf2_127-w | batch | 17.0 ns | 17.0 ns .. 17.1 ns | per elem |
| encode | binary-w.127/mode=batch,n=64 | gf2_127-w | batch | 21.8 ns | 21.7 ns .. 21.9 ns | per elem |
| encode | binary-w.127/mode=batch,n=8 | gf2_127-w | batch | 42.1 ns | 41.9 ns .. 42.2 ns | per elem |
| encode | binary-w.127/mode=indep | gf2_127-w | per-element | 139 ns | 139 ns .. 140 ns | per elem |
| encode | edwards.107/mode=batch,n=1024 | edwards107 | batch | 35.1 ns | 35.0 ns .. 35.4 ns | per elem |
| encode | edwards.107/mode=indep | edwards107 | per-element | 600 ns | 599 ns .. 601 ns | per elem |
| encode | edwards.127/mode=batch,n=1024 | edwards127 | batch | 31.9 ns | 31.8 ns .. 32.0 ns | per elem |
| encode | edwards.127/mode=indep | edwards127 | per-element | 610 ns | 608 ns .. 611 ns | per elem |
| encode | edwards.61x2/mode=batch,n=1024 | edwards61x2 | batch | 35.0 ns | 34.9 ns .. 35.1 ns | per elem |
| encode | edwards.61x2/mode=indep | edwards61x2 | per-element | 203 ns | 202 ns .. 203 ns | per elem |
| encode | twisted.goldilocks2/mode=batch,n=1024 | twisted-goldilocks2 | batch | 22.9 ns | 22.9 ns .. 23.0 ns | per elem |
| encode | twisted.goldilocks2/mode=indep | twisted-goldilocks2 | per-element | 316 ns | 316 ns .. 316 ns | per elem |
| encode | twisted.128/mode=batch,n=1024 | twisted128 | batch | 22.7 ns | 22.7 ns .. 22.8 ns | per elem |
| encode | twisted.128/mode=indep | twisted128 | per-element | 943 ns | 942 ns .. 946 ns | per elem |
| encode | twisted.61x2/mode=batch,n=1024 | twisted61x2 | batch | 14.9 ns | 14.9 ns .. 15.0 ns | per elem |
| encode | twisted.61x2/mode=batch,n=64 | twisted61x2 | batch | 21.1 ns | 21.1 ns .. 21.2 ns | per elem |
| encode | twisted.61x2/mode=batch,n=8 | twisted61x2 | batch | 49.3 ns | 49.3 ns .. 49.4 ns | per elem |
| encode | twisted.61x2/mode=indep | twisted61x2 | per-element | 189 ns | 189 ns .. 190 ns | per elem |
| encode | twisted.64x2/mode=batch,n=1024 | twisted64x2 | batch | 22.6 ns | 22.5 ns .. 22.7 ns | per elem |
| encode | twisted.64x2/mode=indep | twisted64x2 | per-element | 267 ns | 266 ns .. 268 ns | per elem |
| encode | weier.107/mode=batch,n=1024 | weier107 | batch | 19.4 ns | 19.3 ns .. 19.5 ns | per elem |
| encode | weier.107/mode=indep | weier107 | per-element | 582 ns | 579 ns .. 584 ns | per elem |
| encode | weier-jacobian.107/mode=batch,n=1024 | weier107-jacobian | batch | 25.5 ns | 25.4 ns .. 25.6 ns | per elem |
| encode | weier-jacobian.107/mode=indep | weier107-jacobian | per-element | 580 ns | 578 ns .. 581 ns | per elem |
| encode | weier.127/mode=batch,n=1024 | weier127 | batch | 16.7 ns | 16.7 ns .. 16.8 ns | per elem |
| encode | weier.127/mode=indep | weier127 | per-element | 593 ns | 591 ns .. 594 ns | per elem |
| encode | weier-jacobian.127/mode=batch,n=1024 | weier127-jacobian | batch | 23.6 ns | 23.5 ns .. 23.7 ns | per elem |
| encode | weier-jacobian.127/mode=indep | weier127-jacobian | per-element | 605 ns | 602 ns .. 609 ns | per elem |
| encode | weier.61x2/mode=batch,n=1024 | weier61x2 | batch | 15.3 ns | 15.2 ns .. 15.3 ns | per elem |
| encode | weier.61x2/mode=indep | weier61x2 | per-element | 190 ns | 190 ns .. 191 ns | per elem |
| encode | weier-jacobian.61x2/mode=batch,n=1024 | weier61x2-jacobian | batch | 24.8 ns | 24.7 ns .. 24.9 ns | per elem |
| encode | weier-jacobian.61x2/mode=indep | weier61x2-jacobian | per-element | 198 ns | 198 ns .. 199 ns | per elem |
| decode | binary.109/mode=batch,n=1024 | gf2_109 | batch | 26.7 ns | 26.6 ns .. 26.8 ns | per elem |
| decode | binary.109/mode=batch,n=64 | gf2_109 | batch | 38.7 ns | 38.6 ns .. 38.8 ns | per elem |
| decode | binary.109/mode=batch,n=8 | gf2_109 | batch | 108 ns | 108 ns .. 108 ns | per elem |
| decode | binary.109/mode=indep | gf2_109 | per-element | 554 ns | 553 ns .. 556 ns | per elem |
| decode | binary-lambda.109/mode=batch,n=1024 | gf2_109-lambda | batch | 26.5 ns | 26.4 ns .. 26.5 ns | per elem |
| decode | binary-lambda.109/mode=batch,n=64 | gf2_109-lambda | batch | 39.1 ns | 38.9 ns .. 39.2 ns | per elem |
| decode | binary-lambda.109/mode=batch,n=8 | gf2_109-lambda | batch | 109 ns | 108 ns .. 109 ns | per elem |
| decode | binary-lambda.109/mode=indep | gf2_109-lambda | per-element | 549 ns | 548 ns .. 551 ns | per elem |
| decode | binary-u.109/mode=batch,n=1024 | gf2_109-u | batch | 27.7 ns | 27.7 ns .. 27.8 ns | per elem |
| decode | binary-u.109/mode=batch,n=64 | gf2_109-u | batch | 40.3 ns | 40.1 ns .. 40.4 ns | per elem |
| decode | binary-u.109/mode=batch,n=8 | gf2_109-u | batch | 109 ns | 108 ns .. 109 ns | per elem |
| decode | binary-u.109/mode=indep | gf2_109-u | per-element | 555 ns | 555 ns .. 556 ns | per elem |
| decode | binary-w.109/mode=batch,n=1024 | gf2_109-w | batch | 24.4 ns | 24.3 ns .. 24.4 ns | per elem |
| decode | binary-w.109/mode=batch,n=64 | gf2_109-w | batch | 36.8 ns | 36.7 ns .. 37.0 ns | per elem |
| decode | binary-w.109/mode=batch,n=8 | gf2_109-w | batch | 105 ns | 105 ns .. 106 ns | per elem |
| decode | binary-w.109/mode=indep | gf2_109-w | per-element | 555 ns | 553 ns .. 556 ns | per elem |
| decode | binary.122/mode=batch,n=1024 | gf2_122 | batch | 24.0 ns | 23.9 ns .. 24.1 ns | per elem |
| decode | binary.122/mode=batch,n=64 | gf2_122 | batch | 32.4 ns | 32.3 ns .. 32.5 ns | per elem |
| decode | binary.122/mode=batch,n=8 | gf2_122 | batch | 73.5 ns | 73.4 ns .. 73.7 ns | per elem |
| decode | binary.122/mode=indep | gf2_122 | per-element | 313 ns | 312 ns .. 313 ns | per elem |
| decode | binary.122-gls/mode=batch,n=1024 | gf2_122-gls | batch | 22.7 ns | 22.6 ns .. 22.7 ns | per elem |
| decode | binary.122-gls/mode=batch,n=64 | gf2_122-gls | batch | 31.0 ns | 30.9 ns .. 31.1 ns | per elem |
| decode | binary.122-gls/mode=batch,n=8 | gf2_122-gls | batch | 71.5 ns | 71.4 ns .. 71.7 ns | per elem |
| decode | binary.122-gls/mode=indep | gf2_122-gls | per-element | 313 ns | 312 ns .. 313 ns | per elem |
| decode | binary-lambda.122-gls/mode=batch,n=1024 | gf2_122-gls-lambda | batch | 22.6 ns | 22.6 ns .. 22.7 ns | per elem |
| decode | binary-lambda.122-gls/mode=batch,n=64 | gf2_122-gls-lambda | batch | 32.1 ns | 32.0 ns .. 32.2 ns | per elem |
| decode | binary-lambda.122-gls/mode=batch,n=8 | gf2_122-gls-lambda | batch | 73.7 ns | 73.6 ns .. 73.9 ns | per elem |
| decode | binary-lambda.122-gls/mode=indep | gf2_122-gls-lambda | per-element | 311 ns | 310 ns .. 312 ns | per elem |
| decode | binary-u.122-gls/mode=batch,n=1024 | gf2_122-gls-u | batch | 24.7 ns | 24.6 ns .. 24.8 ns | per elem |
| decode | binary-u.122-gls/mode=batch,n=64 | gf2_122-gls-u | batch | 32.9 ns | 32.8 ns .. 33.0 ns | per elem |
| decode | binary-u.122-gls/mode=batch,n=8 | gf2_122-gls-u | batch | 73.8 ns | 73.6 ns .. 73.9 ns | per elem |
| decode | binary-u.122-gls/mode=indep | gf2_122-gls-u | per-element | 313 ns | 311 ns .. 314 ns | per elem |
| decode | binary-w.122-gls/mode=batch,n=1024 | gf2_122-gls-w | batch | 20.9 ns | 20.8 ns .. 21.0 ns | per elem |
| decode | binary-w.122-gls/mode=batch,n=64 | gf2_122-gls-w | batch | 29.1 ns | 29.1 ns .. 29.2 ns | per elem |
| decode | binary-w.122-gls/mode=batch,n=8 | gf2_122-gls-w | batch | 70.1 ns | 69.9 ns .. 70.2 ns | per elem |
| decode | binary-w.122-gls/mode=indep | gf2_122-gls-w | per-element | 305 ns | 304 ns .. 306 ns | per elem |
| decode | binary-lambda.122/mode=batch,n=1024 | gf2_122-lambda | batch | 24.1 ns | 24.0 ns .. 24.1 ns | per elem |
| decode | binary-lambda.122/mode=batch,n=64 | gf2_122-lambda | batch | 32.2 ns | 32.2 ns .. 32.3 ns | per elem |
| decode | binary-lambda.122/mode=batch,n=8 | gf2_122-lambda | batch | 73.1 ns | 72.9 ns .. 73.2 ns | per elem |
| decode | binary-lambda.122/mode=indep | gf2_122-lambda | per-element | 314 ns | 313 ns .. 314 ns | per elem |
| decode | binary-u.122/mode=batch,n=1024 | gf2_122-u | batch | 26.0 ns | 25.8 ns .. 26.2 ns | per elem |
| decode | binary-u.122/mode=batch,n=64 | gf2_122-u | batch | 33.6 ns | 33.6 ns .. 33.7 ns | per elem |
| decode | binary-u.122/mode=batch,n=8 | gf2_122-u | batch | 74.7 ns | 74.6 ns .. 74.8 ns | per elem |
| decode | binary-u.122/mode=indep | gf2_122-u | per-element | 317 ns | 315 ns .. 319 ns | per elem |
| decode | binary-w.122/mode=batch,n=1024 | gf2_122-w | batch | 21.6 ns | 21.5 ns .. 21.7 ns | per elem |
| decode | binary-w.122/mode=batch,n=64 | gf2_122-w | batch | 29.8 ns | 29.7 ns .. 29.9 ns | per elem |
| decode | binary-w.122/mode=batch,n=8 | gf2_122-w | batch | 70.9 ns | 70.7 ns .. 71.1 ns | per elem |
| decode | binary-w.122/mode=indep | gf2_122-w | per-element | 307 ns | 306 ns .. 308 ns | per elem |
| decode | binary.127/mode=batch,n=1024 | gf2_127 | batch | 25.7 ns | 25.6 ns .. 25.7 ns | per elem |
| decode | binary.127/mode=batch,n=64 | gf2_127 | batch | 29.6 ns | 29.5 ns .. 29.6 ns | per elem |
| decode | binary.127/mode=batch,n=8 | gf2_127 | batch | 54.2 ns | 54.1 ns .. 54.3 ns | per elem |
| decode | binary.127/mode=indep | gf2_127 | per-element | 164 ns | 163 ns .. 164 ns | per elem |
| decode | binary-lambda.127/mode=batch,n=1024 | gf2_127-lambda | batch | 24.0 ns | 24.0 ns .. 24.1 ns | per elem |
| decode | binary-lambda.127/mode=batch,n=64 | gf2_127-lambda | batch | 29.7 ns | 29.7 ns .. 29.8 ns | per elem |
| decode | binary-lambda.127/mode=batch,n=8 | gf2_127-lambda | batch | 54.2 ns | 54.2 ns .. 54.3 ns | per elem |
| decode | binary-lambda.127/mode=indep | gf2_127-lambda | per-element | 155 ns | 154 ns .. 155 ns | per elem |
| decode | binary-u.127/mode=batch,n=1024 | gf2_127-u | batch | 27.5 ns | 27.5 ns .. 27.6 ns | per elem |
| decode | binary-u.127/mode=batch,n=64 | gf2_127-u | batch | 32.8 ns | 32.7 ns .. 32.9 ns | per elem |
| decode | binary-u.127/mode=batch,n=8 | gf2_127-u | batch | 57.6 ns | 57.4 ns .. 57.8 ns | per elem |
| decode | binary-u.127/mode=indep | gf2_127-u | per-element | 162 ns | 161 ns .. 162 ns | per elem |
| decode | binary-w.127/mode=batch,n=1024 | gf2_127-w | batch | 22.6 ns | 22.5 ns .. 22.6 ns | per elem |
| decode | binary-w.127/mode=batch,n=64 | gf2_127-w | batch | 28.8 ns | 28.7 ns .. 28.9 ns | per elem |
| decode | binary-w.127/mode=batch,n=8 | gf2_127-w | batch | 55.2 ns | 55.1 ns .. 55.4 ns | per elem |
| decode | binary-w.127/mode=indep | gf2_127-w | per-element | 155 ns | 154 ns .. 155 ns | per elem |
| decode | edwards.107/mode=batch,n=1024 | edwards107 | batch | 426 ns | 424 ns .. 427 ns | per elem |
| decode | edwards.107/mode=indep | edwards107 | per-element | 424 ns | 423 ns .. 426 ns | per elem |
| decode | edwards.127/mode=batch,n=1024 | edwards127 | batch | 541 ns | 540 ns .. 543 ns | per elem |
| decode | edwards.127/mode=indep | edwards127 | per-element | 540 ns | 539 ns .. 541 ns | per elem |
| decode | edwards.61x2/mode=batch,n=1024 | edwards61x2 | batch | 441 ns | 439 ns .. 442 ns | per elem |
| decode | edwards.61x2/mode=indep | edwards61x2 | per-element | 437 ns | 436 ns .. 439 ns | per elem |
| decode | twisted.goldilocks2/mode=batch,n=1024 | twisted-goldilocks2 | batch | 1.92 µs | 1.92 µs .. 1.93 µs | per elem |
| decode | twisted.goldilocks2/mode=indep | twisted-goldilocks2 | per-element | 1.91 µs | 1.91 µs .. 1.91 µs | per elem |
| decode | twisted.128/mode=batch,n=1024 | twisted128 | batch | 962 ns | 960 ns .. 965 ns | per elem |
| decode | twisted.128/mode=indep | twisted128 | per-element | 960 ns | 959 ns .. 962 ns | per elem |
| decode | twisted.61x2/mode=batch,n=1024 | twisted61x2 | batch | 450 ns | 449 ns .. 451 ns | per elem |
| decode | twisted.61x2/mode=batch,n=64 | twisted61x2 | batch | 447 ns | 446 ns .. 447 ns | per elem |
| decode | twisted.61x2/mode=batch,n=8 | twisted61x2 | batch | 448 ns | 447 ns .. 449 ns | per elem |
| decode | twisted.61x2/mode=indep | twisted61x2 | per-element | 448 ns | 447 ns .. 449 ns | per elem |
| decode | twisted.64x2/mode=batch,n=1024 | twisted64x2 | batch | 647 ns | 646 ns .. 649 ns | per elem |
| decode | twisted.64x2/mode=indep | twisted64x2 | per-element | 650 ns | 648 ns .. 652 ns | per elem |
| decode | weier.107/mode=batch,n=1024 | weier107 | batch | 422 ns | 421 ns .. 423 ns | per elem |
| decode | weier.107/mode=indep | weier107 | per-element | 421 ns | 420 ns .. 422 ns | per elem |
| decode | weier-jacobian.107/mode=batch,n=1024 | weier107-jacobian | batch | 421 ns | 420 ns .. 422 ns | per elem |
| decode | weier-jacobian.107/mode=indep | weier107-jacobian | per-element | 419 ns | 418 ns .. 421 ns | per elem |
| decode | weier.127/mode=batch,n=1024 | weier127 | batch | 539 ns | 538 ns .. 541 ns | per elem |
| decode | weier.127/mode=indep | weier127 | per-element | 541 ns | 540 ns .. 543 ns | per elem |
| decode | weier-jacobian.127/mode=batch,n=1024 | weier127-jacobian | batch | 542 ns | 541 ns .. 543 ns | per elem |
| decode | weier-jacobian.127/mode=indep | weier127-jacobian | per-element | 543 ns | 541 ns .. 545 ns | per elem |
| decode | weier.61x2/mode=batch,n=1024 | weier61x2 | batch | 448 ns | 447 ns .. 449 ns | per elem |
| decode | weier.61x2/mode=indep | weier61x2 | per-element | 441 ns | 440 ns .. 442 ns | per elem |
| decode | weier-jacobian.61x2/mode=batch,n=1024 | weier61x2-jacobian | batch | 445 ns | 444 ns .. 446 ns | per elem |
| decode | weier-jacobian.61x2/mode=indep | weier61x2-jacobian | per-element | 440 ns | 439 ns .. 441 ns | per elem |
| normalize | gf2_109/normalize, batched | gf2_109 | batch | 16.4 ns | 16.3 ns .. 16.4 ns | per elem |
| normalize | gf2_122/normalize, batched | gf2_122 | batch | 17.2 ns | 17.2 ns .. 17.3 ns | per elem |
| normalize | gf2_122-gls/normalize, batched | gf2_122-gls | batch | 16.3 ns | 16.2 ns .. 16.3 ns | per elem |
| batch sum | gf2_109/batch affine (tree sum) | gf2_109 | batch | 21.4 ns | 21.4 ns .. 21.5 ns | per elem |
| batch sum | gf2_122/batch affine (tree sum) | gf2_122 | batch | 18.7 ns | 18.7 ns .. 18.8 ns | per elem |
| batch sum | gf2_127/batch affine (tree sum) | gf2_127 | batch | 16.2 ns | 16.1 ns .. 16.2 ns | per elem |
| batch sum | edwards107/batch montgomery affine (tree sum) | edwards107 | batch | 36.7 ns | 36.5 ns .. 36.8 ns | per elem |
| batch sum | edwards127/batch montgomery affine (tree sum) | edwards127 | batch | 40.8 ns | 40.7 ns .. 40.9 ns | per elem |
| batch sum | weier107/batch affine (tree sum) | weier107 | batch | 35.9 ns | 35.8 ns .. 36.1 ns | per elem |
| batch sum | weier127/batch affine (tree sum) | weier127 | batch | 39.3 ns | 39.1 ns .. 39.4 ns | per elem |
| batch sum | secp256k1/combine_keys (jacobian += affine) | secp256k1 | batch | 162 ns | 162 ns .. 163 ns | per elem |
hash to curve
Figure
262 benchmarks
| operation | benchmark | family | mode | time | 95% CI | unit |
|---|---|---|---|---|---|---|
| hash to curve | sha256 (XOR baseline) | xor | per-element | 53.4 ns | 52.9 ns .. 53.9 ns | per elem |
| hash to curve | binary.109/mode=batch,n=1024 | gf2_109 | batch | 126 ns | 125 ns .. 127 ns | per elem |
| hash to curve | binary.109/mode=batch,n=64 | gf2_109 | batch | 195 ns | 194 ns .. 195 ns | per elem |
| hash to curve | binary.109/mode=batch,n=8 | gf2_109 | batch | 431 ns | 430 ns .. 432 ns | per elem |
| hash to curve | binary.109/mode=indep | gf2_109 | per-element | 1.16 µs | 1.16 µs .. 1.17 µs | per elem |
| hash to curve | binary-lambda.109/mode=batch,n=1024 | gf2_109-lambda | batch | 124 ns | 124 ns .. 125 ns | per elem |
| hash to curve | binary-lambda.109/mode=batch,n=64 | gf2_109-lambda | batch | 195 ns | 194 ns .. 195 ns | per elem |
| hash to curve | binary-lambda.109/mode=batch,n=8 | gf2_109-lambda | batch | 431 ns | 430 ns .. 433 ns | per elem |
| hash to curve | binary-lambda.109/mode=indep | gf2_109-lambda | per-element | 1.16 µs | 1.16 µs .. 1.16 µs | per elem |
| hash to curve | binary-u.109/mode=batch,n=1024 | gf2_109-u | batch | 125 ns | 125 ns .. 125 ns | per elem |
| hash to curve | binary-u.109/mode=batch,n=64 | gf2_109-u | batch | 189 ns | 189 ns .. 190 ns | per elem |
| hash to curve | binary-u.109/mode=batch,n=8 | gf2_109-u | batch | 417 ns | 416 ns .. 419 ns | per elem |
| hash to curve | binary-u.109/mode=indep | gf2_109-u | per-element | 1.15 µs | 1.15 µs .. 1.16 µs | per elem |
| hash to curve | binary-w.109/mode=batch,n=1024 | gf2_109-w | batch | 120 ns | 119 ns .. 121 ns | per elem |
| hash to curve | binary-w.109/mode=batch,n=64 | gf2_109-w | batch | 183 ns | 182 ns .. 183 ns | per elem |
| hash to curve | binary-w.109/mode=batch,n=8 | gf2_109-w | batch | 413 ns | 412 ns .. 415 ns | per elem |
| hash to curve | binary-w.109/mode=indep | gf2_109-w | per-element | 1.14 µs | 1.13 µs .. 1.14 µs | per elem |
| hash to curve | binary.122/mode=batch,n=1024 | gf2_122 | batch | 114 ns | 114 ns .. 114 ns | per elem |
| hash to curve | binary.122/mode=batch,n=64 | gf2_122 | batch | 155 ns | 155 ns .. 156 ns | per elem |
| hash to curve | binary.122/mode=batch,n=8 | gf2_122 | batch | 293 ns | 292 ns .. 294 ns | per elem |
| hash to curve | binary.122/mode=indep | gf2_122 | per-element | 670 ns | 669 ns .. 671 ns | per elem |
| hash to curve | binary.122-gls/mode=batch,n=1024 | gf2_122-gls | batch | 116 ns | 116 ns .. 117 ns | per elem |
| hash to curve | binary.122-gls/mode=batch,n=64 | gf2_122-gls | batch | 161 ns | 161 ns .. 162 ns | per elem |
| hash to curve | binary.122-gls/mode=batch,n=8 | gf2_122-gls | batch | 308 ns | 308 ns .. 309 ns | per elem |
| hash to curve | binary.122-gls/mode=indep | gf2_122-gls | per-element | 697 ns | 693 ns .. 702 ns | per elem |
| hash to curve | binary-lambda.122-gls/mode=batch,n=1024 | gf2_122-gls-lambda | batch | 116 ns | 115 ns .. 116 ns | per elem |
| hash to curve | binary-lambda.122-gls/mode=batch,n=64 | gf2_122-gls-lambda | batch | 161 ns | 161 ns .. 161 ns | per elem |
| hash to curve | binary-lambda.122-gls/mode=batch,n=8 | gf2_122-gls-lambda | batch | 306 ns | 306 ns .. 307 ns | per elem |
| hash to curve | binary-lambda.122-gls/mode=indep | gf2_122-gls-lambda | per-element | 692 ns | 688 ns .. 696 ns | per elem |
| hash to curve | binary-u.122-gls/mode=batch,n=1024 | gf2_122-gls-u | batch | 121 ns | 120 ns .. 121 ns | per elem |
| hash to curve | binary-u.122-gls/mode=batch,n=64 | gf2_122-gls-u | batch | 165 ns | 165 ns .. 166 ns | per elem |
| hash to curve | binary-u.122-gls/mode=batch,n=8 | gf2_122-gls-u | batch | 298 ns | 298 ns .. 299 ns | per elem |
| hash to curve | binary-u.122-gls/mode=indep | gf2_122-gls-u | per-element | 678 ns | 676 ns .. 680 ns | per elem |
| hash to curve | binary-w.122-gls/mode=batch,n=1024 | gf2_122-gls-w | batch | 116 ns | 115 ns .. 116 ns | per elem |
| hash to curve | binary-w.122-gls/mode=batch,n=64 | gf2_122-gls-w | batch | 161 ns | 160 ns .. 161 ns | per elem |
| hash to curve | binary-w.122-gls/mode=batch,n=8 | gf2_122-gls-w | batch | 303 ns | 303 ns .. 304 ns | per elem |
| hash to curve | binary-w.122-gls/mode=indep | gf2_122-gls-w | per-element | 659 ns | 658 ns .. 660 ns | per elem |
| hash to curve | binary-lambda.122/mode=batch,n=1024 | gf2_122-lambda | batch | 115 ns | 115 ns .. 116 ns | per elem |
| hash to curve | binary-lambda.122/mode=batch,n=64 | gf2_122-lambda | batch | 156 ns | 156 ns .. 157 ns | per elem |
| hash to curve | binary-lambda.122/mode=batch,n=8 | gf2_122-lambda | batch | 294 ns | 294 ns .. 295 ns | per elem |
| hash to curve | binary-lambda.122/mode=indep | gf2_122-lambda | per-element | 679 ns | 677 ns .. 680 ns | per elem |
| hash to curve | binary-u.122/mode=batch,n=1024 | gf2_122-u | batch | 127 ns | 125 ns .. 128 ns | per elem |
| hash to curve | binary-u.122/mode=batch,n=64 | gf2_122-u | batch | 164 ns | 164 ns .. 165 ns | per elem |
| hash to curve | binary-u.122/mode=batch,n=8 | gf2_122-u | batch | 301 ns | 301 ns .. 302 ns | per elem |
| hash to curve | binary-u.122/mode=indep | gf2_122-u | per-element | 674 ns | 672 ns .. 676 ns | per elem |
| hash to curve | binary-w.122/mode=batch,n=1024 | gf2_122-w | batch | 116 ns | 116 ns .. 117 ns | per elem |
| hash to curve | binary-w.122/mode=batch,n=64 | gf2_122-w | batch | 156 ns | 156 ns .. 156 ns | per elem |
| hash to curve | binary-w.122/mode=batch,n=8 | gf2_122-w | batch | 294 ns | 294 ns .. 295 ns | per elem |
| hash to curve | binary-w.122/mode=indep | gf2_122-w | per-element | 654 ns | 653 ns .. 656 ns | per elem |
| hash to curve | binary.127/mode=batch,n=1024 | gf2_127 | batch | 113 ns | 112 ns .. 113 ns | per elem |
| hash to curve | binary.127/mode=batch,n=64 | gf2_127 | batch | 137 ns | 136 ns .. 137 ns | per elem |
| hash to curve | binary.127/mode=batch,n=8 | gf2_127 | batch | 200 ns | 199 ns .. 200 ns | per elem |
| hash to curve | binary.127/mode=indep | gf2_127 | per-element | 366 ns | 365 ns .. 368 ns | per elem |
| hash to curve | binary-lambda.127/mode=batch,n=1024 | gf2_127-lambda | batch | 114 ns | 114 ns .. 115 ns | per elem |
| hash to curve | binary-lambda.127/mode=batch,n=64 | gf2_127-lambda | batch | 137 ns | 137 ns .. 137 ns | per elem |
| hash to curve | binary-lambda.127/mode=batch,n=8 | gf2_127-lambda | batch | 204 ns | 203 ns .. 204 ns | per elem |
| hash to curve | binary-lambda.127/mode=indep | gf2_127-lambda | per-element | 394 ns | 392 ns .. 396 ns | per elem |
| hash to curve | binary-u.127/mode=batch,n=1024 | gf2_127-u | batch | 125 ns | 124 ns .. 125 ns | per elem |
| hash to curve | binary-u.127/mode=batch,n=64 | gf2_127-u | batch | 153 ns | 152 ns .. 153 ns | per elem |
| hash to curve | binary-u.127/mode=batch,n=8 | gf2_127-u | batch | 225 ns | 225 ns .. 226 ns | per elem |
| hash to curve | binary-u.127/mode=indep | gf2_127-u | per-element | 401 ns | 400 ns .. 403 ns | per elem |
| hash to curve | binary-w.127/mode=batch,n=1024 | gf2_127-w | batch | 119 ns | 119 ns .. 120 ns | per elem |
| hash to curve | binary-w.127/mode=batch,n=64 | gf2_127-w | batch | 145 ns | 145 ns .. 145 ns | per elem |
| hash to curve | binary-w.127/mode=batch,n=8 | gf2_127-w | batch | 219 ns | 218 ns .. 219 ns | per elem |
| hash to curve | binary-w.127/mode=indep | gf2_127-w | per-element | 392 ns | 391 ns .. 393 ns | per elem |
| hash to curve | edwards.107/mode=batch,n=1024 | edwards107 | batch | 916 ns | 914 ns .. 919 ns | per elem |
| hash to curve | edwards.107/mode=indep | edwards107 | per-element | 919 ns | 916 ns .. 922 ns | per elem |
| hash to curve | edwards107/edwards-native try-and-increment | edwards107 | per-element | 1.31 µs | 1.31 µs .. 1.32 µs | per elem |
| hash to curve | edwards.127/mode=batch,n=1024 | edwards127 | batch | 1.24 µs | 1.23 µs .. 1.24 µs | per elem |
| hash to curve | edwards.127/mode=indep | edwards127 | per-element | 1.22 µs | 1.22 µs .. 1.23 µs | per elem |
| hash to curve | edwards127/edwards-native try-and-increment | edwards127 | per-element | 1.29 µs | 1.28 µs .. 1.29 µs | per elem |
| hash to curve | edwards.61x2/mode=batch,n=1024 | edwards61x2 | batch | 706 ns | 704 ns .. 708 ns | per elem |
| hash to curve | edwards.61x2/mode=indep | edwards61x2 | per-element | 707 ns | 705 ns .. 708 ns | per elem |
| hash to curve | twisted.goldilocks2/mode=batch,n=1024 | twisted-goldilocks2 | batch | 2.24 µs | 2.23 µs .. 2.24 µs | per elem |
| hash to curve | twisted.goldilocks2/mode=indep | twisted-goldilocks2 | per-element | 2.21 µs | 2.21 µs .. 2.22 µs | per elem |
| hash to curve | twisted.128/mode=batch,n=1024 | twisted128 | batch | 1.96 µs | 1.96 µs .. 1.96 µs | per elem |
| hash to curve | twisted.128/mode=indep | twisted128 | per-element | 1.97 µs | 1.96 µs .. 1.97 µs | per elem |
| hash to curve | twisted.61x2/mode=batch,n=1024 | twisted61x2 | batch | 711 ns | 708 ns .. 713 ns | per elem |
| hash to curve | twisted.61x2/mode=batch,n=64 | twisted61x2 | batch | 703 ns | 702 ns .. 704 ns | per elem |
| hash to curve | twisted.61x2/mode=batch,n=8 | twisted61x2 | batch | 703 ns | 701 ns .. 705 ns | per elem |
| hash to curve | twisted.61x2/mode=indep | twisted61x2 | per-element | 706 ns | 704 ns .. 708 ns | per elem |
| hash to curve | twisted.64x2/mode=batch,n=1024 | twisted64x2 | batch | 1.00 µs | 1.00 µs .. 1.01 µs | per elem |
| hash to curve | twisted.64x2/mode=indep | twisted64x2 | per-element | 1.00 µs | 999 ns .. 1.01 µs | per elem |
| hash to curve | weier.107/mode=batch,n=1024 | weier107 | batch | 901 ns | 899 ns .. 904 ns | per elem |
| hash to curve | weier.107/mode=indep | weier107 | per-element | 892 ns | 890 ns .. 895 ns | per elem |
| hash to curve | weier-jacobian.107/mode=batch,n=1024 | weier107-jacobian | batch | 893 ns | 891 ns .. 895 ns | per elem |
| hash to curve | weier-jacobian.107/mode=indep | weier107-jacobian | per-element | 886 ns | 884 ns .. 888 ns | per elem |
| hash to curve | weier.127/mode=batch,n=1024 | weier127 | batch | 1.17 µs | 1.16 µs .. 1.17 µs | per elem |
| hash to curve | weier.127/mode=indep | weier127 | per-element | 1.16 µs | 1.16 µs .. 1.16 µs | per elem |
| hash to curve | weier-jacobian.127/mode=batch,n=1024 | weier127-jacobian | batch | 1.16 µs | 1.16 µs .. 1.16 µs | per elem |
| hash to curve | weier-jacobian.127/mode=indep | weier127-jacobian | per-element | 1.15 µs | 1.15 µs .. 1.16 µs | per elem |
| hash to curve | weier.61x2/mode=batch,n=1024 | weier61x2 | batch | 698 ns | 696 ns .. 700 ns | per elem |
| hash to curve | weier.61x2/mode=indep | weier61x2 | per-element | 696 ns | 694 ns .. 697 ns | per elem |
| hash to curve | weier-jacobian.61x2/mode=batch,n=1024 | weier61x2-jacobian | batch | 698 ns | 696 ns .. 700 ns | per elem |
| hash to curve | weier-jacobian.61x2/mode=indep | weier61x2-jacobian | per-element | 702 ns | 700 ns .. 704 ns | per elem |
| hash to curve | ristretto255/hash_from_bytes<Sha512> | ristretto255 | per-element | 6.03 µs | 6.02 µs .. 6.05 µs | per elem |
| hash to curve | secp256k1/ellswift decode | secp256k1 | per-element | 6.16 µs | 6.14 µs .. 6.18 µs | per elem |
| hash to curve | secp256k1/try-and-increment (parse) | secp256k1 | per-element | 6.17 µs | 6.16 µs .. 6.19 µs | per elem |
| ID to addend | binary.109/proj=fp127,h2c=pornin,mode=batch,n=1024 | gf2_109 | batch | 66.9 ns | 66.8 ns .. 67.1 ns | per elem |
| ID to addend | binary.109/proj=fp127,h2c=ti,mode=batch,n=1024 | gf2_109 | batch | 71.9 ns | 71.7 ns .. 72.0 ns | per elem |
| ID to addend | binary.109/proj=fp130,h2c=pornin,mode=batch,n=1024 | gf2_109 | batch | 72.5 ns | 72.3 ns .. 72.8 ns | per elem |
| ID to addend | binary.109/proj=fp130,h2c=ti,mode=batch,n=1024 | gf2_109 | batch | 103 ns | 103 ns .. 104 ns | per elem |
| ID to addend | binary.109/proj=gf2_127,h2c=pornin,mode=batch,n=1024 | gf2_109 | batch | 63.8 ns | 63.6 ns .. 63.9 ns | per elem |
| ID to addend | binary.109/proj=gf2_127,h2c=ti,mode=batch,n=1024 | gf2_109 | batch | 71.6 ns | 71.4 ns .. 71.9 ns | per elem |
| ID to addend | binary.109/proj=none,h2c=pornin,mode=batch,n=1024 | gf2_109 | batch | 113 ns | 113 ns .. 114 ns | per elem |
| ID to addend | binary.109/proj=none,h2c=ti,mode=batch,n=1024 | gf2_109 | batch | 132 ns | 131 ns .. 132 ns | per elem |
| ID to addend | binary-lambda.109/proj=fp127,h2c=pornin-addend,mode=batch,n=1024 | gf2_109-lambda | batch | 59.1 ns | 58.9 ns .. 59.3 ns | per elem |
| ID to addend | binary-lambda.109/proj=fp127,h2c=ti,mode=batch,n=1024 | gf2_109-lambda | batch | 74.9 ns | 74.7 ns .. 75.1 ns | per elem |
| ID to addend | binary-lambda.109/proj=fp127,h2c=ti-addend,mode=batch,n=1024 | gf2_109-lambda | batch | 66.5 ns | 66.3 ns .. 66.8 ns | per elem |
| ID to addend | binary-lambda.109/proj=fp130,h2c=pornin-addend,mode=batch,n=1024 | gf2_109-lambda | batch | 65.0 ns | 64.7 ns .. 65.2 ns | per elem |
| ID to addend | binary-lambda.109/proj=fp130,h2c=ti,mode=batch,n=1024 | gf2_109-lambda | batch | 102 ns | 102 ns .. 103 ns | per elem |
| ID to addend | binary-lambda.109/proj=fp130,h2c=ti-addend,mode=batch,n=1024 | gf2_109-lambda | batch | 93.8 ns | 93.4 ns .. 94.2 ns | per elem |
| ID to addend | binary-lambda.109/proj=gf2_127,h2c=pornin-addend,mode=batch,n=1024 | gf2_109-lambda | batch | 55.7 ns | 55.5 ns .. 55.8 ns | per elem |
| ID to addend | binary-lambda.109/proj=gf2_127,h2c=ti,mode=batch,n=1024 | gf2_109-lambda | batch | 72.5 ns | 72.3 ns .. 72.7 ns | per elem |
| ID to addend | binary-lambda.109/proj=gf2_127,h2c=ti-addend,mode=batch,n=1024 | gf2_109-lambda | batch | 64.3 ns | 64.1 ns .. 64.4 ns | per elem |
| ID to addend | binary-lambda.109/proj=none,h2c=pornin-addend,mode=batch,n=1024 | gf2_109-lambda | batch | 105 ns | 105 ns .. 106 ns | per elem |
| ID to addend | binary-lambda.109/proj=none,h2c=ti,mode=batch,n=1024 | gf2_109-lambda | batch | 132 ns | 132 ns .. 133 ns | per elem |
| ID to addend | binary-lambda.109/proj=none,h2c=ti-addend,mode=batch,n=1024 | gf2_109-lambda | batch | 124 ns | 124 ns .. 125 ns | per elem |
| ID to addend | binary-u.109/proj=fp127,h2c=pornin-addend,mode=batch,n=1024 | gf2_109-u | batch | 64.2 ns | 64.0 ns .. 64.4 ns | per elem |
| ID to addend | binary-u.109/proj=fp127,h2c=ti,mode=batch,n=1024 | gf2_109-u | batch | 71.9 ns | 71.7 ns .. 72.2 ns | per elem |
| ID to addend | binary-u.109/proj=fp130,h2c=pornin-addend,mode=batch,n=1024 | gf2_109-u | batch | 69.8 ns | 69.6 ns .. 70.0 ns | per elem |
| ID to addend | binary-u.109/proj=fp130,h2c=ti,mode=batch,n=1024 | gf2_109-u | batch | 98.9 ns | 98.7 ns .. 99.2 ns | per elem |
| ID to addend | binary-u.109/proj=gf2_127,h2c=pornin-addend,mode=batch,n=1024 | gf2_109-u | batch | 60.6 ns | 60.3 ns .. 60.8 ns | per elem |
| ID to addend | binary-u.109/proj=gf2_127,h2c=ti,mode=batch,n=1024 | gf2_109-u | batch | 70.2 ns | 70.0 ns .. 70.4 ns | per elem |
| ID to addend | binary-u.109/proj=none,h2c=pornin-addend,mode=batch,n=1024 | gf2_109-u | batch | 110 ns | 110 ns .. 111 ns | per elem |
| ID to addend | binary-u.109/proj=none,h2c=ti,mode=batch,n=1024 | gf2_109-u | batch | 130 ns | 130 ns .. 130 ns | per elem |
| ID to addend | binary-w.109/proj=fp127,h2c=pornin-addend,mode=batch,n=1024 | gf2_109-w | batch | 58.5 ns | 58.4 ns .. 58.7 ns | per elem |
| ID to addend | binary-w.109/proj=fp127,h2c=ti,mode=batch,n=1024 | gf2_109-w | batch | 67.2 ns | 66.6 ns .. 68.0 ns | per elem |
| ID to addend | binary-w.109/proj=fp130,h2c=pornin-addend,mode=batch,n=1024 | gf2_109-w | batch | 65.0 ns | 64.8 ns .. 65.2 ns | per elem |
| ID to addend | binary-w.109/proj=fp130,h2c=ti,mode=batch,n=1024 | gf2_109-w | batch | 92.7 ns | 92.4 ns .. 93.0 ns | per elem |
| ID to addend | binary-w.109/proj=gf2_127,h2c=pornin-addend,mode=batch,n=1024 | gf2_109-w | batch | 56.3 ns | 56.1 ns .. 56.4 ns | per elem |
| ID to addend | binary-w.109/proj=gf2_127,h2c=ti,mode=batch,n=1024 | gf2_109-w | batch | 65.0 ns | 64.8 ns .. 65.2 ns | per elem |
| ID to addend | binary-w.109/proj=none,h2c=pornin-addend,mode=batch,n=1024 | gf2_109-w | batch | 105 ns | 105 ns .. 105 ns | per elem |
| ID to addend | binary-w.109/proj=none,h2c=ti,mode=batch,n=1024 | gf2_109-w | batch | 124 ns | 124 ns .. 125 ns | per elem |
| ID to addend | binary.122/proj=fp127,h2c=pornin,mode=batch,n=1024 | gf2_122 | batch | 56.1 ns | 55.9 ns .. 56.3 ns | per elem |
| ID to addend | binary.122/proj=fp127,h2c=ti,mode=batch,n=1024 | gf2_122 | batch | 69.9 ns | 69.7 ns .. 70.1 ns | per elem |
| ID to addend | binary.122/proj=fp130,h2c=pornin,mode=batch,n=1024 | gf2_122 | batch | 62.2 ns | 62.0 ns .. 62.4 ns | per elem |
| ID to addend | binary.122/proj=fp130,h2c=ti,mode=batch,n=1024 | gf2_122 | batch | 95.5 ns | 95.2 ns .. 95.8 ns | per elem |
| ID to addend | binary.122/proj=gf2_127,h2c=pornin,mode=batch,n=1024 | gf2_122 | batch | 53.4 ns | 53.2 ns .. 53.6 ns | per elem |
| ID to addend | binary.122/proj=gf2_127,h2c=ti,mode=batch,n=1024 | gf2_122 | batch | 63.4 ns | 63.2 ns .. 63.5 ns | per elem |
| ID to addend | binary.122/proj=none,h2c=pornin,mode=batch,n=1024 | gf2_122 | batch | 103 ns | 102 ns .. 103 ns | per elem |
| ID to addend | binary.122/proj=none,h2c=ti,mode=batch,n=1024 | gf2_122 | batch | 126 ns | 125 ns .. 127 ns | per elem |
| ID to addend | binary.122-gls/proj=fp127,h2c=pornin,mode=batch,n=1024 | gf2_122-gls | batch | 54.7 ns | 54.6 ns .. 54.8 ns | per elem |
| ID to addend | binary.122-gls/proj=fp127,h2c=ti,mode=batch,n=1024 | gf2_122-gls | batch | 67.3 ns | 67.2 ns .. 67.4 ns | per elem |
| ID to addend | binary.122-gls/proj=fp130,h2c=pornin,mode=batch,n=1024 | gf2_122-gls | batch | 60.7 ns | 60.5 ns .. 60.9 ns | per elem |
| ID to addend | binary.122-gls/proj=fp130,h2c=ti,mode=batch,n=1024 | gf2_122-gls | batch | 92.7 ns | 92.5 ns .. 92.8 ns | per elem |
| ID to addend | binary.122-gls/proj=gf2_127,h2c=pornin,mode=batch,n=1024 | gf2_122-gls | batch | 51.7 ns | 51.5 ns .. 51.9 ns | per elem |
| ID to addend | binary.122-gls/proj=gf2_127,h2c=ti,mode=batch,n=1024 | gf2_122-gls | batch | 62.7 ns | 62.6 ns .. 62.9 ns | per elem |
| ID to addend | binary.122-gls/proj=none,h2c=pornin,mode=batch,n=1024 | gf2_122-gls | batch | 100 ns | 100 ns .. 100 ns | per elem |
| ID to addend | binary.122-gls/proj=none,h2c=ti,mode=batch,n=1024 | gf2_122-gls | batch | 120 ns | 120 ns .. 121 ns | per elem |
| ID to addend | binary-lambda.122-gls/proj=fp127,h2c=pornin-addend,mode=batch,n=1024 | gf2_122-gls-lambda | batch | 48.8 ns | 48.6 ns .. 48.9 ns | per elem |
| ID to addend | binary-lambda.122-gls/proj=fp127,h2c=ti,mode=batch,n=1024 | gf2_122-gls-lambda | batch | 69.5 ns | 69.5 ns .. 69.6 ns | per elem |
| ID to addend | binary-lambda.122-gls/proj=fp127,h2c=ti-addend,mode=batch,n=1024 | gf2_122-gls-lambda | batch | 60.5 ns | 60.4 ns .. 60.6 ns | per elem |
| ID to addend | binary-lambda.122-gls/proj=fp130,h2c=pornin-addend,mode=batch,n=1024 | gf2_122-gls-lambda | batch | 55.4 ns | 55.2 ns .. 55.5 ns | per elem |
| ID to addend | binary-lambda.122-gls/proj=fp130,h2c=ti,mode=batch,n=1024 | gf2_122-gls-lambda | batch | 97.3 ns | 97.1 ns .. 97.5 ns | per elem |
| ID to addend | binary-lambda.122-gls/proj=fp130,h2c=ti-addend,mode=batch,n=1024 | gf2_122-gls-lambda | batch | 88.7 ns | 88.5 ns .. 89.0 ns | per elem |
| ID to addend | binary-lambda.122-gls/proj=gf2_127,h2c=pornin-addend,mode=batch,n=1024 | gf2_122-gls-lambda | batch | 46.1 ns | 46.0 ns .. 46.2 ns | per elem |
| ID to addend | binary-lambda.122-gls/proj=gf2_127,h2c=ti,mode=batch,n=1024 | gf2_122-gls-lambda | batch | 64.6 ns | 64.5 ns .. 64.7 ns | per elem |
| ID to addend | binary-lambda.122-gls/proj=gf2_127,h2c=ti-addend,mode=batch,n=1024 | gf2_122-gls-lambda | batch | 55.5 ns | 55.4 ns .. 55.6 ns | per elem |
| ID to addend | binary-lambda.122-gls/proj=none,h2c=pornin-addend,mode=batch,n=1024 | gf2_122-gls-lambda | batch | 95.2 ns | 95.0 ns .. 95.4 ns | per elem |
| ID to addend | binary-lambda.122-gls/proj=none,h2c=ti,mode=batch,n=1024 | gf2_122-gls-lambda | batch | 124 ns | 123 ns .. 124 ns | per elem |
| ID to addend | binary-lambda.122-gls/proj=none,h2c=ti-addend,mode=batch,n=1024 | gf2_122-gls-lambda | batch | 114 ns | 114 ns .. 114 ns | per elem |
| ID to addend | binary-u.122-gls/proj=fp127,h2c=pornin-addend,mode=batch,n=1024 | gf2_122-gls-u | batch | 53.6 ns | 53.4 ns .. 53.8 ns | per elem |
| ID to addend | binary-u.122-gls/proj=fp127,h2c=ti,mode=batch,n=1024 | gf2_122-gls-u | batch | 65.6 ns | 65.4 ns .. 65.7 ns | per elem |
| ID to addend | binary-u.122-gls/proj=fp130,h2c=pornin-addend,mode=batch,n=1024 | gf2_122-gls-u | batch | 59.2 ns | 59.0 ns .. 59.3 ns | per elem |
| ID to addend | binary-u.122-gls/proj=fp130,h2c=ti,mode=batch,n=1024 | gf2_122-gls-u | batch | 94.3 ns | 94.1 ns .. 94.6 ns | per elem |
| ID to addend | binary-u.122-gls/proj=gf2_127,h2c=pornin-addend,mode=batch,n=1024 | gf2_122-gls-u | batch | 50.1 ns | 50.0 ns .. 50.2 ns | per elem |
| ID to addend | binary-u.122-gls/proj=gf2_127,h2c=ti,mode=batch,n=1024 | gf2_122-gls-u | batch | 61.9 ns | 61.8 ns .. 62.0 ns | per elem |
| ID to addend | binary-u.122-gls/proj=none,h2c=pornin-addend,mode=batch,n=1024 | gf2_122-gls-u | batch | 99.5 ns | 99.2 ns .. 99.8 ns | per elem |
| ID to addend | binary-u.122-gls/proj=none,h2c=ti,mode=batch,n=1024 | gf2_122-gls-u | batch | 123 ns | 123 ns .. 124 ns | per elem |
| ID to addend | binary-w.122-gls/proj=fp127,h2c=pornin-addend,mode=batch,n=1024 | gf2_122-gls-w | batch | 50.0 ns | 49.8 ns .. 50.1 ns | per elem |
| ID to addend | binary-w.122-gls/proj=fp127,h2c=ti,mode=batch,n=1024 | gf2_122-gls-w | batch | 61.4 ns | 61.2 ns .. 61.6 ns | per elem |
| ID to addend | binary-w.122-gls/proj=fp130,h2c=pornin-addend,mode=batch,n=1024 | gf2_122-gls-w | batch | 55.3 ns | 55.2 ns .. 55.4 ns | per elem |
| ID to addend | binary-w.122-gls/proj=fp130,h2c=ti,mode=batch,n=1024 | gf2_122-gls-w | batch | 87.5 ns | 87.3 ns .. 87.8 ns | per elem |
| ID to addend | binary-w.122-gls/proj=gf2_127,h2c=pornin-addend,mode=batch,n=1024 | gf2_122-gls-w | batch | 46.4 ns | 46.3 ns .. 46.5 ns | per elem |
| ID to addend | binary-w.122-gls/proj=gf2_127,h2c=ti,mode=batch,n=1024 | gf2_122-gls-w | batch | 58.1 ns | 57.9 ns .. 58.2 ns | per elem |
| ID to addend | binary-w.122-gls/proj=none,h2c=pornin-addend,mode=batch,n=1024 | gf2_122-gls-w | batch | 95.1 ns | 94.9 ns .. 95.3 ns | per elem |
| ID to addend | binary-w.122-gls/proj=none,h2c=ti,mode=batch,n=1024 | gf2_122-gls-w | batch | 116 ns | 116 ns .. 117 ns | per elem |
| ID to addend | binary-lambda.122/proj=fp127,h2c=pornin-addend,mode=batch,n=1024 | gf2_122-lambda | batch | 49.8 ns | 49.6 ns .. 50.0 ns | per elem |
| ID to addend | binary-lambda.122/proj=fp127,h2c=ti,mode=batch,n=1024 | gf2_122-lambda | batch | 72.1 ns | 71.9 ns .. 72.4 ns | per elem |
| ID to addend | binary-lambda.122/proj=fp127,h2c=ti-addend,mode=batch,n=1024 | gf2_122-lambda | batch | 63.0 ns | 62.8 ns .. 63.3 ns | per elem |
| ID to addend | binary-lambda.122/proj=fp130,h2c=pornin-addend,mode=batch,n=1024 | gf2_122-lambda | batch | 55.8 ns | 55.6 ns .. 55.9 ns | per elem |
| ID to addend | binary-lambda.122/proj=fp130,h2c=ti,mode=batch,n=1024 | gf2_122-lambda | batch | 97.5 ns | 97.2 ns .. 97.8 ns | per elem |
| ID to addend | binary-lambda.122/proj=fp130,h2c=ti-addend,mode=batch,n=1024 | gf2_122-lambda | batch | 88.0 ns | 87.7 ns .. 88.3 ns | per elem |
| ID to addend | binary-lambda.122/proj=gf2_127,h2c=pornin-addend,mode=batch,n=1024 | gf2_122-lambda | batch | 46.4 ns | 46.2 ns .. 46.5 ns | per elem |
| ID to addend | binary-lambda.122/proj=gf2_127,h2c=ti,mode=batch,n=1024 | gf2_122-lambda | batch | 64.5 ns | 64.3 ns .. 64.8 ns | per elem |
| ID to addend | binary-lambda.122/proj=gf2_127,h2c=ti-addend,mode=batch,n=1024 | gf2_122-lambda | batch | 55.1 ns | 55.0 ns .. 55.3 ns | per elem |
| ID to addend | binary-lambda.122/proj=none,h2c=pornin-addend,mode=batch,n=1024 | gf2_122-lambda | batch | 95.8 ns | 95.6 ns .. 96.1 ns | per elem |
| ID to addend | binary-lambda.122/proj=none,h2c=ti,mode=batch,n=1024 | gf2_122-lambda | batch | 126 ns | 126 ns .. 127 ns | per elem |
| ID to addend | binary-lambda.122/proj=none,h2c=ti-addend,mode=batch,n=1024 | gf2_122-lambda | batch | 118 ns | 117 ns .. 118 ns | per elem |
| ID to addend | binary-u.122/proj=fp127,h2c=pornin-addend,mode=batch,n=1024 | gf2_122-u | batch | 53.8 ns | 53.7 ns .. 54.0 ns | per elem |
| ID to addend | binary-u.122/proj=fp127,h2c=ti,mode=batch,n=1024 | gf2_122-u | batch | 68.6 ns | 68.5 ns .. 68.8 ns | per elem |
| ID to addend | binary-u.122/proj=fp130,h2c=pornin-addend,mode=batch,n=1024 | gf2_122-u | batch | 60.1 ns | 59.9 ns .. 60.3 ns | per elem |
| ID to addend | binary-u.122/proj=fp130,h2c=ti,mode=batch,n=1024 | gf2_122-u | batch | 97.8 ns | 97.5 ns .. 98.1 ns | per elem |
| ID to addend | binary-u.122/proj=gf2_127,h2c=pornin-addend,mode=batch,n=1024 | gf2_122-u | batch | 50.3 ns | 50.2 ns .. 50.4 ns | per elem |
| ID to addend | binary-u.122/proj=gf2_127,h2c=ti,mode=batch,n=1024 | gf2_122-u | batch | 63.9 ns | 63.7 ns .. 64.1 ns | per elem |
| ID to addend | binary-u.122/proj=none,h2c=pornin-addend,mode=batch,n=1024 | gf2_122-u | batch | 100 ns | 100.0 ns .. 101 ns | per elem |
| ID to addend | binary-u.122/proj=none,h2c=ti,mode=batch,n=1024 | gf2_122-u | batch | 123 ns | 123 ns .. 123 ns | per elem |
| ID to addend | binary-w.122/proj=fp127,h2c=pornin-addend,mode=batch,n=1024 | gf2_122-w | batch | 49.4 ns | 49.2 ns .. 49.5 ns | per elem |
| ID to addend | binary-w.122/proj=fp127,h2c=ti,mode=batch,n=1024 | gf2_122-w | batch | 63.1 ns | 63.0 ns .. 63.3 ns | per elem |
| ID to addend | binary-w.122/proj=fp130,h2c=pornin-addend,mode=batch,n=1024 | gf2_122-w | batch | 55.7 ns | 55.5 ns .. 55.8 ns | per elem |
| ID to addend | binary-w.122/proj=fp130,h2c=ti,mode=batch,n=1024 | gf2_122-w | batch | 90.8 ns | 90.6 ns .. 90.9 ns | per elem |
| ID to addend | binary-w.122/proj=gf2_127,h2c=pornin-addend,mode=batch,n=1024 | gf2_122-w | batch | 46.6 ns | 46.5 ns .. 46.8 ns | per elem |
| ID to addend | binary-w.122/proj=gf2_127,h2c=ti,mode=batch,n=1024 | gf2_122-w | batch | 58.5 ns | 58.3 ns .. 58.7 ns | per elem |
| ID to addend | binary-w.122/proj=none,h2c=pornin-addend,mode=batch,n=1024 | gf2_122-w | batch | 95.3 ns | 95.1 ns .. 95.5 ns | per elem |
| ID to addend | binary-w.122/proj=none,h2c=ti,mode=batch,n=1024 | gf2_122-w | batch | 116 ns | 116 ns .. 117 ns | per elem |
| ID to addend | binary.127/proj=fp127,h2c=pornin,mode=batch,n=1024 | gf2_127 | batch | 54.6 ns | 54.5 ns .. 54.7 ns | per elem |
| ID to addend | binary.127/proj=fp127,h2c=ti,mode=batch,n=1024 | gf2_127 | batch | 64.8 ns | 64.6 ns .. 64.9 ns | per elem |
| ID to addend | binary.127/proj=fp130,h2c=pornin,mode=batch,n=1024 | gf2_127 | batch | 60.7 ns | 60.6 ns .. 60.8 ns | per elem |
| ID to addend | binary.127/proj=fp130,h2c=ti,mode=batch,n=1024 | gf2_127 | batch | 92.5 ns | 92.3 ns .. 92.8 ns | per elem |
| ID to addend | binary.127/proj=gf2_127,h2c=pornin,mode=batch,n=1024 | gf2_127 | batch | 51.6 ns | 51.6 ns .. 51.7 ns | per elem |
| ID to addend | binary.127/proj=gf2_127,h2c=ti,mode=batch,n=1024 | gf2_127 | batch | 60.9 ns | 60.8 ns .. 61.1 ns | per elem |
| ID to addend | binary.127/proj=none,h2c=pornin,mode=batch,n=1024 | gf2_127 | batch | 101 ns | 101 ns .. 101 ns | per elem |
| ID to addend | binary.127/proj=none,h2c=ti,mode=batch,n=1024 | gf2_127 | batch | 118 ns | 118 ns .. 118 ns | per elem |
| ID to addend | binary-lambda.127/proj=fp127,h2c=pornin-addend,mode=batch,n=1024 | gf2_127-lambda | batch | 46.6 ns | 46.6 ns .. 46.7 ns | per elem |
| ID to addend | binary-lambda.127/proj=fp127,h2c=ti,mode=batch,n=1024 | gf2_127-lambda | batch | 67.2 ns | 66.9 ns .. 67.7 ns | per elem |
| ID to addend | binary-lambda.127/proj=fp127,h2c=ti-addend,mode=batch,n=1024 | gf2_127-lambda | batch | 59.0 ns | 58.9 ns .. 59.1 ns | per elem |
| ID to addend | binary-lambda.127/proj=fp130,h2c=pornin-addend,mode=batch,n=1024 | gf2_127-lambda | batch | 53.5 ns | 53.3 ns .. 53.6 ns | per elem |
| ID to addend | binary-lambda.127/proj=fp130,h2c=ti,mode=batch,n=1024 | gf2_127-lambda | batch | 96.9 ns | 96.7 ns .. 97.1 ns | per elem |
| ID to addend | binary-lambda.127/proj=fp130,h2c=ti-addend,mode=batch,n=1024 | gf2_127-lambda | batch | 88.3 ns | 88.1 ns .. 88.4 ns | per elem |
| ID to addend | binary-lambda.127/proj=gf2_127,h2c=pornin-addend,mode=batch,n=1024 | gf2_127-lambda | batch | 43.9 ns | 43.8 ns .. 43.9 ns | per elem |
| ID to addend | binary-lambda.127/proj=gf2_127,h2c=ti,mode=batch,n=1024 | gf2_127-lambda | batch | 63.2 ns | 63.0 ns .. 63.3 ns | per elem |
| ID to addend | binary-lambda.127/proj=gf2_127,h2c=ti-addend,mode=batch,n=1024 | gf2_127-lambda | batch | 55.2 ns | 55.0 ns .. 55.3 ns | per elem |
| ID to addend | binary-lambda.127/proj=none,h2c=pornin-addend,mode=batch,n=1024 | gf2_127-lambda | batch | 93.0 ns | 92.8 ns .. 93.3 ns | per elem |
| ID to addend | binary-lambda.127/proj=none,h2c=ti,mode=batch,n=1024 | gf2_127-lambda | batch | 120 ns | 119 ns .. 120 ns | per elem |
| ID to addend | binary-lambda.127/proj=none,h2c=ti-addend,mode=batch,n=1024 | gf2_127-lambda | batch | 111 ns | 111 ns .. 112 ns | per elem |
| ID to addend | binary-u.127/proj=fp127,h2c=pornin-addend,mode=batch,n=1024 | gf2_127-u | batch | 52.5 ns | 52.4 ns .. 52.7 ns | per elem |
| ID to addend | binary-u.127/proj=fp127,h2c=ti,mode=batch,n=1024 | gf2_127-u | batch | 63.9 ns | 63.7 ns .. 64.1 ns | per elem |
| ID to addend | binary-u.127/proj=fp130,h2c=pornin-addend,mode=batch,n=1024 | gf2_127-u | batch | 58.3 ns | 58.1 ns .. 58.5 ns | per elem |
| ID to addend | binary-u.127/proj=fp130,h2c=ti,mode=batch,n=1024 | gf2_127-u | batch | 91.1 ns | 90.8 ns .. 91.5 ns | per elem |
| ID to addend | binary-u.127/proj=gf2_127,h2c=pornin-addend,mode=batch,n=1024 | gf2_127-u | batch | 49.2 ns | 49.1 ns .. 49.3 ns | per elem |
| ID to addend | binary-u.127/proj=gf2_127,h2c=ti,mode=batch,n=1024 | gf2_127-u | batch | 59.0 ns | 58.9 ns .. 59.2 ns | per elem |
| ID to addend | binary-u.127/proj=none,h2c=pornin-addend,mode=batch,n=1024 | gf2_127-u | batch | 98.7 ns | 98.4 ns .. 99.1 ns | per elem |
| ID to addend | binary-u.127/proj=none,h2c=ti,mode=batch,n=1024 | gf2_127-u | batch | 120 ns | 119 ns .. 120 ns | per elem |
| ID to addend | binary-w.127/proj=fp127,h2c=pornin-addend,mode=batch,n=1024 | gf2_127-w | batch | 49.5 ns | 49.4 ns .. 49.6 ns | per elem |
| ID to addend | binary-w.127/proj=fp127,h2c=ti,mode=batch,n=1024 | gf2_127-w | batch | 60.6 ns | 60.4 ns .. 60.9 ns | per elem |
| ID to addend | binary-w.127/proj=fp130,h2c=pornin-addend,mode=batch,n=1024 | gf2_127-w | batch | 53.4 ns | 53.3 ns .. 53.6 ns | per elem |
| ID to addend | binary-w.127/proj=fp130,h2c=ti,mode=batch,n=1024 | gf2_127-w | batch | 84.9 ns | 84.7 ns .. 85.2 ns | per elem |
| ID to addend | binary-w.127/proj=gf2_127,h2c=pornin-addend,mode=batch,n=1024 | gf2_127-w | batch | 45.8 ns | 45.7 ns .. 45.9 ns | per elem |
| ID to addend | binary-w.127/proj=gf2_127,h2c=ti,mode=batch,n=1024 | gf2_127-w | batch | 55.7 ns | 55.5 ns .. 55.8 ns | per elem |
| ID to addend | binary-w.127/proj=none,h2c=pornin-addend,mode=batch,n=1024 | gf2_127-w | batch | 93.0 ns | 92.8 ns .. 93.2 ns | per elem |
| ID to addend | binary-w.127/proj=none,h2c=ti,mode=batch,n=1024 | gf2_127-w | batch | 112 ns | 112 ns .. 113 ns | per elem |
| ID to addend | twisted.61x2/proj=fp127,h2c=elligator2,mode=batch,n=1024 | twisted61x2 | batch | 947 ns | 942 ns .. 953 ns | per elem |
| ID to addend | twisted.61x2/proj=fp127,h2c=ti,mode=batch,n=1024 | twisted61x2 | batch | 662 ns | 661 ns .. 663 ns | per elem |
| ID to addend | twisted.61x2/proj=fp130,h2c=elligator2,mode=batch,n=1024 | twisted61x2 | batch | 942 ns | 941 ns .. 943 ns | per elem |
| ID to addend | twisted.61x2/proj=fp130,h2c=ti,mode=batch,n=1024 | twisted61x2 | batch | 677 ns | 676 ns .. 678 ns | per elem |
| ID to addend | twisted.61x2/proj=gf2_127,h2c=elligator2,mode=batch,n=1024 | twisted61x2 | batch | 936 ns | 934 ns .. 937 ns | per elem |
| ID to addend | twisted.61x2/proj=gf2_127,h2c=ti,mode=batch,n=1024 | twisted61x2 | batch | 658 ns | 657 ns .. 659 ns | per elem |
| ID to addend | twisted.61x2/proj=none,h2c=elligator2,mode=batch,n=1024 | twisted61x2 | batch | 996 ns | 994 ns .. 998 ns | per elem |
| ID to addend | twisted.61x2/proj=none,h2c=ti,mode=batch,n=1024 | twisted61x2 | batch | 696 ns | 695 ns .. 697 ns | per elem |
| hash to addend | gf2_109-lambda/try-and-increment to (x, λ) | gf2_109-lambda | per-element | 1.17 µs | 1.16 µs .. 1.17 µs | per elem |
| hash to addend | gf2_109-lambda/try-and-increment to (x, λ), batched | gf2_109-lambda | batch | 131 ns | 130 ns .. 132 ns | per elem |
| hash to addend | gf2_122-gls-lambda/try-and-increment to (x, λ) | gf2_122-gls-lambda | per-element | 679 ns | 678 ns .. 681 ns | per elem |
| hash to addend | gf2_122-gls-lambda/try-and-increment to (x, λ), batched | gf2_122-gls-lambda | batch | 121 ns | 120 ns .. 122 ns | per elem |
| hash to addend | gf2_122-lambda/try-and-increment to (x, λ) | gf2_122-lambda | per-element | 672 ns | 669 ns .. 674 ns | per elem |
| hash to addend | gf2_122-lambda/try-and-increment to (x, λ), batched | gf2_122-lambda | batch | 119 ns | 118 ns .. 120 ns | per elem |
| hash to addend | gf2_127-lambda/try-and-increment to (x, λ) | gf2_127-lambda | per-element | 369 ns | 368 ns .. 371 ns | per elem |
| hash to addend | gf2_127-lambda/try-and-increment to (x, λ), batched | gf2_127-lambda | batch | 111 ns | 111 ns .. 112 ns | per elem |
| steps: digest | digest/sha512 (ristretto input) | ristretto255 | per-element | 175 ns | 175 ns .. 176 ns | per elem |
| steps: ristretto255 | ristretto255/from_uniform_bytes (2 maps + add) | ristretto255 | per-element | 5.83 µs | 5.82 µs .. 5.85 µs | per elem |
| x on curve | ristretto255/decompress (valid, inv sqrt) | ristretto255 | per-element | 2.93 µs | 2.92 µs .. 2.94 µs | per elem |
| x on curve | secp256k1/x: parse compressed (sqrt) | secp256k1 | per-element | 3.10 µs | 3.09 µs .. 3.11 µs | per elem |
comparison maps
Maps from digests to points other than try-and-increment, timed beside it: Pornin’s map on binary curves, Elligator 2 on Edwards curves and simplified SWU on Weierstrass curves, once, and Pornin’s map twice with the points summed; and Pornin’s map taken straight to the unscaled or -affine addend, where it stands for a hash and a prepare together, as try-and-increment to does. One map reaches at most points of , not uniformly. The checksum needs relations to be hard to find among hash outputs within the subset of the group that the hash reaches, not outputs uniform on the group (docs/problem.md, Adversary). Insertion estimates include each measured map with compatible preparation and addition; Pornin already returns an extended binary addend.
Figure
43 benchmarks
| operation | benchmark | family | mode | time | 95% CI | unit |
|---|---|---|---|---|---|---|
| one map to addend | gf2_109-lambda/pornin map x1 to (x, λ) | gf2_109-lambda | per-element | 655 ns | 653 ns .. 657 ns | per elem |
| one map to addend | gf2_109-lambda/pornin map x1 to (x, λ), batched | gf2_109-lambda | batch | 105 ns | 104 ns .. 105 ns | per elem |
| one map to addend | gf2_109-u/pornin map x1 to (u, v) | gf2_109-u | per-element | 657 ns | 656 ns .. 659 ns | per elem |
| one map to addend | gf2_109-u/pornin map x1 to (u, v), batched | gf2_109-u | batch | 110 ns | 109 ns .. 110 ns | per elem |
| one map to addend | gf2_109-w/pornin map x1 to (x, λ) | gf2_109-w | per-element | 652 ns | 650 ns .. 653 ns | per elem |
| one map to addend | gf2_109-w/pornin map x1 to (x, λ), batched | gf2_109-w | batch | 104 ns | 104 ns .. 104 ns | per elem |
| one map to addend | gf2_122-gls-lambda/pornin map x1 to (x, λ) | gf2_122-gls-lambda | per-element | 385 ns | 384 ns .. 386 ns | per elem |
| one map to addend | gf2_122-gls-lambda/pornin map x1 to (x, λ), batched | gf2_122-gls-lambda | batch | 95.0 ns | 94.7 ns .. 95.4 ns | per elem |
| one map to addend | gf2_122-gls-u/pornin map x1 to (u, v) | gf2_122-gls-u | per-element | 390 ns | 389 ns .. 390 ns | per elem |
| one map to addend | gf2_122-gls-u/pornin map x1 to (u, v), batched | gf2_122-gls-u | batch | 97.6 ns | 97.4 ns .. 97.8 ns | per elem |
| one map to addend | gf2_122-gls-w/pornin map x1 to (x, λ) | gf2_122-gls-w | per-element | 385 ns | 384 ns .. 386 ns | per elem |
| one map to addend | gf2_122-gls-w/pornin map x1 to (x, λ), batched | gf2_122-gls-w | batch | 94.6 ns | 94.4 ns .. 94.9 ns | per elem |
| one map to addend | gf2_122-lambda/pornin map x1 to (x, λ) | gf2_122-lambda | per-element | 381 ns | 380 ns .. 382 ns | per elem |
| one map to addend | gf2_122-lambda/pornin map x1 to (x, λ), batched | gf2_122-lambda | batch | 95.0 ns | 94.7 ns .. 95.2 ns | per elem |
| one map to addend | gf2_122-u/pornin map x1 to (u, v) | gf2_122-u | per-element | 391 ns | 390 ns .. 392 ns | per elem |
| one map to addend | gf2_122-u/pornin map x1 to (u, v), batched | gf2_122-u | batch | 99.3 ns | 99.0 ns .. 99.5 ns | per elem |
| one map to addend | gf2_122-w/pornin map x1 to (x, λ) | gf2_122-w | per-element | 381 ns | 380 ns .. 382 ns | per elem |
| one map to addend | gf2_122-w/pornin map x1 to (x, λ), batched | gf2_122-w | batch | 95.2 ns | 95.0 ns .. 95.5 ns | per elem |
| one map to addend | gf2_127-lambda/pornin map x1 to (x, λ) | gf2_127-lambda | per-element | 245 ns | 244 ns .. 246 ns | per elem |
| one map to addend | gf2_127-lambda/pornin map x1 to (x, λ), batched | gf2_127-lambda | batch | 92.7 ns | 92.4 ns .. 93.0 ns | per elem |
| one map to addend | gf2_127-u/pornin map x1 to (u, v) | gf2_127-u | per-element | 249 ns | 248 ns .. 250 ns | per elem |
| one map to addend | gf2_127-u/pornin map x1 to (u, v), batched | gf2_127-u | batch | 98.0 ns | 97.4 ns .. 98.6 ns | per elem |
| one map to addend | gf2_127-w/pornin map x1 to (x, λ) | gf2_127-w | per-element | 244 ns | 243 ns .. 245 ns | per elem |
| one map to addend | gf2_127-w/pornin map x1 to (x, λ), batched | gf2_127-w | batch | 92.8 ns | 92.4 ns .. 93.2 ns | per elem |
| two maps summed | gf2_127/pornin map x2 | gf2_127 | per-element | 452 ns | 451 ns .. 453 ns | per elem |
| one map | gf2_109/pornin map x1 | gf2_109 | per-element | 675 ns | 673 ns .. 677 ns | per elem |
| one map | gf2_109/pornin map x1, batched | gf2_109 | batch | 114 ns | 113 ns .. 114 ns | per elem |
| one map | gf2_122/pornin map x1 | gf2_122 | per-element | 392 ns | 391 ns .. 393 ns | per elem |
| one map | gf2_122/pornin map x1, batched | gf2_122 | batch | 103 ns | 102 ns .. 103 ns | per elem |
| one map | gf2_122-gls/pornin map x1 | gf2_122-gls | per-element | 394 ns | 393 ns .. 395 ns | per elem |
| one map | gf2_122-gls/pornin map x1, batched | gf2_122-gls | batch | 101 ns | 101 ns .. 102 ns | per elem |
| one map | gf2_127/pornin map x1 | gf2_127 | per-element | 256 ns | 254 ns .. 258 ns | per elem |
| one map | gf2_127/pornin map x1, batched | gf2_127 | batch | 103 ns | 102 ns .. 103 ns | per elem |
| one map | edwards107/elligator2 x1 | edwards107 | per-element | 1.28 µs | 1.27 µs .. 1.29 µs | per elem |
| one map | edwards127/elligator2 x1 | edwards127 | per-element | 1.51 µs | 1.50 µs .. 1.51 µs | per elem |
| one map | edwards61x2/elligator2 x1 | edwards61x2 | per-element | 792 ns | 790 ns .. 794 ns | per elem |
| one map | twisted-goldilocks2/elligator2 x1 | twisted-goldilocks2 | per-element | 2.75 µs | 2.75 µs .. 2.76 µs | per elem |
| one map | twisted128/elligator2 x1 | twisted128 | per-element | 3.32 µs | 3.32 µs .. 3.33 µs | per elem |
| one map | twisted61x2/elligator2 x1 | twisted61x2 | per-element | 981 ns | 979 ns .. 984 ns | per elem |
| one map | twisted64x2/elligator2 x1 | twisted64x2 | per-element | 1.38 µs | 1.38 µs .. 1.38 µs | per elem |
| one map | weier107/sswu x1 | weier107 | per-element | 1.26 µs | 1.26 µs .. 1.26 µs | per elem |
| one map | weier127/sswu x1 | weier127 | per-element | 1.29 µs | 1.29 µs .. 1.29 µs | per elem |
| one map | weier61x2/sswu x1 | weier61x2 | per-element | 812 ns | 809 ns .. 816 ns | per elem |
RIBLT workload
Ratios against Go riblt-ecmh also include the mapping generator and the port to Rust, which are not attributed to this project (Workload, Comparison with the reference implementations).
Figure
620 benchmarks
| operation | benchmark | family | mode | time | 95% CI | unit |
|---|---|---|---|---|---|---|
| encode (hash + cells) | xor-sha256.64/m=12150,n=3500 | xor | per-element | 255 ns | 254 ns .. 256 ns | per elem |
| encode (hash + cells) | xor-sha256.64/m=1350,n=3500 | xor | per-element | 218 ns | 218 ns .. 218 ns | per elem |
| encode (hash + cells) | xor-sha256.64/m=150,n=3500 | xor | per-element | 188 ns | 188 ns .. 188 ns | per elem |
| encode (hash + cells) | xor-sha256.64/m=20,n=3500 | xor | per-element | 161 ns | 161 ns .. 162 ns | per elem |
| encode (hash + cells) | xor-sha256.64/m=5,n=3500 | xor | per-element | 144 ns | 143 ns .. 144 ns | per elem |
| encode (hash + cells) | xor-siphash.64/m=12150,n=3500 | xor-siphash | per-element | 219 ns | 219 ns .. 219 ns | per elem |
| encode (hash + cells) | xor-siphash.64/m=12150,n=3500,map=mcg64 | xor-siphash | per-element | 218 ns | 217 ns .. 218 ns | per elem |
| encode (hash + cells) | xor-siphash.64/m=1350,n=3500 | xor-siphash | per-element | 183 ns | 183 ns .. 183 ns | per elem |
| encode (hash + cells) | xor-siphash.64/m=1350,n=3500,map=mcg64 | xor-siphash | per-element | 182 ns | 182 ns .. 182 ns | per elem |
| encode (hash + cells) | xor-siphash.64/m=150,n=3500 | xor-siphash | per-element | 152 ns | 152 ns .. 153 ns | per elem |
| encode (hash + cells) | xor-siphash.64/m=150,n=3500,map=mcg64 | xor-siphash | per-element | 151 ns | 151 ns .. 151 ns | per elem |
| encode (hash + cells) | xor-siphash.64/m=20,n=3500 | xor-siphash | per-element | 124 ns | 124 ns .. 125 ns | per elem |
| encode (hash + cells) | xor-siphash.64/m=20,n=3500,map=mcg64 | xor-siphash | per-element | 123 ns | 123 ns .. 123 ns | per elem |
| encode (hash + cells) | xor-siphash.64/m=5,n=3500 | xor-siphash | per-element | 107 ns | 107 ns .. 108 ns | per elem |
| encode (hash + cells) | xor-siphash.64/m=5,n=3500,map=mcg64 | xor-siphash | per-element | 105 ns | 104 ns .. 106 ns | per elem |
| encode (hash + cells) | binary.109/m=12150,n=3500,h2c=pornin | gf2_109 | per-element | 643 ns | 642 ns .. 644 ns | per elem |
| encode (hash + cells) | binary.109/m=12150,n=3500,h2c=pornin,proj=gf2_127,mapproj=gf2_127 | gf2_109 | per-element | 553 ns | 552 ns .. 554 ns | per elem |
| encode (hash + cells) | binary.109/m=1350,n=3500,h2c=pornin | gf2_109 | per-element | 513 ns | 512 ns .. 514 ns | per elem |
| encode (hash + cells) | binary.109/m=1350,n=3500,h2c=pornin,proj=gf2_127,mapproj=gf2_127 | gf2_109 | per-element | 418 ns | 418 ns .. 419 ns | per elem |
| encode (hash + cells) | binary.109/m=5,n=3500,h2c=pornin | gf2_109 | per-element | 266 ns | 264 ns .. 267 ns | per elem |
| encode (hash + cells) | binary.109/m=5,n=3500,h2c=pornin,proj=gf2_127,mapproj=gf2_127 | gf2_109 | per-element | 170 ns | 170 ns .. 171 ns | per elem |
| encode (hash + cells) | binary-lambda.109/m=12150,n=3500,h2c=pornin-addend | gf2_109-lambda | per-element | 597 ns | 596 ns .. 598 ns | per elem |
| encode (hash + cells) | binary-lambda.109/m=12150,n=3500,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_109-lambda | per-element | 500 ns | 497 ns .. 503 ns | per elem |
| encode (hash + cells) | binary-lambda.109/m=1350,n=3500,h2c=pornin-addend | gf2_109-lambda | per-element | 488 ns | 487 ns .. 489 ns | per elem |
| encode (hash + cells) | binary-lambda.109/m=1350,n=3500,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_109-lambda | per-element | 395 ns | 394 ns .. 395 ns | per elem |
| encode (hash + cells) | binary-lambda.109/m=5,n=3500,h2c=pornin-addend | gf2_109-lambda | per-element | 247 ns | 246 ns .. 247 ns | per elem |
| encode (hash + cells) | binary-lambda.109/m=5,n=3500,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_109-lambda | per-element | 151 ns | 151 ns .. 151 ns | per elem |
| encode (hash + cells) | binary-u.109/m=12150,n=3500,h2c=pornin-addend | gf2_109-u | per-element | 531 ns | 531 ns .. 532 ns | per elem |
| encode (hash + cells) | binary-u.109/m=12150,n=3500,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_109-u | per-element | 437 ns | 436 ns .. 438 ns | per elem |
| encode (hash + cells) | binary-u.109/m=1350,n=3500,h2c=pornin-addend | gf2_109-u | per-element | 422 ns | 422 ns .. 423 ns | per elem |
| encode (hash + cells) | binary-u.109/m=1350,n=3500,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_109-u | per-element | 331 ns | 330 ns .. 331 ns | per elem |
| encode (hash + cells) | binary-u.109/m=150,n=3500,h2c=pornin-addend | gf2_109-u | per-element | 344 ns | 344 ns .. 345 ns | per elem |
| encode (hash + cells) | binary-u.109/m=20,n=3500,h2c=pornin-addend | gf2_109-u | per-element | 278 ns | 278 ns .. 279 ns | per elem |
| encode (hash + cells) | binary-u.109/m=5,n=3500,h2c=pornin-addend | gf2_109-u | per-element | 240 ns | 239 ns .. 240 ns | per elem |
| encode (hash + cells) | binary-u.109/m=5,n=3500,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_109-u | per-element | 148 ns | 147 ns .. 148 ns | per elem |
| encode (hash + cells) | binary-w.109/m=12150,n=3500,h2c=pornin-addend | gf2_109-w | per-element | 596 ns | 596 ns .. 597 ns | per elem |
| encode (hash + cells) | binary-w.109/m=12150,n=3500,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_109-w | per-element | 500 ns | 500 ns .. 501 ns | per elem |
| encode (hash + cells) | binary-w.109/m=1350,n=3500,h2c=pornin-addend | gf2_109-w | per-element | 490 ns | 489 ns .. 491 ns | per elem |
| encode (hash + cells) | binary-w.109/m=1350,n=3500,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_109-w | per-element | 397 ns | 396 ns .. 397 ns | per elem |
| encode (hash + cells) | binary-w.109/m=5,n=3500,h2c=pornin-addend | gf2_109-w | per-element | 249 ns | 249 ns .. 249 ns | per elem |
| encode (hash + cells) | binary-w.109/m=5,n=3500,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_109-w | per-element | 154 ns | 154 ns .. 154 ns | per elem |
| encode (hash + cells) | binary.122/m=12150,n=3500,h2c=pornin | gf2_122 | per-element | 673 ns | 671 ns .. 674 ns | per elem |
| encode (hash + cells) | binary.122/m=12150,n=3500,h2c=pornin,proj=gf2_127,mapproj=gf2_127 | gf2_122 | per-element | 552 ns | 550 ns .. 553 ns | per elem |
| encode (hash + cells) | binary.122/m=1350,n=3500,h2c=pornin | gf2_122 | per-element | 537 ns | 536 ns .. 538 ns | per elem |
| encode (hash + cells) | binary.122/m=1350,n=3500,h2c=pornin,proj=gf2_127,mapproj=gf2_127 | gf2_122 | per-element | 435 ns | 435 ns .. 436 ns | per elem |
| encode (hash + cells) | binary.122/m=5,n=3500,h2c=pornin | gf2_122 | per-element | 271 ns | 270 ns .. 272 ns | per elem |
| encode (hash + cells) | binary.122/m=5,n=3500,h2c=pornin,proj=gf2_127,mapproj=gf2_127 | gf2_122 | per-element | 173 ns | 173 ns .. 173 ns | per elem |
| encode (hash + cells) | binary.122-gls/m=12150,n=3500,h2c=pornin | gf2_122-gls | per-element | 635 ns | 634 ns .. 636 ns | per elem |
| encode (hash + cells) | binary.122-gls/m=12150,n=3500,h2c=pornin,proj=gf2_127,mapproj=gf2_127 | gf2_122-gls | per-element | 534 ns | 533 ns .. 535 ns | per elem |
| encode (hash + cells) | binary.122-gls/m=1350,n=3500,h2c=pornin | gf2_122-gls | per-element | 509 ns | 508 ns .. 510 ns | per elem |
| encode (hash + cells) | binary.122-gls/m=1350,n=3500,h2c=pornin,proj=gf2_127,mapproj=gf2_127 | gf2_122-gls | per-element | 408 ns | 407 ns .. 409 ns | per elem |
| encode (hash + cells) | binary.122-gls/m=5,n=3500,h2c=pornin | gf2_122-gls | per-element | 259 ns | 257 ns .. 260 ns | per elem |
| encode (hash + cells) | binary.122-gls/m=5,n=3500,h2c=pornin,proj=gf2_127,mapproj=gf2_127 | gf2_122-gls | per-element | 162 ns | 162 ns .. 163 ns | per elem |
| encode (hash + cells) | binary-lambda.122-gls/m=12150,n=3500,h2c=pornin-addend | gf2_122-gls-lambda | per-element | 608 ns | 607 ns .. 610 ns | per elem |
| encode (hash + cells) | binary-lambda.122-gls/m=12150,n=3500,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_122-gls-lambda | per-element | 502 ns | 501 ns .. 503 ns | per elem |
| encode (hash + cells) | binary-lambda.122-gls/m=1350,n=3500,h2c=pornin-addend | gf2_122-gls-lambda | per-element | 501 ns | 500 ns .. 502 ns | per elem |
| encode (hash + cells) | binary-lambda.122-gls/m=1350,n=3500,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_122-gls-lambda | per-element | 400 ns | 399 ns .. 401 ns | per elem |
| encode (hash + cells) | binary-lambda.122-gls/m=5,n=3500,h2c=pornin-addend | gf2_122-gls-lambda | per-element | 250 ns | 249 ns .. 250 ns | per elem |
| encode (hash + cells) | binary-lambda.122-gls/m=5,n=3500,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_122-gls-lambda | per-element | 154 ns | 154 ns .. 155 ns | per elem |
| encode (hash + cells) | binary-u.122-gls/m=12150,n=3500,h2c=pornin-addend | gf2_122-gls-u | per-element | 544 ns | 542 ns .. 547 ns | per elem |
| encode (hash + cells) | binary-u.122-gls/m=12150,n=3500,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_122-gls-u | per-element | 442 ns | 440 ns .. 444 ns | per elem |
| encode (hash + cells) | binary-u.122-gls/m=1350,n=3500,h2c=pornin-addend | gf2_122-gls-u | per-element | 432 ns | 431 ns .. 433 ns | per elem |
| encode (hash + cells) | binary-u.122-gls/m=1350,n=3500,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_122-gls-u | per-element | 333 ns | 332 ns .. 334 ns | per elem |
| encode (hash + cells) | binary-u.122-gls/m=150,n=3500,h2c=pornin-addend | gf2_122-gls-u | per-element | 349 ns | 348 ns .. 350 ns | per elem |
| encode (hash + cells) | binary-u.122-gls/m=20,n=3500,h2c=pornin-addend | gf2_122-gls-u | per-element | 280 ns | 280 ns .. 280 ns | per elem |
| encode (hash + cells) | binary-u.122-gls/m=5,n=3500,h2c=pornin-addend | gf2_122-gls-u | per-element | 238 ns | 238 ns .. 239 ns | per elem |
| encode (hash + cells) | binary-u.122-gls/m=5,n=3500,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_122-gls-u | per-element | 140 ns | 140 ns .. 141 ns | per elem |
| encode (hash + cells) | binary-w.122-gls/m=12150,n=3500,h2c=pornin-addend | gf2_122-gls-w | per-element | 606 ns | 605 ns .. 606 ns | per elem |
| encode (hash + cells) | binary-w.122-gls/m=12150,n=3500,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_122-gls-w | per-element | 510 ns | 508 ns .. 513 ns | per elem |
| encode (hash + cells) | binary-w.122-gls/m=1350,n=3500,h2c=pornin-addend | gf2_122-gls-w | per-element | 498 ns | 498 ns .. 499 ns | per elem |
| encode (hash + cells) | binary-w.122-gls/m=1350,n=3500,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_122-gls-w | per-element | 402 ns | 401 ns .. 403 ns | per elem |
| encode (hash + cells) | binary-w.122-gls/m=5,n=3500,h2c=pornin-addend | gf2_122-gls-w | per-element | 250 ns | 250 ns .. 251 ns | per elem |
| encode (hash + cells) | binary-w.122-gls/m=5,n=3500,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_122-gls-w | per-element | 155 ns | 155 ns .. 155 ns | per elem |
| encode (hash + cells) | binary-lambda.122/m=12150,n=3500,h2c=pornin-addend | gf2_122-lambda | per-element | 613 ns | 612 ns .. 615 ns | per elem |
| encode (hash + cells) | binary-lambda.122/m=12150,n=3500,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_122-lambda | per-element | 506 ns | 506 ns .. 507 ns | per elem |
| encode (hash + cells) | binary-lambda.122/m=1350,n=3500,h2c=pornin-addend | gf2_122-lambda | per-element | 505 ns | 503 ns .. 507 ns | per elem |
| encode (hash + cells) | binary-lambda.122/m=1350,n=3500,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_122-lambda | per-element | 403 ns | 402 ns .. 403 ns | per elem |
| encode (hash + cells) | binary-lambda.122/m=5,n=3500,h2c=pornin-addend | gf2_122-lambda | per-element | 250 ns | 250 ns .. 251 ns | per elem |
| encode (hash + cells) | binary-lambda.122/m=5,n=3500,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_122-lambda | per-element | 155 ns | 155 ns .. 156 ns | per elem |
| encode (hash + cells) | binary-u.122/m=12150,n=3500,h2c=pornin-addend | gf2_122-u | per-element | 543 ns | 542 ns .. 544 ns | per elem |
| encode (hash + cells) | binary-u.122/m=12150,n=3500,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_122-u | per-element | 440 ns | 439 ns .. 441 ns | per elem |
| encode (hash + cells) | binary-u.122/m=1350,n=3500,h2c=pornin-addend | gf2_122-u | per-element | 436 ns | 435 ns .. 437 ns | per elem |
| encode (hash + cells) | binary-u.122/m=1350,n=3500,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_122-u | per-element | 332 ns | 331 ns .. 333 ns | per elem |
| encode (hash + cells) | binary-u.122/m=150,n=3500,h2c=pornin-addend | gf2_122-u | per-element | 354 ns | 353 ns .. 355 ns | per elem |
| encode (hash + cells) | binary-u.122/m=20,n=3500,h2c=pornin-addend | gf2_122-u | per-element | 282 ns | 282 ns .. 283 ns | per elem |
| encode (hash + cells) | binary-u.122/m=5,n=3500,h2c=pornin-addend | gf2_122-u | per-element | 239 ns | 238 ns .. 239 ns | per elem |
| encode (hash + cells) | binary-u.122/m=5,n=3500,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_122-u | per-element | 144 ns | 143 ns .. 144 ns | per elem |
| encode (hash + cells) | binary-w.122/m=12150,n=3500,h2c=pornin-addend | gf2_122-w | per-element | 616 ns | 615 ns .. 617 ns | per elem |
| encode (hash + cells) | binary-w.122/m=12150,n=3500,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_122-w | per-element | 516 ns | 513 ns .. 518 ns | per elem |
| encode (hash + cells) | binary-w.122/m=1350,n=3500,h2c=pornin-addend | gf2_122-w | per-element | 504 ns | 503 ns .. 505 ns | per elem |
| encode (hash + cells) | binary-w.122/m=1350,n=3500,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_122-w | per-element | 409 ns | 407 ns .. 410 ns | per elem |
| encode (hash + cells) | binary-w.122/m=5,n=3500,h2c=pornin-addend | gf2_122-w | per-element | 249 ns | 249 ns .. 250 ns | per elem |
| encode (hash + cells) | binary-w.122/m=5,n=3500,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_122-w | per-element | 157 ns | 156 ns .. 158 ns | per elem |
| encode (hash + cells) | binary.127/m=12150,n=3500,h2c=pornin | gf2_127 | per-element | 630 ns | 629 ns .. 631 ns | per elem |
| encode (hash + cells) | binary.127/m=12150,n=3500,h2c=pornin,map=mcg64 | gf2_127 | per-element | 635 ns | 634 ns .. 637 ns | per elem |
| encode (hash + cells) | binary.127/m=12150,n=3500,h2c=pornin,proj=gf2_127,mapproj=gf2_127 | gf2_127 | per-element | 541 ns | 541 ns .. 542 ns | per elem |
| encode (hash + cells) | binary.127/m=1350,n=3500,h2c=pornin | gf2_127 | per-element | 503 ns | 502 ns .. 505 ns | per elem |
| encode (hash + cells) | binary.127/m=1350,n=3500,h2c=pornin,map=mcg64 | gf2_127 | per-element | 502 ns | 502 ns .. 503 ns | per elem |
| encode (hash + cells) | binary.127/m=1350,n=3500,h2c=pornin,proj=gf2_127,mapproj=gf2_127 | gf2_127 | per-element | 412 ns | 411 ns .. 413 ns | per elem |
| encode (hash + cells) | binary.127/m=150,n=3500,h2c=pornin,map=mcg64 | gf2_127 | per-element | 394 ns | 393 ns .. 394 ns | per elem |
| encode (hash + cells) | binary.127/m=20,n=3500,h2c=pornin,map=mcg64 | gf2_127 | per-element | 302 ns | 302 ns .. 303 ns | per elem |
| encode (hash + cells) | binary.127/m=5,n=3500,h2c=pornin | gf2_127 | per-element | 248 ns | 248 ns .. 248 ns | per elem |
| encode (hash + cells) | binary.127/m=5,n=3500,h2c=pornin,map=mcg64 | gf2_127 | per-element | 244 ns | 244 ns .. 245 ns | per elem |
| encode (hash + cells) | binary.127/m=5,n=3500,h2c=pornin,proj=gf2_127,mapproj=gf2_127 | gf2_127 | per-element | 154 ns | 154 ns .. 154 ns | per elem |
| encode (hash + cells) | binary-lambda.127/m=12150,n=3500,h2c=pornin-addend | gf2_127-lambda | per-element | 583 ns | 582 ns .. 584 ns | per elem |
| encode (hash + cells) | binary-lambda.127/m=12150,n=3500,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_127-lambda | per-element | 484 ns | 484 ns .. 485 ns | per elem |
| encode (hash + cells) | binary-lambda.127/m=1350,n=3500,h2c=pornin-addend | gf2_127-lambda | per-element | 474 ns | 473 ns .. 475 ns | per elem |
| encode (hash + cells) | binary-lambda.127/m=1350,n=3500,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_127-lambda | per-element | 379 ns | 379 ns .. 380 ns | per elem |
| encode (hash + cells) | binary-lambda.127/m=150,n=3500,h2c=pornin-addend | gf2_127-lambda | per-element | 376 ns | 375 ns .. 377 ns | per elem |
| encode (hash + cells) | binary-lambda.127/m=20,n=3500,h2c=pornin-addend | gf2_127-lambda | per-element | 291 ns | 289 ns .. 294 ns | per elem |
| encode (hash + cells) | binary-lambda.127/m=5,n=3500,h2c=pornin-addend | gf2_127-lambda | per-element | 234 ns | 233 ns .. 234 ns | per elem |
| encode (hash + cells) | binary-lambda.127/m=5,n=3500,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_127-lambda | per-element | 139 ns | 139 ns .. 139 ns | per elem |
| encode (hash + cells) | binary-u.127/m=12150,n=3500,h2c=pornin-addend | gf2_127-u | per-element | 520 ns | 520 ns .. 521 ns | per elem |
| encode (hash + cells) | binary-u.127/m=12150,n=3500,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_127-u | per-element | 427 ns | 426 ns .. 429 ns | per elem |
| encode (hash + cells) | binary-u.127/m=1350,n=3500,h2c=pornin-addend | gf2_127-u | per-element | 414 ns | 414 ns .. 415 ns | per elem |
| encode (hash + cells) | binary-u.127/m=1350,n=3500,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_127-u | per-element | 320 ns | 319 ns .. 321 ns | per elem |
| encode (hash + cells) | binary-u.127/m=150,n=3500,h2c=pornin-addend | gf2_127-u | per-element | 335 ns | 334 ns .. 336 ns | per elem |
| encode (hash + cells) | binary-u.127/m=20,n=3500,h2c=pornin-addend | gf2_127-u | per-element | 266 ns | 266 ns .. 267 ns | per elem |
| encode (hash + cells) | binary-u.127/m=5,n=3500,h2c=pornin-addend | gf2_127-u | per-element | 225 ns | 224 ns .. 225 ns | per elem |
| encode (hash + cells) | binary-u.127/m=5,n=3500,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_127-u | per-element | 132 ns | 132 ns .. 132 ns | per elem |
| encode (hash + cells) | binary-w.127/m=12150,n=3500,h2c=pornin-addend | gf2_127-w | per-element | 586 ns | 584 ns .. 587 ns | per elem |
| encode (hash + cells) | binary-w.127/m=12150,n=3500,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_127-w | per-element | 485 ns | 484 ns .. 486 ns | per elem |
| encode (hash + cells) | binary-w.127/m=1350,n=3500,h2c=pornin-addend | gf2_127-w | per-element | 476 ns | 475 ns .. 477 ns | per elem |
| encode (hash + cells) | binary-w.127/m=1350,n=3500,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_127-w | per-element | 380 ns | 379 ns .. 381 ns | per elem |
| encode (hash + cells) | binary-w.127/m=150,n=3500,h2c=pornin-addend | gf2_127-w | per-element | 376 ns | 375 ns .. 376 ns | per elem |
| encode (hash + cells) | binary-w.127/m=20,n=3500,h2c=pornin-addend | gf2_127-w | per-element | 288 ns | 288 ns .. 288 ns | per elem |
| encode (hash + cells) | binary-w.127/m=5,n=3500,h2c=pornin-addend | gf2_127-w | per-element | 233 ns | 233 ns .. 234 ns | per elem |
| encode (hash + cells) | binary-w.127/m=5,n=3500,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_127-w | per-element | 139 ns | 139 ns .. 140 ns | per elem |
| encode (hash + cells) | edwards.107/m=1350,n=3500,h2c=ti | edwards107 | per-element | 1.47 µs | 1.47 µs .. 1.47 µs | per elem |
| encode (hash + cells) | edwards.127/m=1350,n=3500,h2c=ti | edwards127 | per-element | 1.73 µs | 1.73 µs .. 1.73 µs | per elem |
| encode (hash + cells) | edwards.61x2/m=1350,n=3500,h2c=ti | edwards61x2 | per-element | 1.22 µs | 1.22 µs .. 1.22 µs | per elem |
| encode (hash + cells) | twisted.goldilocks2/m=1350,n=3500,h2c=ti | twisted-goldilocks2 | per-element | 2.86 µs | 2.85 µs .. 2.87 µs | per elem |
| encode (hash + cells) | twisted.128/m=1350,n=3500,h2c=ti | twisted128 | per-element | 2.61 µs | 2.60 µs .. 2.61 µs | per elem |
| encode (hash + cells) | twisted.61x2/m=1350,n=3500,h2c=ti | twisted61x2 | per-element | 1.18 µs | 1.18 µs .. 1.18 µs | per elem |
| encode (hash + cells) | twisted.64x2/m=1350,n=3500,h2c=ti | twisted64x2 | per-element | 1.58 µs | 1.58 µs .. 1.59 µs | per elem |
| encode (hash + cells) | weier.107/m=1350,n=3500,h2c=ti | weier107 | per-element | 1.74 µs | 1.74 µs .. 1.74 µs | per elem |
| encode (hash + cells) | weier-jacobian.107/m=1350,n=3500,h2c=ti | weier107-jacobian | per-element | 1.64 µs | 1.64 µs .. 1.65 µs | per elem |
| encode (hash + cells) | weier.127/m=1350,n=3500,h2c=ti | weier127 | per-element | 2.07 µs | 2.07 µs .. 2.07 µs | per elem |
| encode (hash + cells) | weier-jacobian.127/m=1350,n=3500,h2c=ti | weier127-jacobian | per-element | 1.91 µs | 1.91 µs .. 1.91 µs | per elem |
| encode (hash + cells) | weier.61x2/m=1350,n=3500,h2c=ti | weier61x2 | per-element | 1.54 µs | 1.53 µs .. 1.54 µs | per elem |
| encode (hash + cells) | weier-jacobian.61x2/m=1350,n=3500,h2c=ti | weier61x2-jacobian | per-element | 1.48 µs | 1.48 µs .. 1.48 µs | per elem |
| encode (hash + cells) | ristretto255/m=12150,n=3500 | ristretto255 | per-element | 8.25 µs | 8.23 µs .. 8.27 µs | per elem |
| encode (hash + cells) | ristretto255/m=12150,n=3500,map=mcg64 | ristretto255 | per-element | 8.23 µs | 8.22 µs .. 8.25 µs | per elem |
| encode (hash + cells) | ristretto255/m=1350,n=3500 | ristretto255 | per-element | 7.69 µs | 7.67 µs .. 7.70 µs | per elem |
| encode (hash + cells) | ristretto255/m=1350,n=3500,map=mcg64 | ristretto255 | per-element | 7.66 µs | 7.65 µs .. 7.67 µs | per elem |
| encode (hash + cells) | ristretto255/m=150,n=3500 | ristretto255 | per-element | 7.14 µs | 7.13 µs .. 7.15 µs | per elem |
| encode (hash + cells) | ristretto255/m=150,n=3500,map=mcg64 | ristretto255 | per-element | 7.12 µs | 7.11 µs .. 7.13 µs | per elem |
| encode (hash + cells) | ristretto255/m=20,n=3500 | ristretto255 | per-element | 6.67 µs | 6.67 µs .. 6.68 µs | per elem |
| encode (hash + cells) | ristretto255/m=20,n=3500,map=mcg64 | ristretto255 | per-element | 6.65 µs | 6.64 µs .. 6.66 µs | per elem |
| encode (hash + cells) | ristretto255/m=5,n=3500 | ristretto255 | per-element | 6.39 µs | 6.37 µs .. 6.41 µs | per elem |
| encode (hash + cells) | ristretto255/m=5,n=3500,map=mcg64 | ristretto255 | per-element | 6.35 µs | 6.34 µs .. 6.36 µs | per elem |
| cell updates | xor-sha256.64/m=1350,n=3500 | xor | per-element | 168 ns | 167 ns .. 168 ns | per elem |
| cell updates | xor-siphash.64/m=1350,n=3500 | xor-siphash | per-element | 166 ns | 166 ns .. 167 ns | per elem |
| cell updates | binary.109/m=12150,n=3500 | gf2_109 | per-element | 516 ns | 515 ns .. 517 ns | per elem |
| cell updates | binary.109/m=1350,n=3500 | gf2_109 | per-element | 384 ns | 384 ns .. 385 ns | per elem |
| cell updates | binary.109/m=5,n=3500 | gf2_109 | per-element | 134 ns | 134 ns .. 134 ns | per elem |
| cell updates | binary-lambda.109/m=12150,n=3500 | gf2_109-lambda | per-element | 471 ns | 470 ns .. 472 ns | per elem |
| cell updates | binary-lambda.109/m=1350,n=3500 | gf2_109-lambda | per-element | 368 ns | 367 ns .. 369 ns | per elem |
| cell updates | binary-lambda.109/m=5,n=3500 | gf2_109-lambda | per-element | 129 ns | 129 ns .. 129 ns | per elem |
| cell updates | binary-u.109/m=12150,n=3500 | gf2_109-u | per-element | 407 ns | 406 ns .. 408 ns | per elem |
| cell updates | binary-u.109/m=1350,n=3500 | gf2_109-u | per-element | 299 ns | 299 ns .. 300 ns | per elem |
| cell updates | binary-u.109/m=150,n=3500 | gf2_109-u | per-element | 221 ns | 220 ns .. 221 ns | per elem |
| cell updates | binary-u.109/m=20,n=3500 | gf2_109-u | per-element | 154 ns | 154 ns .. 155 ns | per elem |
| cell updates | binary-u.109/m=5,n=3500 | gf2_109-u | per-element | 116 ns | 115 ns .. 116 ns | per elem |
| cell updates | binary-w.109/m=12150,n=3500 | gf2_109-w | per-element | 471 ns | 470 ns .. 472 ns | per elem |
| cell updates | binary-w.109/m=1350,n=3500 | gf2_109-w | per-element | 369 ns | 368 ns .. 370 ns | per elem |
| cell updates | binary-w.109/m=5,n=3500 | gf2_109-w | per-element | 129 ns | 129 ns .. 129 ns | per elem |
| cell updates | binary.122/m=12150,n=3500 | gf2_122 | per-element | 527 ns | 526 ns .. 528 ns | per elem |
| cell updates | binary.122/m=1350,n=3500 | gf2_122 | per-element | 397 ns | 396 ns .. 398 ns | per elem |
| cell updates | binary.122/m=5,n=3500 | gf2_122 | per-element | 138 ns | 137 ns .. 138 ns | per elem |
| cell updates | binary.122-gls/m=12150,n=3500 | gf2_122-gls | per-element | 512 ns | 512 ns .. 513 ns | per elem |
| cell updates | binary.122-gls/m=1350,n=3500 | gf2_122-gls | per-element | 383 ns | 382 ns .. 384 ns | per elem |
| cell updates | binary.122-gls/m=5,n=3500 | gf2_122-gls | per-element | 134 ns | 134 ns .. 134 ns | per elem |
| cell updates | binary-lambda.122-gls/m=12150,n=3500 | gf2_122-gls-lambda | per-element | 491 ns | 490 ns .. 492 ns | per elem |
| cell updates | binary-lambda.122-gls/m=1350,n=3500 | gf2_122-gls-lambda | per-element | 384 ns | 384 ns .. 385 ns | per elem |
| cell updates | binary-lambda.122-gls/m=5,n=3500 | gf2_122-gls-lambda | per-element | 134 ns | 134 ns .. 134 ns | per elem |
| cell updates | binary-u.122-gls/m=12150,n=3500 | gf2_122-gls-u | per-element | 422 ns | 421 ns .. 423 ns | per elem |
| cell updates | binary-u.122-gls/m=1350,n=3500 | gf2_122-gls-u | per-element | 312 ns | 312 ns .. 313 ns | per elem |
| cell updates | binary-u.122-gls/m=150,n=3500 | gf2_122-gls-u | per-element | 229 ns | 229 ns .. 230 ns | per elem |
| cell updates | binary-u.122-gls/m=20,n=3500 | gf2_122-gls-u | per-element | 160 ns | 160 ns .. 161 ns | per elem |
| cell updates | binary-u.122-gls/m=5,n=3500 | gf2_122-gls-u | per-element | 118 ns | 118 ns .. 119 ns | per elem |
| cell updates | binary-w.122-gls/m=12150,n=3500 | gf2_122-gls-w | per-element | 489 ns | 489 ns .. 490 ns | per elem |
| cell updates | binary-w.122-gls/m=1350,n=3500 | gf2_122-gls-w | per-element | 383 ns | 382 ns .. 384 ns | per elem |
| cell updates | binary-w.122-gls/m=5,n=3500 | gf2_122-gls-w | per-element | 133 ns | 133 ns .. 133 ns | per elem |
| cell updates | binary-lambda.122/m=12150,n=3500 | gf2_122-lambda | per-element | 493 ns | 490 ns .. 496 ns | per elem |
| cell updates | binary-lambda.122/m=1350,n=3500 | gf2_122-lambda | per-element | 384 ns | 383 ns .. 385 ns | per elem |
| cell updates | binary-lambda.122/m=5,n=3500 | gf2_122-lambda | per-element | 135 ns | 134 ns .. 135 ns | per elem |
| cell updates | binary-u.122/m=12150,n=3500 | gf2_122-u | per-element | 422 ns | 421 ns .. 423 ns | per elem |
| cell updates | binary-u.122/m=1350,n=3500 | gf2_122-u | per-element | 312 ns | 311 ns .. 313 ns | per elem |
| cell updates | binary-u.122/m=150,n=3500 | gf2_122-u | per-element | 229 ns | 229 ns .. 230 ns | per elem |
| cell updates | binary-u.122/m=20,n=3500 | gf2_122-u | per-element | 161 ns | 160 ns .. 161 ns | per elem |
| cell updates | binary-u.122/m=5,n=3500 | gf2_122-u | per-element | 119 ns | 119 ns .. 120 ns | per elem |
| cell updates | binary-w.122/m=12150,n=3500 | gf2_122-w | per-element | 501 ns | 499 ns .. 502 ns | per elem |
| cell updates | binary-w.122/m=1350,n=3500 | gf2_122-w | per-element | 387 ns | 386 ns .. 388 ns | per elem |
| cell updates | binary-w.122/m=5,n=3500 | gf2_122-w | per-element | 134 ns | 133 ns .. 134 ns | per elem |
| cell updates | binary.127/m=12150,n=3500 | gf2_127 | per-element | 518 ns | 517 ns .. 519 ns | per elem |
| cell updates | binary.127/m=1350,n=3500 | gf2_127 | per-element | 386 ns | 385 ns .. 387 ns | per elem |
| cell updates | binary.127/m=5,n=3500 | gf2_127 | per-element | 133 ns | 133 ns .. 133 ns | per elem |
| cell updates | binary-lambda.127/m=12150,n=3500 | gf2_127-lambda | per-element | 484 ns | 483 ns .. 486 ns | per elem |
| cell updates | binary-lambda.127/m=1350,n=3500 | gf2_127-lambda | per-element | 377 ns | 376 ns .. 378 ns | per elem |
| cell updates | binary-lambda.127/m=150,n=3500 | gf2_127-lambda | per-element | 276 ns | 276 ns .. 277 ns | per elem |
| cell updates | binary-lambda.127/m=20,n=3500 | gf2_127-lambda | per-element | 187 ns | 187 ns .. 188 ns | per elem |
| cell updates | binary-lambda.127/m=5,n=3500 | gf2_127-lambda | per-element | 130 ns | 130 ns .. 130 ns | per elem |
| cell updates | binary-u.127/m=12150,n=3500 | gf2_127-u | per-element | 411 ns | 410 ns .. 412 ns | per elem |
| cell updates | binary-u.127/m=1350,n=3500 | gf2_127-u | per-element | 304 ns | 304 ns .. 305 ns | per elem |
| cell updates | binary-u.127/m=150,n=3500 | gf2_127-u | per-element | 225 ns | 224 ns .. 226 ns | per elem |
| cell updates | binary-u.127/m=20,n=3500 | gf2_127-u | per-element | 158 ns | 157 ns .. 160 ns | per elem |
| cell updates | binary-u.127/m=5,n=3500 | gf2_127-u | per-element | 115 ns | 115 ns .. 115 ns | per elem |
| cell updates | binary-w.127/m=12150,n=3500 | gf2_127-w | per-element | 480 ns | 479 ns .. 480 ns | per elem |
| cell updates | binary-w.127/m=1350,n=3500 | gf2_127-w | per-element | 373 ns | 372 ns .. 373 ns | per elem |
| cell updates | binary-w.127/m=150,n=3500 | gf2_127-w | per-element | 273 ns | 273 ns .. 274 ns | per elem |
| cell updates | binary-w.127/m=20,n=3500 | gf2_127-w | per-element | 186 ns | 186 ns .. 187 ns | per elem |
| cell updates | binary-w.127/m=5,n=3500 | gf2_127-w | per-element | 132 ns | 131 ns .. 132 ns | per elem |
| cell updates | edwards.107/m=1350,n=3500 | edwards107 | per-element | 473 ns | 473 ns .. 474 ns | per elem |
| cell updates | edwards.127/m=1350,n=3500 | edwards127 | per-element | 488 ns | 487 ns .. 489 ns | per elem |
| cell updates | edwards.61x2/m=1350,n=3500 | edwards61x2 | per-element | 456 ns | 455 ns .. 457 ns | per elem |
| cell updates | twisted.goldilocks2/m=1350,n=3500 | twisted-goldilocks2 | per-element | 582 ns | 581 ns .. 584 ns | per elem |
| cell updates | twisted.128/m=1350,n=3500 | twisted128 | per-element | 617 ns | 616 ns .. 619 ns | per elem |
| cell updates | twisted.61x2/m=1350,n=3500 | twisted61x2 | per-element | 450 ns | 449 ns .. 452 ns | per elem |
| cell updates | twisted.64x2/m=1350,n=3500 | twisted64x2 | per-element | 561 ns | 560 ns .. 562 ns | per elem |
| cell updates | weier.107/m=1350,n=3500 | weier107 | per-element | 788 ns | 786 ns .. 790 ns | per elem |
| cell updates | weier-jacobian.107/m=1350,n=3500 | weier107-jacobian | per-element | 697 ns | 696 ns .. 699 ns | per elem |
| cell updates | weier.127/m=1350,n=3500 | weier127 | per-element | 910 ns | 908 ns .. 913 ns | per elem |
| cell updates | weier-jacobian.127/m=1350,n=3500 | weier127-jacobian | per-element | 742 ns | 740 ns .. 744 ns | per elem |
| cell updates | weier.61x2/m=1350,n=3500 | weier61x2 | per-element | 817 ns | 812 ns .. 823 ns | per elem |
| cell updates | weier-jacobian.61x2/m=1350,n=3500 | weier61x2-jacobian | per-element | 768 ns | 766 ns .. 770 ns | per elem |
| cell updates | ristretto255/m=1350,n=3500 | ristretto255 | per-element | 1.74 µs | 1.74 µs .. 1.75 µs | per elem |
| peel, per difference | xor-sha256.64/d=1350,m=2700,prefilter=true,batch=true | xor | batch | 1.03 µs | 1.03 µs .. 1.03 µs | per elem |
| peel, per difference | xor-siphash.64/d=1350,m=2700,prefilter=true,batch=true | xor-siphash | batch | 988 ns | 987 ns .. 990 ns | per elem |
| peel, per difference | binary.109/d=10000,m=20000,prefilter=true,batch=true,h2c=pornin | gf2_109 | batch | 1.70 µs | 1.69 µs .. 1.70 µs | per elem |
| peel, per difference | binary.109/d=10000,m=20000,prefilter=true,batch=true,h2c=pornin,proj=gf2_127,mapproj=gf2_127 | gf2_109 | batch | 1.45 µs | 1.45 µs .. 1.46 µs | per elem |
| peel, per difference | binary.109/d=1350,m=2700,prefilter=true,batch=true,h2c=pornin | gf2_109 | batch | 1.39 µs | 1.39 µs .. 1.39 µs | per elem |
| peel, per difference | binary.109/d=1350,m=2700,prefilter=true,batch=true,h2c=pornin,proj=gf2_127,mapproj=gf2_127 | gf2_109 | batch | 1.16 µs | 1.16 µs .. 1.17 µs | per elem |
| peel, per difference | binary.109/d=4,m=10,prefilter=true,batch=true,h2c=pornin,proj=gf2_127,mapproj=gf2_127 | gf2_109 | batch | 962 ns | 960 ns .. 964 ns | per elem |
| peel, per difference | binary.109/d=4,m=8,prefilter=true,batch=true,h2c=pornin | gf2_109 | batch | 820 ns | 817 ns .. 824 ns | per elem |
| peel, per difference | binary-lambda.109/d=10000,m=20000,prefilter=true,batch=true,h2c=pornin-addend | gf2_109-lambda | batch | 1.67 µs | 1.67 µs .. 1.67 µs | per elem |
| peel, per difference | binary-lambda.109/d=10000,m=20000,prefilter=true,batch=true,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_109-lambda | batch | 1.44 µs | 1.43 µs .. 1.44 µs | per elem |
| peel, per difference | binary-lambda.109/d=1350,m=2700,prefilter=true,batch=true,h2c=pornin-addend | gf2_109-lambda | batch | 1.37 µs | 1.37 µs .. 1.37 µs | per elem |
| peel, per difference | binary-lambda.109/d=1350,m=2700,prefilter=true,batch=true,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_109-lambda | batch | 1.14 µs | 1.14 µs .. 1.15 µs | per elem |
| peel, per difference | binary-lambda.109/d=4,m=10,prefilter=true,batch=true,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_109-lambda | batch | 927 ns | 925 ns .. 929 ns | per elem |
| peel, per difference | binary-lambda.109/d=4,m=8,prefilter=true,batch=true,h2c=pornin-addend | gf2_109-lambda | batch | 795 ns | 793 ns .. 798 ns | per elem |
| peel, per difference | binary-u.109/d=10000,m=20000,prefilter=false,batch=false,h2c=pornin-addend | gf2_109-u | per-element | 2.27 µs | 2.26 µs .. 2.27 µs | per elem |
| peel, per difference | binary-u.109/d=10000,m=20000,prefilter=false,batch=true,h2c=pornin-addend | gf2_109-u | batch | 1.35 µs | 1.35 µs .. 1.35 µs | per elem |
| peel, per difference | binary-u.109/d=10000,m=20000,prefilter=true,batch=false,h2c=pornin-addend | gf2_109-u | per-element | 2.11 µs | 2.10 µs .. 2.11 µs | per elem |
| peel, per difference | binary-u.109/d=10000,m=20000,prefilter=true,batch=true,h2c=pornin-addend | gf2_109-u | batch | 1.57 µs | 1.57 µs .. 1.58 µs | per elem |
| peel, per difference | binary-u.109/d=10000,m=20000,prefilter=true,batch=true,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_109-u | batch | 1.33 µs | 1.33 µs .. 1.34 µs | per elem |
| peel, per difference | binary-u.109/d=1350,m=2700,prefilter=false,batch=false,h2c=pornin-addend | gf2_109-u | per-element | 2.04 µs | 2.03 µs .. 2.04 µs | per elem |
| peel, per difference | binary-u.109/d=1350,m=2700,prefilter=false,batch=true,h2c=pornin-addend | gf2_109-u | batch | 1.12 µs | 1.11 µs .. 1.12 µs | per elem |
| peel, per difference | binary-u.109/d=1350,m=2700,prefilter=true,batch=false,h2c=pornin-addend | gf2_109-u | per-element | 1.82 µs | 1.82 µs .. 1.83 µs | per elem |
| peel, per difference | binary-u.109/d=1350,m=2700,prefilter=true,batch=true,h2c=pornin-addend | gf2_109-u | batch | 1.30 µs | 1.30 µs .. 1.30 µs | per elem |
| peel, per difference | binary-u.109/d=1350,m=2700,prefilter=true,batch=true,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_109-u | batch | 1.07 µs | 1.07 µs .. 1.07 µs | per elem |
| peel, per difference | binary-u.109/d=150,m=300,prefilter=false,batch=false,h2c=pornin-addend | gf2_109-u | per-element | 1.78 µs | 1.78 µs .. 1.79 µs | per elem |
| peel, per difference | binary-u.109/d=150,m=300,prefilter=false,batch=true,h2c=pornin-addend | gf2_109-u | batch | 865 ns | 863 ns .. 868 ns | per elem |
| peel, per difference | binary-u.109/d=150,m=300,prefilter=true,batch=false,h2c=pornin-addend | gf2_109-u | per-element | 1.58 µs | 1.58 µs .. 1.58 µs | per elem |
| peel, per difference | binary-u.109/d=150,m=300,prefilter=true,batch=true,h2c=pornin-addend | gf2_109-u | batch | 1.04 µs | 1.04 µs .. 1.05 µs | per elem |
| peel, per difference | binary-u.109/d=20,m=40,prefilter=false,batch=false,h2c=pornin-addend | gf2_109-u | per-element | 1.43 µs | 1.43 µs .. 1.44 µs | per elem |
| peel, per difference | binary-u.109/d=20,m=40,prefilter=false,batch=true,h2c=pornin-addend | gf2_109-u | batch | 750 ns | 749 ns .. 752 ns | per elem |
| peel, per difference | binary-u.109/d=20,m=40,prefilter=true,batch=false,h2c=pornin-addend | gf2_109-u | per-element | 1.31 µs | 1.30 µs .. 1.31 µs | per elem |
| peel, per difference | binary-u.109/d=20,m=40,prefilter=true,batch=true,h2c=pornin-addend | gf2_109-u | batch | 881 ns | 878 ns .. 884 ns | per elem |
| peel, per difference | binary-u.109/d=4,m=10,prefilter=true,batch=true,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_109-u | batch | 938 ns | 933 ns .. 943 ns | per elem |
| peel, per difference | binary-u.109/d=4,m=8,prefilter=false,batch=false,h2c=pornin-addend | gf2_109-u | per-element | 953 ns | 951 ns .. 955 ns | per elem |
| peel, per difference | binary-u.109/d=4,m=8,prefilter=false,batch=true,h2c=pornin-addend | gf2_109-u | batch | 722 ns | 720 ns .. 723 ns | per elem |
| peel, per difference | binary-u.109/d=4,m=8,prefilter=true,batch=false,h2c=pornin-addend | gf2_109-u | per-element | 1.02 µs | 1.02 µs .. 1.03 µs | per elem |
| peel, per difference | binary-u.109/d=4,m=8,prefilter=true,batch=true,h2c=pornin-addend | gf2_109-u | batch | 805 ns | 802 ns .. 807 ns | per elem |
| peel, per difference | binary-w.109/d=10000,m=20000,prefilter=true,batch=true,h2c=pornin-addend | gf2_109-w | batch | 1.66 µs | 1.66 µs .. 1.67 µs | per elem |
| peel, per difference | binary-w.109/d=10000,m=20000,prefilter=true,batch=true,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_109-w | batch | 1.42 µs | 1.42 µs .. 1.43 µs | per elem |
| peel, per difference | binary-w.109/d=1350,m=2700,prefilter=true,batch=true,h2c=pornin-addend | gf2_109-w | batch | 1.37 µs | 1.36 µs .. 1.37 µs | per elem |
| peel, per difference | binary-w.109/d=1350,m=2700,prefilter=true,batch=true,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_109-w | batch | 1.13 µs | 1.13 µs .. 1.14 µs | per elem |
| peel, per difference | binary-w.109/d=4,m=10,prefilter=true,batch=true,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_109-w | batch | 922 ns | 920 ns .. 924 ns | per elem |
| peel, per difference | binary-w.109/d=4,m=8,prefilter=true,batch=true,h2c=pornin-addend | gf2_109-w | batch | 795 ns | 793 ns .. 798 ns | per elem |
| peel, per difference | binary.122/d=10000,m=20000,prefilter=true,batch=true,h2c=pornin | gf2_122 | batch | 1.69 µs | 1.68 µs .. 1.70 µs | per elem |
| peel, per difference | binary.122/d=10000,m=20000,prefilter=true,batch=true,h2c=pornin,proj=gf2_127,mapproj=gf2_127 | gf2_122 | batch | 1.47 µs | 1.46 µs .. 1.47 µs | per elem |
| peel, per difference | binary.122/d=1350,m=2700,prefilter=true,batch=true,h2c=pornin | gf2_122 | batch | 1.39 µs | 1.39 µs .. 1.40 µs | per elem |
| peel, per difference | binary.122/d=1350,m=2700,prefilter=true,batch=true,h2c=pornin,proj=gf2_127,mapproj=gf2_127 | gf2_122 | batch | 1.16 µs | 1.16 µs .. 1.16 µs | per elem |
| peel, per difference | binary.122/d=4,m=10,prefilter=true,batch=true,h2c=pornin,proj=gf2_127,mapproj=gf2_127 | gf2_122 | batch | 771 ns | 768 ns .. 774 ns | per elem |
| peel, per difference | binary.122/d=4,m=8,prefilter=true,batch=true,h2c=pornin | gf2_122 | batch | 683 ns | 682 ns .. 685 ns | per elem |
| peel, per difference | binary.122-gls/d=10000,m=20000,prefilter=true,batch=true,h2c=pornin | gf2_122-gls | batch | 1.67 µs | 1.66 µs .. 1.67 µs | per elem |
| peel, per difference | binary.122-gls/d=10000,m=20000,prefilter=true,batch=true,h2c=pornin,proj=gf2_127,mapproj=gf2_127 | gf2_122-gls | batch | 1.45 µs | 1.44 µs .. 1.45 µs | per elem |
| peel, per difference | binary.122-gls/d=1350,m=2700,prefilter=true,batch=true,h2c=pornin | gf2_122-gls | batch | 1.37 µs | 1.37 µs .. 1.37 µs | per elem |
| peel, per difference | binary.122-gls/d=1350,m=2700,prefilter=true,batch=true,h2c=pornin,proj=gf2_127,mapproj=gf2_127 | gf2_122-gls | batch | 1.15 µs | 1.14 µs .. 1.15 µs | per elem |
| peel, per difference | binary.122-gls/d=4,m=10,prefilter=true,batch=true,h2c=pornin,proj=gf2_127,mapproj=gf2_127 | gf2_122-gls | batch | 765 ns | 762 ns .. 768 ns | per elem |
| peel, per difference | binary.122-gls/d=4,m=8,prefilter=true,batch=true,h2c=pornin | gf2_122-gls | batch | 676 ns | 674 ns .. 677 ns | per elem |
| peel, per difference | binary-lambda.122-gls/d=10000,m=20000,prefilter=true,batch=true,h2c=pornin-addend | gf2_122-gls-lambda | batch | 1.67 µs | 1.66 µs .. 1.68 µs | per elem |
| peel, per difference | binary-lambda.122-gls/d=10000,m=20000,prefilter=true,batch=true,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_122-gls-lambda | batch | 1.44 µs | 1.43 µs .. 1.44 µs | per elem |
| peel, per difference | binary-lambda.122-gls/d=1350,m=2700,prefilter=true,batch=true,h2c=pornin-addend | gf2_122-gls-lambda | batch | 1.37 µs | 1.37 µs .. 1.38 µs | per elem |
| peel, per difference | binary-lambda.122-gls/d=1350,m=2700,prefilter=true,batch=true,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_122-gls-lambda | batch | 1.14 µs | 1.14 µs .. 1.15 µs | per elem |
| peel, per difference | binary-lambda.122-gls/d=4,m=10,prefilter=true,batch=true,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_122-gls-lambda | batch | 734 ns | 732 ns .. 737 ns | per elem |
| peel, per difference | binary-lambda.122-gls/d=4,m=8,prefilter=true,batch=true,h2c=pornin-addend | gf2_122-gls-lambda | batch | 661 ns | 659 ns .. 663 ns | per elem |
| peel, per difference | binary-u.122-gls/d=10000,m=20000,prefilter=false,batch=false,h2c=pornin-addend | gf2_122-gls-u | per-element | 1.86 µs | 1.86 µs .. 1.87 µs | per elem |
| peel, per difference | binary-u.122-gls/d=10000,m=20000,prefilter=false,batch=true,h2c=pornin-addend | gf2_122-gls-u | batch | 1.35 µs | 1.34 µs .. 1.35 µs | per elem |
| peel, per difference | binary-u.122-gls/d=10000,m=20000,prefilter=true,batch=false,h2c=pornin-addend | gf2_122-gls-u | per-element | 1.85 µs | 1.85 µs .. 1.85 µs | per elem |
| peel, per difference | binary-u.122-gls/d=10000,m=20000,prefilter=true,batch=true,h2c=pornin-addend | gf2_122-gls-u | batch | 1.57 µs | 1.57 µs .. 1.58 µs | per elem |
| peel, per difference | binary-u.122-gls/d=10000,m=20000,prefilter=true,batch=true,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_122-gls-u | batch | 1.34 µs | 1.34 µs .. 1.34 µs | per elem |
| peel, per difference | binary-u.122-gls/d=1350,m=2700,prefilter=false,batch=false,h2c=pornin-addend | gf2_122-gls-u | per-element | 1.61 µs | 1.60 µs .. 1.61 µs | per elem |
| peel, per difference | binary-u.122-gls/d=1350,m=2700,prefilter=false,batch=true,h2c=pornin-addend | gf2_122-gls-u | batch | 1.10 µs | 1.10 µs .. 1.11 µs | per elem |
| peel, per difference | binary-u.122-gls/d=1350,m=2700,prefilter=true,batch=false,h2c=pornin-addend | gf2_122-gls-u | per-element | 1.58 µs | 1.57 µs .. 1.58 µs | per elem |
| peel, per difference | binary-u.122-gls/d=1350,m=2700,prefilter=true,batch=true,h2c=pornin-addend | gf2_122-gls-u | batch | 1.30 µs | 1.29 µs .. 1.30 µs | per elem |
| peel, per difference | binary-u.122-gls/d=1350,m=2700,prefilter=true,batch=true,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_122-gls-u | batch | 1.06 µs | 1.06 µs .. 1.07 µs | per elem |
| peel, per difference | binary-u.122-gls/d=150,m=300,prefilter=false,batch=false,h2c=pornin-addend | gf2_122-gls-u | per-element | 1.32 µs | 1.31 µs .. 1.32 µs | per elem |
| peel, per difference | binary-u.122-gls/d=150,m=300,prefilter=false,batch=true,h2c=pornin-addend | gf2_122-gls-u | batch | 834 ns | 831 ns .. 837 ns | per elem |
| peel, per difference | binary-u.122-gls/d=150,m=300,prefilter=true,batch=false,h2c=pornin-addend | gf2_122-gls-u | per-element | 1.30 µs | 1.29 µs .. 1.30 µs | per elem |
| peel, per difference | binary-u.122-gls/d=150,m=300,prefilter=true,batch=true,h2c=pornin-addend | gf2_122-gls-u | batch | 1.01 µs | 1.01 µs .. 1.02 µs | per elem |
| peel, per difference | binary-u.122-gls/d=20,m=40,prefilter=false,batch=false,h2c=pornin-addend | gf2_122-gls-u | per-element | 1.05 µs | 1.04 µs .. 1.05 µs | per elem |
| peel, per difference | binary-u.122-gls/d=20,m=40,prefilter=false,batch=true,h2c=pornin-addend | gf2_122-gls-u | batch | 696 ns | 693 ns .. 699 ns | per elem |
| peel, per difference | binary-u.122-gls/d=20,m=40,prefilter=true,batch=false,h2c=pornin-addend | gf2_122-gls-u | per-element | 1.05 µs | 1.05 µs .. 1.06 µs | per elem |
| peel, per difference | binary-u.122-gls/d=20,m=40,prefilter=true,batch=true,h2c=pornin-addend | gf2_122-gls-u | batch | 823 ns | 819 ns .. 826 ns | per elem |
| peel, per difference | binary-u.122-gls/d=4,m=10,prefilter=true,batch=true,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_122-gls-u | batch | 728 ns | 726 ns .. 730 ns | per elem |
| peel, per difference | binary-u.122-gls/d=4,m=8,prefilter=false,batch=false,h2c=pornin-addend | gf2_122-gls-u | per-element | 718 ns | 716 ns .. 720 ns | per elem |
| peel, per difference | binary-u.122-gls/d=4,m=8,prefilter=false,batch=true,h2c=pornin-addend | gf2_122-gls-u | batch | 600 ns | 597 ns .. 604 ns | per elem |
| peel, per difference | binary-u.122-gls/d=4,m=8,prefilter=true,batch=false,h2c=pornin-addend | gf2_122-gls-u | per-element | 796 ns | 794 ns .. 799 ns | per elem |
| peel, per difference | binary-u.122-gls/d=4,m=8,prefilter=true,batch=true,h2c=pornin-addend | gf2_122-gls-u | batch | 676 ns | 673 ns .. 678 ns | per elem |
| peel, per difference | binary-w.122-gls/d=10000,m=20000,prefilter=true,batch=true,h2c=pornin-addend | gf2_122-gls-w | batch | 1.67 µs | 1.67 µs .. 1.67 µs | per elem |
| peel, per difference | binary-w.122-gls/d=10000,m=20000,prefilter=true,batch=true,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_122-gls-w | batch | 1.44 µs | 1.44 µs .. 1.44 µs | per elem |
| peel, per difference | binary-w.122-gls/d=1350,m=2700,prefilter=true,batch=true,h2c=pornin-addend | gf2_122-gls-w | batch | 1.38 µs | 1.38 µs .. 1.38 µs | per elem |
| peel, per difference | binary-w.122-gls/d=1350,m=2700,prefilter=true,batch=true,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_122-gls-w | batch | 1.14 µs | 1.14 µs .. 1.15 µs | per elem |
| peel, per difference | binary-w.122-gls/d=4,m=10,prefilter=true,batch=true,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_122-gls-w | batch | 732 ns | 729 ns .. 734 ns | per elem |
| peel, per difference | binary-w.122-gls/d=4,m=8,prefilter=true,batch=true,h2c=pornin-addend | gf2_122-gls-w | batch | 665 ns | 662 ns .. 667 ns | per elem |
| peel, per difference | binary-lambda.122/d=10000,m=20000,prefilter=true,batch=true,h2c=pornin-addend | gf2_122-lambda | batch | 1.67 µs | 1.66 µs .. 1.67 µs | per elem |
| peel, per difference | binary-lambda.122/d=10000,m=20000,prefilter=true,batch=true,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_122-lambda | batch | 1.45 µs | 1.44 µs .. 1.46 µs | per elem |
| peel, per difference | binary-lambda.122/d=1350,m=2700,prefilter=true,batch=true,h2c=pornin-addend | gf2_122-lambda | batch | 1.38 µs | 1.37 µs .. 1.38 µs | per elem |
| peel, per difference | binary-lambda.122/d=1350,m=2700,prefilter=true,batch=true,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_122-lambda | batch | 1.15 µs | 1.15 µs .. 1.15 µs | per elem |
| peel, per difference | binary-lambda.122/d=4,m=10,prefilter=true,batch=true,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_122-lambda | batch | 735 ns | 733 ns .. 737 ns | per elem |
| peel, per difference | binary-lambda.122/d=4,m=8,prefilter=true,batch=true,h2c=pornin-addend | gf2_122-lambda | batch | 659 ns | 657 ns .. 662 ns | per elem |
| peel, per difference | binary-u.122/d=10000,m=20000,prefilter=false,batch=false,h2c=pornin-addend | gf2_122-u | per-element | 1.84 µs | 1.84 µs .. 1.85 µs | per elem |
| peel, per difference | binary-u.122/d=10000,m=20000,prefilter=false,batch=true,h2c=pornin-addend | gf2_122-u | batch | 1.34 µs | 1.34 µs .. 1.35 µs | per elem |
| peel, per difference | binary-u.122/d=10000,m=20000,prefilter=true,batch=false,h2c=pornin-addend | gf2_122-u | per-element | 1.86 µs | 1.86 µs .. 1.87 µs | per elem |
| peel, per difference | binary-u.122/d=10000,m=20000,prefilter=true,batch=true,h2c=pornin-addend | gf2_122-u | batch | 1.57 µs | 1.57 µs .. 1.58 µs | per elem |
| peel, per difference | binary-u.122/d=10000,m=20000,prefilter=true,batch=true,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_122-u | batch | 1.33 µs | 1.33 µs .. 1.33 µs | per elem |
| peel, per difference | binary-u.122/d=1350,m=2700,prefilter=false,batch=false,h2c=pornin-addend | gf2_122-u | per-element | 1.62 µs | 1.61 µs .. 1.62 µs | per elem |
| peel, per difference | binary-u.122/d=1350,m=2700,prefilter=false,batch=true,h2c=pornin-addend | gf2_122-u | batch | 1.11 µs | 1.10 µs .. 1.11 µs | per elem |
| peel, per difference | binary-u.122/d=1350,m=2700,prefilter=true,batch=false,h2c=pornin-addend | gf2_122-u | per-element | 1.59 µs | 1.59 µs .. 1.59 µs | per elem |
| peel, per difference | binary-u.122/d=1350,m=2700,prefilter=true,batch=true,h2c=pornin-addend | gf2_122-u | batch | 1.30 µs | 1.30 µs .. 1.30 µs | per elem |
| peel, per difference | binary-u.122/d=1350,m=2700,prefilter=true,batch=true,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_122-u | batch | 1.06 µs | 1.06 µs .. 1.06 µs | per elem |
| peel, per difference | binary-u.122/d=150,m=300,prefilter=false,batch=false,h2c=pornin-addend | gf2_122-u | per-element | 1.33 µs | 1.32 µs .. 1.33 µs | per elem |
| peel, per difference | binary-u.122/d=150,m=300,prefilter=false,batch=true,h2c=pornin-addend | gf2_122-u | batch | 837 ns | 834 ns .. 839 ns | per elem |
| peel, per difference | binary-u.122/d=150,m=300,prefilter=true,batch=false,h2c=pornin-addend | gf2_122-u | per-element | 1.31 µs | 1.30 µs .. 1.31 µs | per elem |
| peel, per difference | binary-u.122/d=150,m=300,prefilter=true,batch=true,h2c=pornin-addend | gf2_122-u | batch | 1.03 µs | 1.02 µs .. 1.04 µs | per elem |
| peel, per difference | binary-u.122/d=20,m=40,prefilter=false,batch=false,h2c=pornin-addend | gf2_122-u | per-element | 1.05 µs | 1.05 µs .. 1.05 µs | per elem |
| peel, per difference | binary-u.122/d=20,m=40,prefilter=false,batch=true,h2c=pornin-addend | gf2_122-u | batch | 690 ns | 688 ns .. 692 ns | per elem |
| peel, per difference | binary-u.122/d=20,m=40,prefilter=true,batch=false,h2c=pornin-addend | gf2_122-u | per-element | 1.05 µs | 1.04 µs .. 1.05 µs | per elem |
| peel, per difference | binary-u.122/d=20,m=40,prefilter=true,batch=true,h2c=pornin-addend | gf2_122-u | batch | 826 ns | 823 ns .. 830 ns | per elem |
| peel, per difference | binary-u.122/d=4,m=10,prefilter=true,batch=true,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_122-u | batch | 751 ns | 745 ns .. 757 ns | per elem |
| peel, per difference | binary-u.122/d=4,m=8,prefilter=false,batch=false,h2c=pornin-addend | gf2_122-u | per-element | 713 ns | 712 ns .. 714 ns | per elem |
| peel, per difference | binary-u.122/d=4,m=8,prefilter=false,batch=true,h2c=pornin-addend | gf2_122-u | batch | 603 ns | 597 ns .. 611 ns | per elem |
| peel, per difference | binary-u.122/d=4,m=8,prefilter=true,batch=false,h2c=pornin-addend | gf2_122-u | per-element | 793 ns | 791 ns .. 795 ns | per elem |
| peel, per difference | binary-u.122/d=4,m=8,prefilter=true,batch=true,h2c=pornin-addend | gf2_122-u | batch | 675 ns | 673 ns .. 676 ns | per elem |
| peel, per difference | binary-w.122/d=10000,m=20000,prefilter=true,batch=true,h2c=pornin-addend | gf2_122-w | batch | 1.68 µs | 1.68 µs .. 1.69 µs | per elem |
| peel, per difference | binary-w.122/d=10000,m=20000,prefilter=true,batch=true,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_122-w | batch | 1.43 µs | 1.43 µs .. 1.44 µs | per elem |
| peel, per difference | binary-w.122/d=1350,m=2700,prefilter=true,batch=true,h2c=pornin-addend | gf2_122-w | batch | 1.38 µs | 1.38 µs .. 1.39 µs | per elem |
| peel, per difference | binary-w.122/d=1350,m=2700,prefilter=true,batch=true,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_122-w | batch | 1.14 µs | 1.14 µs .. 1.14 µs | per elem |
| peel, per difference | binary-w.122/d=4,m=10,prefilter=true,batch=true,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_122-w | batch | 730 ns | 728 ns .. 733 ns | per elem |
| peel, per difference | binary-w.122/d=4,m=8,prefilter=true,batch=true,h2c=pornin-addend | gf2_122-w | batch | 680 ns | 677 ns .. 684 ns | per elem |
| peel, per difference | binary.127/d=10000,m=20000,prefilter=true,batch=true,h2c=pornin | gf2_127 | batch | 1.66 µs | 1.66 µs .. 1.67 µs | per elem |
| peel, per difference | binary.127/d=10000,m=20000,prefilter=true,batch=true,h2c=pornin,proj=gf2_127,mapproj=gf2_127 | gf2_127 | batch | 1.44 µs | 1.44 µs .. 1.45 µs | per elem |
| peel, per difference | binary.127/d=1350,m=2700,prefilter=true,batch=true,h2c=pornin | gf2_127 | batch | 1.37 µs | 1.37 µs .. 1.37 µs | per elem |
| peel, per difference | binary.127/d=1350,m=2700,prefilter=true,batch=true,h2c=pornin,proj=gf2_127,mapproj=gf2_127 | gf2_127 | batch | 1.15 µs | 1.15 µs .. 1.15 µs | per elem |
| peel, per difference | binary.127/d=4,m=10,prefilter=true,batch=true,h2c=pornin,proj=gf2_127,mapproj=gf2_127 | gf2_127 | batch | 660 ns | 657 ns .. 663 ns | per elem |
| peel, per difference | binary.127/d=4,m=8,prefilter=true,batch=true,h2c=pornin | gf2_127 | batch | 601 ns | 599 ns .. 603 ns | per elem |
| peel, per difference | binary-lambda.127/d=10000,m=20000,prefilter=false,batch=false,h2c=pornin-addend | gf2_127-lambda | per-element | 1.64 µs | 1.64 µs .. 1.65 µs | per elem |
| peel, per difference | binary-lambda.127/d=10000,m=20000,prefilter=false,batch=true,h2c=pornin-addend | gf2_127-lambda | batch | 1.40 µs | 1.40 µs .. 1.40 µs | per elem |
| peel, per difference | binary-lambda.127/d=10000,m=20000,prefilter=true,batch=false,h2c=pornin-addend | gf2_127-lambda | per-element | 1.77 µs | 1.77 µs .. 1.78 µs | per elem |
| peel, per difference | binary-lambda.127/d=10000,m=20000,prefilter=true,batch=true,h2c=pornin-addend | gf2_127-lambda | batch | 1.63 µs | 1.63 µs .. 1.64 µs | per elem |
| peel, per difference | binary-lambda.127/d=10000,m=20000,prefilter=true,batch=true,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_127-lambda | batch | 1.40 µs | 1.40 µs .. 1.41 µs | per elem |
| peel, per difference | binary-lambda.127/d=1350,m=2700,prefilter=false,batch=false,h2c=pornin-addend | gf2_127-lambda | per-element | 1.38 µs | 1.38 µs .. 1.39 µs | per elem |
| peel, per difference | binary-lambda.127/d=1350,m=2700,prefilter=false,batch=true,h2c=pornin-addend | gf2_127-lambda | batch | 1.16 µs | 1.15 µs .. 1.16 µs | per elem |
| peel, per difference | binary-lambda.127/d=1350,m=2700,prefilter=true,batch=false,h2c=pornin-addend | gf2_127-lambda | per-element | 1.49 µs | 1.48 µs .. 1.50 µs | per elem |
| peel, per difference | binary-lambda.127/d=1350,m=2700,prefilter=true,batch=true,h2c=pornin-addend | gf2_127-lambda | batch | 1.35 µs | 1.35 µs .. 1.35 µs | per elem |
| peel, per difference | binary-lambda.127/d=1350,m=2700,prefilter=true,batch=true,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_127-lambda | batch | 1.12 µs | 1.12 µs .. 1.13 µs | per elem |
| peel, per difference | binary-lambda.127/d=150,m=300,prefilter=false,batch=false,h2c=pornin-addend | gf2_127-lambda | per-element | 1.08 µs | 1.08 µs .. 1.08 µs | per elem |
| peel, per difference | binary-lambda.127/d=150,m=300,prefilter=false,batch=true,h2c=pornin-addend | gf2_127-lambda | batch | 848 ns | 846 ns .. 851 ns | per elem |
| peel, per difference | binary-lambda.127/d=150,m=300,prefilter=true,batch=false,h2c=pornin-addend | gf2_127-lambda | per-element | 1.16 µs | 1.16 µs .. 1.16 µs | per elem |
| peel, per difference | binary-lambda.127/d=150,m=300,prefilter=true,batch=true,h2c=pornin-addend | gf2_127-lambda | batch | 1.03 µs | 1.03 µs .. 1.04 µs | per elem |
| peel, per difference | binary-lambda.127/d=20,m=40,prefilter=false,batch=false,h2c=pornin-addend | gf2_127-lambda | per-element | 827 ns | 825 ns .. 829 ns | per elem |
| peel, per difference | binary-lambda.127/d=20,m=40,prefilter=false,batch=true,h2c=pornin-addend | gf2_127-lambda | batch | 665 ns | 663 ns .. 668 ns | per elem |
| peel, per difference | binary-lambda.127/d=20,m=40,prefilter=true,batch=false,h2c=pornin-addend | gf2_127-lambda | per-element | 890 ns | 888 ns .. 891 ns | per elem |
| peel, per difference | binary-lambda.127/d=20,m=40,prefilter=true,batch=true,h2c=pornin-addend | gf2_127-lambda | batch | 796 ns | 794 ns .. 798 ns | per elem |
| peel, per difference | binary-lambda.127/d=4,m=10,prefilter=true,batch=true,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_127-lambda | batch | 605 ns | 604 ns .. 606 ns | per elem |
| peel, per difference | binary-lambda.127/d=4,m=8,prefilter=false,batch=false,h2c=pornin-addend | gf2_127-lambda | per-element | 542 ns | 540 ns .. 543 ns | per elem |
| peel, per difference | binary-lambda.127/d=4,m=8,prefilter=false,batch=true,h2c=pornin-addend | gf2_127-lambda | batch | 495 ns | 493 ns .. 497 ns | per elem |
| peel, per difference | binary-lambda.127/d=4,m=8,prefilter=true,batch=false,h2c=pornin-addend | gf2_127-lambda | per-element | 623 ns | 621 ns .. 626 ns | per elem |
| peel, per difference | binary-lambda.127/d=4,m=8,prefilter=true,batch=true,h2c=pornin-addend | gf2_127-lambda | batch | 576 ns | 574 ns .. 578 ns | per elem |
| peel, per difference | binary-u.127/d=10000,m=20000,prefilter=false,batch=false,h2c=pornin-addend | gf2_127-u | per-element | 1.56 µs | 1.56 µs .. 1.56 µs | per elem |
| peel, per difference | binary-u.127/d=10000,m=20000,prefilter=false,batch=true,h2c=pornin-addend | gf2_127-u | batch | 1.32 µs | 1.32 µs .. 1.32 µs | per elem |
| peel, per difference | binary-u.127/d=10000,m=20000,prefilter=true,batch=false,h2c=pornin-addend | gf2_127-u | per-element | 1.70 µs | 1.70 µs .. 1.71 µs | per elem |
| peel, per difference | binary-u.127/d=10000,m=20000,prefilter=true,batch=true,h2c=pornin-addend | gf2_127-u | batch | 1.57 µs | 1.57 µs .. 1.58 µs | per elem |
| peel, per difference | binary-u.127/d=10000,m=20000,prefilter=true,batch=true,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_127-u | batch | 1.33 µs | 1.33 µs .. 1.34 µs | per elem |
| peel, per difference | binary-u.127/d=1350,m=2700,prefilter=false,batch=false,h2c=pornin-addend | gf2_127-u | per-element | 1.33 µs | 1.32 µs .. 1.33 µs | per elem |
| peel, per difference | binary-u.127/d=1350,m=2700,prefilter=false,batch=true,h2c=pornin-addend | gf2_127-u | batch | 1.09 µs | 1.09 µs .. 1.09 µs | per elem |
| peel, per difference | binary-u.127/d=1350,m=2700,prefilter=true,batch=false,h2c=pornin-addend | gf2_127-u | per-element | 1.42 µs | 1.42 µs .. 1.42 µs | per elem |
| peel, per difference | binary-u.127/d=1350,m=2700,prefilter=true,batch=true,h2c=pornin-addend | gf2_127-u | batch | 1.29 µs | 1.28 µs .. 1.29 µs | per elem |
| peel, per difference | binary-u.127/d=1350,m=2700,prefilter=true,batch=true,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_127-u | batch | 1.06 µs | 1.06 µs .. 1.06 µs | per elem |
| peel, per difference | binary-u.127/d=150,m=300,prefilter=false,batch=false,h2c=pornin-addend | gf2_127-u | per-element | 1.05 µs | 1.05 µs .. 1.05 µs | per elem |
| peel, per difference | binary-u.127/d=150,m=300,prefilter=false,batch=true,h2c=pornin-addend | gf2_127-u | batch | 819 ns | 818 ns .. 821 ns | per elem |
| peel, per difference | binary-u.127/d=150,m=300,prefilter=true,batch=false,h2c=pornin-addend | gf2_127-u | per-element | 1.14 µs | 1.13 µs .. 1.14 µs | per elem |
| peel, per difference | binary-u.127/d=150,m=300,prefilter=true,batch=true,h2c=pornin-addend | gf2_127-u | batch | 1.00 µs | 1.00 µs .. 1.01 µs | per elem |
| peel, per difference | binary-u.127/d=20,m=40,prefilter=false,batch=false,h2c=pornin-addend | gf2_127-u | per-element | 819 ns | 817 ns .. 821 ns | per elem |
| peel, per difference | binary-u.127/d=20,m=40,prefilter=false,batch=true,h2c=pornin-addend | gf2_127-u | batch | 661 ns | 659 ns .. 663 ns | per elem |
| peel, per difference | binary-u.127/d=20,m=40,prefilter=true,batch=false,h2c=pornin-addend | gf2_127-u | per-element | 884 ns | 880 ns .. 891 ns | per elem |
| peel, per difference | binary-u.127/d=20,m=40,prefilter=true,batch=true,h2c=pornin-addend | gf2_127-u | batch | 789 ns | 787 ns .. 792 ns | per elem |
| peel, per difference | binary-u.127/d=4,m=10,prefilter=true,batch=true,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_127-u | batch | 625 ns | 621 ns .. 629 ns | per elem |
| peel, per difference | binary-u.127/d=4,m=8,prefilter=false,batch=false,h2c=pornin-addend | gf2_127-u | per-element | 551 ns | 550 ns .. 553 ns | per elem |
| peel, per difference | binary-u.127/d=4,m=8,prefilter=false,batch=true,h2c=pornin-addend | gf2_127-u | batch | 510 ns | 509 ns .. 512 ns | per elem |
| peel, per difference | binary-u.127/d=4,m=8,prefilter=true,batch=false,h2c=pornin-addend | gf2_127-u | per-element | 632 ns | 630 ns .. 634 ns | per elem |
| peel, per difference | binary-u.127/d=4,m=8,prefilter=true,batch=true,h2c=pornin-addend | gf2_127-u | batch | 589 ns | 588 ns .. 591 ns | per elem |
| peel, per difference | binary-w.127/d=10000,m=20000,prefilter=false,batch=false,h2c=pornin-addend | gf2_127-w | per-element | 1.66 µs | 1.65 µs .. 1.66 µs | per elem |
| peel, per difference | binary-w.127/d=10000,m=20000,prefilter=false,batch=true,h2c=pornin-addend | gf2_127-w | batch | 1.42 µs | 1.41 µs .. 1.42 µs | per elem |
| peel, per difference | binary-w.127/d=10000,m=20000,prefilter=true,batch=false,h2c=pornin-addend | gf2_127-w | per-element | 1.78 µs | 1.78 µs .. 1.78 µs | per elem |
| peel, per difference | binary-w.127/d=10000,m=20000,prefilter=true,batch=true,h2c=pornin-addend | gf2_127-w | batch | 1.65 µs | 1.65 µs .. 1.65 µs | per elem |
| peel, per difference | binary-w.127/d=10000,m=20000,prefilter=true,batch=true,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_127-w | batch | 1.40 µs | 1.40 µs .. 1.41 µs | per elem |
| peel, per difference | binary-w.127/d=1350,m=2700,prefilter=false,batch=false,h2c=pornin-addend | gf2_127-w | per-element | 1.39 µs | 1.39 µs .. 1.39 µs | per elem |
| peel, per difference | binary-w.127/d=1350,m=2700,prefilter=false,batch=true,h2c=pornin-addend | gf2_127-w | batch | 1.16 µs | 1.16 µs .. 1.17 µs | per elem |
| peel, per difference | binary-w.127/d=1350,m=2700,prefilter=true,batch=false,h2c=pornin-addend | gf2_127-w | per-element | 1.49 µs | 1.48 µs .. 1.49 µs | per elem |
| peel, per difference | binary-w.127/d=1350,m=2700,prefilter=true,batch=true,h2c=pornin-addend | gf2_127-w | batch | 1.36 µs | 1.36 µs .. 1.36 µs | per elem |
| peel, per difference | binary-w.127/d=1350,m=2700,prefilter=true,batch=true,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_127-w | batch | 1.12 µs | 1.12 µs .. 1.13 µs | per elem |
| peel, per difference | binary-w.127/d=150,m=300,prefilter=false,batch=false,h2c=pornin-addend | gf2_127-w | per-element | 1.09 µs | 1.09 µs .. 1.10 µs | per elem |
| peel, per difference | binary-w.127/d=150,m=300,prefilter=false,batch=true,h2c=pornin-addend | gf2_127-w | batch | 861 ns | 856 ns .. 865 ns | per elem |
| peel, per difference | binary-w.127/d=150,m=300,prefilter=true,batch=false,h2c=pornin-addend | gf2_127-w | per-element | 1.18 µs | 1.18 µs .. 1.18 µs | per elem |
| peel, per difference | binary-w.127/d=150,m=300,prefilter=true,batch=true,h2c=pornin-addend | gf2_127-w | batch | 1.04 µs | 1.04 µs .. 1.05 µs | per elem |
| peel, per difference | binary-w.127/d=20,m=40,prefilter=false,batch=false,h2c=pornin-addend | gf2_127-w | per-element | 829 ns | 826 ns .. 831 ns | per elem |
| peel, per difference | binary-w.127/d=20,m=40,prefilter=false,batch=true,h2c=pornin-addend | gf2_127-w | batch | 668 ns | 664 ns .. 671 ns | per elem |
| peel, per difference | binary-w.127/d=20,m=40,prefilter=true,batch=false,h2c=pornin-addend | gf2_127-w | per-element | 887 ns | 885 ns .. 888 ns | per elem |
| peel, per difference | binary-w.127/d=20,m=40,prefilter=true,batch=true,h2c=pornin-addend | gf2_127-w | batch | 794 ns | 791 ns .. 797 ns | per elem |
| peel, per difference | binary-w.127/d=4,m=10,prefilter=true,batch=true,h2c=pornin-addend,proj=gf2_127,mapproj=gf2_127 | gf2_127-w | batch | 612 ns | 610 ns .. 615 ns | per elem |
| peel, per difference | binary-w.127/d=4,m=8,prefilter=false,batch=false,h2c=pornin-addend | gf2_127-w | per-element | 551 ns | 548 ns .. 553 ns | per elem |
| peel, per difference | binary-w.127/d=4,m=8,prefilter=false,batch=true,h2c=pornin-addend | gf2_127-w | batch | 508 ns | 505 ns .. 510 ns | per elem |
| peel, per difference | binary-w.127/d=4,m=8,prefilter=true,batch=false,h2c=pornin-addend | gf2_127-w | per-element | 626 ns | 624 ns .. 627 ns | per elem |
| peel, per difference | binary-w.127/d=4,m=8,prefilter=true,batch=true,h2c=pornin-addend | gf2_127-w | batch | 584 ns | 581 ns .. 587 ns | per elem |
| peel, per difference | edwards.107/d=1350,m=2700,prefilter=true,batch=true,h2c=ti | edwards107 | batch | 2.39 µs | 2.38 µs .. 2.40 µs | per elem |
| peel, per difference | edwards.127/d=1350,m=2700,prefilter=true,batch=true,h2c=ti | edwards127 | batch | 2.64 µs | 2.64 µs .. 2.65 µs | per elem |
| peel, per difference | edwards.61x2/d=1350,m=2700,prefilter=true,batch=true,h2c=ti | edwards61x2 | batch | 2.12 µs | 2.11 µs .. 2.12 µs | per elem |
| peel, per difference | twisted.goldilocks2/d=1350,m=2700,prefilter=true,batch=true,h2c=ti | twisted-goldilocks2 | batch | 3.81 µs | 3.80 µs .. 3.82 µs | per elem |
| peel, per difference | twisted.128/d=1350,m=2700,prefilter=true,batch=true,h2c=ti | twisted128 | batch | 3.64 µs | 3.63 µs .. 3.64 µs | per elem |
| peel, per difference | twisted.61x2/d=1350,m=2700,prefilter=true,batch=true,h2c=ti | twisted61x2 | batch | 2.08 µs | 2.07 µs .. 2.08 µs | per elem |
| peel, per difference | twisted.64x2/d=1350,m=2700,prefilter=true,batch=true,h2c=ti | twisted64x2 | batch | 2.51 µs | 2.50 µs .. 2.52 µs | per elem |
| peel, per difference | weier.107/d=1350,m=2700,prefilter=true,batch=true,h2c=ti | weier107 | batch | 2.67 µs | 2.66 µs .. 2.68 µs | per elem |
| peel, per difference | weier-jacobian.107/d=1350,m=2700,prefilter=true,batch=true,h2c=ti | weier107-jacobian | batch | 2.57 µs | 2.56 µs .. 2.58 µs | per elem |
| peel, per difference | weier.127/d=1350,m=2700,prefilter=true,batch=true,h2c=ti | weier127 | batch | 3.04 µs | 3.04 µs .. 3.05 µs | per elem |
| peel, per difference | weier-jacobian.127/d=1350,m=2700,prefilter=true,batch=true,h2c=ti | weier127-jacobian | batch | 2.81 µs | 2.80 µs .. 2.82 µs | per elem |
| peel, per difference | weier.61x2/d=1350,m=2700,prefilter=true,batch=true,h2c=ti | weier61x2 | batch | 2.45 µs | 2.44 µs .. 2.46 µs | per elem |
| peel, per difference | weier-jacobian.61x2/d=1350,m=2700,prefilter=true,batch=true,h2c=ti | weier61x2-jacobian | batch | 2.37 µs | 2.37 µs .. 2.38 µs | per elem |
| peel, per difference | ristretto255/d=1350,m=2700,prefilter=true,batch=true | ristretto255 | batch | 9.13 µs | 9.11 µs .. 9.15 µs | per elem |
| rateless encode and decode, per difference | xor-sha256.64/d=10 | xor | per-element | 758 ns | 754 ns .. 764 ns | per elem |
| rateless encode and decode, per difference | xor-sha256.64/d=100 | xor | per-element | 1.34 µs | 1.34 µs .. 1.35 µs | per elem |
| rateless encode and decode, per difference | xor-sha256.64/d=1000 | xor | per-element | 2.28 µs | 2.28 µs .. 2.29 µs | per elem |
| rateless encode and decode, per difference | xor-sha256.64/d=10000 | xor | per-element | 4.24 µs | 4.22 µs .. 4.26 µs | per elem |
| rateless encode and decode, per difference | xor-sha256.64/d=100000 | xor | per-element | 11.1 µs | 11.0 µs .. 11.1 µs | per elem |
| rateless encode and decode, per difference | xor-sha256.64/d=20 | xor | per-element | 921 ns | 917 ns .. 927 ns | per elem |
| rateless encode and decode, per difference | xor-sha256.64/d=40 | xor | per-element | 1.06 µs | 1.06 µs .. 1.07 µs | per elem |
| rateless encode and decode, per difference | xor-sha256.64/d=50000 | xor | per-element | 7.98 µs | 7.94 µs .. 8.03 µs | per elem |
| rateless encode and decode, per difference | xor-siphash.64/d=10 | xor-siphash | per-element | 617 ns | 616 ns .. 619 ns | per elem |
| rateless encode and decode, per difference | xor-siphash.64/d=10,map=mcg64 | xor-siphash | per-element | 611 ns | 609 ns .. 613 ns | per elem |
| rateless encode and decode, per difference | xor-siphash.64/d=100 | xor-siphash | per-element | 1.15 µs | 1.15 µs .. 1.15 µs | per elem |
| rateless encode and decode, per difference | xor-siphash.64/d=100,map=mcg64 | xor-siphash | per-element | 1.14 µs | 1.13 µs .. 1.15 µs | per elem |
| rateless encode and decode, per difference | xor-siphash.64/d=1000 | xor-siphash | per-element | 2.05 µs | 2.05 µs .. 2.06 µs | per elem |
| rateless encode and decode, per difference | xor-siphash.64/d=1000,map=mcg64 | xor-siphash | per-element | 1.99 µs | 1.99 µs .. 2.00 µs | per elem |
| rateless encode and decode, per difference | xor-siphash.64/d=10000 | xor-siphash | per-element | 3.88 µs | 3.87 µs .. 3.88 µs | per elem |
| rateless encode and decode, per difference | xor-siphash.64/d=10000,map=chacha8 | xor-siphash | per-element | 4.47 µs | 4.44 µs .. 4.50 µs | per elem |
| rateless encode and decode, per difference | xor-siphash.64/d=10000,map=mcg64 | xor-siphash | per-element | 3.88 µs | 3.87 µs .. 3.89 µs | per elem |
| rateless encode and decode, per difference | xor-siphash.64/d=100000 | xor-siphash | per-element | 10.7 µs | 10.7 µs .. 10.8 µs | per elem |
| rateless encode and decode, per difference | xor-siphash.64/d=100000,map=chacha8 | xor-siphash | per-element | 16.4 µs | 16.4 µs .. 16.4 µs | per elem |
| rateless encode and decode, per difference | xor-siphash.64/d=100000,map=mcg64 | xor-siphash | per-element | 10.6 µs | 10.6 µs .. 10.7 µs | per elem |
| rateless encode and decode, per difference | xor-siphash.64/d=20 | xor-siphash | per-element | 765 ns | 763 ns .. 768 ns | per elem |
| rateless encode and decode, per difference | xor-siphash.64/d=20,map=mcg64 | xor-siphash | per-element | 757 ns | 755 ns .. 759 ns | per elem |
| rateless encode and decode, per difference | xor-siphash.64/d=40 | xor-siphash | per-element | 893 ns | 891 ns .. 895 ns | per elem |
| rateless encode and decode, per difference | xor-siphash.64/d=40,map=mcg64 | xor-siphash | per-element | 894 ns | 892 ns .. 897 ns | per elem |
| rateless encode and decode, per difference | xor-siphash.64/d=50000 | xor-siphash | per-element | 7.72 µs | 7.68 µs .. 7.76 µs | per elem |
| rateless encode and decode, per difference | xor-siphash.64/d=50000,map=mcg64 | xor-siphash | per-element | 7.15 µs | 7.08 µs .. 7.23 µs | per elem |
| rateless encode and decode, per difference | binary.109/d=10,h2c=pornin | gf2_109 | per-element | 2.69 µs | 2.68 µs .. 2.69 µs | per elem |
| rateless encode and decode, per difference | binary.109/d=1000,h2c=pornin | gf2_109 | per-element | 5.53 µs | 5.52 µs .. 5.54 µs | per elem |
| rateless encode and decode, per difference | binary.109/d=100000,h2c=pornin | gf2_109 | per-element | 19.0 µs | 19.0 µs .. 19.1 µs | per elem |
| rateless encode and decode, per difference | binary-lambda.109/d=10,h2c=pornin-addend | gf2_109-lambda | per-element | 2.62 µs | 2.62 µs .. 2.63 µs | per elem |
| rateless encode and decode, per difference | binary-lambda.109/d=1000,h2c=pornin-addend | gf2_109-lambda | per-element | 5.47 µs | 5.46 µs .. 5.48 µs | per elem |
| rateless encode and decode, per difference | binary-lambda.109/d=100000,h2c=pornin-addend | gf2_109-lambda | per-element | 18.2 µs | 18.2 µs .. 18.2 µs | per elem |
| rateless encode and decode, per difference | binary-u.109/d=10,h2c=pornin-addend | gf2_109-u | per-element | 2.55 µs | 2.55 µs .. 2.56 µs | per elem |
| rateless encode and decode, per difference | binary-u.109/d=100,h2c=pornin-addend | gf2_109-u | per-element | 3.76 µs | 3.76 µs .. 3.77 µs | per elem |
| rateless encode and decode, per difference | binary-u.109/d=1000,h2c=pornin-addend | gf2_109-u | per-element | 5.15 µs | 5.15 µs .. 5.16 µs | per elem |
| rateless encode and decode, per difference | binary-u.109/d=10000,h2c=pornin-addend | gf2_109-u | per-element | 7.44 µs | 7.41 µs .. 7.46 µs | per elem |
| rateless encode and decode, per difference | binary-u.109/d=100000,h2c=pornin-addend | gf2_109-u | per-element | 19.5 µs | 19.4 µs .. 19.8 µs | per elem |
| rateless encode and decode, per difference | binary-u.109/d=20,h2c=pornin-addend | gf2_109-u | per-element | 2.95 µs | 2.95 µs .. 2.96 µs | per elem |
| rateless encode and decode, per difference | binary-u.109/d=40,h2c=pornin-addend | gf2_109-u | per-element | 3.29 µs | 3.29 µs .. 3.30 µs | per elem |
| rateless encode and decode, per difference | binary-u.109/d=50000,h2c=pornin-addend | gf2_109-u | per-element | 13.8 µs | 13.7 µs .. 13.9 µs | per elem |
| rateless encode and decode, per difference | binary-w.109/d=10,h2c=pornin-addend | gf2_109-w | per-element | 2.63 µs | 2.62 µs .. 2.63 µs | per elem |
| rateless encode and decode, per difference | binary-w.109/d=1000,h2c=pornin-addend | gf2_109-w | per-element | 5.46 µs | 5.45 µs .. 5.48 µs | per elem |
| rateless encode and decode, per difference | binary-w.109/d=100000,h2c=pornin-addend | gf2_109-w | per-element | 18.1 µs | 18.0 µs .. 18.1 µs | per elem |
| rateless encode and decode, per difference | binary.122/d=10,h2c=pornin | gf2_122 | per-element | 2.05 µs | 2.05 µs .. 2.06 µs | per elem |
| rateless encode and decode, per difference | binary.122/d=1000,h2c=pornin | gf2_122 | per-element | 4.70 µs | 4.69 µs .. 4.71 µs | per elem |
| rateless encode and decode, per difference | binary.122/d=100000,h2c=pornin | gf2_122 | per-element | 18.3 µs | 18.2 µs .. 18.3 µs | per elem |
| rateless encode and decode, per difference | binary.122-gls/d=10,h2c=pornin | gf2_122-gls | per-element | 2.03 µs | 2.03 µs .. 2.03 µs | per elem |
| rateless encode and decode, per difference | binary.122-gls/d=1000,h2c=pornin | gf2_122-gls | per-element | 4.61 µs | 4.61 µs .. 4.62 µs | per elem |
| rateless encode and decode, per difference | binary.122-gls/d=100000,h2c=pornin | gf2_122-gls | per-element | 18.0 µs | 18.0 µs .. 18.0 µs | per elem |
| rateless encode and decode, per difference | binary-lambda.122-gls/d=10,h2c=pornin-addend | gf2_122-gls-lambda | per-element | 1.99 µs | 1.99 µs .. 2.00 µs | per elem |
| rateless encode and decode, per difference | binary-lambda.122-gls/d=1000,h2c=pornin-addend | gf2_122-gls-lambda | per-element | 4.61 µs | 4.60 µs .. 4.62 µs | per elem |
| rateless encode and decode, per difference | binary-lambda.122-gls/d=100000,h2c=pornin-addend | gf2_122-gls-lambda | per-element | 17.9 µs | 17.8 µs .. 18.1 µs | per elem |
| rateless encode and decode, per difference | binary-u.122-gls/d=10,h2c=pornin-addend | gf2_122-gls-u | per-element | 1.93 µs | 1.93 µs .. 1.93 µs | per elem |
| rateless encode and decode, per difference | binary-u.122-gls/d=100,h2c=pornin-addend | gf2_122-gls-u | per-element | 2.98 µs | 2.98 µs .. 2.99 µs | per elem |
| rateless encode and decode, per difference | binary-u.122-gls/d=1000,h2c=pornin-addend | gf2_122-gls-u | per-element | 4.33 µs | 4.33 µs .. 4.34 µs | per elem |
| rateless encode and decode, per difference | binary-u.122-gls/d=10000,h2c=pornin-addend | gf2_122-gls-u | per-element | 6.85 µs | 6.83 µs .. 6.86 µs | per elem |
| rateless encode and decode, per difference | binary-u.122-gls/d=100000,h2c=pornin-addend | gf2_122-gls-u | per-element | 18.9 µs | 18.9 µs .. 19.0 µs | per elem |
| rateless encode and decode, per difference | binary-u.122-gls/d=20,h2c=pornin-addend | gf2_122-gls-u | per-element | 2.29 µs | 2.28 µs .. 2.31 µs | per elem |
| rateless encode and decode, per difference | binary-u.122-gls/d=40,h2c=pornin-addend | gf2_122-gls-u | per-element | 2.55 µs | 2.55 µs .. 2.56 µs | per elem |
| rateless encode and decode, per difference | binary-u.122-gls/d=50000,h2c=pornin-addend | gf2_122-gls-u | per-element | 13.1 µs | 13.1 µs .. 13.2 µs | per elem |
| rateless encode and decode, per difference | binary-w.122-gls/d=10,h2c=pornin-addend | gf2_122-gls-w | per-element | 2.00 µs | 2.00 µs .. 2.00 µs | per elem |
| rateless encode and decode, per difference | binary-w.122-gls/d=1000,h2c=pornin-addend | gf2_122-gls-w | per-element | 4.65 µs | 4.64 µs .. 4.65 µs | per elem |
| rateless encode and decode, per difference | binary-w.122-gls/d=100000,h2c=pornin-addend | gf2_122-gls-w | per-element | 18.1 µs | 18.0 µs .. 18.1 µs | per elem |
| rateless encode and decode, per difference | binary-lambda.122/d=10,h2c=pornin-addend | gf2_122-lambda | per-element | 2.01 µs | 2.00 µs .. 2.01 µs | per elem |
| rateless encode and decode, per difference | binary-lambda.122/d=1000,h2c=pornin-addend | gf2_122-lambda | per-element | 4.64 µs | 4.63 µs .. 4.66 µs | per elem |
| rateless encode and decode, per difference | binary-lambda.122/d=100000,h2c=pornin-addend | gf2_122-lambda | per-element | 18.0 µs | 18.0 µs .. 18.1 µs | per elem |
| rateless encode and decode, per difference | binary-u.122/d=10,h2c=pornin-addend | gf2_122-u | per-element | 1.93 µs | 1.93 µs .. 1.93 µs | per elem |
| rateless encode and decode, per difference | binary-u.122/d=100,h2c=pornin-addend | gf2_122-u | per-element | 2.97 µs | 2.96 µs .. 2.98 µs | per elem |
| rateless encode and decode, per difference | binary-u.122/d=1000,h2c=pornin-addend | gf2_122-u | per-element | 4.33 µs | 4.32 µs .. 4.35 µs | per elem |
| rateless encode and decode, per difference | binary-u.122/d=10000,h2c=pornin-addend | gf2_122-u | per-element | 6.70 µs | 6.69 µs .. 6.71 µs | per elem |
| rateless encode and decode, per difference | binary-u.122/d=100000,h2c=pornin-addend | gf2_122-u | per-element | 17.5 µs | 17.5 µs .. 17.6 µs | per elem |
| rateless encode and decode, per difference | binary-u.122/d=20,h2c=pornin-addend | gf2_122-u | per-element | 2.26 µs | 2.25 µs .. 2.26 µs | per elem |
| rateless encode and decode, per difference | binary-u.122/d=40,h2c=pornin-addend | gf2_122-u | per-element | 2.54 µs | 2.53 µs .. 2.55 µs | per elem |
| rateless encode and decode, per difference | binary-u.122/d=50000,h2c=pornin-addend | gf2_122-u | per-element | 12.5 µs | 12.5 µs .. 12.5 µs | per elem |
| rateless encode and decode, per difference | binary-w.122/d=10,h2c=pornin-addend | gf2_122-w | per-element | 2.02 µs | 2.00 µs .. 2.04 µs | per elem |
| rateless encode and decode, per difference | binary-w.122/d=1000,h2c=pornin-addend | gf2_122-w | per-element | 4.63 µs | 4.62 µs .. 4.64 µs | per elem |
| rateless encode and decode, per difference | binary-w.122/d=100000,h2c=pornin-addend | gf2_122-w | per-element | 17.8 µs | 17.8 µs .. 17.9 µs | per elem |
| rateless encode and decode, per difference | binary.127/d=10,h2c=pornin | gf2_127 | per-element | 1.65 µs | 1.65 µs .. 1.66 µs | per elem |
| rateless encode and decode, per difference | binary.127/d=10,h2c=pornin,map=mcg64 | gf2_127 | per-element | 1.65 µs | 1.64 µs .. 1.65 µs | per elem |
| rateless encode and decode, per difference | binary.127/d=100,h2c=pornin,map=mcg64 | gf2_127 | per-element | 2.65 µs | 2.65 µs .. 2.66 µs | per elem |
| rateless encode and decode, per difference | binary.127/d=1000,h2c=pornin | gf2_127 | per-element | 4.14 µs | 4.13 µs .. 4.14 µs | per elem |
| rateless encode and decode, per difference | binary.127/d=1000,h2c=pornin,map=mcg64 | gf2_127 | per-element | 4.05 µs | 4.04 µs .. 4.07 µs | per elem |
| rateless encode and decode, per difference | binary.127/d=10000,h2c=pornin,map=chacha8 | gf2_127 | per-element | 7.71 µs | 7.67 µs .. 7.77 µs | per elem |
| rateless encode and decode, per difference | binary.127/d=10000,h2c=pornin,map=mcg64 | gf2_127 | per-element | 6.58 µs | 6.50 µs .. 6.69 µs | per elem |
| rateless encode and decode, per difference | binary.127/d=100000,h2c=pornin | gf2_127 | per-element | 19.7 µs | 19.7 µs .. 19.8 µs | per elem |
| rateless encode and decode, per difference | binary.127/d=100000,h2c=pornin,map=chacha8 | gf2_127 | per-element | 23.9 µs | 23.9 µs .. 24.0 µs | per elem |
| rateless encode and decode, per difference | binary.127/d=100000,h2c=pornin,map=mcg64 | gf2_127 | per-element | 16.3 µs | 16.2 µs .. 16.3 µs | per elem |
| rateless encode and decode, per difference | binary.127/d=20,h2c=pornin,map=mcg64 | gf2_127 | per-element | 1.94 µs | 1.94 µs .. 1.94 µs | per elem |
| rateless encode and decode, per difference | binary.127/d=40,h2c=pornin,map=mcg64 | gf2_127 | per-element | 2.22 µs | 2.22 µs .. 2.23 µs | per elem |
| rateless encode and decode, per difference | binary.127/d=50000,h2c=pornin,map=mcg64 | gf2_127 | per-element | 12.1 µs | 12.0 µs .. 12.1 µs | per elem |
| rateless encode and decode, per difference | binary-lambda.127/d=10,h2c=pornin-addend | gf2_127-lambda | per-element | 1.57 µs | 1.57 µs .. 1.57 µs | per elem |
| rateless encode and decode, per difference | binary-lambda.127/d=100,h2c=pornin-addend | gf2_127-lambda | per-element | 2.63 µs | 2.62 µs .. 2.63 µs | per elem |
| rateless encode and decode, per difference | binary-lambda.127/d=1000,h2c=pornin-addend | gf2_127-lambda | per-element | 4.05 µs | 4.04 µs .. 4.06 µs | per elem |
| rateless encode and decode, per difference | binary-lambda.127/d=10000,h2c=pornin-addend | gf2_127-lambda | per-element | 6.54 µs | 6.51 µs .. 6.58 µs | per elem |
| rateless encode and decode, per difference | binary-lambda.127/d=100000,h2c=pornin-addend | gf2_127-lambda | per-element | 17.5 µs | 17.5 µs .. 17.6 µs | per elem |
| rateless encode and decode, per difference | binary-lambda.127/d=20,h2c=pornin-addend | gf2_127-lambda | per-element | 1.89 µs | 1.88 µs .. 1.89 µs | per elem |
| rateless encode and decode, per difference | binary-lambda.127/d=40,h2c=pornin-addend | gf2_127-lambda | per-element | 2.17 µs | 2.17 µs .. 2.18 µs | per elem |
| rateless encode and decode, per difference | binary-lambda.127/d=50000,h2c=pornin-addend | gf2_127-lambda | per-element | 12.5 µs | 12.4 µs .. 12.6 µs | per elem |
| rateless encode and decode, per difference | binary-u.127/d=10,h2c=pornin-addend | gf2_127-u | per-element | 1.53 µs | 1.53 µs .. 1.53 µs | per elem |
| rateless encode and decode, per difference | binary-u.127/d=100,h2c=pornin-addend | gf2_127-u | per-element | 2.47 µs | 2.46 µs .. 2.47 µs | per elem |
| rateless encode and decode, per difference | binary-u.127/d=1000,h2c=pornin-addend | gf2_127-u | per-element | 3.84 µs | 3.81 µs .. 3.90 µs | per elem |
| rateless encode and decode, per difference | binary-u.127/d=10000,h2c=pornin-addend | gf2_127-u | per-element | 6.21 µs | 6.20 µs .. 6.23 µs | per elem |
| rateless encode and decode, per difference | binary-u.127/d=100000,h2c=pornin-addend | gf2_127-u | per-element | 17.1 µs | 17.0 µs .. 17.3 µs | per elem |
| rateless encode and decode, per difference | binary-u.127/d=20,h2c=pornin-addend | gf2_127-u | per-element | 1.81 µs | 1.80 µs .. 1.81 µs | per elem |
| rateless encode and decode, per difference | binary-u.127/d=40,h2c=pornin-addend | gf2_127-u | per-element | 2.07 µs | 2.07 µs .. 2.07 µs | per elem |
| rateless encode and decode, per difference | binary-u.127/d=50000,h2c=pornin-addend | gf2_127-u | per-element | 11.9 µs | 11.9 µs .. 12.0 µs | per elem |
| rateless encode and decode, per difference | binary-w.127/d=10,h2c=pornin-addend | gf2_127-w | per-element | 1.58 µs | 1.57 µs .. 1.58 µs | per elem |
| rateless encode and decode, per difference | binary-w.127/d=100,h2c=pornin-addend | gf2_127-w | per-element | 2.62 µs | 2.62 µs .. 2.62 µs | per elem |
| rateless encode and decode, per difference | binary-w.127/d=1000,h2c=pornin-addend | gf2_127-w | per-element | 4.05 µs | 4.05 µs .. 4.06 µs | per elem |
| rateless encode and decode, per difference | binary-w.127/d=10000,h2c=pornin-addend | gf2_127-w | per-element | 6.50 µs | 6.49 µs .. 6.51 µs | per elem |
| rateless encode and decode, per difference | binary-w.127/d=100000,h2c=pornin-addend | gf2_127-w | per-element | 17.3 µs | 17.3 µs .. 17.4 µs | per elem |
| rateless encode and decode, per difference | binary-w.127/d=20,h2c=pornin-addend | gf2_127-w | per-element | 1.89 µs | 1.89 µs .. 1.90 µs | per elem |
| rateless encode and decode, per difference | binary-w.127/d=40,h2c=pornin-addend | gf2_127-w | per-element | 2.18 µs | 2.17 µs .. 2.18 µs | per elem |
| rateless encode and decode, per difference | binary-w.127/d=50000,h2c=pornin-addend | gf2_127-w | per-element | 12.3 µs | 12.3 µs .. 12.4 µs | per elem |
| rateless encode and decode, per difference | edwards.107/d=1000,h2c=ti | edwards107 | per-element | 9.04 µs | 9.02 µs .. 9.07 µs | per elem |
| rateless encode and decode, per difference | edwards.127/d=1000,h2c=ti | edwards127 | per-element | 9.89 µs | 9.87 µs .. 9.91 µs | per elem |
| rateless encode and decode, per difference | edwards.61x2/d=1000,h2c=ti | edwards61x2 | per-element | 6.93 µs | 6.92 µs .. 6.95 µs | per elem |
| rateless encode and decode, per difference | twisted.goldilocks2/d=1000,h2c=ti | twisted-goldilocks2 | per-element | 11.7 µs | 11.7 µs .. 11.7 µs | per elem |
| rateless encode and decode, per difference | twisted.128/d=1000,h2c=ti | twisted128 | per-element | 11.2 µs | 11.1 µs .. 11.2 µs | per elem |
| rateless encode and decode, per difference | twisted.61x2/d=1000,h2c=ti | twisted61x2 | per-element | 6.15 µs | 6.13 µs .. 6.18 µs | per elem |
| rateless encode and decode, per difference | twisted.64x2/d=1000,h2c=ti | twisted64x2 | per-element | 7.46 µs | 7.44 µs .. 7.48 µs | per elem |
| rateless encode and decode, per difference | weier.107/d=1000,h2c=ti | weier107 | per-element | 8.14 µs | 8.12 µs .. 8.16 µs | per elem |
| rateless encode and decode, per difference | weier-jacobian.107/d=1000,h2c=ti | weier107-jacobian | per-element | 7.72 µs | 7.70 µs .. 7.75 µs | per elem |
| rateless encode and decode, per difference | weier.127/d=1000,h2c=ti | weier127 | per-element | 9.39 µs | 9.37 µs .. 9.42 µs | per elem |
| rateless encode and decode, per difference | weier-jacobian.127/d=1000,h2c=ti | weier127-jacobian | per-element | 8.62 µs | 8.61 µs .. 8.64 µs | per elem |
| rateless encode and decode, per difference | weier.61x2/d=1000,h2c=ti | weier61x2 | per-element | 7.42 µs | 7.41 µs .. 7.43 µs | per elem |
| rateless encode and decode, per difference | weier-jacobian.61x2/d=1000,h2c=ti | weier61x2-jacobian | per-element | 7.21 µs | 7.20 µs .. 7.22 µs | per elem |
| rateless encode and decode, per difference | ristretto255/d=10 | ristretto255 | per-element | 17.8 µs | 17.8 µs .. 17.9 µs | per elem |
| rateless encode and decode, per difference | ristretto255/d=10,map=mcg64 | ristretto255 | per-element | 17.9 µs | 17.8 µs .. 17.9 µs | per elem |
| rateless encode and decode, per difference | ristretto255/d=100 | ristretto255 | per-element | 24.3 µs | 24.2 µs .. 24.4 µs | per elem |
| rateless encode and decode, per difference | ristretto255/d=100,map=mcg64 | ristretto255 | per-element | 24.3 µs | 24.2 µs .. 24.4 µs | per elem |
| rateless encode and decode, per difference | ristretto255/d=1000 | ristretto255 | per-element | 28.8 µs | 28.7 µs .. 28.9 µs | per elem |
| rateless encode and decode, per difference | ristretto255/d=1000,map=mcg64 | ristretto255 | per-element | 28.7 µs | 28.6 µs .. 28.8 µs | per elem |
| rateless encode and decode, per difference | ristretto255/d=10000 | ristretto255 | per-element | 33.9 µs | 33.8 µs .. 34.0 µs | per elem |
| rateless encode and decode, per difference | ristretto255/d=10000,map=chacha8 | ristretto255 | per-element | 36.3 µs | 36.1 µs .. 36.5 µs | per elem |
| rateless encode and decode, per difference | ristretto255/d=10000,map=mcg64 | ristretto255 | per-element | 34.2 µs | 33.6 µs .. 35.1 µs | per elem |
| rateless encode and decode, per difference | ristretto255/d=100000 | ristretto255 | per-element | 48.0 µs | 47.9 µs .. 48.1 µs | per elem |
| rateless encode and decode, per difference | ristretto255/d=100000,map=chacha8 | ristretto255 | per-element | 54.1 µs | 54.0 µs .. 54.3 µs | per elem |
| rateless encode and decode, per difference | ristretto255/d=100000,map=mcg64 | ristretto255 | per-element | 47.0 µs | 46.7 µs .. 47.4 µs | per elem |
| rateless encode and decode, per difference | ristretto255/d=20 | ristretto255 | per-element | 20.3 µs | 20.2 µs .. 20.3 µs | per elem |
| rateless encode and decode, per difference | ristretto255/d=20,map=mcg64 | ristretto255 | per-element | 20.2 µs | 20.1 µs .. 20.3 µs | per elem |
| rateless encode and decode, per difference | ristretto255/d=40 | ristretto255 | per-element | 22.2 µs | 22.2 µs .. 22.3 µs | per elem |
| rateless encode and decode, per difference | ristretto255/d=40,map=mcg64 | ristretto255 | per-element | 22.2 µs | 22.1 µs .. 22.3 µs | per elem |
| rateless encode and decode, per difference | ristretto255/d=50000 | ristretto255 | per-element | 43.3 µs | 43.2 µs .. 43.5 µs | per elem |
| rateless encode and decode, per difference | ristretto255/d=50000,map=mcg64 | ristretto255 | per-element | 42.2 µs | 42.1 µs .. 42.4 µs | per elem |
| mapping, per index | chacha8/next | mapping | per-element | 10.5 ns | 10.5 ns .. 10.5 ns | per elem |
| mapping, per index | mcg64/next | mapping | per-element | 4.09 ns | 4.08 ns .. 4.10 ns | per elem |
| mapping, per index | sha256-ctr/next | mapping | per-element | 22.6 ns | 22.5 ns .. 22.6 ns | per elem |
| mapping, per index | xoshiro256pp/next | mapping | per-element | 4.43 ns | 4.42 ns .. 4.43 ns | per elem |
| mapping, per item | chacha8/item,m=12150 | mapping | per-element | 216 ns | 215 ns .. 216 ns | per elem |
| mapping, per item | chacha8/item,m=1350 | mapping | per-element | 180 ns | 180 ns .. 181 ns | per elem |
| mapping, per item | chacha8/item,m=150 | mapping | per-element | 141 ns | 141 ns .. 141 ns | per elem |
| mapping, per item | chacha8/item,m=20 | mapping | per-element | 105 ns | 104 ns .. 105 ns | per elem |
| mapping, per item | chacha8/item,m=5 | mapping | per-element | 81.1 ns | 80.8 ns .. 81.4 ns | per elem |
| mapping, per item | mcg64/item,m=12150 | mapping | per-element | 157 ns | 157 ns .. 158 ns | per elem |
| mapping, per item | mcg64/item,m=1350 | mapping | per-element | 122 ns | 122 ns .. 122 ns | per elem |
| mapping, per item | mcg64/item,m=150 | mapping | per-element | 83.8 ns | 83.6 ns .. 83.9 ns | per elem |
| mapping, per item | mcg64/item,m=20 | mapping | per-element | 46.1 ns | 46.0 ns .. 46.2 ns | per elem |
| mapping, per item | mcg64/item,m=5 | mapping | per-element | 21.4 ns | 21.3 ns .. 21.4 ns | per elem |
| mapping, per item | sha256-ctr/item,m=12150 | mapping | per-element | 430 ns | 429 ns .. 431 ns | per elem |
| mapping, per item | sha256-ctr/item,m=1350 | mapping | per-element | 334 ns | 334 ns .. 335 ns | per elem |
| mapping, per item | sha256-ctr/item,m=150 | mapping | per-element | 237 ns | 236 ns .. 237 ns | per elem |
| mapping, per item | sha256-ctr/item,m=20 | mapping | per-element | 148 ns | 147 ns .. 148 ns | per elem |
| mapping, per item | sha256-ctr/item,m=5 | mapping | per-element | 89.9 ns | 89.7 ns .. 90.1 ns | per elem |
| mapping, per item | xoshiro256pp/item,m=12150 | mapping | per-element | 159 ns | 158 ns .. 159 ns | per elem |
| mapping, per item | xoshiro256pp/item,m=1350 | mapping | per-element | 124 ns | 123 ns .. 124 ns | per elem |
| mapping, per item | xoshiro256pp/item,m=150 | mapping | per-element | 86.0 ns | 85.9 ns .. 86.1 ns | per elem |
| mapping, per item | xoshiro256pp/item,m=20 | mapping | per-element | 49.0 ns | 49.0 ns .. 49.1 ns | per elem |
| mapping, per item | xoshiro256pp/item,m=5 | mapping | per-element | 26.4 ns | 26.4 ns .. 26.5 ns | per elem |
| map digest of an ID | projection-fp127/digest of id | mapping | per-element | 13.6 ns | 13.6 ns .. 13.7 ns | per elem |
| map digest of an ID | projection-fp130/digest of id | mapping | per-element | 26.0 ns | 26.0 ns .. 26.1 ns | per elem |
| map digest of an ID | projection-gf2_127/digest of id | mapping | per-element | 9.67 ns | 9.65 ns .. 9.69 ns | per elem |
| map digest of an ID | salted-sha256/digest of id | mapping | per-element | 51.4 ns | 51.3 ns .. 51.5 ns | per elem |
| per-salt keys | projection-fp127/keys | mapping | per-element | 404 ns | 403 ns .. 406 ns | per elem |
| per-salt keys | projection-fp130/keys | mapping | per-element | 406 ns | 406 ns .. 407 ns | per elem |
| per-salt keys | projection-gf2_127/keys | mapping | per-element | 375 ns | 375 ns .. 376 ns | per elem |
| per-salt keys | salted-sha256/keys | mapping | per-element | 127 ns | 127 ns .. 127 ns | per elem |
| item ID | sha256/id | xor | per-element | 50.2 ns | 50.0 ns .. 50.3 ns | per elem |
| map digest | salted-sha256/digest | mapping | per-element | 51.8 ns | 51.7 ns .. 51.9 ns | per elem |
digest
Figure
11 benchmarks
| operation | benchmark | family | mode | time | 95% CI | unit |
|---|---|---|---|---|---|---|
| digest | xor-sha256 | xor | per-element | 55.1 ns | 54.3 ns .. 55.9 ns | per elem |
| digest | gf2_109/batch | gf2_109 | batch | 147 ns | 146 ns .. 147 ns | per elem |
| digest | gf2_122/batch | gf2_122 | batch | 138 ns | 136 ns .. 139 ns | per elem |
| digest | gf2_122-gls/batch | gf2_122-gls | batch | 136 ns | 135 ns .. 136 ns | per elem |
| digest | gf2_127/batch | gf2_127 | batch | 127 ns | 127 ns .. 128 ns | per elem |
| digest | edwards107/batch | edwards107 | batch | 961 ns | 958 ns .. 964 ns | per elem |
| digest | edwards127/batch | edwards127 | batch | 1.24 µs | 1.23 µs .. 1.24 µs | per elem |
| digest | weier107/batch | weier107 | batch | 937 ns | 933 ns .. 941 ns | per elem |
| digest | weier127/batch | weier127 | batch | 1.21 µs | 1.21 µs .. 1.21 µs | per elem |
| digest | ristretto255/streaming | ristretto255 | streaming | 6.18 µs | 6.16 µs .. 6.20 µs | per elem |
| digest | secp256k1/try-and-increment + combine_keys | secp256k1 | batch | 6.34 µs | 6.32 µs .. 6.36 µs | per elem |
curve generation
Figure
85 benchmarks
| operation | benchmark | family | mode | time | 95% CI | unit |
|---|---|---|---|---|---|---|
| accept certificate | gf2_109/0 | gf2_109 | total | 74.4 µs | 74.2 µs .. 74.5 µs | per iter |
| accept certificate | gf2_122/0 | gf2_122 | total | 70.1 µs | 69.9 µs .. 70.2 µs | per iter |
| accept certificate | gf2_122-gls/0 | gf2_122-gls | total | 78.3 µs | 78.0 µs .. 78.6 µs | per iter |
| accept certificate | gf2_127/0 | gf2_127 | total | 69.9 µs | 69.8 µs .. 70.1 µs | per iter |
| accept certificate | edwards107/0 | edwards107 | total | 78.4 µs | 78.1 µs .. 78.7 µs | per iter |
| accept certificate | edwards127/0 | edwards127 | total | 78.3 µs | 78.0 µs .. 78.7 µs | per iter |
| accept certificate | edwards61x2/0 | edwards61x2 | total | 82.6 µs | 82.3 µs .. 83.1 µs | per iter |
| accept certificate | twisted-goldilocks2/0 | twisted-goldilocks2 | total | 83.5 µs | 82.9 µs .. 84.1 µs | per iter |
| accept certificate | twisted128/0 | twisted128 | total | 87.5 µs | 87.3 µs .. 88.0 µs | per iter |
| accept certificate | twisted61x2/0 | twisted61x2 | total | 80.7 µs | 80.5 µs .. 81.0 µs | per iter |
| accept certificate | twisted64x2/0 | twisted64x2 | total | 86.9 µs | 86.4 µs .. 87.4 µs | per iter |
| accept certificate | weier107/0 | weier107 | total | 82.4 µs | 82.1 µs .. 82.8 µs | per iter |
| accept certificate | weier127/0 | weier127 | total | 91.2 µs | 91.0 µs .. 91.4 µs | per iter |
| accept certificate | weier61x2/0 | weier61x2 | total | 87.0 µs | 86.8 µs .. 87.2 µs | per iter |
| verify certificate | gf2_109/198 rejections/0 | gf2_109 | total | 258 µs | 258 µs .. 259 µs | per iter |
| verify certificate | gf2_122/4 rejections/0 | gf2_122 | total | 73.5 µs | 73.2 µs .. 73.9 µs | per iter |
| verify certificate | gf2_122-gls/60 rejections/0 | gf2_122-gls | total | 147 µs | 147 µs .. 147 µs | per iter |
| verify certificate | gf2_127/30 rejections/0 | gf2_127 | total | 84.5 µs | 84.3 µs .. 84.9 µs | per iter |
| verify certificate | edwards107/28 rejections/0 | edwards107 | total | 183 µs | 183 µs .. 184 µs | per iter |
| verify certificate | edwards127/56 rejections/0 | edwards127 | total | 307 µs | 299 µs .. 317 µs | per iter |
| verify certificate | edwards61x2/118 rejections/0 | edwards61x2 | total | 374 µs | 372 µs .. 376 µs | per iter |
| verify certificate | twisted-goldilocks2/32 rejections/0 | twisted-goldilocks2 | total | 221 µs | 221 µs .. 222 µs | per iter |
| verify certificate | twisted128/4 rejections/0 | twisted128 | total | 98.3 µs | 98.0 µs .. 98.7 µs | per iter |
| verify certificate | twisted61x2/344 rejections/0 | twisted61x2 | total | 696 µs | 696 µs .. 697 µs | per iter |
| verify certificate | twisted64x2/36 rejections/0 | twisted64x2 | total | 177 µs | 176 µs .. 177 µs | per iter |
| verify certificate | weier107/519 rejections/0 | weier107 | total | 475 µs | 474 µs .. 476 µs | per iter |
| verify certificate | weier127/125 rejections/0 | weier127 | total | 203 µs | 202 µs .. 205 µs | per iter |
| verify certificate | weier61x2/123 rejections/0 | weier61x2 | total | 193 µs | 192 µs .. 193 µs | per iter |
| embedding-degree bound | gf2_109/0 | gf2_109 | total | 43.6 µs | 43.4 µs .. 43.8 µs | per iter |
| embedding-degree bound | gf2_122/0 | gf2_122 | total | 43.2 µs | 42.9 µs .. 43.6 µs | per iter |
| embedding-degree bound | gf2_122-gls/0 | gf2_122-gls | total | 43.8 µs | 43.2 µs .. 44.2 µs | per iter |
| embedding-degree bound | gf2_127/0 | gf2_127 | total | 43.3 µs | 43.0 µs .. 43.6 µs | per iter |
| embedding-degree bound | edwards107/0 | edwards107 | total | 43.1 µs | 42.4 µs .. 43.5 µs | per iter |
| embedding-degree bound | edwards127/0 | edwards127 | total | 43.3 µs | 43.2 µs .. 43.4 µs | per iter |
| embedding-degree bound | edwards61x2/0 | edwards61x2 | total | 43.4 µs | 43.0 µs .. 44.0 µs | per iter |
| embedding-degree bound | twisted-goldilocks2/0 | twisted-goldilocks2 | total | 42.1 µs | 42.0 µs .. 42.2 µs | per iter |
| embedding-degree bound | twisted128/0 | twisted128 | total | 44.3 µs | 44.0 µs .. 44.5 µs | per iter |
| embedding-degree bound | twisted61x2/0 | twisted61x2 | total | 43.7 µs | 43.4 µs .. 44.3 µs | per iter |
| embedding-degree bound | twisted64x2/0 | twisted64x2 | total | 43.3 µs | 43.2 µs .. 43.4 µs | per iter |
| embedding-degree bound | weier107/0 | weier107 | total | 43.6 µs | 43.3 µs .. 43.7 µs | per iter |
| embedding-degree bound | weier127/0 | weier127 | total | 44.4 µs | 43.7 µs .. 45.1 µs | per iter |
| embedding-degree bound | weier61x2/0 | weier61x2 | total | 44.2 µs | 43.9 µs .. 44.4 µs | per iter |
| find (Rust: AGM + sieve) | gf2_127 agm+sieve/index 114/1 | gf2_127 | total | 24.8 ms | 24.7 ms .. 25.0 ms | per iter |
| find (Rust: AGM + sieve) | gf2_127 agm+sieve/index 14/3 | gf2_127 | total | 2.49 ms | 2.49 ms .. 2.50 ms | per iter |
| find (Rust: AGM + sieve) | gf2_127 agm+sieve/index 30/0 | gf2_127 | total | 4.92 ms | 4.90 ms .. 4.95 ms | per iter |
| find (Rust: AGM + sieve) | gf2_127 agm+sieve/index 54/2 | gf2_127 | total | 12.2 ms | 12.2 ms .. 12.3 ms | per iter |
| certify (Rust: AGM + sieve + order witnesses) | gf2_127 agm+sieve/index 114/1 | gf2_127 | total | 25.3 ms | 25.1 ms .. 25.4 ms | per iter |
| certify (Rust: AGM + sieve + order witnesses) | gf2_127 agm+sieve/index 14/3 | gf2_127 | total | 2.63 ms | 2.62 ms .. 2.64 ms | per iter |
| certify (Rust: AGM + sieve + order witnesses) | gf2_127 agm+sieve/index 30/0 | gf2_127 | total | 5.08 ms | 5.07 ms .. 5.10 ms | per iter |
| certify (Rust: AGM + sieve + order witnesses) | gf2_127 agm+sieve/index 54/2 | gf2_127 | total | 12.4 ms | 12.4 ms .. 12.5 ms | per iter |
| point count (PARI) | gf2_127 | gf2_127 | total | 3.53 ms | 3.51 ms .. 3.56 ms | per iter |
| point count (PARI) | edwards127 | edwards127 | total | 77.0 ms | 76.9 ms .. 77.1 ms | per iter |
| point count (PARI) | edwards61x2 | edwards61x2 | total | 64.1 ms | 64.0 ms .. 64.2 ms | per iter |
| point count (PARI) | twisted-goldilocks2 | twisted-goldilocks2 | total | 79.1 ms | 78.8 ms .. 79.5 ms | per iter |
| point count (PARI) | twisted61x2 | twisted61x2 | total | 70.4 ms | 70.2 ms .. 70.6 ms | per iter |
| point count (PARI) | twisted64x2 | twisted64x2 | total | 84.7 ms | 84.5 ms .. 84.9 ms | per iter |
| point count (PARI) | weier127 | weier127 | total | 87.9 ms | 87.7 ms .. 88.2 ms | per iter |
| point count (PARI) | weier61x2 | weier61x2 | total | 61.6 ms | 61.5 ms .. 61.7 ms | per iter |
| point count (Rust AGM) | order | gf2_127 | total | 484 µs | 482 µs .. 486 µs | per iter |
| AGM steps | tables | gf2_127 | total | 1.76 ms | 1.75 ms .. 1.77 ms | per iter |
| AGM steps | trace | gf2_127 | total | 491 µs | 489 µs .. 493 µs | per iter |
| Z_q ring op | mul | gf2_127 | total | 2.45 µs | 2.44 µs .. 2.46 µs | per iter |
| Z_q ring op | sigma | gf2_127 | total | 2.71 µs | 2.70 µs .. 2.73 µs | per iter |
| Z_q ring op | sigma_inv | gf2_127 | total | 2.50 µs | 2.49 µs .. 2.51 µs | per iter |
| Z_q ring op | square | gf2_127 | total | 1.48 µs | 1.47 µs .. 1.48 µs | per iter |
| sieve, one l | gf2_127/11 | gf2_127 | total | 365 µs | 364 µs .. 366 µs | per iter |
| sieve, one l | gf2_127/13 | gf2_127 | total | 701 µs | 700 µs .. 702 µs | per iter |
| sieve, one l | gf2_127/3 | gf2_127 | total | 3.78 µs | 3.77 µs .. 3.79 µs | per iter |
| sieve, one l | gf2_127/5 | gf2_127 | total | 18.1 µs | 18.0 µs .. 18.2 µs | per iter |
| sieve, one l | gf2_127/7 | gf2_127 | total | 63.9 µs | 63.7 µs .. 64.0 µs | per iter |
| sieve, one l | edwards127/11 | edwards127 | total | 2.47 ms | 2.47 ms .. 2.48 ms | per iter |
| sieve, one l | edwards127/13 | edwards127 | total | 4.79 ms | 4.78 ms .. 4.80 ms | per iter |
| sieve, one l | edwards127/3 | edwards127 | total | 15.4 µs | 15.3 µs .. 15.4 µs | per iter |
| sieve, one l | edwards127/5 | edwards127 | total | 109 µs | 108 µs .. 109 µs | per iter |
| sieve, one l | edwards127/7 | edwards127 | total | 413 µs | 412 µs .. 414 µs | per iter |
| sieve, one l | edwards127/8 | edwards127 | total | 1.13 µs | 1.13 µs .. 1.14 µs | per iter |
| sieve, one l | weier127/11 | weier127 | total | 2.47 ms | 2.47 ms .. 2.48 ms | per iter |
| sieve, one l | weier127/13 | weier127 | total | 4.79 ms | 4.78 ms .. 4.79 ms | per iter |
| sieve, one l | weier127/2 | weier127 | total | 9.75 µs | 9.73 µs .. 9.76 µs | per iter |
| sieve, one l | weier127/3 | weier127 | total | 15.3 µs | 15.2 µs .. 15.3 µs | per iter |
| sieve, one l | weier127/5 | weier127 | total | 109 µs | 109 µs .. 109 µs | per iter |
| sieve, one l | weier127/7 | weier127 | total | 411 µs | 410 µs .. 411 µs | per iter |
| sieve, per candidate | gf2_127/7 | gf2_127 | per-element | 42.8 µs | 42.8 µs .. 42.9 µs | per elem |
| sieve, per candidate | edwards127/13 | edwards127 | per-element | 1.70 ms | 1.70 ms .. 1.70 ms | per elem |
| sieve, per candidate | weier127/13 | weier127 | per-element | 1.05 ms | 1.05 ms .. 1.05 ms | per elem |
Lower bound, every family
One hash plus an addition to each of the cells an item maps to in a sketch of cells (: ; : ; : ; : ; : ), from each family’s fastest hash and addition in any representation, without conversions; the only estimate for families without group-trait benchmarks.
| family | hashing | hash | hash time | add | add time | m=5 | m=20 | m=150 | m=1350 | m=12150 |
|---|---|---|---|---|---|---|---|---|---|---|
| xor | one at a time | sha256 (XOR baseline) | 53.4 ns | xor-sha256/xor 32B, 1 accumulator | 0.26 ns | 54.1 ns | 54.8 ns | 55.7 ns | 56.9 ns | 58.0 ns |
| gf2_109 | one at a time | gf2_109/pornin map x1 | 675 ns | binary.109/mode=throughput | 20.4 ns | 734 ns | 783 ns | 862 ns | 951 ns | 1.04 µs |
| gf2_109 | batched | gf2_109/pornin map x1, batched | 114 ns | binary.109/mode=throughput | 20.4 ns | 173 ns | 222 ns | 301 ns | 390 ns | 480 ns |
| gf2_109-lambda | one at a time | gf2_109-lambda/pornin map x1 to (x, λ) | 655 ns | binary-lambda.109/mode=throughput | 18.9 ns | 710 ns | 755 ns | 829 ns | 911 ns | 994 ns |
| gf2_109-lambda | batched | gf2_109-lambda/pornin map x1 to (x, λ), batched | 105 ns | binary-lambda.109/mode=throughput | 18.9 ns | 159 ns | 205 ns | 278 ns | 361 ns | 444 ns |
| gf2_109-u | one at a time | gf2_109-u/pornin map x1 to (u, v) | 657 ns | binary-u.109/mode=throughput | 13.5 ns | 697 ns | 729 ns | 782 ns | 841 ns | 900 ns |
| gf2_109-u | batched | gf2_109-u/pornin map x1 to (u, v), batched | 110 ns | binary-u.109/mode=throughput | 13.5 ns | 149 ns | 181 ns | 234 ns | 293 ns | 352 ns |
| gf2_109-w | one at a time | gf2_109-w/pornin map x1 to (x, λ) | 652 ns | binary-w.109/mode=throughput | 18.9 ns | 707 ns | 752 ns | 826 ns | 909 ns | 992 ns |
| gf2_109-w | batched | gf2_109-w/pornin map x1 to (x, λ), batched | 104 ns | binary-w.109/mode=throughput | 18.9 ns | 159 ns | 204 ns | 278 ns | 361 ns | 444 ns |
| gf2_122 | one at a time | gf2_122/pornin map x1 | 392 ns | binary.122/mode=throughput | 19.9 ns | 449 ns | 497 ns | 575 ns | 662 ns | 750 ns |
| gf2_122 | batched | gf2_122/pornin map x1, batched | 103 ns | binary.122/mode=throughput | 19.9 ns | 161 ns | 208 ns | 286 ns | 373 ns | 461 ns |
| gf2_122-gls | one at a time | gf2_122-gls/pornin map x1 | 394 ns | binary.122-gls/mode=throughput | 19.3 ns | 450 ns | 497 ns | 572 ns | 657 ns | 741 ns |
| gf2_122-gls | batched | gf2_122-gls/pornin map x1, batched | 101 ns | binary.122-gls/mode=throughput | 19.3 ns | 157 ns | 204 ns | 279 ns | 363 ns | 448 ns |
| gf2_122-gls-lambda | one at a time | gf2_122-gls-lambda/pornin map x1 to (x, λ) | 385 ns | binary-lambda.122-gls/mode=throughput | 20.3 ns | 443 ns | 492 ns | 571 ns | 660 ns | 749 ns |
| gf2_122-gls-lambda | batched | gf2_122-gls-lambda/pornin map x1 to (x, λ), batched | 95.0 ns | binary-lambda.122-gls/mode=throughput | 20.3 ns | 154 ns | 202 ns | 281 ns | 370 ns | 459 ns |
| gf2_122-gls-u | one at a time | gf2_122-gls-u/pornin map x1 to (u, v) | 390 ns | binary-u.122-gls/mode=throughput | 13.7 ns | 429 ns | 462 ns | 516 ns | 576 ns | 636 ns |
| gf2_122-gls-u | batched | gf2_122-gls-u/pornin map x1 to (u, v), batched | 97.6 ns | binary-u.122-gls/mode=throughput | 13.7 ns | 137 ns | 170 ns | 224 ns | 284 ns | 344 ns |
| gf2_122-gls-w | one at a time | gf2_122-gls-w/pornin map x1 to (x, λ) | 385 ns | binary-w.122-gls/mode=throughput | 20.3 ns | 444 ns | 492 ns | 572 ns | 660 ns | 750 ns |
| gf2_122-gls-w | batched | gf2_122-gls-w/pornin map x1 to (x, λ), batched | 94.6 ns | binary-w.122-gls/mode=throughput | 20.3 ns | 154 ns | 202 ns | 281 ns | 370 ns | 459 ns |
| gf2_122-lambda | one at a time | gf2_122-lambda/pornin map x1 to (x, λ) | 381 ns | binary-lambda.122/mode=throughput | 20.2 ns | 440 ns | 488 ns | 568 ns | 656 ns | 745 ns |
| gf2_122-lambda | batched | gf2_122-lambda/pornin map x1 to (x, λ), batched | 95.0 ns | binary-lambda.122/mode=throughput | 20.2 ns | 154 ns | 202 ns | 281 ns | 370 ns | 459 ns |
| gf2_122-u | one at a time | gf2_122-u/pornin map x1 to (u, v) | 391 ns | binary-u.122/mode=throughput | 14.3 ns | 432 ns | 467 ns | 523 ns | 585 ns | 648 ns |
| gf2_122-u | batched | gf2_122-u/pornin map x1 to (u, v), batched | 99.3 ns | binary-u.122/mode=throughput | 14.3 ns | 141 ns | 175 ns | 231 ns | 294 ns | 357 ns |
| gf2_122-w | one at a time | gf2_122-w/pornin map x1 to (x, λ) | 381 ns | binary-w.122/mode=throughput | 20.5 ns | 440 ns | 489 ns | 570 ns | 659 ns | 749 ns |
| gf2_122-w | batched | gf2_122-w/pornin map x1 to (x, λ), batched | 95.2 ns | binary-w.122/mode=throughput | 20.5 ns | 155 ns | 204 ns | 284 ns | 374 ns | 464 ns |
| gf2_127 | one at a time | gf2_127/pornin map x1 | 256 ns | binary.127/mode=throughput | 19.5 ns | 313 ns | 360 ns | 436 ns | 521 ns | 607 ns |
| gf2_127 | batched | gf2_127/pornin map x1, batched | 103 ns | binary.127/mode=throughput | 19.5 ns | 159 ns | 206 ns | 282 ns | 368 ns | 454 ns |
| gf2_127-lambda | one at a time | gf2_127-lambda/pornin map x1 to (x, λ) | 245 ns | binary-lambda.127/mode=throughput | 17.6 ns | 296 ns | 338 ns | 407 ns | 484 ns | 562 ns |
| gf2_127-lambda | batched | gf2_127-lambda/pornin map x1 to (x, λ), batched | 92.7 ns | binary-lambda.127/mode=throughput | 17.6 ns | 144 ns | 186 ns | 255 ns | 332 ns | 409 ns |
| gf2_127-u | one at a time | gf2_127-u/pornin map x1 to (u, v) | 249 ns | binary-u.127/mode=throughput | 13.2 ns | 287 ns | 319 ns | 371 ns | 428 ns | 486 ns |
| gf2_127-u | batched | gf2_127-u/pornin map x1 to (u, v), batched | 98.0 ns | binary-u.127/mode=throughput | 13.2 ns | 136 ns | 168 ns | 219 ns | 277 ns | 335 ns |
| gf2_127-w | one at a time | gf2_127-w/pornin map x1 to (x, λ) | 244 ns | binary-w.127/mode=throughput | 17.7 ns | 295 ns | 337 ns | 406 ns | 484 ns | 562 ns |
| gf2_127-w | batched | gf2_127-w/pornin map x1 to (x, λ), batched | 92.8 ns | binary-w.127/mode=throughput | 17.7 ns | 144 ns | 186 ns | 255 ns | 333 ns | 411 ns |
| edwards107 | one at a time | edwards.107/mode=indep | 919 ns | edwards.107/mode=throughput | 27.6 ns | 999 ns | 1.06 µs | 1.17 µs | 1.29 µs | 1.41 µs |
| edwards107 | batched | edwards.107/mode=batch,n=1024 | 916 ns | edwards.107/mode=throughput | 27.6 ns | 996 ns | 1.06 µs | 1.17 µs | 1.29 µs | 1.41 µs |
| edwards127 | one at a time | edwards.127/mode=indep | 1.22 µs | edwards.127/mode=throughput | 27.5 ns | 1.30 µs | 1.37 µs | 1.48 µs | 1.60 µs | 1.72 µs |
| edwards127 | batched | edwards.127/mode=batch,n=1024 | 1.24 µs | edwards.127/mode=throughput | 27.5 ns | 1.32 µs | 1.38 µs | 1.49 µs | 1.61 µs | 1.73 µs |
| edwards61x2 | one at a time | edwards.61x2/mode=indep | 707 ns | edwards.61x2/mode=throughput | 25.8 ns | 781 ns | 843 ns | 944 ns | 1.06 µs | 1.17 µs |
| edwards61x2 | batched | edwards.61x2/mode=batch,n=1024 | 706 ns | edwards.61x2/mode=throughput | 25.8 ns | 781 ns | 842 ns | 943 ns | 1.06 µs | 1.17 µs |
| twisted-goldilocks2 | one at a time | twisted.goldilocks2/mode=indep | 2.21 µs | twisted.goldilocks2/mode=throughput | 28.7 ns | 2.30 µs | 2.37 µs | 2.48 µs | 2.60 µs | 2.73 µs |
| twisted-goldilocks2 | batched | twisted.goldilocks2/mode=batch,n=1024 | 2.24 µs | twisted.goldilocks2/mode=throughput | 28.7 ns | 2.32 µs | 2.39 µs | 2.50 µs | 2.63 µs | 2.75 µs |
| twisted128 | one at a time | twisted.128/mode=indep | 1.97 µs | twisted.128/mode=throughput | 31.1 ns | 2.06 µs | 2.13 µs | 2.25 µs | 2.39 µs | 2.53 µs |
| twisted128 | batched | twisted.128/mode=batch,n=1024 | 1.96 µs | twisted.128/mode=throughput | 31.1 ns | 2.05 µs | 2.12 µs | 2.25 µs | 2.38 µs | 2.52 µs |
| twisted61x2 | one at a time | twisted.61x2/mode=indep | 706 ns | twisted.61x2/mode=throughput | 24.9 ns | 778 ns | 838 ns | 935 ns | 1.04 µs | 1.15 µs |
| twisted61x2 | batched | twisted.61x2/mode=batch,n=1024 | 711 ns | twisted.61x2/mode=throughput | 24.9 ns | 783 ns | 842 ns | 940 ns | 1.05 µs | 1.16 µs |
| twisted64x2 | one at a time | twisted.64x2/mode=indep | 1.00 µs | twisted.64x2/mode=throughput | 33.3 ns | 1.10 µs | 1.18 µs | 1.31 µs | 1.45 µs | 1.60 µs |
| twisted64x2 | batched | twisted.64x2/mode=batch,n=1024 | 1.00 µs | twisted.64x2/mode=throughput | 33.3 ns | 1.10 µs | 1.18 µs | 1.31 µs | 1.46 µs | 1.60 µs |
| weier107 | one at a time | weier.107/mode=indep | 892 ns | weier.107/mode=throughput | 48.6 ns | 1.03 µs | 1.15 µs | 1.34 µs | 1.55 µs | 1.76 µs |
| weier107 | batched | weier.107/mode=batch,n=1024 | 901 ns | weier.107/mode=throughput | 48.6 ns | 1.04 µs | 1.16 µs | 1.35 µs | 1.56 µs | 1.77 µs |
| weier107-jacobian | one at a time | weier-jacobian.107/mode=indep | 886 ns | weier-jacobian.107/mode=throughput | 44.1 ns | 1.01 µs | 1.12 µs | 1.29 µs | 1.49 µs | 1.68 µs |
| weier107-jacobian | batched | weier-jacobian.107/mode=batch,n=1024 | 893 ns | weier-jacobian.107/mode=throughput | 44.1 ns | 1.02 µs | 1.13 µs | 1.30 µs | 1.49 µs | 1.69 µs |
| weier127 | one at a time | weier.127/mode=indep | 1.16 µs | weier.127/mode=throughput | 58.7 ns | 1.33 µs | 1.47 µs | 1.70 µs | 1.96 µs | 2.22 µs |
| weier127 | batched | weier.127/mode=batch,n=1024 | 1.17 µs | weier.127/mode=throughput | 58.7 ns | 1.34 µs | 1.48 µs | 1.71 µs | 1.96 µs | 2.22 µs |
| weier127-jacobian | one at a time | weier-jacobian.127/mode=indep | 1.15 µs | weier-jacobian.127/mode=throughput | 48.1 ns | 1.29 µs | 1.41 µs | 1.60 µs | 1.81 µs | 2.02 µs |
| weier127-jacobian | batched | weier-jacobian.127/mode=batch,n=1024 | 1.16 µs | weier-jacobian.127/mode=throughput | 48.1 ns | 1.30 µs | 1.41 µs | 1.60 µs | 1.81 µs | 2.02 µs |
| weier61x2 | one at a time | weier.61x2/mode=indep | 696 ns | weier.61x2/mode=throughput | 50.6 ns | 842 ns | 963 ns | 1.16 µs | 1.38 µs | 1.60 µs |
| weier61x2 | batched | weier.61x2/mode=batch,n=1024 | 698 ns | weier.61x2/mode=throughput | 50.6 ns | 844 ns | 965 ns | 1.16 µs | 1.38 µs | 1.61 µs |
| weier61x2-jacobian | one at a time | weier-jacobian.61x2/mode=indep | 702 ns | weier-jacobian.61x2/mode=throughput | 50.2 ns | 847 ns | 967 ns | 1.16 µs | 1.38 µs | 1.60 µs |
| weier61x2-jacobian | batched | weier-jacobian.61x2/mode=batch,n=1024 | 698 ns | weier-jacobian.61x2/mode=throughput | 50.2 ns | 844 ns | 964 ns | 1.16 µs | 1.38 µs | 1.60 µs |
| ristretto255 | one at a time | ristretto255/hash_from_bytes<Sha512> | 6.03 µs | ristretto255/+=, 8 accumulators | 116 ns | 6.37 µs | 6.65 µs | 7.10 µs | 7.60 µs | 8.11 µs |
Intel(R) Xeon(R) W-1390P @ 3.50GHz · rustc 1.98.1 · RUSTFLAGS=-C target-cpu=x86-64-v3 -C target-feature=+pclmulqdq · ef9e82d39fbf · full profile · 2026-10-08
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
Annotated literature
One entry per key in references.bib, stating why the
work bears on the question this repository asks: how efficient an ECMH checksum
for RIBLT cells can be made when the curve is derived from a short-lived public
salt (or a shared secret), with 48–64-bit collision resistance and 16-byte
identifiers. Within a section, entries are ordered by role: foundational
results, attacks and bounds, methods used here, alternatives considered. The
chapters cite works by key; in the book, each entry is headed by its citation
as formatted from the bibliography, and each key cited links to its entry.
The entries keep four distinctions apart: an encoding, a hash indifferentiable from a random oracle, and a weak encoding with a collision-resistance reduction; a field primitive, a curve map, and a prepared accumulator operand; fixed-time and variable-time implementation; and setup reusable per field against setup per epoch. The module boundaries and the benchmark rows follow the same distinctions.
Curve generation, point counting, Weil descent and discrete-logarithm security
Generic discrete-logarithm bounds and attacks
-
[shoup-1997] V. Shoup. Lower Bounds for Discrete Logarithms and Related Problems. Advances in Cryptology – EUROCRYPT ’97, LNCS 1233, pp. 256–266, 1997. https://doi.org/10.1007/3-540-69053-0_18
Any generic-group algorithm needs group operations to compute discrete logarithms in a group of prime order . The reference work factor for an -bit group is therefore tight for generic attacks, and every attack below it must use structure of the field, the curve or the map.
-
[pollard-1978] J. M. Pollard. Monte Carlo Methods for Index Computation (mod p). Mathematics of Computation 32(143), pp. 918–924, 1978. https://doi.org/10.1090/S0025-5718-1978-0491431-9
The rho method: expected group operations and constant memory. The reference attack behind every “rho” figure in the report.
-
[van-oorschot-wiener-1999] P. C. van Oorschot, M. J. Wiener. Parallel Collision Search with Cryptanalytic Applications. Journal of Cryptology 12(1), pp. 1–28, 1999. https://doi.org/10.1007/PL00003816
Parallel collision search with distinguished points: a linear speedup in the number of processors with negligible communication. It makes the generic cost a machine-time quantity, which is how the 48–64-bit target is to be read.
-
[wiener-zuccherato-1998] M. J. Wiener, R. J. Zuccherato. Faster Attacks on Elliptic Curve Cryptosystems. Selected Areas in Cryptography – SAC ’98, LNCS 1556, pp. 190–200, 1999. https://doi.org/10.1007/3-540-48892-8_15
[duursma-gaudry-morain-1999] I. Duursma, P. Gaudry, F. Morain. Speeding up the Discrete Log Computation on Curves with Automorphisms. Advances in Cryptology – ASIACRYPT ’99, LNCS 1716, pp. 103–121, 1999. https://doi.org/10.1007/978-3-540-48000-6_10Rho runs faster with the negation map and faster on curves with an automorphism group of order (Koblitz curves, curves with efficiently computable endomorphisms). The report divides the reference work factor by these factors where they apply: by for every family, and by a further for the GLS family over , whose endomorphism group has order 4.
-
[bernstein-lange-schwabe-2011] D. J. Bernstein, T. Lange, P. Schwabe. On the Correct Use of the Negation Map in the Pollard rho Method. Public Key Cryptography – PKC 2011, LNCS 6571, pp. 128–146. https://doi.org/10.1007/978-3-642-19379-8_8
How the negation map is used in practice (fruitless cycles and their cost); the source of the practical constant in the rho figures.
-
[bernstein-lange-2012] D. J. Bernstein, T. Lange. Computing Small Discrete Logarithms Faster. Progress in Cryptology – INDOCRYPT 2012, LNCS 7668, pp. 317–338. https://doi.org/10.1007/978-3-642-34931-7_19
[bernstein-lange-2013] D. J. Bernstein, T. Lange. Non-uniform Cracks in the Concrete: The Power of Free Precomputation. Advances in Cryptology – ASIACRYPT 2013, Part II, LNCS 8270, pp. 321–340. https://doi.org/10.1007/978-3-642-42045-0_17With a precomputed table of size about , each further discrete logarithm in a group of size costs about operations. A fixed curve would let an attacker amortize this across epochs. Deriving the curve from the salt prevents direct reuse of curve-specific tables; field-level arithmetic and work on the candidate space remain reusable. These two papers motivate a curve per namespace.
-
[corrigan-gibbs-kogan-2018] H. Corrigan-Gibbs, D. Kogan. The Discrete-Logarithm Problem with Preprocessing. Advances in Cryptology – EUROCRYPT 2018, Part II, LNCS 10821, pp. 415–447. https://doi.org/10.1007/978-3-319-78375-8_14
Lower bound for generic discrete-logarithm algorithms with bits of advice and online queries. It shows the Bernstein–Lange tradeoff is optimal and lets the report state exactly what a persistent curve would concede.
-
[menezes-okamoto-vanstone-1993] A. J. Menezes, T. Okamoto, S. A. Vanstone. Reducing Elliptic Curve Logarithms to Logarithms in a Finite Field. IEEE Transactions on Information Theory 39(5), pp. 1639–1646, 1993. https://doi.org/10.1109/18.259647
[frey-rueck-1994] G. Frey, H.-G. Rück. A Remark Concerning m-Divisibility and the Discrete Logarithm in the Divisor Class Group of Curves. Mathematics of Computation 62(206), pp. 865–874, 1994. https://doi.org/10.1090/S0025-5718-1994-1218343-6The pairing reductions that move the discrete logarithm into when divides . They are why every certificate requires an embedding degree above (
EMBEDDING_MINinsrc/curvegen/number.rs). -
[smart-1999] N. P. Smart. The Discrete Logarithm Problem on Elliptic Curves of Trace One. Journal of Cryptology 12(3), pp. 193–196, 1999. https://doi.org/10.1007/s001459900052
Curves with have a polynomial-time discrete logarithm. The Weierstrass policy excludes ; the binary and cofactor families cannot be anomalous. One clause in the policy documentation.
-
[bos-et-al-2012] J. W. Bos, M. E. Kaihara, T. Kleinjung, A. K. Lenstra, P. L. Montgomery. Solving a 112-bit Prime Elliptic Curve Discrete Logarithm Problem on Game Consoles Using Sloppy Reduction. International Journal of Applied Cryptography 2(3), pp. 212–228, 2012. https://doi.org/10.1504/IJACT.2012.045590
[wenger-wolfger-2014] E. Wenger, P. Wolfger. Solving the Discrete Logarithm of a 113-bit Koblitz Curve with an FPGA Cluster. Selected Areas in Cryptography – SAC 2014, LNCS 8781, pp. 363–379. https://doi.org/10.1007/978-3-319-13051-4_22
[bernstein-et-al-2016] D. J. Bernstein, S. Engels, T. Lange, R. Niederhagen, C. Paar, P. Schwabe, R. Zimmermann. Faster Elliptic-Curve Discrete Logarithms on FPGAs. Cryptology ePrint Archive, Paper 2016/382. https://eprint.iacr.org/2016/382
[bailey-et-al-2009-breaking] D. V. Bailey, L. Batina, D. J. Bernstein, P. Birkner, J. W. Bos, H.-C. Chen, C.-M. Cheng, G. van Damme, G. de Meulenaer, L. J. Dominguez Perez, J. Fan, T. Güneysu, F. Gürkaynak, T. Kleinjung, T. Lange, N. Mentens, R. Niederhagen, C. Paar, F. Regazzoni, P. Schwabe, L. Uhsadel, A. Van Herrewege, B.-Y. Yang. Breaking ECC2K-130. Cryptology ePrint Archive, Paper 2009/541. https://eprint.iacr.org/2009/541
[certicom-1997] Certicom Research. The Certicom ECC Challenge. Certicom, 1997. Updated 2003; lists ECC2K-108 (GF(2^109), Koblitz) solved 4 April 2000 by R. Harley et al. https://www.certicom.com/content/dam/certicom/images/pdfs/cert_ecc_challenge.pdf
[bailey-et-al-2009] D. V. Bailey, B. Baldwin, L. Batina, D. J. Bernstein, P. Birkner, J. W. Bos, G. van Damme, G. de Meulenaer, J. Fan, T. Güneysu, F. Gurkaynak, T. Kleinjung, T. Lange, N. Mentens, C. Paar, F. Regazzoni, P. Schwabe, L. Uhsadel. The Certicom Challenges ECC2-X. Cryptology ePrint Archive, Paper 2009/466; SHARCS 2009. https://eprint.iacr.org/2009/466The solved instances that calibrate the target: a 112-bit prime-field curve on about 215 PlayStation 3 consoles (2012), a 113-bit Koblitz curve on 18 FPGAs in an extrapolated 24 days (2014), the SECG curve sect113r2 and a 117.35-bit binary instance on FPGAs (2016), and the still-open ECC2K-130 effort with its cost analysis. They place to group operations within reach of a dedicated effort over months, the reference against which the 48–64-bit target is weighed.
-
[galbraith-gaudry-2016] S. D. Galbraith, P. Gaudry. Recent Progress on the Elliptic Curve Discrete Logarithm Problem. Designs, Codes and Cryptography 78(1), pp. 51–72, 2016. https://doi.org/10.1007/s10623-015-0146-7
Survey of the elliptic-curve discrete logarithm problem: no subexponential algorithm is known for curves over prime fields or over with prime, and the state of index calculus over extension fields. Cited for the statement that generic attacks are the best known.
Weil descent and index calculus over extension fields
-
[frey-1998] G. Frey, H. Gangl. How to Disguise an Elliptic Curve (Weil Descent). Talk at ECC ’98, Waterloo. Slides dated 15 September 1998; the conference slides page lists the talk under Frey alone. https://web.archive.org/web/2005/http://cacr.math.uwaterloo.ca/conferences/1998/ecc98/slides.html
The idea of Weil restriction as an attack: an elliptic curve over becomes an -dimensional abelian variety over .
-
[gaudry-hess-smart-2002] P. Gaudry, F. Hess, N. P. Smart. Constructive and Destructive Facets of Weil Descent on Elliptic Curves. Journal of Cryptology 15(1), pp. 19–46, 2002. Preprint: HP Labs Technical Report HPL-2000-10. https://doi.org/10.1007/s00145-001-0011-x
The GHS construction: the descent gives a hyperelliptic curve over of genus about , the “magic number” determined by the minimal polynomial of under Frobenius.
sage/ghs.sagecomputes for the binary families and the genus that results. -
[menezes-qu-2001] A. Menezes, M. Qu. Analysis of the Weil Descent Attack of Gaudry, Hess and Smart. Topics in Cryptology – CT-RSA 2001, LNCS 2020, pp. 308–318. https://doi.org/10.1007/3-540-45353-9_23
For prime in the GHS genus is too large for any attack. The degree 127 lies outside that range and is the exceptional small prime degree: 2 has order 7 modulo 127, so splits into degree-7 factors over and the minimal genus is , so the descent must be examined for .
-
[galbraith-hess-smart-2002] S. D. Galbraith, F. Hess, N. P. Smart. Extending the GHS Weil Descent Attack. Advances in Cryptology – EUROCRYPT 2002, LNCS 2332, pp. 29–44. ePrint 2001/054 is PostScript only. https://doi.org/10.1007/3-540-46035-7_3
Isogenous curves have equal order and the attack transfers along isogenies, so the vulnerable set is a union of isogeny classes, not of curves.
sage/ghs122.sagechecks the class, and the statement counts classes. -
[hess-2003] F. Hess. The GHS Attack Revisited. Advances in Cryptology – EUROCRYPT 2003, LNCS 2656, pp. 374–387. https://doi.org/10.1007/3-540-39200-9_23
Generalizes GHS: with for in the span of a degree-7 factor’s kernel and , the descent still has genus 127 or 128. Over this reaches 4537 Frobenius classes, 65 of them of order and so admissible to the certificate, a heuristic of the admissible isogeny classes (Hess’s own estimate gives ). Accepted without a check: across epochs the probability is at most times this heuristic figure, and a descent compromises only its own epoch.
-
[hess-2005] F. Hess. Weil Descent Attacks. In: Advances in Elliptic Curve Cryptography, ed. I. F. Blake, G. Seroussi, N. P. Smart, London Mathematical Society Lecture Note Series 317, Cambridge University Press, pp. 151–180, 2005. https://doi.org/10.1017/CBO9780511546570.010
Survey chapter covering the above; cited where the problem statement states the Weil-descent conclusion without the derivation.
-
[hankerson-karabina-menezes-2009] D. Hankerson, K. Karabina, A. Menezes. Analyzing the Galbraith–Lin–Scott Point Multiplication Method for Elliptic Curves over Binary Fields. IEEE Transactions on Computers 58(10), pp. 1411–1420, 2009. https://doi.org/10.1109/TC.2009.61
Security analysis of GLS curves over : the GHS descent to and the index calculus leave the discrete logarithm at about , the rho cost. It is the reference for the family’s security statement.
-
[gaudry-2009] P. Gaudry. Index Calculus for Abelian Varieties of Small Dimension and the Elliptic Curve Discrete Logarithm Problem. Journal of Symbolic Computation 44(12), pp. 1690–1702, 2009. https://doi.org/10.1016/j.jsc.2008.08.005
Index calculus for over in for fixed : at , which ties rho for every quadratic-extension family here (fp61x2, fp64x2, goldilocks2, and as ). The reason degree 2 is admissible and degree is not.
-
[diem-2011] C. Diem. On the Discrete Logarithm Problem in Elliptic Curves. Compositio Mathematica 147(1), pp. 75–104, 2011. https://doi.org/10.1112/S0010437X10005075
The discrete logarithm over is subexponential when grows with within fixed bounds. It does not apply at or at prime ; cited to say so.
-
[joux-vitse-2012] A. Joux, V. Vitse. Cover and Decomposition Index Calculus on Elliptic Curves Made Practical. Advances in Cryptology – EUROCRYPT 2012, LNCS 7237, pp. 9–26. Full version subtitled “Application to a Previously Unreachable Curve over F_{p^6}”. https://doi.org/10.1007/978-3-642-29011-4_3
Cover and decomposition attacks made practical for -type fields; the boundary case showing where composite-degree extensions become dangerous, and that is not among them.
-
[semaev-2004] I. Semaev. Summation Polynomials and the Discrete Logarithm Problem on Elliptic Curves. Cryptology ePrint Archive, Paper 2004/031. https://eprint.iacr.org/2004/031
[faugere-et-al-2012] J.-C. Faugère, L. Perret, C. Petit, G. Renault. Improving the Complexity of Index Calculus Algorithms in Elliptic Curves over Binary Fields. Advances in Cryptology – EUROCRYPT 2012, LNCS 7237, pp. 27–44. https://doi.org/10.1007/978-3-642-29011-4_4
[petit-quisquater-2012] C. Petit, J.-J. Quisquater. On Polynomial Systems Arising from a Weil Descent. Advances in Cryptology – ASIACRYPT 2012, LNCS 7658, pp. 451–466. https://doi.org/10.1007/978-3-642-34961-4_28Summation polynomials and the heuristic index calculus over , prime. The authors’ own estimate places the crossover with generic methods near ; the degrees used here are far below it, and the heuristics remain unconfirmed. Cited as the reason prime-degree binary fields are still considered generic-secure.
Point counting and curve generation
-
[schoof-1995] R. Schoof. Counting Points on Elliptic Curves over Finite Fields. Journal de Théorie des Nombres de Bordeaux 7(1), pp. 219–254, 1995. https://doi.org/10.5802/jtnb.142
Schoof’s algorithm and the Elkies–Atkin improvements (SEA): polynomial-time point counting over any finite field. PARI’s
ellsearuns it for the odd-field families, with the Elkies-prime early abort theparimodule uses. -
[satoh-2000] T. Satoh. The Canonical Lift of an Ordinary Elliptic Curve over a Finite Field and Its Point Counting. Journal of the Ramanujan Mathematical Society 15(4), pp. 247–270, 2000.
[mestre-2000] J.-F. Mestre. Lettre adressée à Gaudry et Harley. Letter, December 2000. The arithmetic–geometric mean point-counting method; cited through [gaudry-2002] and [satoh-skjernaa-taguchi-2003].
[gaudry-2002] P. Gaudry. A Comparison and a Combination of SST and AGM Algorithms for Counting Points of Elliptic Curves in Characteristic 2. Advances in Cryptology – ASIACRYPT 2002, LNCS 2501, pp. 311–327. https://doi.org/10.1007/3-540-36178-2_20Canonical lifts and Mestre’s AGM for characteristic 2: counting a curve over in milliseconds. The Rust
agmcounter is a canonical lift of this kind and PARI’sF2xq_ellcardis Harley’s variant of the AGM;gaudry-2002is the comparison that established the method. -
[satoh-skjernaa-taguchi-2003] T. Satoh, B. Skjernaa, Y. Taguchi. Fast Computation of Canonical Lifts of Elliptic Curves and its Application to Point Counting. Finite Fields and Their Applications 9(1), pp. 89–101, 2003. https://doi.org/10.1016/S1071-5797(02)00013-8
The SST variant of the canonical lift, one of the methods
gaudry-2002compares; the method implemented is the AGM. -
[lercier-lubicz-2003] R. Lercier, D. Lubicz. Counting Points on Elliptic Curves over Finite Fields of Small Characteristic in Quasi Quadratic Time. Advances in Cryptology – EUROCRYPT 2003, LNCS 2656, pp. 360–373. https://doi.org/10.1007/3-540-39200-9_22
Quasi-quadratic point counting in small characteristic via canonical lifts. The asymptotic improvement does not establish a concrete gain at degree 127; this implementation uses the AGM.
-
[fouquet-gaudry-harley-2001] M. Fouquet, P. Gaudry, R. Harley. Finding Secure Curves with the Satoh-FGH Algorithm and an Early-Abort Strategy. Advances in Cryptology – EUROCRYPT 2001, LNCS 2045, pp. 14–29. https://doi.org/10.1007/3-540-44987-6_2
The early-abort strategy: test small torsion before counting, since most candidates fail on the group order. The direct ancestor of
curvegen::sieve, whose witnesses double as certificate rejections. -
[rabin-1980] M. O. Rabin. Probabilistic Algorithm for Testing Primality. Journal of Number Theory 12(1), pp. 128–138, 1980. https://doi.org/10.1016/0022-314X(80)90084-0
[arnault-1995] F. Arnault. Constructing Carmichael Numbers Which Are Strong Pseudoprimes to Several Bases. Journal of Symbolic Computation 20(2), pp. 151–161, 1995. https://doi.org/10.1006/jsco.1995.1042
[albrecht-et-al-2018] M. R. Albrecht, J. Massimo, K. G. Paterson, J. Somorovsky. Prime and Prejudice: Primality Testing Under Adversarial Conditions. Proceedings of the 2018 ACM SIGSAC Conference on Computer and Communications Security (CCS ’18), pp. 281–298. https://doi.org/10.1145/3243734.3243787The Miller–Rabin test and the constructions of composites that pass it for fixed bases. The certificate accepts as a probable prime to 24 fixed bases; these papers are why the statement is conditional. The prover cannot skip an admissible candidate, since rejection witnesses exist only for inadmissible ones. For the accepted candidate the verifier takes from the prover and checks for the cofactor-cleared hashed point , the Hasse window, and the 24 Miller–Rabin bases; the order argument is conditional on being prime.
-
[bernstein-et-al-2015] D. J. Bernstein, T. Chou, C. Chuengsatiansup, A. Hülsing, E. Lambooij, T. Lange, R. Niederhagen, C. van Vredendaal. How to Manipulate Curve Standards: A White Paper for the Black Hat. Security Standardisation Research – SSR 2015, LNCS 9497, pp. 109–139. https://doi.org/10.1007/978-3-319-27152-1_6
[flori-et-al-2015] J.-P. Flori, J. Plût, J.-R. Reinhard, M. Ekerå. Diversity and Transparency for ECC. Cryptology ePrint Archive, Paper 2015/659. https://eprint.iacr.org/2015/659
[bos-et-al-2016] J. W. Bos, C. Costello, P. Longa, M. Naehrig. Selecting Elliptic Curves for Cryptography: An Efficiency and Security Analysis. Journal of Cryptographic Engineering 6(4), pp. 259–286, 2016. https://doi.org/10.1007/s13389-015-0097-yWhy the curve is derived from a public seed with a verifiable certificate rather than taken from a standard: manipulable standards, transparent generation of many curves, and the efficiency/security tradeoffs of the selection procedure itself.
flori-et-al-2015is the closest prior work on generating a fresh curve per use. -
[ansi-x9-62-1998] Accredited Standards Committee X9. Public Key Cryptography for the Financial Services Industry: The Elliptic Curve Digital Signature Algorithm (ECDSA). American National Standards Institute, ANSI X9.62-1998, 1999.
[rfc5639] M. Lochter, J. Merkle. Elliptic Curve Cryptography (ECC) Brainpool Standard Curves and Curve Generation. RFC 5639, 2010. https://doi.org/10.17487/RFC5639
[baigneres-et-al-2015] T. Baignères, C. Delerablée, M. Finiasz, L. Goubin, T. Lepoint, M. Rivain. Trap Me If You Can – Million Dollar Curve. Cryptology ePrint Archive, Paper 2015/1249. https://eprint.iacr.org/2015/1249
[lenstra-wesolowski-2017] A. K. Lenstra, B. Wesolowski. Trustworthy Public Randomness with Sloth, Unicorn, and Trx. International Journal of Applied Cryptography 3(4), pp. 330–343, 2017. https://eprint.iacr.org/2015/366Curves derived from public randomness. X9.62’s verifiably random curves and Brainpool’s verifiably pseudo-random ones hash a published seed, which
bernstein-et-al-2015shows still leaves the seed’s author a choice. The Million Dollar Curve takes its seed from several national lotteries and turns it into parameters by a deterministic filter, for one curve meant to replace P-256 and Curve25519. Lenstra and Wesolowski’s trx derives a stream of curves from the output of their beacon, unicorn: the first acceptable candidate in a fixed enumeration, with data to show that the earlier candidates fail, which is the shape of this repository’s certificate. Both provide curves for general use at the 128-bit level, where trx takes hours per curve; here a new beacon value selects a smaller curve for each namespace. -
[safecurves] D. J. Bernstein, T. Lange. SafeCurves: Choosing Safe Curves for Elliptic-Curve Cryptography. Fields: https://safecurves.cr.yp.to/field.html. https://safecurves.cr.yp.to
[bernstein-lange-2024] D. J. Bernstein, T. Lange. Safe curves for elliptic-curve cryptography. Cryptology ePrint Archive, Paper 2024/1265. https://eprint.iacr.org/2024/1265The rigidity criterion the selection satisfies by construction, and (paper, §4.4) the batched affine addition cost of about per step that an attacker’s rho implementation attains, which is the add cost the collision-resistance figures assume for the attacker.
-
[syta-et-al-2017] E. Syta, P. Jovanovic, E. Kokoris-Kogias, N. Gailly, L. Gasser, I. Khoffi, M. J. Fischer, B. Ford. Scalable Bias-Resistant Distributed Randomness. 2017 IEEE Symposium on Security and Privacy, pp. 444–460. https://doi.org/10.1109/SP.2017.45
[kelsey-et-al-2019] J. Kelsey, L. T. A. N. Brandão, R. Peralta, H. Booth. A Reference for Randomness Beacons: Format and Protocol Version 2. NIST, NIST IR 8213 (draft), 2019. https://doi.org/10.6028/NIST.IR.8213-draftRandomness beacons: where an unpredictable public salt comes from, and the unpredictability requirement the precomputation argument depends on.
-
[bonneau-clark-goldfeder-2015] J. Bonneau, J. Clark, S. Goldfeder. On Bitcoin as a Public Randomness Source. Cryptology ePrint Archive, Paper 2015/1015. https://eprint.iacr.org/2015/1015
Bitcoin block hashes as a beacon: a lower bound on each block’s min-entropy, and the cost to a miner of biasing the output by withholding blocks, which is the manipulation this study leaves to the protocol.
-
[koblitz-1991] N. Koblitz. CM-Curves with Good Cryptographic Properties. Advances in Cryptology – CRYPTO ’91, LNCS 576, pp. 279–287, 1992. https://doi.org/10.1007/3-540-46766-1_22
[solinas-2000] J. A. Solinas. Efficient Arithmetic on Koblitz Curves. Designs, Codes and Cryptography 19(2–3), pp. 195–249, 2000. https://doi.org/10.1023/A:1008306223194Koblitz (subfield) curves: fast scalar multiplication, which the workload does not use, and a rho speedup, which it cannot afford. Excluded.
-
[sutherland-2012] A. V. Sutherland. Constructing elliptic curves over finite fields with prescribed torsion. Mathematics of Computation 81, pp. 1131–1147, 2012. https://doi.org/10.1090/S0025-5718-2011-02538-X
Constructing curves with prescribed torsion through modular curves: an alternative sampler that would change the canonical candidate stream and its certificate. Not used.
-
[pari-gp] The PARI Group. PARI/GP. https://pari.math.u-bordeaux.fr/.
[sagemath] The Sage Developers. SageMath, the Sage Mathematics Software System. https://www.sagemath.org/.The point-counting and primality oracle for fixtures and the
parifeature, and the system in which the reference programs undersage/are written; Sage counts points through PARI.
Hash-to-curve, encodings, ECMH and inversion
Security contract and foundational constructions
-
[bellare-micciancio-1997] M. Bellare, D. Micciancio. A New Paradigm for Collision-Free Hashing: Incrementality at Reduced Cost. Advances in Cryptology – EUROCRYPT ’97, LNCS 1233, pp. 163–192, 1997. https://doi.org/10.1007/3-540-69053-0_13
Establishes the incremental multiset-hashing framework underlying ECMH. It supplies the algebraic security question for cell checksums; a fast map and group operation must be assessed within that question rather than by mapping speed alone.
-
[wegman-carter-1981] M. N. Wegman, J. L. Carter. New Hash Functions and Their Use in Authentication and Set Equality. Journal of Computer and System Sciences 22(3), pp. 265–279, 1981. https://doi.org/10.1016/0022-0000(81)90033-7
Defines almost-universal hash families and applies them to authentication and to testing sets for equality under insertion and deletion. The salted projection of an item’s unsalted identifier is such a family: its collision bound holds for identifiers fixed before the salt, and after the salt the identifiers’ being hash outputs leaves only a generic search (Adversary).
-
[wagner-2002] D. Wagner. A Generalized Birthday Problem. Advances in Cryptology – CRYPTO 2002, LNCS 2442, pp. 288–304. https://doi.org/10.1007/3-540-45708-9_19
The generalized birthday algorithm combines many independently chosen terms into an additive relation; for an -bit modulus and about lists it takes about operations, subexponential in . Its list-merging step needs a group representation in which partial sums can be matched on bits, as in or . Elliptic-curve groups have no such representation, so without discrete logarithms the -sum bound is not the attack cost for these checksums; with them, the checksum is AdHash modulo and the algorithm applies (Known weaknesses).
-
[meyer-2022] A. Meyer. Range-Based Set Reconciliation. arXiv:2212.13567 [cs.CR], 2022. Section numbers refer to the short version at https://github.com/AljoschaMeyer/rbsr_short. https://arxiv.org/abs/2212.13567
Range-based set reconciliation with fingerprints combined in a monoid. Section V-B surveys fingerprint groups against an adversary who chooses items, and cites additive hashes of 2688 to 4160 bits for 128-bit security against Wagner’s algorithm and its successors (
mihajloska-gligoroski-samardjiska-2015). -
[mihajloska-gligoroski-samardjiska-2015] H. Mihajloska, D. Gligoroski, S. Samardjiska. Reviving the Idea of Incremental Cryptography for the Zettabyte Era Use Case: Incremental Hash Functions Based on SHA-3. Cryptology ePrint Archive, Paper 2015/1028. Also in International Workshop on Open Problems in Network Security (iNetSec 2015), Springer, pp. 97–111. https://eprint.iacr.org/2015/1028
Incremental hash functions over SHAKE outputs combined by word-wise addition modulo , with output lengths chosen against Wagner’s algorithm: 2688 bits for 128-bit security when a relation has at most terms, 4160 bits without a bound. The security chapter compares these sizes with a checksum whose discrete logarithms are known.
-
[phan-wagner-2006] R. C.-W. Phan, D. Wagner. Security Considerations for Incremental Hash Functions Based on Pair Block Chaining. Computers & Security 25, pp. 131–136, 2006. https://doi.org/10.1016/j.cose.2005.12.006
Collisions in randomize-then-combine hashes of pair-chained message blocks: repeated blocks, coinciding padding and cyclic chaining give distinct messages with equal hashes, in several cases with equal multisets of pair terms, so that modular addition fails as XOR does. They follow from the encoding of a message into terms, not from the combining operation; here each item is hashed whole to one term and the digest of a multiset is meant to be independent of order, so the attacks do not carry over. The paper also records a PCIHF variant proposed with its modulus raised from to in response to Wagner’s algorithm.
-
[maitin-shepard-et-al-2016] J. Maitin-Shepard, M. Tibouchi, D. F. Aranha. Elliptic Curve Multiset Hash. arXiv:1601.06502 [cs.CR]. Journal version: The Computer Journal, 2016, https://doi.org/10.1093/comjnl/bxw053. https://arxiv.org/abs/1601.06502
Gives the binary-curve ECMH construction, its weak-encoding collision-security reduction and separate mapping, group-operation and batching measurements. It distinguishes a sufficient ECMH encoding from a hash indifferentiable from a random oracle; applying the reduction to this repository’s adapted map still requires establishing that map’s hypotheses and reduction loss.
-
[brier-et-al-2010] E. Brier, J.-S. Coron, T. Icart, D. Madore, H. Randriam, M. Tibouchi. Efficient Indifferentiable Hashing into Ordinary Elliptic Curves. Advances in Cryptology – CRYPTO 2010, LNCS 6223, pp. 237–254. https://doi.org/10.1007/978-3-642-14623-7_13
Provides constructions and analysis for indifferentiable hashing into ordinary elliptic curves. It explains why a deterministic encoding and a random-oracle hash require different contracts, even when the implementations share mapping formulas.
-
[farashahi-pellikaan-sidorenko-2008] R. R. Farashahi, R. Pellikaan, A. Sidorenko. Extractors for Binary Elliptic Curves. Designs, Codes and Cryptography 49(1–3), pp. 171–186, 2008. https://doi.org/10.1007/s10623-008-9187-5
Deterministic extraction of a subfield coefficient from uniformly distributed points on binary curves of even extension degree. It distinguishes randomness extraction from point encoding; it supplies no proof of the current -plus-sign codec or of the hash-to-curve distribution.
-
[shallue-van-de-woestijne-2006] A. Shallue, C. E. van de Woestijne. Construction of Rational Points on Elliptic Curves over Finite Fields. Algorithmic Number Theory (ANTS-VII), LNCS 4076, pp. 510–524, 2006. https://doi.org/10.1007/11792086_36
Constructs rational points deterministically over finite fields and supplies the lineage of the SW maps used in later hashing work. Its relevance is the point-construction mechanism; the required output-distribution and ECMH-security arguments come from additional analysis.
-
[boneh-lynn-shacham-2001] D. Boneh, B. Lynn, H. Shacham. Short Signatures from the Weil Pairing. Advances in Cryptology – ASIACRYPT 2001, LNCS 2248, pp. 514–532. https://doi.org/10.1007/3-540-45682-1_30
MapToGroup, an early reference for counter-based rejection sampling into a curve group. Here the shared driver
curve::h2csamples digest-derived candidate encodings until decoding succeeds; the weak-encoding condition ofmaitin-shepard-et-al-2016, a sufficient route to collision resistance, may be established from each codec’s accepted preimages, including identity and torsion handling. The variable-time path is evaluated under the project’s public-input assumption. -
[rfc9380] A. Faz-Hernández, S. Scott, N. Sullivan, R. S. Wahby, C. A. Wood. Hashing to Elliptic Curves. RFC 9380, 2023. https://doi.org/10.17487/RFC9380
Specifies hash-to-field, domain separation, mappings and cofactor handling for hash-to-curve suites. It provides a reference decomposition for the implementation and benchmarks, while its standardized suites do not directly certify arbitrary ephemeral curves or the binary maps used here.
-
[bernstein-et-al-2013] D. J. Bernstein, M. Hamburg, A. Krasnova, T. Lange. Elligator: Elliptic-Curve Points Indistinguishable from Uniform Random Strings. Proceedings of the 2013 ACM SIGSAC Conference on Computer and Communications Security (CCS ’13), pp. 967–980. https://doi.org/10.1145/2508859.2516734
Introduces Elligator and the distinction between curve-point encodings and uniform-looking bit strings. Elligator 2 is an applicable mapping reference for suitable odd-characteristic curves with rational two-torsion, but its encoding alone must not be labeled a full random-oracle hash.
-
[hamburg-2020] M. Hamburg. Indifferentiable Hashing from Elligator 2. Cryptology ePrint Archive, Paper 2020/1513. https://eprint.iacr.org/2020/1513
Analyzes indifferentiable constructions from Elligator 2, including hash-twice-and-add. It supports the explicit separation of single-map and two-map interfaces and their costs; the argument must be matched to the actual map and target group.
Binary maps and their implementation
-
[aranha-et-al-2014] D. F. Aranha, P.-A. Fouque, C. Qian, M. Tibouchi, J.-C. Zapalowicz. Binary Elligator Squared. Selected Areas in Cryptography – SAC 2014, LNCS 8781. https://doi.org/10.1007/978-3-319-13051-4_2
Optimizes the characteristic-two SW map through shared inversion and gives preimage analysis, quadratic-solving techniques and implementation measurements. It is a direct comparison for the repository’s binary mapping alternatives; the paper’s full Elligator Squared representation timing must not be mistaken for a single hash-to-point timing.
-
[maitin-shepard-2017] J. Maitin-Shepard. Optimal software-implemented Itoh–Tsujii inversion for F_{2^m}. Designs, Codes and Cryptography 82, pp. 301–318, 2017. https://doi.org/10.1007/s10623-016-0260-1
Optimizes Itoh–Tsujii inversion chains jointly with multi-squaring tables using machine-specific measurements, including degree 127. It closes the gap between minimizing symbolic multiplication counts and minimizing the actual binary-map cost, subject to memory and timing constraints.
-
[fong-et-al-2004] K. Fong, D. Hankerson, J. López, A. Menezes. Field Inversion and Point Halving Revisited. IEEE Transactions on Computers 53(8), pp. 1047–1059, 2004. The open copy is the technical-report version. https://doi.org/10.1109/TC.2004.43
Examines binary-field inversion, division and SIMD implementation costs. These primitives inform the affine/projective and decoding tradeoffs here, although its point-halving scalar-multiplication results do not measure arbitrary RIBLT-cell additions.
Odd-characteristic mapping alternatives
-
[chavez-saab-et-al-2022] J. Chávez-Saab, F. Rodríguez-Henríquez, M. Tibouchi. SwiftEC: Shallue–van de Woestijne Indifferentiable Function to Elliptic Curves. Journal of Cryptology 37, 2024. https://doi.org/10.1007/s00145-024-09529-y
SwiftEC reduces full-point hashing to one square-root extraction on compatible odd-characteristic curves, with per-curve parameter construction and possible isogeny adaptation. For ephemeral curves, compatibility and setup amortization are part of the comparison; its -only output, of lower cost, is insufficient by itself for signed arbitrary additions.
-
[aranha-et-al-2023] D. F. Aranha, B. S. Hvass, B. Spitters, M. Tibouchi. Faster constant-time evaluation of the Kronecker symbol with application to elliptic curve hashing. ACM SIGSAC Conference on Computer and Communications Security (CCS 2023), pp. 3228–3238. https://doi.org/10.1145/3576915.3616597
Gives faster constant-time character computation and concrete SwiftEC measurements. It is the comparison for the variable-time Jacobi and special-prime exponentiation paths used here, without transferring its larger-field speedups to the 48–64-bit collision-security configurations.
-
[koshelev-2024] D. Koshelev. Simultaneously Simple, Universal, and Indifferentiable Hashing to Elliptic Curves. Cryptology ePrint Archive, Paper 2024/085. https://eprint.iacr.org/2024/085
Extends one-root indifferentiable hashing in characteristic greater than three and is a possible way to broaden SwiftEC’s applicability. Its relevance is conditional on checking the exact target-curve construction, exceptional inputs and setup cost; no speedup over the maps implemented here has been established.
-
[koshelev-2025] D. Koshelev. Hashing-friendly elliptic curves. Cryptology ePrint Archive, Paper 2025/1926, revised March 2026. https://eprint.iacr.org/2025/1926
Studies batching root extraction on specially constructed hashing-friendly curves. It represents a joint curve-selection and hashing alternative, with distribution questions that require separate analysis, rather than an optimization already applicable to the repository’s current candidate stream.
Field primitives used by mapping and decoding
-
[bernstein-yang-2019] D. J. Bernstein, B.-Y. Yang. Fast constant-time gcd computation and modular inversion. IACR Transactions on Cryptographic Hardware and Embedded Systems 2019(3), pp. 340–398, 2019. https://doi.org/10.13154/tches.v2019.i3.340-398
Supplies constant-time divsteps algorithms for integer and polynomial inversion. It provides alternatives to exponentiation-based inversion. Its benefit depends on the field size and batch size, since batching amortizes the inversion cost.
-
[adj-rodriguez-henriquez-2014] G. Adj, F. Rodríguez-Henríquez. Square Root Computation over Even Extension Fields. IEEE Transactions on Computers 63(11), pp. 2829–2841, 2014. https://doi.org/10.1109/TC.2013.145
Uses extension-field structure to compute square roots and quadratic characters in odd-characteristic even-degree extensions. It applies to quadratic prime-field alternatives; “even extension” does not mean a binary field.
-
[bernstein-2001] D. J. Bernstein. Faster square roots in annoying finite fields. Preprint, 2001, retypeset 2022. https://cr.yp.to/papers/sqroot-20011123-retypeset20220327.pdf
Gives precomputation/time tradeoffs for square roots when the field order minus one has high two-adicity. It explains a cost specific to Goldilocks-style alternatives, which is absent from the simple square-root exponentiation over the current Mersenne prime fields.
-
[pornin-2023-sqrt] T. Pornin. Optimized Discrete Logarithm Computation for Faster Square Roots in Finite Fields. Cryptology ePrint Archive, Paper 2023/828. https://eprint.iacr.org/2023/828
Improves the subgroup discrete-logarithm stage of square-root extraction in high-two-adicity fields. It is a more recent alternative to assess alongside the preceding method when such fields are considered, including table/setup costs.
-
[bernstein-2005] D. J. Bernstein. The Poly1305-AES Message-Authentication Code. Fast Software Encryption – FSE 2005, LNCS 3557, pp. 32–49. https://doi.org/10.1007/11502760_3
Poly1305 evaluates a message as a polynomial in a clamped key over , a field chosen for fast integer arithmetic, and bounds the differential probability by the polynomial’s degree. The projection of item identifiers evaluates a two-block message in the same way, unclamped and without the pad; its field is measured beside and , which are cheaper where their multiplications are (
hash).
Field and group arithmetic, set reconciliation and baselines
Set reconciliation and the cell checksum
-
[yang-gilad-alizadeh-2024] L. Yang, Y. Gilad, M. Alizadeh. Practical Rateless Set Reconciliation. Proceedings of the ACM SIGCOMM 2024 Conference, pp. 595–612. https://doi.org/10.1145/3651890.3672219
Rateless IBLTs: a coded-symbol stream whose communication overhead approaches 1.35 symbols per set difference, and the item-to-cell mapping
src/riblt.rsimplements. Each cell carries a checksum used to decide whether the cell holds exactly one item; the question of what that checksum must resist, raised in yangl1996/riblt#3, is the question this repository answers. -
[goodrich-mitzenmacher-2011] M. T. Goodrich, M. Mitzenmacher. Invertible Bloom Lookup Tables. 49th Annual Allerton Conference on Communication, Control, and Computing, pp. 792–799, 2011. https://doi.org/10.1109/Allerton.2011.6120248
[eppstein-et-al-2011] D. Eppstein, M. T. Goodrich, F. Uyeda, G. Varghese. What’s the Difference? Efficient Set Reconciliation without Prior Context. Proceedings of the ACM SIGCOMM 2011 Conference, pp. 218–229. https://doi.org/10.1145/2018436.2018462Invertible Bloom lookup tables and their use for set difference. They introduce the hash-sum field that decides purity and peeling, which RIBLT inherits and which an ECMH checksum replaces. Under a secret key a short keyed hash suffices; the ECMH checksum is needed when the salt is public and the items may be chosen against it.
-
[minsky-trachtenberg-zippel-2003] Y. Minsky, A. Trachtenberg, R. Zippel. Set Reconciliation with Nearly Optimal Communication Complexity. IEEE Transactions on Information Theory 49(9), pp. 2213–2218, 2003. https://doi.org/10.1109/TIT.2003.815784
[dodis-et-al-2008] Y. Dodis, R. Ostrovsky, L. Reyzin, A. Smith. Fuzzy Extractors: How to Generate Strong Keys from Biometrics and Other Noisy Data. SIAM Journal on Computing 38(1), pp. 97–139, 2008. https://doi.org/10.1137/060651380
[naumenko-et-al-2019] G. Naumenko, G. Maxwell, P. Wuille, A. Fedorova, I. Beschastnikh. Erlay: Efficient Transaction Relay for Bitcoin. Proceedings of the 2019 ACM SIGSAC Conference on Computer and Communications Security (CCS ’19), pp. 817–831. https://doi.org/10.1145/3319535.3354237Algebraic set reconciliation: characteristic-polynomial interpolation, the PinSketch BCH syndrome, and its use in Erlay (Minisketch), proposed for Bitcoin’s transaction relay and not deployed. Decoding is exact and needs no checksum, so the purity question does not arise, but decoding costs time quadratic in the difference and the capacity is fixed in advance. This is an alternative to rateless IBLTs; the case for RIBLTs rests on rateless, linear-time decoding.
-
[riblt-ecmh] D. Buchanan. riblt-ecmh: Go Implementation of Rateless IBLTs with Additional Security Hardening. GitHub repository, commit 11521a4c73ebbbfe80050ec99a4f976eb9ce7147, 2026. https://github.com/DavidBuchanan314/riblt-ecmh
An independent Go implementation of RIBLT with an elliptic-curve multiset-hash checksum: the nearest prior implementation of the combination evaluated here.
-
[meyer-scherer-2024] A. Meyer, K. Scherer. Range-Based Set Reconciliation Without Homomorphic Hashing. Preprint, 2024. https://aljoscha-meyer.de/assets/landing/rbsr_nonhomomorphic.pdf
Range-based set reconciliation over conventional hashes. It names censorship resistance, that a malicious party cannot generate sets which two honest nodes fail to reconcile, and universality, that a node’s main computation does not depend on its peer’s set; the adversary of Adversary is the one their first property resists. It observes that RIBLTs meet adversarial sets by randomizing the hash for each session, which repeats the hashing in every session; a salt shared by an epoch’s sessions amortizes that work.
-
[hoyte-2023] D. Hoyte. Range-Based Set Reconciliation. Web article, December 2023. Sections “Fingerprint Threat Model” and “Security of Incremental Hash Functions”. https://logperiodic.com/rbsr.html
Range-based reconciliation as deployed in negentropy. Its fingerprint threat model is the third party of Adversary, who inserts crafted elements so that others fail to synchronize. It reports collisions of 256-bit XOR fingerprints in two seconds by Gaussian elimination and of sums modulo in about 28 hours with a -dimensional birthday solver, the kind of problem to which known discrete logarithms reduce the checksum (Known weaknesses), and judges ECMH collisions infeasible but ECMH slower, with a single reference implementation.
-
[corallo-2016] M. Corallo. Compact Block Relay. Bitcoin Improvement Proposal 152, 2016. https://github.com/bitcoin/bips/blob/master/bip-0152.mediawiki
Compact block relay keys short transaction identifiers with SipHash under a hash of the block header and a nonce. The header commits to the transactions it identifies, so they cannot be chosen against the key. Items reconciled within an epoch can be, which is why a short keyed hash does not serve here although a block hash still bounds the epoch.
-
[krohn-freedman-mazieres-2004] M. N. Krohn, M. J. Freedman, D. Mazières. On-the-Fly Verification of Rateless Erasure Codes for Efficient Content Distribution. IEEE Symposium on Security and Privacy, pp. 226–240, 2004. https://doi.org/10.1109/SECPRI.2004.1301326
[juels-et-al-2015] A. Juels, J. Kelley, R. Tamassia, N. Triandopoulos. Falcon Codes: Fast, Authenticated LT Codes (Or: Making Rapid Tornadoes Unstoppable). Proceedings of the 22nd ACM SIGSAC Conference on Computer and Communications Security, pp. 1032–1047, 2015. https://doi.org/10.1145/2810103.2813728
[boneh-freeman-katz-waters-2009] D. Boneh, D. Freeman, J. Katz, B. Waters. Signing a Linear Subspace: Signature Schemes for Network Coding. Public Key Cryptography – PKC 2009, LNCS 5443, pp. 68–87. https://doi.org/10.1007/978-3-642-00468-1_5Integrity of coded data against corrupt symbols from participants: homomorphic hashes of a publisher’s blocks verify each block of a rateless erasure code on receipt, Falcon codes authenticate LT-coded symbols with a MAC under a key the sender and receiver share, and signatures on a linear subspace let the nodes of a random linear network code derive and verify signatures on combinations. The first uses a discrete-logarithm homomorphic hash, as the cell checksum does. Each authenticates data against a source or a key from which every legitimate symbol derives; the items of a reconciled set are authored by any party, the adversary included, and carry no such credential, so corrupt symbols from a participating peer remain outside the adversary of Adversary.
-
[bolt-7] Lightning Network specification contributors. BOLT #7: P2P Node and Channel Discovery. Basis of Lightning Technology. https://github.com/lightning/bolts/blob/master/07-routing-gossip.md
[chen-et-al-2026] X. Chen, A. Sinha, D. Starobinski, A. Trachtenberg. Scaling the Lightning Network with Practical Set Reconciliation. arXiv:2608.15921, 2026. https://arxiv.org/abs/2608.15921Lightning gossip, a public set of channel and node announcements that any node can extend, and an evaluation of IBLT-based reconciliation for it, which leaves adversarial conditions to future work.
Multiset hashes in deployment, and fixed-group baselines
-
[van-der-wansem-2018] T. van der Wansem. ECMH: Elliptic Curve Multiset Hash for UTXO Commitments. Bitcoin Cash specification draft, 2018. https://github.com/tomasvdw/bips/blob/master/ecmh.mediawiki
[wuille-2020] P. Wuille. MuHash3072: A Multiset Hash for the UTXO Set. Bitcoin Core pull request 19055 and BIP draft, 2020. https://github.com/bitcoin/bitcoin/pull/19055The deployed multiset hashes for UTXO-set commitments: ECMH on secp256k1 with try-and-increment, and MuHash3072 in the multiplicative group of a 3072-bit prime field. Both fix one group for all time at 128-bit security; they are the reference for why a curve rather than a modular group, and for what a fixed group costs at full size.
-
[certicom-2010] Certicom Research. SEC 2: Recommended Elliptic Curve Domain Parameters. Standards for Efficient Cryptography, version 2.0. 27 January 2010. https://www.secg.org/sec2-v2.pdf
[libsecp256k1] Bitcoin Core contributors. libsecp256k1. GitHub repository. https://github.com/bitcoin-core/secp256k1secp256k1’s parameters and the library timed in
benches/compare.rs(compressed-point parsing, ElligatorSwift decoding, Jacobian accumulation): the cost of ECMH on a fixed 256-bit curve. -
[bernstein-2006] D. J. Bernstein. Curve25519: New Diffie-Hellman Speed Records. Public Key Cryptography – PKC 2006, LNCS 3958, pp. 207–228. https://doi.org/10.1007/11745853_14
[hamburg-2015] M. Hamburg. Decaf: Eliminating Cofactors through Point Compression. Advances in Cryptology – CRYPTO 2015, Part I, LNCS 9215, pp. 705–723. https://doi.org/10.1007/978-3-662-47989-6_34
[rfc9496] H. de Valence, J. Grigg, M. Hamburg, I. Lovecruft, G. Tankersley, F. Valsorda. The ristretto255 and decaf448 Groups. RFC 9496, December 2023. https://doi.org/10.17487/RFC9496
[curve25519-dalek] I. Lovecruft, H. de Valence. curve25519-dalek. GitHub repository. https://github.com/dalek-cryptography/curve25519-dalekCurve25519, the Decaf quotient that removes its cofactor, the ristretto255 specification, and the implementation timed in
benches/compare.rs: the second fixed 256-bit baseline. Decaf’s quotient, which removes a cofactor of 4, is the model for thetwistedfamily’s encoding of , which removes only the 2-torsion point . -
[fips-180-4] National Institute of Standards and Technology. Secure Hash Standard (SHS). NIST, FIPS PUB 180-4, 2015. https://doi.org/10.6028/NIST.FIPS.180-4
[aumasson-bernstein-2012] J.-P. Aumasson, D. J. Bernstein. SipHash: A Fast Short-Input PRF. Progress in Cryptology – INDOCRYPT 2012, LNCS 7668, pp. 489–508. https://doi.org/10.1007/978-3-642-34931-7_28SHA-256, the digest behind
src/hash.rsand every map, and SipHash. XOR of either is the non-adversarial baseline every curve is compared against.
Binary fields and their dependence on carry-less multiplication
-
[hankerson-menezes-vanstone-2004] D. Hankerson, A. Menezes, S. Vanstone. Guide to Elliptic Curve Cryptography. Springer, 2004. https://doi.org/10.1007/b97644
Reference for arithmetic: the trace, the half-trace that solves in decoding and hashing, Itoh–Tsujii inversion, and the multiplication-by-constant cost model the operation counts in the module documentation use.
-
[taverne-et-al-2011] J. Taverne, A. Faz-Hernández, D. F. Aranha, F. Rodríguez-Henríquez, D. Hankerson, J. López. Software Implementation of Binary Elliptic Curves: Impact of the Carry-Less Multiplier on Scalar Multiplication. Cryptographic Hardware and Embedded Systems – CHES 2011, LNCS 6917, pp. 108–123. https://doi.org/10.1007/978-3-642-23951-9_8
[bluhm-gueron-2015] M. Bluhm, S. Gueron. Fast Software Implementation of Binary Elliptic Curve Cryptography. Journal of Cryptographic Engineering 5(3), pp. 215–226, 2015. https://doi.org/10.1007/s13389-015-0094-1Binary-curve software built on PCLMULQDQ, with measurements of how far the carry-less multiplier decides speed. The binary families are fast only where PMULL or PCLMULQDQ is present; the
bench-bins-genericruns time the portable backend that stands in when it is absent, which makes the hardware dependence a deployment condition stated with numbers. -
[crrl] T. Pornin. crrl: Rust Library for Cryptographic Research. GitHub repository. https://github.com/pornin/crrl
Pornin’s library: the backends (
field::gf2_127) and the GLS254 code from whichcurve::binary127::mapand the tower are adapted.
Binary curve models and addition formulas
-
[pornin-2022] T. Pornin. Efficient and Complete Formulas for Binary Curves. Cryptology ePrint Archive, Paper 2022/1325. https://eprint.iacr.org/2022/1325
Complete formulas for ordinary binary curves with in coordinates, the extended accumulators of
curve::binary::extended, the encoding ofwcodec, and the mixed addition thatunscaledreduces to by moving the curve constant into the addend, against for the implemented incomplete formula. -
[pornin-2023] T. Pornin. Faster Complete Formulas for the GLS254 Binary Curve. Cryptology ePrint Archive, Paper 2023/1688. https://eprint.iacr.org/2023/1688
The same formulas over (GLS254) and the map to the curve. The tower and the GLS family (
binary.122-gls) test whether this shape transfers at half the size. -
[pornin-2024] T. Pornin. A Prime-Order Group with Complete Formulas from Even-Order Elliptic Curves. IACR Communications in Cryptology 1(1), 2024. https://doi.org/10.62056/akmp-4c2h
The general method: a prime-order group abstraction with complete formulas from any curve of even order, most efficient for . Both characteristics are covered, so it states once the structure the binary families () and the
twistedquotient use. -
[oliveira-et-al-2014] T. Oliveira, J. López, D. F. Aranha, F. Rodríguez-Henríquez. Two Is the Fastest Prime: Lambda Coordinates for Binary Elliptic Curves. Journal of Cryptographic Engineering 4(1), pp. 3–17, 2014. https://doi.org/10.1007/s13389-013-0069-z
[oliveira-et-al-2013] T. Oliveira, J. López, D. F. Aranha, F. Rodríguez-Henríquez. Lambda Coordinates for Binary Elliptic Curves. Cryptographic Hardware and Embedded Systems – CHES 2013, LNCS 8086, pp. 311–330. ePrint 2013/131, version of 2013-07-31; later versions of 2013/131 are the journal version, [oliveira-et-al-2014]. https://doi.org/10.1007/978-3-642-40349-1_18-projective coordinates, with mixed addition and no curve constant: the
curve::binary::lambdaaccumulators. On curves with a dense , where Pornin’s extended formulas need two full multiplications by , this costs less than the extended accumulator, at the price of incompleteness; the unscaled formulas, at , move into the addend and cost less than ’s for the addition itself. -
[kim-kim-2007] K. H. Kim, S. I. Kim. A New Method for Speeding Up Arithmetic on Elliptic Curves over Binary Fields. Cryptology ePrint Archive, Paper 2007/181. https://eprint.iacr.org/2007/181
PL-coordinates: López–Dahab with kept unreduced. Mixed addition of an affine and a PL point costs on curves (Theorem 2), in an accounting that counts a reduction modulo the field polynomial as a squaring and defers it. Not implemented: a comparison with the of the unscaled formulas requires the same accounting; the formulas as written cover the families (, ) and not the families over , where has trace 0.
-
[lopez-dahab-1998] J. López, R. Dahab. Improved Algorithms for Elliptic Curve Arithmetic in GF(2^n). Selected Areas in Cryptography – SAC ’98, LNCS 1556, pp. 201–212, 1999. https://doi.org/10.1007/3-540-48892-8_16
López–Dahab projective coordinates, the earlier standard that -coordinates improve on; not implemented, and dominated by
lambdafor mixed addition. -
[galbraith-lin-scott-2009] S. D. Galbraith, X. Lin, M. Scott. Endomorphisms for Faster Elliptic Curve Cryptography on a Large Class of Curves. Advances in Cryptology – EUROCRYPT 2009, LNCS 5479, pp. 518–535. https://doi.org/10.1007/978-3-642-01001-9_30
GLS curves: over , quadratic twists of curves defined over , with an endomorphism , . For binary curves, and in , as in
binary.122-gls. The endomorphism speeds scalar multiplication, which this workload does not perform; what the family gains here is a curve constant in , so each multiplication by it costs two word products instead of three. Its rho penalty is in the security section. -
[bernstein-lange-farashahi-2008] D. J. Bernstein, T. Lange, R. Rezaeian Farashahi. Binary Edwards Curves. Cryptographic Hardware and Embedded Systems – CHES 2008, LNCS 5154, pp. 244–265. https://doi.org/10.1007/978-3-540-85053-3_16
Binary Edwards curves: the complete model in characteristic 2. For every ordinary curve over is birationally equivalent to a complete binary Edwards curve (Theorem 4.3), so the model is available for every certified binary curve and the exclusion is one of cost. Mixed addition costs (projective ; for , with no mixed variant of lower cost) against for the unscaled formulas of
pornin-2022. No direct map to the model with a demonstrated advantage was found, and generic projective equality costs about against to on the representations; neither is a lower bound for a cached or quotient representation. Excluded on these inspected operation counts under equal field arithmetic; not implemented or measured, so the exclusion is a prioritization, not a lower bound. The forms, of lower cost, have in the birational Weierstrass model, and so ; the certified binary curves, with and odd, require . -
[kim-lee-negre-2014] K. H. Kim, C. O. Lee, C. Negre. Binary Edwards Curves Revisited. Progress in Cryptology – INDOCRYPT 2014, LNCS 8885, pp. 393–408. https://doi.org/10.1007/978-3-319-13039-2_23
Revisits binary Edwards arithmetic and keeps completeness on complete curves (). For general , projective addition costs (the paper’s baseline for the 2008 formulas, from the EFD, is ), mixed addition and doubling . The forms (projective addition , mixed ) and the complete differential addition-and-doubling at exist exactly when the curve has a rational point of order 4 (Lemma 1), so not on the certified curves; the differential formulas also assume a fixed difference (and when ). Mixed addition stays near twice the of
pornin-2022with dense constants, and the differential result does not implement an arbitrary cell update. -
[bernstein-2009] D. J. Bernstein. Batch Binary Edwards. Advances in Cryptology – CRYPTO 2009, LNCS 5677, pp. 317–336. https://doi.org/10.1007/978-3-642-03356-8_19
[koziel-azarderakhsh-mozaffari-2015] B. Koziel, R. Azarderakhsh, M. Mozaffari-Kermani. Low-Resource and Fast Binary Edwards Curves Cryptography. Progress in Cryptology – INDOCRYPT 2015, LNCS 9462, pp. 347–369. https://doi.org/10.1007/978-3-319-26617-6_19
[koziel-bec-small] B. Koziel, R. Azarderakhsh, M. Mozaffari-Kermani. BEC_Small: SageMath Verification of Binary Edwards Differential Addition. GitHub repository, commit f252fd653354466abfc36416dbf74379f11fce05. Companion to [koziel-azarderakhsh-mozaffari-2015]. https://github.com/briankoziel/BEC_Small
[farias-albertini-barreto-2018] L. A. Farias, B. C. Albertini, P. S. L. M. Barreto. A Class of Safe and Efficient Binary Edwards Curves. Journal of Cryptographic Engineering 8(4), pp. 271–283, 2018. https://doi.org/10.1007/s13389-017-0174-5
[loiseau-fournier-2018] A. Loiseau, J. J. A. Fournier. Binary Edwards Curves for Intrinsically Secure ECC Implementations for the IoT. Proceedings of the 15th International Joint Conference on e-Business and Telecommunications (SECRYPT 2018), pp. 625–631. https://doi.org/10.5220/0006831506250631
[hajra-karati-sen-2026] R. Hajra, S. Karati, T. Sen. Binary Kummer Lines and Binary Edwards Curves: Efficient Two-way Vectorizations. ACM Asia Conference on Computer and Communications Security (ASIA CCS ’26), pp. 519–532, 2026. https://doi.org/10.1145/3779208.3807491The fast binary Edwards formulas are differential, in the coordinate , which identifies with : is computed from , and , as a Montgomery ladder supplies it. Batch Binary Edwards gives the mixed form at with chosen sparse so that multiplication by reduces to a few shifts and additions (
bernstein-2009, section “Differential addition and doubling”); the later papers correct and re-cost these -formulas ( mixed,koziel-azarderakhsh-mozaffari-2015;koziel-bec-smallis its Sage check), apply them with (farias-albertini-barreto-2018, Section 4), add the co-Z technique (loiseau-fournier-2018, Algorithm 2), and vectorize the ladder step with VPCLMULQDQ on a curve with sparse and cofactor 4 (hajra-karati-sen-2026, Table 2). A cell update adds an independent hashed point with no known difference, so none of these formulas applies to it; for generic dense parameters counts as a full , and the sparse-parameter specialization they rely on is not established for seed-derived curves. -
[moloney-omahony-laurent-2010] R. Moloney, A. O’Mahony, P. Laurent. Efficient Implementation of Elliptic Curve Point Operations Using Binary Edwards Curves. Cryptology ePrint Archive, Paper 2010/208. https://eprint.iacr.org/2010/208
The explicit birational maps between a Weierstrass curve and its complete binary Edwards curve, with their exceptional points (Section 3): the conversion a hashed Weierstrass or point would need to enter the model. The affine conversion uses rational functions; their denominators may be inverted in a batch or retained in projective coordinates. No conversion cost has been measured here.
-
[hirschfeld-batten-amain-2018] S. T. E. Hirschfeld, L. M. Batten, M. K. I. Amain. Efficiencies in Binary Elliptic Curves. Computational Science and Its Applications – ICCSA 2018, LNCS 10964, pp. 246–260. https://doi.org/10.1007/978-3-319-95174-4_21
[li-et-al-2019] J. Li, S. Zhong, Z. Li, S. Cao, J. Zhang, W. Wang. Speed-Oriented Architecture for Binary Field Point Multiplication on Elliptic Curves. IEEE Access 7, pp. 32048–32060, 2019. https://doi.org/10.1109/ACCESS.2019.2903170A survey of binary-curve implementation choices that restates Theorem 4.3 and the operation-count comparison, and an FPGA Montgomery-ladder architecture for binary curves: the hardware side of the differential results, with no arbitrary-addition formula.
-
[kohel-2012] D. Kohel. Efficient Arithmetic on Elliptic Curves in Characteristic 2. Progress in Cryptology – INDOCRYPT 2012, LNCS 7668, pp. 378–398. https://doi.org/10.1007/978-3-642-34931-7_22
[wu-tang-feng-2012] H. Wu, C. Tang, R. Feng. A New Model of Binary Elliptic Curves. Progress in Cryptology – INDOCRYPT 2012, LNCS 7668, pp. 399–411. https://doi.org/10.1007/978-3-642-34931-7_23
[wu-2026] H. Wu. A New Characteristic-Uniform Model for Elliptic Curves – Theory, Arithmetic, and Applications. arXiv:2608.01675 [math.NT], 2026. https://doi.org/10.48550/arXiv.2608.01675Other binary normal forms considered: Kohel’s form (addition ) requires a rational 4-torsion point, which the certified curves of order lack; the Wu–Tang–Feng model is unified, not complete, at . The Wu 2026 preprint proposes a characteristic-uniform model; its addition counts were not evaluated here.
Odd-characteristic curve models and addition formulas
-
[edwards-2007] H. M. Edwards. A Normal Form for Elliptic Curves. Bulletin of the American Mathematical Society 44(3), pp. 393–422, 2007. https://doi.org/10.1090/S0273-0979-07-01153-6
[bernstein-lange-2007] D. J. Bernstein, T. Lange. Faster Addition and Doubling on Elliptic Curves. Advances in Cryptology – ASIACRYPT 2007, LNCS 4833, pp. 29–50. https://doi.org/10.1007/978-3-540-76900-2_3The Edwards normal form and its complete addition law when is a non-square: the
edwardsfamily, with drawn per salt. -
[bernstein-et-al-2008] D. J. Bernstein, P. Birkner, M. Joye, T. Lange, C. Peters. Twisted Edwards Curves. Progress in Cryptology – AFRICACRYPT 2008, LNCS 5023, pp. 389–405. https://doi.org/10.1007/978-3-540-68164-9_26
[hisil-et-al-2008] H. Hisil, K. K.-H. Wong, G. Carter, E. Dawson. Twisted Edwards Curves Revisited. Advances in Cryptology – ASIACRYPT 2008, LNCS 5350, pp. 326–343. https://doi.org/10.1007/978-3-540-89255-7_20Twisted Edwards curves and extended coordinates. With a square, the addition is complete and a cached addend costs ; this is the
twistedfamily’s accumulator, and the reason it requires . -
[renes-costello-batina-2016] J. Renes, C. Costello, L. Batina. Complete Addition Formulas for Prime Order Elliptic Curves. Advances in Cryptology – EUROCRYPT 2016, LNCS 9665, pp. 403–428. https://doi.org/10.1007/978-3-662-49890-3_16
Complete projective formulas for prime-order short Weierstrass curves, for mixed addition: the
weierfamily’s accumulator, and the cost of completeness when the order has no cofactor to quotient away. -
[efd] D. J. Bernstein, T. Lange. Explicit-Formulas Database. https://hyperelliptic.org/EFD/
The Explicit-Formulas Database: the named formulas (madd-2007-bl, dbl-2001-b) in
curve::weier::jacobianand the operation counts quoted in the module documentation. -
[montgomery-1987] P. L. Montgomery. Speeding the Pollard and Elliptic Curve Methods of Factorization. Mathematics of Computation 48(177), pp. 243–264, 1987. https://doi.org/10.1090/S0025-5718-1987-0866113-7
Montgomery curves and simultaneous inversion. The inversion method is
field::batch, which every batch sum and batch normalization uses; the Montgomery model is the form in whichedwardspoints travel and are summed in batches by the affine chord law. -
[farashahi-fadavi-sabbaghian-2024] R. Rezaeian Farashahi, M. Fadavi, S. Sabbaghian. Faster Complete Addition Laws for Montgomery Curves. IACR Transactions on Cryptographic Hardware and Embedded Systems 2024(4), pp. 737–762, 2024. https://doi.org/10.46586/tches.v2024.i4.737-762
[kim-et-al-2019] J. Kim, J. H. Park, D.-C. Kim, W.-H. Kim. Complete Addition Law for Montgomery Curves. Information Security and Cryptology – ICISC 2019, LNCS 11975, pp. 260–277, 2020. https://doi.org/10.1007/978-3-030-40921-0_16Complete addition on Montgomery curves: in 2019, then extended Montgomery coordinates with multiplication-free maps to and from extended twisted Edwards coordinates. The extended Montgomery laws correspond to twisted Edwards laws through these maps, so the model change alone gives no field-multiplication saving for the corresponding full additions. The remaining practical comparisons concern cached operands, preparation and conversion, and implementation scheduling.
-
[bernstein-lange-2007-inverted] D. J. Bernstein, T. Lange. Inverted Edwards Coordinates. Applied Algebra, Algebraic Algorithms and Error-Correcting Codes (AAECC-17), LNCS 4851, pp. 20–27, 2007. https://doi.org/10.1007/978-3-540-77224-8_4
Inverted Edwards coordinates, superseded for addition by the extended coordinates of
hisil-et-al-2008. -
[goundar-joye-miyaji-2010] R. R. Goundar, M. Joye, A. Miyaji. Co-Z Addition Formulæ and Binary Ladders on Elliptic Curves. Cryptographic Hardware and Embedded Systems – CHES 2010, LNCS 6225, pp. 65–79. https://doi.org/10.1007/978-3-642-15031-9_5
[kim-et-al-2020] K. H. Kim, J. Choe, S. Y. Kim, N. Kim, S. Hong. Speeding Up Regular Elliptic Curve Scalar Multiplication without Precomputation. Advances in Mathematics of Communications 14(4), pp. 703–726, 2020. https://doi.org/10.3934/amc.2020090Co-Z Jacobian formulas and Montgomery-ladder scalar multiplication on short Weierstrass curves over fields of characteristic other than 2 and 3, built on differential addition-and-doubling. Scalar multiplication, which the workload does not perform.
Prime fields
-
[scott-2024] M. Scott. Elliptic Curve Cryptography for the Masses: Simple and Fast Finite Field Arithmetic. Cryptology ePrint Archive, Paper 2024/779. https://eprint.iacr.org/2024/779
Reduction for shaped primes: Mersenne (, , ), pseudo-Mersenne (, ) and generalized Mersenne (Goldilocks). Every odd field here has one of these shapes; the paper indicates what generated or assembly code could gain over the portable implementations timed.
-
[polygon-zero-2022] Polygon Zero Team. Plonky2: Fast Recursive Arguments with PLONK and FRI. Draft, plonky2 repository. 7 September 2022. https://github.com/0xPolygonZero/plonky2/blob/main/plonky2/plonky2.pdf
[plonky3] Polygon. Plonky3: A Toolkit for Polynomial IOPs. GitHub repository. https://github.com/Plonky3/Plonky3The Goldilocks prime and the implementation
field::goldilocks2uses for its base field and binomial extension. Its 2-adicity of 32, chosen for FFTs, makes square roots slower than over ; thegoldilocks2rows measure that cost. -
[bruestle-gafni-2023] J. Bruestle, P. Gafni, RISC Zero Team. RISC Zero zkVM: Scalable, Transparent Arguments of RISC-V Integrity. RISC Zero, draft. 11 August 2023. https://dev.risczero.com/proof-system-in-detail.pdf
[haboeck-levit-papini-2024] U. Haböck, D. Levit, S. Papini. Circle STARKs. Cryptology ePrint Archive, Paper 2024/278. https://eprint.iacr.org/2024/278BabyBear and the Mersenne prime , the 31-bit fields of current STARK systems. Reaching points over a 31-bit prime needs an extension of degree 4, which admits the heuristic index-calculus asymptotic of
gaudry-2009, below the generic . Group size alone therefore does not justify the target security, and these fields are excluded from the comparison.
Repository organization
- Field arithmetic: representations, arithmetic backends, and batch inversion.
- Curves: group laws, coordinate systems, hash maps, and encodings.
- Group capabilities: the operations consumed by ECMH, the RIBLT workload, and the benchmarks.
- Benchmarks and reporting tools.
results/: the published benchmark runs, each in the compact form described in Measurement methodology, from which the site renders one chapter per run.bench-runs/, where runs are recorded, is not under version control.- Tests: known-answer tests against the reference programs’
fixtures, point counts against PARI, and the certificate corpus. Every
recorded fixture opens with how it was produced: the generated
tests/common/*.rswith the Sage command that rewrites them, the corpustests/fixtures/cert_corpus.txtwith the test that records and checks it, and the report’sreport/tests/fixtures/*.tsvwith the run and derivation they come from, as far as these were recorded. - Nix: the pinned toolchains and the derivations for the package,
checks, benchmark executables, reports, assembly listings, and this site;
nix run .#validate-commits -- RANGEruns the checks at every commit of a range, as the continuous integration does for each commit a push or pull request adds. - Documents: the chapters;
docs/index.mdgives their order. - Reference programs: the known-answer-test generators and order
proofs the Rust fixtures come from (
kat*.sage,prove_orders.sage,agm_vectors.sage,sieve.sage,gf2_*.sage), and the surveys behind the choice of fields and curves: candidate field sizes (field_sizes.sage), GLS fields (gls_survey.sage), Weil descent (ghs.sage,ghs122.sage), and complete Edwards curves over pseudo-Mersenne primes (edwards_search.py).