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 32 vCPUs, DKLs23 built the 100,000-presignature pool in 2 minutes 22 seconds at 200 parallel sessions; CGGMP21 took 2 hours 36 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 66× 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: 2 min 22 s with DKLs23, 2 h 36 min with CGGMP21

Three n2d-standard-32 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 66×. 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 · 32 vCPU pool DKLs23 0.69 Gbit/s · CGGMP21 7.6 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 (≈706/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

DKLs232 min 22 sat 32 vCPU
CGGMP212 h 36 minat 32 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 is 66×. 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.82 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.82 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.82
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,078.7 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,078.7 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,078.7
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.

Consistency check: throughput × latency ≈ concurrency

All three VM sizes and both protocols · dashed line is y = x

DKLs2321 cellsall VM sizes
CGGMP2117 cellsall VM sizes
Throughput times latency against concurrency DKLs23 uses circles; CGGMP21 uses squares. Exact values are listed in the data table below. 1 10 100 1k 10k throughput × mean latency 10 100 1k 10k configured concurrency (c) DKLs23 · 4 vCPU · c=10: 10.0 in flight (1.00x the configured 10) DKLs23 · 4 vCPU · c=50: 49.9 in flight (1.00x the configured 50) DKLs23 · 4 vCPU · c=100: 99.6 in flight (1.00x the configured 100) DKLs23 · 4 vCPU · c=200: 197.8 in flight (0.99x the configured 200) DKLs23 · 4 vCPU · c=400: 390.1 in flight (0.98x the configured 400) DKLs23 · 16 vCPU · c=10: 10.0 in flight (1.00x the configured 10) DKLs23 · 16 vCPU · c=50: 49.9 in flight (1.00x the configured 50) DKLs23 · 16 vCPU · c=100: 99.7 in flight (1.00x the configured 100) DKLs23 · 16 vCPU · c=200: 198.9 in flight (0.99x the configured 200) DKLs23 · 16 vCPU · c=400: 396.0 in flight (0.99x the configured 400) DKLs23 · 32 vCPU · c=10: 10.0 in flight (1.00x the configured 10) DKLs23 · 32 vCPU · c=50: 49.9 in flight (1.00x the configured 50) DKLs23 · 32 vCPU · c=100: 99.6 in flight (1.00x the configured 100) DKLs23 · 32 vCPU · c=200: 198.7 in flight (0.99x the configured 200) DKLs23 · 32 vCPU · c=250: 248.1 in flight (0.99x the configured 250) DKLs23 · 32 vCPU · c=400: 377.3 in flight (0.94x the configured 400) DKLs23 · 32 vCPU · c=800: 769.0 in flight (0.96x the configured 800) DKLs23 · 32 vCPU · c=1200: 1,127.9 in flight (0.94x the configured 1200) DKLs23 · 32 vCPU · c=1400: 1,318.9 in flight (0.94x the configured 1400) DKLs23 · 32 vCPU · c=1600: 1,446.8 in flight (0.90x the configured 1600) DKLs23 · 32 vCPU · c=2000: 1,305.0 in flight (0.65x the configured 2000) CGGMP21 · 4 vCPU · c=10: 9.7 in flight (0.97x the configured 10) CGGMP21 · 4 vCPU · c=50: 48.6 in flight (0.97x the configured 50) CGGMP21 · 4 vCPU · c=100: 91.1 in flight (0.91x the configured 100) CGGMP21 · 4 vCPU · c=200: 158.4 in flight (0.79x the configured 200) CGGMP21 · 4 vCPU · c=400: 244.4 in flight (0.61x the configured 400) CGGMP21 · 16 vCPU · c=10: 9.8 in flight (0.98x the configured 10) CGGMP21 · 16 vCPU · c=50: 48.0 in flight (0.96x the configured 50) CGGMP21 · 16 vCPU · c=100: 93.1 in flight (0.93x the configured 100) CGGMP21 · 16 vCPU · c=200: 173.4 in flight (0.87x the configured 200) CGGMP21 · 16 vCPU · c=400: 291.8 in flight (0.73x the configured 400) CGGMP21 · 32 vCPU · c=10: 9.9 in flight (0.99x the configured 10) CGGMP21 · 32 vCPU · c=50: 48.7 in flight (0.97x the configured 50) CGGMP21 · 32 vCPU · c=100: 95.3 in flight (0.95x the configured 100) CGGMP21 · 32 vCPU · c=150: 139.5 in flight (0.93x the configured 150) CGGMP21 · 32 vCPU · c=200: 181.0 in flight (0.91x the configured 200) CGGMP21 · 32 vCPU · c=250: 221.4 in flight (0.89x the configured 250) CGGMP21 · 32 vCPU · c=400: 324.2 in flight (0.81x the configured 400) Throughput times latency against concurrency DKLs23 uses circles; CGGMP21 uses squares. Exact values are listed in the data table below. 1 10 100 1k 10k throughput × mean latency 10 100 1k 10k configured concurrency (c) DKLs23 · 4 vCPU · c=10: 10.0 in flight (1.00x the configured 10) DKLs23 · 4 vCPU · c=50: 49.9 in flight (1.00x the configured 50) DKLs23 · 4 vCPU · c=100: 99.6 in flight (1.00x the configured 100) DKLs23 · 4 vCPU · c=200: 197.8 in flight (0.99x the configured 200) DKLs23 · 4 vCPU · c=400: 390.1 in flight (0.98x the configured 400) DKLs23 · 16 vCPU · c=10: 10.0 in flight (1.00x the configured 10) DKLs23 · 16 vCPU · c=50: 49.9 in flight (1.00x the configured 50) DKLs23 · 16 vCPU · c=100: 99.7 in flight (1.00x the configured 100) DKLs23 · 16 vCPU · c=200: 198.9 in flight (0.99x the configured 200) DKLs23 · 16 vCPU · c=400: 396.0 in flight (0.99x the configured 400) DKLs23 · 32 vCPU · c=10: 10.0 in flight (1.00x the configured 10) DKLs23 · 32 vCPU · c=50: 49.9 in flight (1.00x the configured 50) DKLs23 · 32 vCPU · c=100: 99.6 in flight (1.00x the configured 100) DKLs23 · 32 vCPU · c=200: 198.7 in flight (0.99x the configured 200) DKLs23 · 32 vCPU · c=250: 248.1 in flight (0.99x the configured 250) DKLs23 · 32 vCPU · c=400: 377.3 in flight (0.94x the configured 400) DKLs23 · 32 vCPU · c=800: 769.0 in flight (0.96x the configured 800) DKLs23 · 32 vCPU · c=1200: 1,127.9 in flight (0.94x the configured 1200) DKLs23 · 32 vCPU · c=1400: 1,318.9 in flight (0.94x the configured 1400) DKLs23 · 32 vCPU · c=1600: 1,446.8 in flight (0.90x the configured 1600) DKLs23 · 32 vCPU · c=2000: 1,305.0 in flight (0.65x the configured 2000) CGGMP21 · 4 vCPU · c=10: 9.7 in flight (0.97x the configured 10) CGGMP21 · 4 vCPU · c=50: 48.6 in flight (0.97x the configured 50) CGGMP21 · 4 vCPU · c=100: 91.1 in flight (0.91x the configured 100) CGGMP21 · 4 vCPU · c=200: 158.4 in flight (0.79x the configured 200) CGGMP21 · 4 vCPU · c=400: 244.4 in flight (0.61x the configured 400) CGGMP21 · 16 vCPU · c=10: 9.8 in flight (0.98x the configured 10) CGGMP21 · 16 vCPU · c=50: 48.0 in flight (0.96x the configured 50) CGGMP21 · 16 vCPU · c=100: 93.1 in flight (0.93x the configured 100) CGGMP21 · 16 vCPU · c=200: 173.4 in flight (0.87x the configured 200) CGGMP21 · 16 vCPU · c=400: 291.8 in flight (0.73x the configured 400) CGGMP21 · 32 vCPU · c=10: 9.9 in flight (0.99x the configured 10) CGGMP21 · 32 vCPU · c=50: 48.7 in flight (0.97x the configured 50) CGGMP21 · 32 vCPU · c=100: 95.3 in flight (0.95x the configured 100) CGGMP21 · 32 vCPU · c=150: 139.5 in flight (0.93x the configured 150) CGGMP21 · 32 vCPU · c=200: 181.0 in flight (0.91x the configured 200) CGGMP21 · 32 vCPU · c=250: 221.4 in flight (0.89x the configured 250) CGGMP21 · 32 vCPU · c=400: 324.2 in flight (0.81x the configured 400)
concurrency (c) · log scalepresignatures in flight · log scale

By Little's law, the number of presignatures in flight equals throughput multiplied by latency. Points on the diagonal confirm that the harness holds the configured concurrency with no hidden queue on either side, so the latency and throughput figures on this page describe the protocols, not the test rig.

View values & sources
Throughput × latency against configured concurrency
vCPUProtocolConcurrency (c)presigns/smean latency (s)median latency (s)throughput × meanRatio to c
4CGGMP21c=101.257.7517.8109.70.97×
4CGGMP21c=501.3236.85636.85648.60.97×
4CGGMP21c=1001.3169.32369.82291.10.91×
4CGGMP21c=2001.27125.075130.745158.40.79×
4CGGMP21c=4001.31186.172175.498244.40.61× — outside ±30%
4DKLs23c=10114.190.0870.08710.01.00×
4DKLs23c=50163.210.3060.31249.91.00×
4DKLs23c=100163.130.6100.61999.61.00×
4DKLs23c=200161.131.2271.225197.80.99×
4DKLs23c=400163.092.3922.449390.10.98×
16CGGMP21c=104.322.2712.2469.80.98×
16CGGMP21c=505.129.3749.44348.00.96×
16CGGMP21c=1005.1917.94517.53993.10.93×
16CGGMP21c=2005.2033.34932.127173.40.87×
16CGGMP21c=4005.2755.39461.724291.80.73×
16DKLs23c=10127.090.0790.06710.01.00×
16DKLs23c=50376.540.1330.10049.91.00×
16DKLs23c=100396.140.2520.17299.71.00×
16DKLs23c=200448.920.4430.349198.90.99×
16DKLs23c=400407.170.9720.697396.00.99×
32CGGMP21c=104.702.1052.1009.90.99×
32CGGMP21c=5010.364.7004.71248.70.97×
32CGGMP21c=10010.449.1279.16995.30.95×
32CGGMP21c=15010.4413.37012.995139.50.93×
32CGGMP21c=20010.5117.22617.515181.00.91×
32CGGMP21c=25010.4621.16918.711221.40.89×
32CGGMP21c=40010.5230.83534.943324.20.81×
32DKLs23c=10117.620.0850.06610.01.00×
32DKLs23c=50304.460.1640.08049.91.00×
32DKLs23c=100341.430.2920.14299.61.00×
32DKLs23c=200213.210.9320.268198.70.99×
32DKLs23c=250254.040.9770.344248.10.99×
32DKLs23c=400213.281.7690.548377.30.94×
32DKLs23c=800261.182.9441.095769.00.96×
32DKLs23c=1200248.544.5382.1471,127.90.94×
32DKLs23c=1400262.775.0191.8951,318.90.94×
32DKLs23c=1600164.638.7889.2331,446.80.90×
32DKLs23c=2000179.937.2530.5771,305.00.65× — outside ±30%

Source: 2026-09-15 single-boot sweeps (results/harvest/presig-highc2-*.csv), zero-error cells. Little's law uses mean time in system, so the product uses avg_latency_ms; the median is shown alongside for reference. 2 of 38 cells fall outside ±30%: 32 vCPU DKLs23 c=2000 at 0.65×; 4 vCPU CGGMP21 c=400 at 0.61×.

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.

fastest 100k in the measured grid: DKLs23 2m 22s (c=200) · CGGMP21 2h 36m 02s (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.69 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; 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