What's Changed
Производительность
Существенно ускорено получение информации о процессоре и сокращено количество аллокаций:
| ОС | Ускорение | Уменьшение аллокаций, % |
|---|---|---|
| macOS | ~2× | ~90% |
| Ubuntu | ~2× | ~22% |
| Windows | 3–120× | ~45–77% |
Основные оптимизации:
- Windows теперь использует COM WMI как основной источник данных без запуска внешнего процесса.
- PowerShell CIM запрашивает только необходимые свойства процессора, что ускоряет этот источник примерно в 3–4 раза.
- В Linux
/proc/cpuinfoчитается напрямую, без запуска внешней командыcat. - В macOS характеристики процессора и состояние Rosetta запрашиваются одним вызовом
sysctl. Вместо полногоsysctl -aзапрашиваются только необходимые OID.
Новые возможности
- В Windows реализована отказоустойчивая цепочка источников: COM WMI → WMIC → PowerShell CIM.
- При ошибке запуска, разбора или проверки данных автоматически используется следующий доступный источник.
- Если все источники Windows недоступны, итоговая ошибка содержит причины отказа каждого из них.
- Добавлено диагностическое логирование попыток, результатов и ошибок определения процессора на Windows, Linux и macOS.
Исправления
Linux
- Исправлено определение топологии ARM-процессоров и процессоров в контейнерах с неполным
/proc/cpuinfo. - Логические процессоры теперь подсчитываются по полю
processor, даже если отсутствуетmodel name. - Физические процессоры определяются по уникальным
physical id, а ядра — по парамphysical idиcore id. - При недостатке данных используются значения
cpu coresи fallback изlscpu:CPU(s),Socket(s)иCore(s) per socket. - Если процессоры или ядра найдены, но информация о сокетах отсутствует, предполагается один сокет.
- Для ARM имя процессора дополнительно определяется по полям
ProcessorиHardware. - Некорректные и неположительные числовые значения из
lscpuнормализуются в ноль. lscpuзапускается с нейтральной локальюLC_ALL=C, поэтому результат не зависит от языка операционной системы.- Учтён BOM в выводе
lscpu.
Windows
- Системные утилиты ищутся относительно
%SystemRoot%, без привязки кC:\Windows, с резервным поиском черезPATH. - PowerShell запускается с параметрами
-NoProfile,-NonInteractiveи-ErrorAction Stop, а результат CIM передаётся в стабильном формате JSON. - Исправлена обработка числовых кодов архитектуры из COM WMI и PowerShell CIM.
- Пустые и неполные данные больше не считаются успешным результатом.
- Номинальная и максимальная частоты определяются по наибольшей ненулевой частоте процессоров вместо среднего значения.
macOS
- Улучшено определение архитектуры при запуске x64-приложения на ARM64 через Rosetta.
- Отсутствие
sysctl.proc_translatedна Intel Mac теперь обрабатывается безопасно.
Рефакторинг и тестирование
- Получение исходных данных отделено от их разбора, проверки и преобразования.
- Источники и парсеры Linux, Windows и macOS выделены в отдельные классы с единообразной архитектурой.
- Linux-парсер разделён на разбор
/proc/cpuinfo, разборlscpuи объединение полученных данных. - Общая нормализация и агрегация данных
Win32_Processorперенесена в единый преобразователь. - Парсеры и тесты приведены к соглашениям проекта.
- Добавлены тесты для ARM, контейнеров, неполных данных Linux, fallback-цепочки Windows, нативного запуска macOS и Rosetta.
Full Changelog: v1.4.0...v1.5.0