/
cloud-castle
/
memcached
Обзор
Документация
Войти
/
cloud-castle
/
memcached
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
9
CI/CD
Аналитика
main
benchmarks/assert-superiority.php
130 строк
5 KB
Алексей Зорин
docs: мультиязычная документация, wiki по возможностям и проверки качества
27 июл 2026, 15:14
27 июл 2026, 15:14
7d5a082
Код
Авторство
О чём код?
<?php declare(strict_types=1); /** * Проверка превосходства пакета по осям, где оно достижимо. * * Функционал, безопасность и качество кода проверяются жёстко: отставание * здесь означает, что пакет перестал быть лучшим выбором. Скорость и память * сверяются с порогом относительно лучшего результата и сообщают о регрессии, * но не требуют первого места: чистый PHP принципиально не обгоняет * расширение на C на сетевых операциях, и делать вид, что это не так, * значило бы врать в собственных тестах. * * @internal инструмент разработки */ $resultsFile = \dirname(__DIR__) . '/var/comparison/results.json'; if (!is_file($resultsFile)) { fwrite(STDERR, "Нет результатов замеров: запустите composer docs:compare\n"); exit(1); } /** @var array<string, mixed> $data */ $data = json_decode((string) file_get_contents($resultsFile), true, 512, JSON_THROW_ON_ERROR); $own = (string) $data['own']; $baselines = $data['baselines']; $failures = []; $notes = []; /** * Считает число отмеченных возможностей у каждого участника. * * @param array{matrix: array<string, list<bool>>} $section раздел матрицы * * @return array<string, int> */ $totals = static function (array $section): array { $result = []; foreach ($section['matrix'] as $name => $flags) { $result[$name] = count(array_filter($flags)); } return $result; }; foreach (['features' => 'функционалу', 'security' => 'безопасности'] as $section => $label) { $counts = $totals($data[$section]); $ourScore = $counts[$own]; unset($counts[$own]); if ($counts !== [] && $ourScore <= max($counts)) { $failures[] = sprintf( 'По %s пакет не превосходит аналоги: %d против %d у лучшего из них.', $label, $ourScore, max($counts), ); continue; } $notes[] = sprintf('По %s: %d возможностей против %d у лучшего аналога.', $label, $ourScore, max($counts)); } $leaks = $data['leaks']['results'][$own] ?? 0; if ($leaks > 0) { $failures[] = sprintf('Обнаружен рост памяти на %d KB — возможна утечка.', $leaks); } else { $notes[] = 'Утечек памяти нет: рост за 20 000 операций равен нулю.'; } $quality = $data['quality']['results']; if (($quality[$own]['lint_errors'] ?? 0) !== 0) { $failures[] = 'В исходниках есть синтаксические ошибки.'; } foreach (['strict_percent' => 'strict_types', 'final_percent' => 'final-классы'] as $metric => $label) { $ours = (int) $quality[$own][$metric]; $others = []; foreach ($quality as $name => $row) { if ($name !== $own) { $others[] = (int) $row[$metric]; } } if ($others !== [] && $ours < max($others)) { $failures[] = sprintf('По метрике «%s» пакет отстаёт: %d%% против %d%%.', $label, $ours, max($others)); continue; } $notes[] = sprintf('Метрика «%s»: %d%% — не хуже любого аналога.', $label, $ours); } $performance = $data['performance']['results']; $competitors = array_diff_key($performance, array_flip($baselines), [$own => true]); $ourTime = (float) $performance[$own]; $bestTime = $competitors === [] ? $ourTime : (float) min($competitors); if ($ourTime > $bestTime * 2.5) { $failures[] = sprintf( 'Скорость упала более чем в 2.5 раза относительно лучшего аналога: %.1f мс против %.1f мс.', $ourTime, $bestTime, ); } else { $notes[] = sprintf('Скорость: %.1f мс при лучшем результате %.1f мс среди аналогов.', $ourTime, $bestTime); } foreach ($notes as $note) { echo ' ✔ ', $note, PHP_EOL; } if ($failures !== []) { fwrite(STDERR, PHP_EOL); foreach ($failures as $failure) { fwrite(STDERR, ' ✖ ' . $failure . PHP_EOL); } exit(1); } echo PHP_EOL, 'Превосходство подтверждено по всем проверяемым осям.', PHP_EOL;