🇷🇺 Русский · 🇬🇧 English · 🇩🇪 Deutsch · 🇫🇷 Français · 🇪🇸 Español · 🇮🇹 Italiano
Comparaison avec les concurrents
Tous les tableaux ci-dessous sont générés automatiquement à partir de tests comparatifs honnêtes (benchmarks/compare.php) exécutant la MÊME opération pour chaque concurrent, PHP 8.3.32, sans Xdebug.
1. Fonctionnalités
| Capacité | 🏆 CloudCastle | symfony | carbon | lcobucci | beste | ergebnis | new¹ |
|---|---|---|---|---|---|---|---|
| PSR-20 ClockInterface (now(): DateTimeImmutable) | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ |
| Horloge figée pour des tests déterministes | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ |
| Horloge simulée avec sleep() virtuel | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ |
| Horloge monotone (insensible aux sauts de l’heure système) | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ |
| Décalage temporel par décorateur (OffsetClock) | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ |
| Mise à l’échelle du temps par décorateur (ScaledClock) | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ |
| Troncature des instants à une unité arbitraire | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ |
| Objet-valeur de durée avec précision à la nanoseconde | ✅ | ❌ | ✅ | ❌ | ❌ | ❌ | ❌ |
| Échéances avec temps restant (Deadline) | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ |
| Horloges à pas et à file d’attente pour tests de scénario | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ |
| Chronomètre avec tours inclus dans le paquet | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ |
| Primitives timestamp()/microtime() économiques sans objets date | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ |
| Instant lié à l’horloge de l’application (DatePoint) | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ |
| Substitution à portée limitée de l’horloge globale avec restauration automatique | ✅ | ❌ | ✅ | ❌ | ❌ | ❌ | ❌ |
| Adaptateur pour toute horloge PSR-20 | ✅ | ✅ | ❌ | ❌ | ✅ | ❌ | ❌ |
| Arithmétique calendaire des mois/années avec contrôle de dépassement (CalendarDate) | ✅ | ❌ | ✅ | ❌ | ❌ | ❌ | ❌ |
| diffForHumans et isoFormat localisés sans ext-intl | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ |
| Prédicats et différences calendaires (isWeekend, diffInDays, next) | ✅ | ❌ | ✅ | ❌ | ❌ | ❌ | ❌ |
| Trait PHPUnit pour simuler le temps (mockTime/unmockTime) | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ |
| sleep() réel sur les horloges système et monotones | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ |
| Encapsulation de tout objet doté de now() en PSR-20 | ✅ | ❌ | ❌ | ❌ | ✅ | ❌ | ❌ |
| Itération d’une période calendaire avec un pas (CalendarPeriod) | ✅ | ❌ | ✅ | ❌ | ❌ | ❌ | ❌ |
| Durée lisible par l’humain (TimeSpan::forHumans) | ✅ | ❌ | ✅ | ❌ | ❌ | ❌ | ❌ |
| Macros : extension de l’API des dates sans héritage | ✅ | ❌ | ✅ | ❌ | ❌ | ❌ | ❌ |
| Total | 🏆 24 | 8 | 10 | 2 | 4 | 2 | 0 |
2. Sécurité et exactitude
| Propriété | 🏆 CloudCastle | symfony | carbon | lcobucci | beste | ergebnis | new¹ |
|---|---|---|---|---|---|---|---|
| Lectures immuables (DateTimeImmutable) | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| Fuseau horaire explicite (indépendant de date.timezone) | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | ❌ |
| Déterminisme des tests sans état global obligatoire | ✅ | ✅ | ❌ | ✅ | ✅ | ✅ | ❌ |
| Monotonie (résistante au recul de l’horloge système) | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ |
| Exceptions typées au lieu de false/warning à la frontière d’entrée | ✅ | ❌ | ✅ | ❌ | ❌ | ❌ | ❌ |
| Assainissement des entrées hostiles dans les messages d’exception | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ |
| Contrôle du dépassement d’entier pour les durées | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ |
| Dépendances minimales (≤2, sans ICU/ext-intl) | ✅ | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ |
| Total | 🏆 8 | 4 | 3 | 4 | 3 | 4 | 2 |
2.1. Conformité aux normes de sécurité des paquets Composer
| Norme | CloudCastle | symfony | carbon | lcobucci | beste | ergebnis | 🏆 Gagnants |
|---|---|---|---|---|---|---|---|
| Politique de sécurité (SECURITY.md ou processus publié) | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | CloudCastle, symfony, carbon, beste, ergebnis |
| Contrôle des vulnérabilités connues des dépendances (roave/security-advisories + composer audit) | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | CloudCastle |
| OpenSSF Scorecard : score publié ≥ 7/10 | ❌ | ✅ | ❌ | ❌ | ❌ | ❌ | symfony |
| CWE-20 : validation des entrées avec exceptions typées | ✅ | ❌ | ✅ | ❌ | ❌ | ❌ | CloudCastle, carbon |
| CWE-117/CWE-150 : neutralisation des caractères de contrôle dans les messages d’erreur | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | CloudCastle |
| CWE-190 : contrôle du dépassement d’entier | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | CloudCastle |
| Chaîne d’approvisionnement : ≤2 dépendances d’exécution sans polyfill/ICU | ✅ | ❌ | ❌ | ✅ | ✅ | ✅ | CloudCastle, lcobucci, beste, ergebnis |
| OpenSSF Best Practices : tests automatisés avec contrôle par mutation en CI | ✅ | ❌ | ❌ | ✅ | ❌ | ✅ | CloudCastle, lcobucci, ergebnis |
| Licence approuvée OSI dans la distribution (MIT) | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | CloudCastle, symfony, carbon, lcobucci, beste, ergebnis |
| Total | 🏆 8 | 3 | 3 | 3 | 3 | 4 | CloudCastle |
<sub>Sources : fichiers SECURITY.md des dépôts (API GitHub), require-dev des distributions sur Packagist, api.securityscorecards.dev (symfony/clock — score du monorepo symfony/symfony ; OpenSSF Scorecard n’évalue que les projets GitHub, CloudCastle sur GitVerse n’a donc pas de score — un moins honnête lié à la plateforme) ; lignes CWE — d’après les tests de sécurité des paquets ; symfony/clock pour PHP 8.1 est la branche 6.4 avec polyfill-php83.</sub>
3. Performance : now()
_Obtention de l’instant courant now(), 200 000 fois (minimum de 15)._
| Solution | Temps (ms) | Verdict |
|---|---|---|
| new¹ | 109,7 | référence (pas une bibliothèque) |
| 🏆 CloudCastle | 114,5 | la plus rapide des bibliothèques |
| 🏆 ergebnis | 115,6 | à égalité avec le meilleur (dans la marge d’erreur) |
| 🏆 lcobucci | 116 | à égalité avec le meilleur (dans la marge d’erreur) |
| 🏆 beste | 116,8 | à égalité avec le meilleur (dans la marge d’erreur) |
| symfony | 154,6 | concurrent |
| carbon | 649,8 | concurrent |
4. Performance : horodatage unix
_Horodatage unix courant (secondes entières), 200 000 fois._
| Solution | Temps (ms) | Verdict |
|---|---|---|
| new¹ | 16 | référence (pas une bibliothèque) |
| 🏆 CloudCastle | 27,8 | la plus rapide des bibliothèques |
| ergebnis | 122,3 | concurrent |
| lcobucci | 123 | concurrent |
| beste | 125,6 | concurrent |
| symfony | 164,2 | concurrent |
| carbon | 658,7 | concurrent |
5. Consommation mémoire de la bibliothèque
_Croissance mémoire de la seule bibliothèque sur 200 000 appels now() (processus isolé, sans le poids de l’autoloader)._
| Solution | Mémoire (KB) | Verdict |
|---|---|---|
| new¹ | 1 | référence (pas une bibliothèque) |
| 🏆 beste | 3 | la plus légère des bibliothèques |
| lcobucci | 5 | concurrent |
| ergebnis | 5 | concurrent |
| symfony | 30 | concurrent |
| CloudCastle | 31 | concurrent |
| carbon | 3 425 | concurrent |
6. Fuites mémoire
_Croissance mémoire après préchauffage sur 200 000 appels now() (0 — aucune fuite)._
| Solution | Mémoire (KB) | Verdict |
|---|---|---|
| 🏆 CloudCastle | 0 | sans fuites |
| symfony | 0 | sans fuites |
| carbon | 0 | sans fuites |
| lcobucci | 0 | sans fuites |
| beste | 0 | sans fuites |
| ergebnis | 0 | sans fuites |
| new¹ | 0 | référence (pas une bibliothèque) |
7. Pic mémoire du processus
_Pic mémoire d’un processus isolé sur 200 000 appels now()._
| Solution | Mémoire (KB) | Verdict |
|---|---|---|
| 🏆 CloudCastle | 7 035 | la plus légère des bibliothèques |
| 🏆 symfony | 7 035 | à égalité avec le meilleur (dans la marge d’erreur) |
| 🏆 lcobucci | 7 035 | à égalité avec le meilleur (dans la marge d’erreur) |
| 🏆 beste | 7 035 | à égalité avec le meilleur (dans la marge d’erreur) |
| 🏆 ergebnis | 7 035 | à égalité avec le meilleur (dans la marge d’erreur) |
| new¹ | 7 035 | référence (pas une bibliothèque) |
| carbon | 10 303 | concurrent |
8. Qualité du code
| Outil | 🏆 CloudCastle | symfony | carbon | lcobucci | beste | ergebnis |
|---|---|---|---|---|---|---|
| PHPStan | ✅ max + strict | ❌ | ✅ | ✅ + strict | ✅ + strict | ✅ + strict |
| Psalm | ✅ level 1 | ✅ (monorepo) | ❌ | ❌ | ✅ | ❌ |
| PHPMD | ✅ | ❌ | ✅ | ❌ | ❌ | ❌ |
| PHPCS / CS-Fixer | ✅ PSR-12 + fixer | ✅ fixer | ✅ | ✅ | ❌ | ✅ fixer |
| Rector | ✅ | ❌ | ❌ | ❌ | ❌ | ✅ |
| Deptrac (couches d’architecture) | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ |
| Tests de mutation (Infection) | ✅ MSI 100.0% | ❌ | ❌ | ✅ | ❌ | ✅ |
| Couverture de lignes (en direct) | ✅ 100.0% | — | — | — | — | — |
| Total | 🏆 8 | 2 | 3 | 3 | 2 | 4 |
<sub>Outils des concurrents selon le require-dev de leurs distributions publiées (instantané juillet 2026) ; symfony/clock — selon le monorepo symfony/symfony. Les métriques CloudCastle sont des résultats réels d’exécution locale.</sub>
¹ La référence (appels natifs sans la complétude d’une solution) est donnée pour contexte et ne concourt pas avec les bibliothèques.
Les résultats à moins de 5% du meilleur sont marqués comme égaux : ces solutions partagent un chemin chaud identique caractère pour caractère (new DateTimeImmutable('now', $tz)) ; à cette échelle, l’écart vient du bruit de la machine, pas du code.
🇷🇺 Русский · 🇬🇧 English · 🇩🇪 Deutsch · 🇫🇷 Français · 🇪🇸 Español · 🇮🇹 Italiano