Benchmarks de performance Zygos
Comparaison de performance entre Zygos, Neverthrow (Result) et fp-ts (Option).
Données auto-générées le Jan 29, 2026.
TL;DR
Zygos gagne 80% des benchmarks Result vs Neverthrow. Jusqu'à 3× plus rapide sur la création d'objets, 2-3× plus rapide sur les opérations chaînées. Performances similaires sur les opérations simples comme isOk() et unwrapOr().
Opérations par seconde. Plus c'est élevé, mieux c'est.
Méthodologie
Chaque benchmark :
- Crée des données de test correspondant aux patterns réels (chaînes de Result, transformations d'Option)
- Exécute les opérations en boucle serrée
- Mesure les opérations par seconde avec analyse statistique
- Rapporte min, max, moyenne, percentiles (p75, p99, p995, p999)
- Inclut la marge d'erreur relative (rme) pour la confiance
Le label "fastest" n'est attribué que lorsque le gagnant est ≥10% plus rapide que le second. Sinon, c'est considéré comme une égalité statistique.
Bibliothèques testées
| Bibliothèque | Version | Description |
|---|---|---|
| zygos | 1.1.0 | Module Result/Option de Pithos (léger, tree-shakable) |
| neverthrow | 8.2.0 | Bibliothèque Result populaire pour TypeScript |
Pattern Result (Zygos vs Neverthrow)
Le pattern Result est le cœur de la gestion d'erreurs dans les deux bibliothèques. Voici comment elles se comparent :
| Test | zygos | neverthrow |
|---|---|---|
andThen-chain | 15.63M ops/s le plus rapide | 4.37M ops/s (3.57x) |
andThen-err | 25.10M ops/s (1x) | 25.13M ops/s le plus rapide |
andThen-ok | 22.39M ops/s le plus rapide | 9.93M ops/s (2.26x) |
combine-all-ok | 17.09M ops/s le plus rapide | 6.61M ops/s (2.59x) |
combine-large | 3.58M ops/s le plus rapide | 2.49M ops/s (1.44x) |
combine-with-err | 17.58M ops/s le plus rapide | 6.69M ops/s (2.63x) |
err-creation | 21.04M ops/s le plus rapide | 7.17M ops/s (2.93x) |
fromThrowable-error | 233.68K ops/s (1.01x) | 235.96K ops/s le plus rapide |
fromThrowable-success | 4.90M ops/s le plus rapide | 4.89M ops/s (1x) |
isErr | 25.30M ops/s le plus rapide | 25.27M ops/s (1x) |
isOk | 25.36M ops/s le plus rapide | 25.20M ops/s (1.01x) |
map-err | 28.47M ops/s le plus rapide | 28.44M ops/s (1x) |
map-ok | 28.38M ops/s le plus rapide | 28.32M ops/s (1x) |
mapErr | 28.44M ops/s le plus rapide | 28.41M ops/s (1x) |
match-err | 28.31M ops/s (1x) | 28.32M ops/s le plus rapide |
match-ok | 28.23M ops/s le plus rapide | 27.99M ops/s (1.01x) |
ok-complex | 21.37M ops/s le plus rapide | 7.13M ops/s (3x) |
ok-creation | 21.00M ops/s le plus rapide | 9.98M ops/s (2.1x) |
unwrapOr-err | 25.17M ops/s (1x) | 25.29M ops/s le plus rapide |
unwrapOr-ok | 25.33M ops/s le plus rapide | 25.32M ops/s (1x) |
Résultats clés
La création d'objets est 2-3x plus rapide. Zygos utilise de simples littéraux d'objets tandis que Neverthrow utilise l'instanciation de classes avec plus de surcharge.
Les opérations chaînées (andThen) sont 2-4x plus rapides. L'implémentation plus simple de Zygos paie quand on chaîne plusieurs opérations.
Les opérations simples sont équivalentes. isOk(), isErr(), unwrapOr() performent de manière identique : les deux sont juste des vérifications de propriétés.
Pattern Option (Zygos vs fp-ts)
Zygos fournit une implémentation légère d'Option comparée à l'approche plus complète (mais plus lourde) de fp-ts :
| Test | Zygos | fp-ts |
|---|---|---|
| flatMap | 17.07M ops/s le plus rapide | 2.16M ops/s (7.9x) |
| fromNullable | 21.18M ops/s le plus rapide | 12.53M ops/s (1.69x) |
| fromNullable-null | 21.42M ops/s le plus rapide | 12.74M ops/s (1.68x) |
| getOrElse | 20.48M ops/s le plus rapide | 10.37M ops/s (1.98x) |
| isSome | 20.54M ops/s le plus rapide | 12.33M ops/s (1.67x) |
| map | 20.27M ops/s le plus rapide | 10.06M ops/s (2.01x) |
| match | 20.35M ops/s le plus rapide | 10.00M ops/s (2.04x) |
| some-creation | 21.11M ops/s le plus rapide | 13.70M ops/s (1.54x) |
Résultats clés
Zygos est 1,5-8x plus rapide sur toutes les opérations Option. Les plus gros gains sont sur flatMap (8x) et getOrElse (2x).
Le pipe de fp-ts ajoute de la surcharge. Bien qu'élégant, le style de composition fonctionnelle a un coût runtime.
Zygos utilise des appels de fonctions directs. Pas d'abstractions intermédiaires, juste des conditionnels simples.
📊 Résumé des performances
Pourquoi Zygos est rapide
- Littéraux d'objets simples :
{ _tag: "Ok", value }au lieu d'instances de classes - Pas d'abstractions intermédiaires : Accès direct aux propriétés, pas de chaînes de méthodes
- JavaScript moderne : Cible ES2020+, pas de surcharge de transpilation
- Code minimal : Moins de code = moins à exécuter
Quand la performance n'a pas d'importance
Pour la plupart des applications, Zygos et Neverthrow sont tous deux "assez rapides". Le vrai différenciateur est :
- Taille de bundle : Zygos est 2.6x plus petit par rapport à Neverthrow
- Ergonomie de l'API : Choisissez ce qui convient à votre équipe
- Écosystème : Zygos s'intègre avec les autres modules Pithos
Statistiques détaillées
Pour les sceptiques qui veulent voir les chiffres bruts :
Result20
andThen-chain
| Bibliothèque | ops/s | min | max | moy. | p75 | p99 | rme | échantillons |
|---|---|---|---|---|---|---|---|---|
| zygos 🏆 | 15.63M | 0.0000 | 0.0394 | 0.0001 | 0.0001 | 0.0001 | ±0.12% | 7,812,553 |
| neverthrow | 4.37M | 0.0001 | 0.0668 | 0.0002 | 0.0002 | 0.0003 | ±0.13% | 2,186,487 |
andThen-err
| Bibliothèque | ops/s | min | max | moy. | p75 | p99 | rme | échantillons |
|---|---|---|---|---|---|---|---|---|
| neverthrow 🏆 | 25.13M | 0.0000 | 0.0378 | 0.0000 | 0.0000 | 0.0001 | ±0.13% | 12,564,743 |
| zygos | 25.10M | 0.0000 | 0.1050 | 0.0000 | 0.0000 | 0.0001 | ±0.13% | 12,548,149 |
andThen-ok
| Bibliothèque | ops/s | min | max | moy. | p75 | p99 | rme | échantillons |
|---|---|---|---|---|---|---|---|---|
| zygos 🏆 | 22.39M | 0.0000 | 0.2858 | 0.0000 | 0.0000 | 0.0001 | ±0.20% | 11,196,072 |
| neverthrow | 9.93M | 0.0000 | 0.1548 | 0.0001 | 0.0001 | 0.0001 | ±0.17% | 4,962,641 |
combine-all-ok
| Bibliothèque | ops/s | min | max | moy. | p75 | p99 | rme | échantillons |
|---|---|---|---|---|---|---|---|---|
| zygos 🏆 | 17.09M | 0.0000 | 2.6903 | 0.0001 | 0.0001 | 0.0001 | ±1.09% | 8,546,422 |
| neverthrow | 6.61M | 0.0000 | 0.2838 | 0.0002 | 0.0002 | 0.0002 | ±0.27% | 3,303,774 |
combine-large
| Bibliothèque | ops/s | min | max | moy. | p75 | p99 | rme | échantillons |
|---|---|---|---|---|---|---|---|---|
| zygos 🏆 | 3.58M | 0.0002 | 0.2067 | 0.0003 | 0.0003 | 0.0006 | ±0.42% | 1,789,730 |
| neverthrow | 2.49M | 0.0002 | 0.2685 | 0.0004 | 0.0004 | 0.0007 | ±0.39% | 1,245,772 |
combine-with-err
| Bibliothèque | ops/s | min | max | moy. | p75 | p99 | rme | échantillons |
|---|---|---|---|---|---|---|---|---|
| zygos 🏆 | 17.58M | 0.0000 | 0.2636 | 0.0001 | 0.0001 | 0.0001 | ±0.44% | 8,789,518 |
| neverthrow | 6.69M | 0.0000 | 0.4447 | 0.0001 | 0.0002 | 0.0002 | ±0.37% | 3,346,903 |
err-creation
| Bibliothèque | ops/s | min | max | moy. | p75 | p99 | rme | échantillons |
|---|---|---|---|---|---|---|---|---|
| zygos 🏆 | 21.04M | 0.0000 | 0.1367 | 0.0000 | 0.0000 | 0.0001 | ±0.20% | 10,518,494 |
| neverthrow | 7.17M | 0.0000 | 0.1430 | 0.0001 | 0.0001 | 0.0002 | ±0.23% | 3,586,381 |
fromThrowable-error
| Bibliothèque | ops/s | min | max | moy. | p75 | p99 | rme | échantillons |
|---|---|---|---|---|---|---|---|---|
| neverthrow 🏆 | 235.96K | 0.0038 | 1.6269 | 0.0042 | 0.0040 | 0.0086 | ±0.79% | 117,980 |
| zygos | 233.68K | 0.0038 | 0.5621 | 0.0043 | 0.0041 | 0.0097 | ±0.50% | 116,839 |
fromThrowable-success
| Bibliothèque | ops/s | min | max | moy. | p75 | p99 | rme | échantillons |
|---|---|---|---|---|---|---|---|---|
| zygos 🏆 | 4.90M | 0.0001 | 0.0430 | 0.0002 | 0.0002 | 0.0003 | ±0.12% | 2,447,979 |
| neverthrow | 4.89M | 0.0001 | 0.1341 | 0.0002 | 0.0002 | 0.0003 | ±0.16% | 2,446,526 |
isErr
| Bibliothèque | ops/s | min | max | moy. | p75 | p99 | rme | échantillons |
|---|---|---|---|---|---|---|---|---|
| zygos 🏆 | 25.30M | 0.0000 | 0.0526 | 0.0000 | 0.0000 | 0.0001 | ±0.12% | 12,652,338 |
| neverthrow | 25.27M | 0.0000 | 0.0633 | 0.0000 | 0.0000 | 0.0001 | ±0.15% | 12,636,894 |
isOk
| Bibliothèque | ops/s | min | max | moy. | p75 | p99 | rme | échantillons |
|---|---|---|---|---|---|---|---|---|
| zygos 🏆 | 25.36M | 0.0000 | 0.0754 | 0.0000 | 0.0000 | 0.0001 | ±0.13% | 12,682,172 |
| neverthrow | 25.20M | 0.0000 | 0.0903 | 0.0000 | 0.0000 | 0.0001 | ±0.13% | 12,600,520 |
map-err
| Bibliothèque | ops/s | min | max | moy. | p75 | p99 | rme | échantillons |
|---|---|---|---|---|---|---|---|---|
| zygos 🏆 | 28.47M | 0.0000 | 0.2628 | 0.0000 | 0.0000 | 0.0000 | ±0.16% | 14,236,276 |
| neverthrow | 28.44M | 0.0000 | 0.0571 | 0.0000 | 0.0000 | 0.0000 | ±0.12% | 14,219,506 |
map-ok
| Bibliothèque | ops/s | min | max | moy. | p75 | p99 | rme | échantillons |
|---|---|---|---|---|---|---|---|---|
| zygos 🏆 | 28.38M | 0.0000 | 0.0707 | 0.0000 | 0.0000 | 0.0000 | ±0.13% | 14,187,567 |
| neverthrow | 28.32M | 0.0000 | 0.1597 | 0.0000 | 0.0000 | 0.0000 | ±0.15% | 14,159,415 |
mapErr
| Bibliothèque | ops/s | min | max | moy. | p75 | p99 | rme | échantillons |
|---|---|---|---|---|---|---|---|---|
| zygos 🏆 | 28.44M | 0.0000 | 0.0390 | 0.0000 | 0.0000 | 0.0000 | ±0.13% | 14,218,338 |
| neverthrow | 28.41M | 0.0000 | 0.0673 | 0.0000 | 0.0000 | 0.0000 | ±0.13% | 14,203,990 |
match-err
| Bibliothèque | ops/s | min | max | moy. | p75 | p99 | rme | échantillons |
|---|---|---|---|---|---|---|---|---|
| neverthrow 🏆 | 28.32M | 0.0000 | 0.0956 | 0.0000 | 0.0000 | 0.0000 | ±0.19% | 14,160,960 |
| zygos | 28.31M | 0.0000 | 0.1078 | 0.0000 | 0.0000 | 0.0000 | ±0.21% | 14,152,591 |
match-ok
| Bibliothèque | ops/s | min | max | moy. | p75 | p99 | rme | échantillons |
|---|---|---|---|---|---|---|---|---|
| zygos 🏆 | 28.23M | 0.0000 | 0.0685 | 0.0000 | 0.0000 | 0.0000 | ±0.13% | 14,115,862 |
| neverthrow | 27.99M | 0.0000 | 0.1938 | 0.0000 | 0.0000 | 0.0000 | ±0.23% | 13,995,988 |
ok-complex
| Bibliothèque | ops/s | min | max | moy. | p75 | p99 | rme | échantillons |
|---|---|---|---|---|---|---|---|---|
| zygos 🏆 | 21.37M | 0.0000 | 0.2407 | 0.0000 | 0.0000 | 0.0001 | ±0.23% | 10,682,566 |
| neverthrow | 7.13M | 0.0000 | 0.1102 | 0.0001 | 0.0001 | 0.0002 | ±0.24% | 3,564,423 |
ok-creation
| Bibliothèque | ops/s | min | max | moy. | p75 | p99 | rme | échantillons |
|---|---|---|---|---|---|---|---|---|
| zygos 🏆 | 21.00M | 0.0000 | 0.0781 | 0.0000 | 0.0000 | 0.0001 | ±0.21% | 10,501,012 |
| neverthrow | 9.98M | 0.0000 | 0.1812 | 0.0001 | 0.0001 | 0.0001 | ±0.24% | 4,990,318 |
unwrapOr-err
| Bibliothèque | ops/s | min | max | moy. | p75 | p99 | rme | échantillons |
|---|---|---|---|---|---|---|---|---|
| neverthrow 🏆 | 25.29M | 0.0000 | 0.0662 | 0.0000 | 0.0000 | 0.0001 | ±0.13% | 12,647,338 |
| zygos | 25.17M | 0.0000 | 0.1113 | 0.0000 | 0.0000 | 0.0001 | ±0.14% | 12,586,019 |
unwrapOr-ok
| Bibliothèque | ops/s | min | max | moy. | p75 | p99 | rme | échantillons |
|---|---|---|---|---|---|---|---|---|
| zygos 🏆 | 25.33M | 0.0000 | 0.1078 | 0.0000 | 0.0000 | 0.0001 | ±0.12% | 12,663,841 |
| neverthrow | 25.32M | 0.0000 | 0.3640 | 0.0000 | 0.0000 | 0.0001 | ±0.19% | 12,659,480 |
Option8
flatMap
| Bibliothèque | ops/s | min | max | moy. | p75 | p99 | rme | échantillons |
|---|---|---|---|---|---|---|---|---|
| zygos 🏆 | 17.07M | 0.0000 | 0.2398 | 0.0001 | 0.0001 | 0.0001 | ±0.27% | 8,533,278 |
| fp-ts/flatMap | 2.16M | 0.0003 | 0.3111 | 0.0005 | 0.0005 | 0.0006 | ±0.34% | 1,079,701 |
fromNullable
| Bibliothèque | ops/s | min | max | moy. | p75 | p99 | rme | échantillons |
|---|---|---|---|---|---|---|---|---|
| zygos 🏆 | 21.18M | 0.0000 | 0.4290 | 0.0000 | 0.0000 | 0.0001 | ±0.30% | 10,587,618 |
| fp-ts/fromNullable | 12.53M | 0.0000 | 0.0431 | 0.0001 | 0.0001 | 0.0001 | ±0.12% | 6,265,561 |
fromNullable-null
| Bibliothèque | ops/s | min | max | moy. | p75 | p99 | rme | échantillons |
|---|---|---|---|---|---|---|---|---|
| zygos 🏆 | 21.42M | 0.0000 | 0.0794 | 0.0000 | 0.0000 | 0.0001 | ±0.12% | 10,709,367 |
| fp-ts/fromNullable | 12.74M | 0.0000 | 0.0665 | 0.0001 | 0.0001 | 0.0001 | ±0.13% | 6,369,362 |
getOrElse
| Bibliothèque | ops/s | min | max | moy. | p75 | p99 | rme | échantillons |
|---|---|---|---|---|---|---|---|---|
| zygos 🏆 | 20.48M | 0.0000 | 0.1204 | 0.0000 | 0.0000 | 0.0001 | ±0.13% | 10,241,621 |
| fp-ts/getOrElse | 10.37M | 0.0000 | 0.0699 | 0.0001 | 0.0001 | 0.0001 | ±0.13% | 5,183,817 |
isSome
| Bibliothèque | ops/s | min | max | moy. | p75 | p99 | rme | échantillons |
|---|---|---|---|---|---|---|---|---|
| zygos 🏆 | 20.54M | 0.0000 | 0.8130 | 0.0000 | 0.0000 | 0.0001 | ±0.34% | 10,269,219 |
| fp-ts/isSome | 12.33M | 0.0000 | 0.0842 | 0.0001 | 0.0001 | 0.0001 | ±0.13% | 6,163,962 |
map
| Bibliothèque | ops/s | min | max | moy. | p75 | p99 | rme | échantillons |
|---|---|---|---|---|---|---|---|---|
| zygos 🏆 | 20.27M | 0.0000 | 0.1348 | 0.0000 | 0.0000 | 0.0001 | ±0.14% | 10,132,860 |
| fp-ts/map | 10.06M | 0.0000 | 0.3281 | 0.0001 | 0.0001 | 0.0001 | ±0.18% | 5,030,723 |
match
| Bibliothèque | ops/s | min | max | moy. | p75 | p99 | rme | échantillons |
|---|---|---|---|---|---|---|---|---|
| zygos 🏆 | 20.35M | 0.0000 | 0.3162 | 0.0000 | 0.0000 | 0.0001 | ±0.19% | 10,175,539 |
| fp-ts/match | 10.00M | 0.0000 | 0.2816 | 0.0001 | 0.0001 | 0.0001 | ±0.17% | 5,000,125 |
some-creation
| Bibliothèque | ops/s | min | max | moy. | p75 | p99 | rme | échantillons |
|---|---|---|---|---|---|---|---|---|
| zygos 🏆 | 21.11M | 0.0000 | 0.0643 | 0.0000 | 0.0000 | 0.0001 | ±0.11% | 10,553,702 |
| fp-ts/some | 13.70M | 0.0000 | 0.0586 | 0.0001 | 0.0001 | 0.0001 | ±0.13% | 6,851,485 |
Reproduire ces résultats
Vous voulez vérifier ces résultats ? Consultez comment reproduire nos données.
Related
- Zygos vs Neverthrow — Comparaison complète : philosophie, API, migration
- Kanon — Performance — Benchmarks des bibliothèques de validation
- Guide du module Zygos — Documentation complète du module