Performance

Metrics

To evaluate a zkVM’s performance, two primary metrics are considered: Efficiency and Cost.

Efficiency

The Efficiency, or cycles per instruction, means how many cycles the zkVM can prove in one second. One cycle is usually mapped to one MIPS instruction in the zkVM.

For each MIPS instruction in a shard, it goes through two main phases: the execution phase and the proving phase (to generate the proof).

In the execution phase, the MIPS VM (Emulator) reads the instruction at the program counter (PC) from the program image and executes it to generate execution traces (events). These traces are converted into a matrix for the proving phase. The number of traces depends on the program's instruction sequence - the shorter the sequence, the more efficient the execution and proving.

In the proving phase, the zkMIPS prover uses a Polynomial Commitment Scheme (PCS) — specifically FRI — to commit the execution traces. The proving complexity is determined by the matrix size of the trace table.

Therefore, the instruction sequence size and prover efficiency directly impact overall proving performance.

Cost

Proving cost is a more comprehensive metric that measures the total expense of proving a specific program. It can be approximated as: Prover Efficiency * Unit, Where Prover Efficiency reflects execution performance, and Unit Price refers to the cost per second of the server running the prover.

For example, ethproofs.org provides a platform for all zkVMs to submit their Ethereum mainnet block proofs, which includes the proof size, proving time and proving cost per Mgas (Efficiency * Unit / GasUsed, where the GasUsed is of unit Mgas).

zkVM benchmarks

To facilitate the fairest possible comparison among different zkVMs, we provide the zkvm-benchmarks suite, enabling anyone to reproduce the performance data.

Performance of zkMIPS

The performance of zkMIPS on an AWS r6a.8xlarge instance, a CPU-based server, is presented below:

Note that all the time is of unit millisecond. Define Rate = 100*(SP1 - zkMIPS)/zkMIPS.

Fibonacci

nROVM 2.0.1zkMIPS 0.3zkMIPS 1.0SP1 4.1.1Rate
1001691647819475828199.33
10003291803719335728196.32
10000128814423929727932166.89
58218646482235341498531063107.29

sha2

Byte LengthROVM 2.0.1zkMIPS 0.3zkMIPS 1.0SP1 4.1.1Rate
323307786619275931207.78
2566540831819135872206.95
51265041153019705970203.04
1024129721343421926489196.03
2048258982277429757686158.35

sha3

Byte LengthROVM 2.0.1zkMIPS 0.3zkMIPS 1.0SP1 4.1.1Rate
323303789119725942201.31
25664871063622675909160.65
512129651301522256580195.73
1024130022104432837612131.86
20482601443249492310087104.89

Proving with precompile:

Byte LengthzkMIPS 1.0SP1 4.1.1Rate
3264698051.70
25663499056.15
51273199335.84
1024755103436.95
2048976125728.79

big-memory

ValueROVM 2.0.1zkMIPS 0.3zkMIPS 1.0SP1 4.1.1Rate
578486199344212183692774.03

sha2-chain

IterationsROVM 2.0.1zkMIPS 0.3zkMIPS 1.0SP1 4.1.1Rate
2305397914145187561585081.01
460104584321358177893179978.75

sha3-chain

IterationsROVM 2.0.1zkMIPS 0.3zkMIPS 1.0SP1 4.1.1Rate
230208734718678362053998710.44
460417773135824868488687900.44

Proving with precompile:

IterationszkMIPS 1.0SP1 4.1.1Rate
2303491427722.51
4606471792422.45