# Performances

> Chaque chiffre mesuré de la v1.0.0, avec sa source : la preuve de base d’un bloc Ethereum complet, l’arbre de récursion, le décideur et le contrat, la preuve de shard de chaque famille, et les coûts propres à Mercury.

Tous les chiffres de bout en bout concernent le bloc 257 510 de `glamsterdam-devnet-8`, prouvé au moyen du programme invité validateur sans état : 60 transactions, 101,5 Mgas, 198 millions de cycles. Chaque chiffre provient des mesures de la spécification.

## De bout en bout

| Étape | Machine | Résultat |
| --- | --- | --- |
| Preuve de base | 32 vCPU, 247,7 GiB, 12 shards en cours de traitement | 207 shards, 14,5 MB, 2 481 s; pic de 173,92 GiB |
| Feuilles de récursion | 32 CPU, quatre feuilles à la fois | 21, 24, 23 et 27 shards; 2 157 s; pic de 92 GiB |
| Racine de récursion | la même machine, quatre shards en cours de traitement | 21 shards, 460 s, 1,03 MB |
| Cérémonie du décideur | portable à 18 cœurs | `init` 65 s; une contribution de 50 à 56 s; `key` 70 s et 12,7 GB; la clé 2,65 GB |
| Preuve du décideur | portable à 18 cœurs | clé lue en 1 s, preuve en 18,5 s, 6,1 GB; 7 896 686 contraintes sur `2^23` |
| Vérification sur la chaîne | revm | 3 620 026 gas; 34 980 octets de calldata; 358 points |

## La preuve de base, passe par passe

| | |
| --- | --- |
| Passe 1, engagement | 191 s; 25,7 vCPU occupés en moyenne; les remplissages sur un seul fil occupent 81 % de ses shard-secondes; mémoire échantillonnée d’au plus 15,9 GiB |
| Passe 2, preuve | 2 290 s; en moyenne 11,95 shards détenus sur 12 et 30,4 vCPU occupés jusqu’à la sortie du programme invité; puis une phase finale de 460 s, dont les plus longues séquences sont les remplissages sur un seul fil des deux shards `KECCAK_F`, 200 s et 279 s |
| Pic de mémoire | 173,92 GiB : les deux shards `KECCAK_F` de `2^18`, ensemble dans la phase finale, sans rien d’autre en cours de traitement |

Le pic a été fixé par la hauteur d’une seule famille de délégation, et non par le nombre de shards en cours de traitement.

## Un petit programme invité

Le programme invité du Démarrage rapide, 114 cycles répartis sur quatre familles d’instructions, prouvé avec des hauteurs d’instructions de `2^20` et des hauteurs de fenêtres de `2^16`, avec deux shards en cours de traitement : 7 shards, 52 s et un pic de 18 GB sur un portable à 18 cœurs et 48 GiB, presque entièrement dû aux deux shards de `2^20` en cours de traitement. Le plancher d’une preuve est fixé par ses familles et ses hauteurs, et non par son nombre de cycles.

## Le shard de chaque famille

Aux hauteurs par défaut. La taille de la preuve d’un shard est fixée par la forme et la hauteur de son circuit; son coût de preuve suit le produit de sa hauteur par la largeur de son circuit, quel que soit le nombre de lignes actives.

| Famille | Hauteur | Engagées `M`/`W`/`S` | Portes de contrainte | Colonnes internes | Preuve de shard |
| --- | --- | --- | --- | --- | --- |
| `ADD_SUB_LUI_AUIPC` | `2^22` | 27 / 35 / 7 | 63 | 314 | 64 764 B |
| `JUMP_BRANCH_SLT` | `2^22` | 21 / 44 / 10 | 42 | 392 | 69 436 B |
| `SHIFT_BITWISE` | `2^22` | 21 / 61 / 10 | 48 | 478 | 76 644 B |
| `MUL_DIV` | `2^20` | 21 / 54 / 9 | 54 | 444 | 67 412 B |
| `MEM_WORD` | `2^22` | 31 / 24 / 7 | 33 | 314 | 63 836 B |
| `MEM_SUBWORD` | `2^22` | 31 / 55 / 10 | 53 | 472 | 76 196 B |
| `ATOMICS` | `2^20` | 26 / 54 / 9 | 46 | 472 | 68 468 B |
| `INIT_TEARDOWN` | `2^22` | 2 / 0 / 1 | 0 | 46 | 36 316 B |
| `ZERO_WINDOWS` | `2^22` | 2 / 0 / 0 | 0 | 46 | 36 284 B |
| `KECCAK_F` | `2^18` | 208 / 1 556 / 0 | 385 | 5 490 | 381 100 B |
| `POSEIDON2` | `2^8` | 100 / 4 092 / 0 | 4 248 | 2 020 | 664 780 B |
| `FR_ARITH` | `2^8` | 104 / 2 576 / 0 | 2 701 | 142 | 266 292 B |
| `PUBLIC_INPUT`, `PUBLIC_OUTPUT` | `2^12` | 3 ou 2 / 0 / 0 | 0 | 26 | 12 556 B, 12 524 B |
| `ADVICE_WINDOWS` | `2^22` | 3 / 0 / 0 | 0 | 46 | 36 316 B |
| `MOD_MUL` | `2^16` | 104 / 221 / 0 | 125 | 2 244 | 135 220 B |
| `SHA256_COMP` | `2^18` | 104 / 520 / 0 | 119 | 2 802 | 189 988 B |
| `EC_ADD` | `2^16` | 392 / 1 028 / 0 | 637 | 8 772 | 434 916 B |

Une hauteur ne change que le nombre de listes à réduction de moitié et de tours de sumcheck, pas les portes : `ADD_SUB_LUI_AUIPC` à `2^20` a 298 colonnes internes et une preuve de 57 196 octets, contre 314 et 64 764 à `2^22`.

## Mémoire de la passe avant

Le prouveur GKR détient chaque couche interne sous forme d’éléments du corps, à raison de 32 octets par cellule. Ensembles de travail représentatifs :

| Shard | Passe avant |
| --- | --- |
| `SHIFT_BITWISE` à `2^20` | 8,4 GiB |
| `MOD_MUL` à `2^16` | 4,6 GB |
| `EC_ADD` à `2^16` | 18,3 GB |
| `SHA256_COMP` à `2^18` | 22,6 GB |
| `KECCAK_F` à `2^18` | 42 GiB |

## Mercury

Sur un Apple M5 Pro à 18 cœurs :

| | |
| --- | --- |
| Engagement, `n = 2^22` | 1,30 s |
| Ouverture, `n = 2^22` | 2,89 s |
| 16 colonnes de `2^20` en un seul lot | ouvertes en 1,01 s, vérifiées en 4,8 ms |
| Les mêmes 16, ouvertes une à une | 9,79 s, vérifiées en 62 ms |

## Lire ces chiffres

La génération de preuves est limitée par la mémoire, et sa mémoire suit les shards en cours de traitement et leurs hauteurs, jamais la longueur de l’exécution. Le temps suit le nombre de cycles, famille par famille. Le coût sur la chaîne suit le nombre de points que la racine doit au couplage final, à environ 9 000 gas par point. Les nombres de cycles eux-mêmes sont exacts et indépendants de la machine : le profileur de cycles est donc le bon premier outil pour estimer tout le reste.
