🇷🇺 Русский · 🇬🇧 English · 🇩🇪 Deutsch · 🇫🇷 Français · 🇪🇸 Español · 🇮🇹 Italiano
Сравнение с аналогами
Все таблицы ниже сгенерированы автоматически из честных сравнительных тестов (benchmarks/compare.php) на ОДИНАКОВОЙ операции для всех аналогов, PHP 8.3.32, без Xdebug.
1. Функциональность
| Возможность | 🏆 CloudCastle | symfony | carbon | lcobucci | beste | ergebnis | new¹ |
|---|---|---|---|---|---|---|---|
| PSR-20 ClockInterface (now(): DateTimeImmutable) | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ |
| Замороженные часы для детерминизма тестов | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ |
| Мок-часы с виртуальным sleep() | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ |
| Монотонные часы (защита от прыжков системного времени) | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ |
| Смещение времени декоратором (OffsetClock) | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ |
| Масштаб времени декоратором (ScaledClock) | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ |
| Усечение моментов до произвольной единицы | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ |
| Value object длительности с наносекундной точностью | ✅ | ❌ | ✅ | ❌ | ❌ | ❌ | ❌ |
| Дедлайны с остатком времени (Deadline) | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ |
| Шаговые часы и часы-очередь для сценарных тестов | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ |
| Секундомер с кругами в составе пакета | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ |
| Дешёвые примитивы timestamp()/microtime() без объекта даты | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ |
| Момент от часов приложения (DatePoint) | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ |
| Скоуп-подмена глобальных часов с автовосстановлением | ✅ | ❌ | ✅ | ❌ | ❌ | ❌ | ❌ |
| Адаптер произвольных PSR-20 часов | ✅ | ✅ | ❌ | ❌ | ✅ | ❌ | ❌ |
| Календарная арифметика месяцев/лет с контролем переполнения (CalendarDate) | ✅ | ❌ | ✅ | ❌ | ❌ | ❌ | ❌ |
| Локализованный diffForHumans и isoFormat без ext-intl | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ |
| Календарные предикаты и разницы (isWeekend, diffInDays, next) | ✅ | ❌ | ✅ | ❌ | ❌ | ❌ | ❌ |
| PHPUnit-трейт подмены времени (mockTime/unmockTime) | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ |
| Реальный sleep() у системных и монотонных часов | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ |
| Обёртка любого объекта с методом now() в PSR-20 | ✅ | ❌ | ❌ | ❌ | ✅ | ❌ | ❌ |
| Итерация календарного периода с шагом (CalendarPeriod) | ✅ | ❌ | ✅ | ❌ | ❌ | ❌ | ❌ |
| Человекочитаемая длительность (TimeSpan::forHumans) | ✅ | ❌ | ✅ | ❌ | ❌ | ❌ | ❌ |
| Макросы: расширение API дат без наследования | ✅ | ❌ | ✅ | ❌ | ❌ | ❌ | ❌ |
| Всего | 🏆 24 | 8 | 10 | 2 | 4 | 2 | 0 |
2. Безопасность и корректность
| Свойство | 🏆 CloudCastle | symfony | carbon | lcobucci | beste | ergebnis | new¹ |
|---|---|---|---|---|---|---|---|
| Иммутабельные показания (DateTimeImmutable) | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| Явная временная зона (не зависит от date.timezone) | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | ❌ |
| Детерминизм тестов без обязательного глобального состояния | ✅ | ✅ | ❌ | ✅ | ✅ | ✅ | ❌ |
| Монотонность (устойчивость к откату системных часов) | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ |
| Типизированные исключения вместо false/warning на границе ввода | ✅ | ❌ | ✅ | ❌ | ❌ | ❌ | ❌ |
| Санитайзинг враждебного ввода в сообщениях исключений | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ |
| Контроль целочисленного переполнения длительностей | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ |
| Минимальные зависимости (≤2, без ICU/ext-intl) | ✅ | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ |
| Всего | 🏆 8 | 4 | 3 | 4 | 3 | 4 | 2 |
2.1. Соответствие стандартам безопасности composer-пакетов
| Стандарт | CloudCastle | symfony | carbon | lcobucci | beste | ergebnis | 🏆 Победители |
|---|---|---|---|---|---|---|---|
| Политика безопасности (SECURITY.md или опубликованный процесс) | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | CloudCastle, symfony, carbon, beste, ergebnis |
| Контроль известных уязвимостей зависимостей (roave/security-advisories + composer audit) | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | CloudCastle |
| OpenSSF Scorecard: опубликованная оценка ≥ 7/10 | ❌ | ✅ | ❌ | ❌ | ❌ | ❌ | symfony |
| CWE-20: валидация ввода с типизированными исключениями | ✅ | ❌ | ✅ | ❌ | ❌ | ❌ | CloudCastle, carbon |
| CWE-117/CWE-150: нейтрализация управляющих символов в сообщениях об ошибках | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | CloudCastle |
| CWE-190: контроль целочисленного переполнения | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | CloudCastle |
| Цепочка поставок: ≤2 runtime-зависимости без polyfill/ICU | ✅ | ❌ | ❌ | ✅ | ✅ | ✅ | CloudCastle, lcobucci, beste, ergebnis |
| OpenSSF Best Practices: автотесты с мутационным контролем в CI | ✅ | ❌ | ❌ | ✅ | ❌ | ✅ | CloudCastle, lcobucci, ergebnis |
| Лицензия OSI в дистрибутиве (MIT) | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | CloudCastle, symfony, carbon, lcobucci, beste, ergebnis |
| Всего | 🏆 8 | 3 | 3 | 3 | 3 | 4 | CloudCastle |
<sub>Источники: файлы SECURITY.md в репозиториях (API GitHub), require-dev дистрибутивов на Packagist, api.securityscorecards.dev (symfony/clock — оценка монорепозитория symfony/symfony; OpenSSF Scorecard оценивает только проекты на GitHub, поэтому у CloudCastle на GitVerse оценки нет — честный минус площадки); строки CWE — по тестам безопасности пакетов; symfony/clock для PHP 8.1 — ветка 6.4 с polyfill-php83.</sub>
3. Производительность: now()
_Получение текущего момента now(), 200 000 раз (минимум из 15)._
| Решение | Время (мс) | Итог |
|---|---|---|
| new¹ | 109,7 | базовый уровень (не библиотека) |
| 🏆 CloudCastle | 114,5 | быстрейшее среди библиотек |
| 🏆 ergebnis | 115,6 | наравне с лидером (в пределах погрешности) |
| 🏆 lcobucci | 116 | наравне с лидером (в пределах погрешности) |
| 🏆 beste | 116,8 | наравне с лидером (в пределах погрешности) |
| symfony | 154,6 | аналог |
| carbon | 649,8 | аналог |
4. Производительность: unix-метка
_Текущая unix-метка (целые секунды), 200 000 раз._
| Решение | Время (мс) | Итог |
|---|---|---|
| new¹ | 16 | базовый уровень (не библиотека) |
| 🏆 CloudCastle | 27,8 | быстрейшее среди библиотек |
| ergebnis | 122,3 | аналог |
| lcobucci | 123 | аналог |
| beste | 125,6 | аналог |
| symfony | 164,2 | аналог |
| carbon | 658,7 | аналог |
5. Потребление памяти библиотекой
_Прирост памяти самой библиотеки на 200 000 вызовов now() (изолированный процесс, без веса автолоадера)._
| Решение | Память (KB) | Итог |
|---|---|---|
| new¹ | 1 | базовый уровень (не библиотека) |
| 🏆 beste | 3 | легчайшее среди библиотек |
| lcobucci | 5 | аналог |
| ergebnis | 5 | аналог |
| symfony | 30 | аналог |
| CloudCastle | 31 | аналог |
| carbon | 3 425 | аналог |
6. Утечки памяти
_Рост памяти после прогрева за 200 000 вызовов now() (0 — утечек нет)._
| Решение | Память (KB) | Итог |
|---|---|---|
| 🏆 CloudCastle | 0 | без утечек |
| symfony | 0 | без утечек |
| carbon | 0 | без утечек |
| lcobucci | 0 | без утечек |
| beste | 0 | без утечек |
| ergebnis | 0 | без утечек |
| new¹ | 0 | базовый уровень (не библиотека) |
7. Пик памяти процесса
_Пик памяти изолированного процесса на 200 000 вызовов now()._
| Решение | Память (KB) | Итог |
|---|---|---|
| 🏆 CloudCastle | 7 035 | легчайшее среди библиотек |
| 🏆 symfony | 7 035 | наравне с лидером (в пределах погрешности) |
| 🏆 lcobucci | 7 035 | наравне с лидером (в пределах погрешности) |
| 🏆 beste | 7 035 | наравне с лидером (в пределах погрешности) |
| 🏆 ergebnis | 7 035 | наравне с лидером (в пределах погрешности) |
| new¹ | 7 035 | базовый уровень (не библиотека) |
| carbon | 10 303 | аналог |
8. Качество кода
| Инструмент | 🏆 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 (слои архитектуры) | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ |
| Мутационное тестирование (Infection) | ✅ MSI 100.0% | ❌ | ❌ | ✅ | ❌ | ✅ |
| Покрытие строк (живое) | ✅ 100.0% | — | — | — | — | — |
| Всего | 🏆 8 | 2 | 3 | 3 | 2 | 4 |
<sub>Инструменты аналогов — по require-dev их опубликованных дистрибутивов (снапшот июль 2026); symfony/clock — по монорепозиторию symfony/symfony. Метрики CloudCastle — живые результаты локального прогона.</sub>
¹ Базовый уровень (нативные вызовы/примитивы без полноты решения) показан для контекста и не претендует на победу среди библиотек-аналогов.
Результаты, отличающиеся от лучшего менее чем на 5%, отмечены как равные: у этих решений горячий путь совпадает посимвольно (new DateTimeImmutable('now', $tz)), и на таком масштабе разницу определяет шум машины, а не код.
🇷🇺 Русский · 🇬🇧 English · 🇩🇪 Deutsch · 🇫🇷 Français · 🇪🇸 Español · 🇮🇹 Italiano