Skip to content

v1.5.0

Latest

Choose a tag to compare

@Stivo182 Stivo182 released this 07 Aug 18:42

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