Как я могу программно определить, используется ли многоядерный, гиперпоточный или многопроцессорный?
-
08-07-2019 - |
Вопрос
Я знаю, как получить тип процессора, возможно, это единственный способ, но на самом деле я ищу способ определения из приложения, выполняется ли оно на многоядерном процессоре или на одноядерном процессоре с гиперпоточностью.
(предыстория:хостинг-провайдеры некоторых моих клиентов очень расплывчато представляют, какие ресурсы они предоставляют через VMware images.Предполагается, что это приложение должно работать на многоядерной платформе, но с момента его последнего "перемещения" производительность снизилась.Обычно в многоядерных системах одно ядро подключается к одному потоку, а не к другому.В этой "многоядерности" оба процессора резко увеличиваются, даже в однопоточных приложениях.)
Решение
System.Environment.ProcessorCount, который также будет включать гиперпоточные процессоры.Которые Vmware может раскрывать, а может и не раскрывать.Вероятность того, что он будет раскрыт, выше, если на процессоре включена VT И вы используете технологию гипервизора с поддержкой baremetal.
Если у вас XP-SP3 / WIN2k3 или выше, вы можете использовать WMI для извлечения:
Win32_ComputerSystem.NumberOfProcessors returns physical count
Win32_ComputerSystem.NumberOfLogicalProcessors returns logical count
Если значения одинаковы, то, скорее всего, в вашей системе нет HT или она не включена.
Вы можете начать изучать, как извлечь информацию WMI в .NET, с этот учебник.