Measure the configuration you will use.
A reproducible record for latency, memory, accuracy, and security assumptions.
Source guide · 7dd13e6Markdown
What the explorer currently shows
The benchmark explorer reports full-slot CKKS bootstrapping restoring 16 net levels at scale 2³⁵. The x86 backends were measured on an AMD Ryzen 9 9950X and the NEON backend on an Apple M5 Pro; each run names its hardware, and speedups against the portable backend are only given on the host where it was measured. It includes C2S-first and S2C-first timings, precision, presets, key/ciphertext modulus bounds. The measurements use Poulpy 0.9.0 and cover 20 measured iterations after three warm-ups per configuration. Binary FHE results are not yet available.
The performance guide explains mechanisms and tuning hypotheses. Use it to select candidates, then measure your actual circuit.
Define the operation boundary
Measure key generation, key preparation, encoding/encryption, evaluation, and decryption separately. State whether transfers, allocation, thread-pool startup, and preparation are included. Distinguish one-operation latency from throughput across independent ciphertexts.
The client/evaluator example prints evaluation latency and serialized byte counts as a local diagnostic. Its small learning parameters have no security rating and its one timing sample is not a comparative benchmark.
Record enough to reproduce
| Field | Required information |
|---|---|
| Code | Repository, full commit or exact versions, lockfile, command, input generator/seed |
| Machine | Host CPU and accelerator models, host/device memory, OS, driver/runtime versions, instruction sets, power policy, affinity and other load |
| Build | Rust and device compiler versions where applicable, release profile, Cargo features, target flags |
| Workload | Scheme, operation/pipeline, real/complex slot count, input range, batch size |
| Parameters | Ring degree/rank, all ciphertext and evaluation-key widths, limb/decomposition sizes, secret/error distributions |
| Security | Target, estimator revision, attack assumptions, additional construction assumptions |
| Accuracy | Required tolerance and measured error; bootstrap failure/correctness criteria where relevant |
| Timing | Warm-up, independent repetitions, median and defined spread statistic; included/excluded transfers, device synchronization, and other work |
| Memory | Serialized and prepared key bytes, ciphertext bytes, scratch reservation, peak host and device memory |
| Parallelism | Backend, host threads, device execution configuration where applicable, concurrent operations, scheduling configuration |
Use the same accuracy and security goals for a cross-library comparison, and disclose differences in algorithms, packing, and preparation. A transform-count argument alone is not a runtime result.
Run the maintained tools
From the pinned checkout:
cargo bench --locked -p poulpy-cpu-portable --bench standard --features enable-ckks,enable-bin-fhe -- "vec_znx_add"
This is a primitive benchmark, not an application estimate. The benchmark crate documents additional targets. Thread tuning provides a sweep for the chosen hardware.
Keep raw output with the configuration record. Publish measured comparisons only when their records are available, and repeat measurement after changing parameters, compiler, backend, or source revision.