Silence Laboratories
Learn more

Presign calculator · 2-of-3 · measured on GCP n2d-standard

Presigns: DKLs23 vs CGGMP21

Goal. Measure the time to generate 100,000 presignatures with DKLs23 and with CGGMP21, and how that time changes with machine size, concurrency and geography.

Setup. Three GCP n2d-standard VMs at 4, 16 and 32 vCPU, one per party, in a 2-of-3 configuration. Concurrency (c) is the number of presignatures being generated in parallel; each protocol was run at the concurrency that gave it the highest throughput (DKLs23: c=50 on 4 vCPU, c=200 on 16 and 32 vCPU; CGGMP21: c=50 on all sizes). Same harness and same load generator for both protocols. All figures on this page are same-region.

Result. On 16 vCPUs, DKLs23 built the 100,000-presignature pool in 5 minutes 16 seconds at 200 parallel sessions; CGGMP21 took 5 hours 11 minutes at 50 parallel sessions, which was its fastest setting — beyond that it only queues. Both completed all 100,000 with zero failures. DKLs23 is 59× faster, and the gap holds at every machine size tested.

Full data and method: repo (private — request access) · exhaustive DKG and DSG benchmarks.

2-of-3 threshold signing Three key shares held by separate parties. Any two of them combine to produce one signature; the third stays offline and the full key is never assembled. 2 of 3 sign · key never assembled

Measured answer · 100,000 presignatures

100,000 presignatures: 5 min 16 s with DKLs23, 5 h 11 min with CGGMP21

Three n2d-standard-16 VMs, one per party, same harness and load generator for both protocols. DKLs23 ran at 200 parallel sessions; CGGMP21 at 50, its fastest setting. Both completed 100,000 of 100,000 presignatures with zero errors. The ratio is 59×. For reference, a single CGGMP21 session (c=1) would take about 73 hours.

VM size DKLs23CGGMP21 Ratio
4 vCPU11 min 17 sc=5020 h 46 minc=50110×
16 vCPU5 min 16 sc=2005 h 11 minc=5059×
32 vCPU2 min 22 sc=2002 h 36 minc=5066×
Topology3 parties · one GCP zone
Sustained traffic · 16 vCPU pool DKLs23 0.31 Gbit/s · CGGMP21 3.8 Mbit/s
1 Gbit/s link capacity DKLs23 ≈1,019/s · CGGMP21 ≈1,400/s

Bandwidth never binds: one presign costs ≈120 KiB, so a 1 Gbit/s link carries ≈1019 presigns/s — far above what the CPUs deliver (≈316/s sustained in the 100k pool; 449/s peak in a 45 s sweep cell). For CGGMP21, c=50 is already the sweet spot: past ~c=400 latency only grows, and from ~c=800 requests start failing.

Time to build a 100k pool

One 100,000-presignature run per size, each protocol at its best setting

DKLs235 min 16 sat 16 vCPU
CGGMP215 h 11 minat 16 vCPU
Time to build a 100k pool DKLs23 uses circles; CGGMP21 uses squares; hollow markers are estimates. Exact values and missing measurements are listed in the data table below. 36 s 6 min 1 h 10 h 100 h pool build time 4 16 32 vCPU DKLs23 · 4: 11 min 17 s DKLs23 · 16: 5 min 16 s DKLs23 · 32: 2 min 22 s CGGMP21 · 4: 20 h 46 min CGGMP21 · 16: 5 h 11 min CGGMP21 · 32: 2 h 36 min 2m 22s 2h 36m Time to build a 100k pool DKLs23 uses circles; CGGMP21 uses squares; hollow markers are estimates. Exact values and missing measurements are listed in the data table below. 36 s 6 min 1 h 10 h 100 h pool build time 4 16 32 vCPU DKLs23 · 4: 11 min 17 s DKLs23 · 16: 5 min 16 s DKLs23 · 32: 2 min 22 s CGGMP21 · 4: 20 h 46 min CGGMP21 · 16: 5 h 11 min CGGMP21 · 32: 2 h 36 min
vCPU · sustained 100k poolspool build time · log scale

Every point is a complete 100,000-presignature run at that VM size. DKLs23: 2 min 22 s to 11 min 17 s. CGGMP21: 2 h 36 min to 20 h 46 min.

View values & sources
Each protocol at its fastest setting
vCPUProtocolConcurrency (c)Wall-clock
4DKLs23c=5011m 17s
4CGGMP21c=5020h 46m 12s
16DKLs23c=2005m 16s
16CGGMP21c=505h 11m 00s
32DKLs23c=2002m 22s
32CGGMP21c=502h 36m 02s

Sources: DKLs23 sustained 100k pools (2026-09-15, one per size, best setting); CGGMP21 measured 100k pools (c=50, one per VM size, 2026-09-12). X settings are equally spaced.

CGGMP21's build time is nearly independent of concurrency: its throughput reaches a plateau by c=50 and does not rise further, so running it at DKLs23's setting would only lengthen its queue. DKLs23's build time does depend on concurrency. Under either convention the ratio stays between roughly 55× and 110×.

Both protocols at the same setting (c=50)
vCPUDKLs23CGGMP21RatioBasis
411m 17s20h 46m 12s110×measured
165m 35s5h 11m 00s56×measured
322m 49s2h 36m 02s55×measured

Sources: DKLs23 measured 100k pools at c=50 (results/harvest/presig-dkls100k-{4,16}-dkls-c50.csv, presig-dkls100000-32-dkls-c50.csv); CGGMP21 measured 100k pools at c=50 (results/harvest/bulk-cggmp-100k-{4,16,32}.json). Every run completed 100,000/100,000 with zero errors.

Why the gap is this large

A CGGMP21 presignature is built from Paillier encryption over 3072-bit numbers, plus the zero-knowledge proofs that go with it; across the three party VMs one presignature consumes about 5.9 core-seconds of CPU. A DKLs23 presignature is built from elliptic-curve operations and oblivious transfer, and consumes about 0.05 core-seconds on the same basis. The two also respond differently to load: DKLs23 keeps getting faster as you add sessions and cores, while CGGMP21 stops improving around 10 to 50 parallel sessions — past that it holds roughly two-thirds of the machine busy and every extra session only lengthens the queue. Measured end to end, the wall-clock gap runs from 59× to 110× across the machine sizes tested. Bandwidth is not a factor either way — CGGMP21 actually sends about 28% fewer bytes per presignature, but at these rates neither protocol comes close to filling a 1 Gbit/s link.

Scenario explorer

Model your setup

An exact match to a measured pool is shown as measured; anything projected from a short sampling run is labelled estimated with its source.

RAM 64 GiB (4 GiB per vCPU)

DKLs23 vs CGGMP21 — benchmark comparison

Reference charts across the measured scenarios stay synchronized with the vCPU control. Each chart identifies its conditions and sources. Solid lines show measurements.

Throughput by VM size

Same region · sustained 100k pool · 100,000 ÷ wall-clock

DKLs23706.29 presigns/sat 32 vCPU
CGGMP2110.68 presigns/sat 32 vCPU
Throughput by VM size DKLs23 uses circles; CGGMP21 uses squares; hollow markers are estimates. Exact values and missing measurements are listed in the data table below. 1 10 100 1k presigns/s 4 16 32 vCPU DKLs23 · 4: 147.65 presigns/s DKLs23 · 16: 316.37 presigns/s DKLs23 · 32: 706.29 presigns/s CGGMP21 · 4: 1.34 presigns/s CGGMP21 · 16: 5.36 presigns/s CGGMP21 · 32: 10.68 presigns/s ×110 ×59 ×66 706 11 Throughput by VM size DKLs23 uses circles; CGGMP21 uses squares; hollow markers are estimates. Exact values and missing measurements are listed in the data table below. 1 10 100 1k presigns/s 4 16 32 vCPU DKLs23 · 4: 147.65 presigns/s DKLs23 · 16: 316.37 presigns/s DKLs23 · 32: 706.29 presigns/s CGGMP21 · 4: 1.34 presigns/s CGGMP21 · 16: 5.36 presigns/s CGGMP21 · 32: 10.68 presigns/s ×110 ×59 ×66
vCPU · sustained 100k poolspresigns/s · log scale

Sustained pool throughput, not a short sweep cell: each point is a full 100,000-presignature run divided by its wall-clock. Labels give the DKLs23/CGGMP21 ratio at that size.

View values & sources
Sustained 100k pool throughput · 100,000 ÷ wall-clock
vCPUProtocolConcurrencyWall-clockpresigns/sErrors
4DKLs23c=5011m 17s147.60
4CGGMP21c=5020h 46m 12s1.30
16DKLs23c=2005m 16s316.40
16CGGMP21c=505h 11m 00s5.40
32DKLs23c=2002m 22s706.30
32CGGMP21c=502h 36m 02s10.70

Sources: DKLs23 results/harvest/presig-dkls100k-4-dkls-c50.csv, presig-dkls100k-16-dkls-c200.csv, presig-dkls100000-32-dkls-c200.csv; CGGMP21 results/harvest/bulk-cggmp-100k-4.json, bulk-cggmp-100k-16.json, bulk-cggmp-100k-32.json. Every run completed 100,000/100,000 with zero errors. X settings are equally spaced.

Peak 45-second sweep throughput (used to choose concurrency) · presigns/s
vCPUDKLs23CGGMP21
4163.211.34
16448.925.27
32341.4310.52

Source: 2026-09-15 single-boot sweeps (results/harvest/presig-highc2-*.csv); CGGMP21 at 4/16 vCPU uses the 2026-09-11 cells. Only zero-error cells. Each protocol may peak at a different concurrency. These 45-second cells chose the concurrency for the sustained pools above; they are not pool throughput.

Throughput vs concurrency (c)

Same region · 16 vCPU · measured requests per second

DKLs23163.09 presigns/sat 400 concurrency (c)
CGGMP211.31 presigns/sat 400 concurrency (c)
Throughput vs concurrency (c) DKLs23 uses circles; CGGMP21 uses squares; hollow markers are estimates. Exact values and missing measurements are listed in the data table below. 0.1 1 10 100 1k presigns/s 1 10 100 400 concurrency DKLs23 · 1: 16.32 presigns/s DKLs23 · 10: 114.19 presigns/s DKLs23 · 50: 163.21 presigns/s DKLs23 · 100: 163.13 presigns/s DKLs23 · 200: 161.13 presigns/s DKLs23 · 400: 163.09 presigns/s CGGMP21 · 1: 0.38 presigns/s CGGMP21 · 1: 0.5 presigns/s CGGMP21 · 10: 1.34 presigns/s CGGMP21 · 50: 1.32 presigns/s CGGMP21 · 100: 1.31 presigns/s CGGMP21 · 200: 1.27 presigns/s CGGMP21 · 400: 1.31 presigns/s CGGMP21 · 800: 1.3 presigns/s 163 1.3 Throughput vs concurrency (c) DKLs23 uses circles; CGGMP21 uses squares; hollow markers are estimates. Exact values and missing measurements are listed in the data table below. 0.1 1 10 100 1k presigns/s 1 10 100 400 concurrency DKLs23 · 1: 16.32 presigns/s DKLs23 · 10: 114.19 presigns/s DKLs23 · 50: 163.21 presigns/s DKLs23 · 100: 163.13 presigns/s DKLs23 · 200: 161.13 presigns/s DKLs23 · 400: 163.09 presigns/s CGGMP21 · 1: 0.38 presigns/s CGGMP21 · 1: 0.5 presigns/s CGGMP21 · 10: 1.34 presigns/s CGGMP21 · 50: 1.32 presigns/s CGGMP21 · 100: 1.31 presigns/s CGGMP21 · 200: 1.27 presigns/s CGGMP21 · 400: 1.31 presigns/s CGGMP21 · 800: 1.3 presigns/s
concurrency · sampled settingspresigns/s · log scale
View values & sources
Throughput vs concurrency (c) · 4 vCPU · presigns/s
concurrency (c)DKLs23CGGMP21
116.320.38
1Not measured0.5
10114.191.34
50163.211.32
100163.131.31
200161.131.27
400163.091.31
800Not measured1.3

Sources: 2026-09-15 single-boot sweeps (results/harvest/presig-highc2-{4,16,32}-{dkls,cggmp}-c*.csv); c=1 anchors as in the latency chart. Throughput is requests_per_sec. X settings are equally spaced.

DKLs23407.17 presigns/sat 400 concurrency (c)
CGGMP215.27 presigns/sat 400 concurrency (c)
Throughput vs concurrency (c) DKLs23 uses circles; CGGMP21 uses squares; hollow markers are estimates. Exact values and missing measurements are listed in the data table below. 0.1 1 10 100 1k presigns/s 1 50 400 concurrency DKLs23 · 1: 15.7 presigns/s DKLs23 · 10: 127.09 presigns/s DKLs23 · 50: 376.54 presigns/s DKLs23 · 100: 396.14 presigns/s DKLs23 · 200: 448.92 presigns/s DKLs23 · 400: 407.17 presigns/s DKLs23 · 800: 390.11 presigns/s CGGMP21 · 1: 0.38 presigns/s CGGMP21 · 1: 0.51 presigns/s CGGMP21 · 10: 4.32 presigns/s CGGMP21 · 50: 5.12 presigns/s CGGMP21 · 100: 5.19 presigns/s CGGMP21 · 200: 5.2 presigns/s CGGMP21 · 400: 5.27 presigns/s 390 5.3 Throughput vs concurrency (c) DKLs23 uses circles; CGGMP21 uses squares; hollow markers are estimates. Exact values and missing measurements are listed in the data table below. 0.1 1 10 100 1k presigns/s 1 50 400 concurrency DKLs23 · 1: 15.7 presigns/s DKLs23 · 10: 127.09 presigns/s DKLs23 · 50: 376.54 presigns/s DKLs23 · 100: 396.14 presigns/s DKLs23 · 200: 448.92 presigns/s DKLs23 · 400: 407.17 presigns/s DKLs23 · 800: 390.11 presigns/s CGGMP21 · 1: 0.38 presigns/s CGGMP21 · 1: 0.51 presigns/s CGGMP21 · 10: 4.32 presigns/s CGGMP21 · 50: 5.12 presigns/s CGGMP21 · 100: 5.19 presigns/s CGGMP21 · 200: 5.2 presigns/s CGGMP21 · 400: 5.27 presigns/s
concurrency · sampled settingspresigns/s · log scale
View values & sources
Throughput vs concurrency (c) · 16 vCPU · presigns/s
concurrency (c)DKLs23CGGMP21
115.70.38
1Not measured0.51
10127.094.32
50376.545.12
100396.145.19
200448.925.2
400407.175.27
8008 errors414 errors
16001333 errors1273 errors

Sources: 2026-09-15 single-boot sweeps (results/harvest/presig-highc2-{4,16,32}-{dkls,cggmp}-c*.csv); c=1 anchors as in the latency chart. Throughput is requests_per_sec. X settings are equally spaced.

DKLs23213.28 presigns/sat 400 concurrency (c)
CGGMP2110.52 presigns/sat 400 concurrency (c)
Throughput vs concurrency (c) DKLs23 uses circles; CGGMP21 uses squares; hollow markers are estimates. Exact values and missing measurements are listed in the data table below. 0.1 1 10 100 1k presigns/s 1 50 200 800 1600 concurrency DKLs23 · 1: 15.33 presigns/s DKLs23 · 10: 117.62 presigns/s DKLs23 · 50: 304.46 presigns/s DKLs23 · 100: 341.43 presigns/s DKLs23 · 150: 232.82 presigns/s DKLs23 · 200: 213.21 presigns/s DKLs23 · 250: 254.04 presigns/s DKLs23 · 400: 213.28 presigns/s DKLs23 · 800: 261.18 presigns/s DKLs23 · 1200: 248.54 presigns/s DKLs23 · 1400: 262.77 presigns/s DKLs23 · 1600: 164.63 presigns/s DKLs23 · 2000: 179.93 presigns/s CGGMP21 · 1: 0.38 presigns/s CGGMP21 · 1: 0.51 presigns/s CGGMP21 · 10: 4.7 presigns/s CGGMP21 · 50: 10.36 presigns/s CGGMP21 · 100: 10.44 presigns/s CGGMP21 · 150: 10.44 presigns/s CGGMP21 · 200: 10.51 presigns/s CGGMP21 · 250: 10.46 presigns/s CGGMP21 · 400: 10.52 presigns/s 180 11 Throughput vs concurrency (c) DKLs23 uses circles; CGGMP21 uses squares; hollow markers are estimates. Exact values and missing measurements are listed in the data table below. 0.1 1 10 100 1k presigns/s 1 50 200 800 1600 concurrency DKLs23 · 1: 15.33 presigns/s DKLs23 · 10: 117.62 presigns/s DKLs23 · 50: 304.46 presigns/s DKLs23 · 100: 341.43 presigns/s DKLs23 · 150: 232.82 presigns/s DKLs23 · 200: 213.21 presigns/s DKLs23 · 250: 254.04 presigns/s DKLs23 · 400: 213.28 presigns/s DKLs23 · 800: 261.18 presigns/s DKLs23 · 1200: 248.54 presigns/s DKLs23 · 1400: 262.77 presigns/s DKLs23 · 1600: 164.63 presigns/s DKLs23 · 2000: 179.93 presigns/s CGGMP21 · 1: 0.38 presigns/s CGGMP21 · 1: 0.51 presigns/s CGGMP21 · 10: 4.7 presigns/s CGGMP21 · 50: 10.36 presigns/s CGGMP21 · 100: 10.44 presigns/s CGGMP21 · 150: 10.44 presigns/s CGGMP21 · 200: 10.51 presigns/s CGGMP21 · 250: 10.46 presigns/s CGGMP21 · 400: 10.52 presigns/s
concurrency · sampled settingspresigns/s · log scale
View values & sources
Throughput vs concurrency (c) · 32 vCPU · presigns/s
concurrency (c)DKLs23CGGMP21
115.330.38
1Not measured0.51
10117.624.7
50304.4610.36
100341.4310.44
1501 errors10.44
200213.2110.51
250254.0410.46
400213.2810.52
800261.1831 errors
1200248.54265 errors
1400262.77396 errors
1600164.63594 errors
2000179.931198 errors

Sources: 2026-09-15 single-boot sweeps (results/harvest/presig-highc2-{4,16,32}-{dkls,cggmp}-c*.csv); c=1 anchors as in the latency chart. Throughput is requests_per_sec. X settings are equally spaced.

DKLs23 peaks near c=100-250 and then declines; CGGMP21 is flat to c=400 and starts failing around c=800.

Latency under concurrency (c)

Same region · 16 vCPU · median per-presign latency

DKLs232,448.58 msat 400 concurrency (c)
CGGMP21175,497.7 msat 400 concurrency (c)
Latency under concurrency (c) DKLs23 uses circles; CGGMP21 uses squares; hollow markers are estimates. Exact values and missing measurements are listed in the data table below. 10 100 1k 10k 100k 1000k ms, lower is better 1 10 100 400 concurrency DKLs23 · 1: 61.28 ms DKLs23 · 10: 86.99 ms DKLs23 · 50: 311.65 ms DKLs23 · 100: 619.4 ms DKLs23 · 200: 1,225.41 ms DKLs23 · 400: 2,448.58 ms CGGMP21 · 1: 2,646.16 ms CGGMP21 · 1: 1,968.6 ms CGGMP21 · 10: 7,485.6 ms CGGMP21 · 50: 36,855.91 ms CGGMP21 · 100: 69,821.84 ms CGGMP21 · 200: 130,745.32 ms CGGMP21 · 400: 175,497.7 ms CGGMP21 · 800: 350,000 ms 2.4k 350k Latency under concurrency (c) DKLs23 uses circles; CGGMP21 uses squares; hollow markers are estimates. Exact values and missing measurements are listed in the data table below. 10 100 1k 10k 100k 1000k ms, lower is better 1 10 100 400 concurrency DKLs23 · 1: 61.28 ms DKLs23 · 10: 86.99 ms DKLs23 · 50: 311.65 ms DKLs23 · 100: 619.4 ms DKLs23 · 200: 1,225.41 ms DKLs23 · 400: 2,448.58 ms CGGMP21 · 1: 2,646.16 ms CGGMP21 · 1: 1,968.6 ms CGGMP21 · 10: 7,485.6 ms CGGMP21 · 50: 36,855.91 ms CGGMP21 · 100: 69,821.84 ms CGGMP21 · 200: 130,745.32 ms CGGMP21 · 400: 175,497.7 ms CGGMP21 · 800: 350,000 ms
concurrency · sampled settingsms · log scale
View values & sources
Latency under concurrency (c) · 4 vCPU · ms
concurrency (c)DKLs23CGGMP21
161.282,646.16
1Not measured1,968.6
1086.997,485.6
50311.6536,855.91
100619.469,821.84
2001,225.41130,745.32
4002,448.58175,497.7
800Not measured350,000

Sources: 2026-09-15 single-boot sweep CSVs (results/harvest/presig-highc2-*.csv) plus the c=1 anchors (2026-09-11 DKLS pools; CGGMP21 sequential reference). Cells with <1% failures are shown with their error count; heavier failure breaks the line.

DKLs23697.4 msat 400 concurrency (c)
CGGMP2161,723.56 msat 400 concurrency (c)
Latency under concurrency (c) DKLs23 uses circles; CGGMP21 uses squares; hollow markers are estimates. Exact values and missing measurements are listed in the data table below. 10 100 1k 10k 100k ms, lower is better 1 50 400 concurrency DKLs23 · 1: 63.69 ms DKLs23 · 10: 66.98 ms DKLs23 · 50: 100.24 ms DKLs23 · 100: 172.19 ms DKLs23 · 200: 348.71 ms DKLs23 · 400: 697.4 ms DKLs23 · 800: 1,405.57 ms CGGMP21 · 1: 2,658.29 ms CGGMP21 · 1: 1,964.8 ms CGGMP21 · 10: 2,245.9 ms CGGMP21 · 50: 9,442.84 ms CGGMP21 · 100: 17,538.52 ms CGGMP21 · 200: 32,126.5 ms CGGMP21 · 400: 61,723.56 ms 1.4k 61.7k Latency under concurrency (c) DKLs23 uses circles; CGGMP21 uses squares; hollow markers are estimates. Exact values and missing measurements are listed in the data table below. 10 100 1k 10k 100k ms, lower is better 1 50 400 concurrency DKLs23 · 1: 63.69 ms DKLs23 · 10: 66.98 ms DKLs23 · 50: 100.24 ms DKLs23 · 100: 172.19 ms DKLs23 · 200: 348.71 ms DKLs23 · 400: 697.4 ms DKLs23 · 800: 1,405.57 ms CGGMP21 · 1: 2,658.29 ms CGGMP21 · 1: 1,964.8 ms CGGMP21 · 10: 2,245.9 ms CGGMP21 · 50: 9,442.84 ms CGGMP21 · 100: 17,538.52 ms CGGMP21 · 200: 32,126.5 ms CGGMP21 · 400: 61,723.56 ms
concurrency · sampled settingsms · log scale
View values & sources
Latency under concurrency (c) · 16 vCPU · ms
concurrency (c)DKLs23CGGMP21
163.692,658.29
1Not measured1,964.8
1066.982,245.9
50100.249,442.84
100172.1917,538.52
200348.7132,126.5
400697.461,723.56
8008 errors414 errors
16001333 errors1273 errors

Sources: 2026-09-15 single-boot sweep CSVs (results/harvest/presig-highc2-*.csv) plus the c=1 anchors (2026-09-11 DKLS pools; CGGMP21 sequential reference). Cells with <1% failures are shown with their error count; heavier failure breaks the line.

DKLs23547.53 msat 400 concurrency (c)
CGGMP2134,943.41 msat 400 concurrency (c)
Latency under concurrency (c) DKLs23 uses circles; CGGMP21 uses squares; hollow markers are estimates. Exact values and missing measurements are listed in the data table below. 10 100 1k 10k 100k ms, lower is better 1 50 200 800 1600 concurrency DKLs23 · 1: 65.25 ms DKLs23 · 10: 66.24 ms DKLs23 · 50: 79.76 ms DKLs23 · 100: 141.58 ms DKLs23 · 150: 198.85 ms DKLs23 · 200: 267.62 ms DKLs23 · 250: 344.32 ms DKLs23 · 400: 547.53 ms DKLs23 · 800: 1,094.89 ms DKLs23 · 1200: 2,146.67 ms DKLs23 · 1400: 1,894.93 ms DKLs23 · 1600: 9,232.86 ms DKLs23 · 2000: 576.79 ms CGGMP21 · 1: 2,640.98 ms CGGMP21 · 1: 1,961.9 ms CGGMP21 · 10: 2,100.45 ms CGGMP21 · 50: 4,712.44 ms CGGMP21 · 100: 9,168.65 ms CGGMP21 · 150: 12,994.85 ms CGGMP21 · 200: 17,514.75 ms CGGMP21 · 250: 18,711.2 ms CGGMP21 · 400: 34,943.41 ms 577 34.9k Latency under concurrency (c) DKLs23 uses circles; CGGMP21 uses squares; hollow markers are estimates. Exact values and missing measurements are listed in the data table below. 10 100 1k 10k 100k ms, lower is better 1 50 200 800 1600 concurrency DKLs23 · 1: 65.25 ms DKLs23 · 10: 66.24 ms DKLs23 · 50: 79.76 ms DKLs23 · 100: 141.58 ms DKLs23 · 150: 198.85 ms DKLs23 · 200: 267.62 ms DKLs23 · 250: 344.32 ms DKLs23 · 400: 547.53 ms DKLs23 · 800: 1,094.89 ms DKLs23 · 1200: 2,146.67 ms DKLs23 · 1400: 1,894.93 ms DKLs23 · 1600: 9,232.86 ms DKLs23 · 2000: 576.79 ms CGGMP21 · 1: 2,640.98 ms CGGMP21 · 1: 1,961.9 ms CGGMP21 · 10: 2,100.45 ms CGGMP21 · 50: 4,712.44 ms CGGMP21 · 100: 9,168.65 ms CGGMP21 · 150: 12,994.85 ms CGGMP21 · 200: 17,514.75 ms CGGMP21 · 250: 18,711.2 ms CGGMP21 · 400: 34,943.41 ms
concurrency · sampled settingsms · log scale
View values & sources
Latency under concurrency (c) · 32 vCPU · ms
concurrency (c)DKLs23CGGMP21
165.252,640.98
1Not measured1,961.9
1066.242,100.45
5079.764,712.44
100141.589,168.65
1501 errors12,994.85
200267.6217,514.75
250344.3218,711.2
400547.5334,943.41
8001,094.8931 errors
12002,146.67265 errors
14001,894.93396 errors
16009,232.86594 errors
2000576.791198 errors

Sources: 2026-09-15 single-boot sweep CSVs (results/harvest/presig-highc2-*.csv) plus the c=1 anchors (2026-09-11 DKLS pools; CGGMP21 sequential reference). Cells with <1% failures are shown with their error count; heavier failure breaks the line.

More concurrency only adds queueing: CGGMP21 latency grows linearly and fails past ~c=400, while DKLs23 holds flat until its knee near c=100-200.

Compute vs bandwidth per transaction — DKLs23 vs CGGMP21

ProtocolOperationCPU per tx (3 VMs)Bandwidth per tx (one-way, aggregate over parties)Sustained rate (100k pool)Traffic at sustained rate
DKLs23Presigning~0.05 core-s~120 KiB~706 presigns/s~0.69 Gbit/s
DKLs23One online signing round~7.5 ms p50~4.4 KB——
CGGMP21Presigning~5.9 core-s~88 KiB~10.7 presigns/s~7.6 Mbit/s
CGGMP21One online signing round~26 ms p50~4–7 KB——

Bandwidth (CGGMP21 / DKLs23) ≈ 0.72×: CGGMP21 sends ≈28% fewer bytes per presignature. Both online rounds are small (4–7 KB) and fast (10s of ms). The headline comparison on this page is measured wall-clock, not a compute ratio.

Sizing for custody

Everything below is arithmetic on the measured pool runs. Rows marked projected scale a measured run linearly; rows marked measured are a real run at that size.

Time to build a pool of size N, on 32 vCPU

Pool build time by pool size · 32 vCPU
PresignaturesDKLs23CGGMP21RatioBasis
10,0000:00:230:15:3641×measured
100,0000:02:222:36:0266×measured
1,000,0000:23:3626:00:1866×projected

Trios needed to sustain a signing rate

32-vCPU trios needed to keep the pool from draining
Signatures/sDKLs23 triosCGGMP21 trios
1011
5015
100110
500147

A presignature pool is a buffer between the signing rate and the refill rate; if signing outpaces refill, the pool empties and each signature falls back to a full interactive run. Trios = ceil(rate ÷ sustained presigns/s), at 706/s for DKLs23 and 10.7/s for CGGMP21.

Recovery from an empty pool

Refilling 100,000 presignatures from zero takes as long as the measured pool run: 4 vCPU: DKLs23 0:11:17 vs CGGMP21 20:46:12 · 16 vCPU: DKLs23 0:05:16 vs CGGMP21 5:11:00 · 32 vCPU: DKLs23 0:02:22 vs CGGMP21 2:36:02.

Concurrency to use

Best concurrency, and where the sweeps first returned errors
vCPUProtocolBest settingFirst errors in sweep
4DKLs23c=50none to c=400
4CGGMP21c=50c=800 (100%)
16DKLs23c=200c=800 (0.04%)
16CGGMP21c=50c=800 (43%)
32DKLs23c=200c=150 (0.01%)
32CGGMP21c=50c=800 (3%)

Beyond these settings, more concurrency adds queueing for DKLs23 and failures for both. The error column gives the lowest swept concurrency that returned any error, with its error rate: a hundredth of a percent is one failed request, not a boundary.

100,000 presignatures on 16 vCPUs: DKLs23 5m 16s (c=200) · CGGMP21 5h 11m 00s (c=50) · both 0 errorssizing: fastest 100k per size — 4 → c50 · 16 → c200 · 32 → c200; more concurrency adds queueing, not throughputnetwork is never the limit: aggregate TX 0.31 Gbit/s sustained (100k pool) · 0.44 Gbit/s peak (45 s sweep); 1 Gbit/s carries ≈1,019 presigns/s

How to read the numbers

* Estimated pool times are computed, not measured: a measured single-run rate for that protocol and concurrency, scaled to the selected size and (for c=1) by the measured vCPU effect; the derivation of every cell is in its tooltip. Repeats of identical settings on this fleet varied by up to ±20% between boots (DKLS c=100 at 32 vCPU: 294–427 s), so treat estimates as ±20% intervals and read them as orders of magnitude. Cells without * are measured runs and carry their exact duration.

What was benchmarked

Get in touch

MPC infrastructure for Institution Grade Digital Assets

Book a discussion call