Как определить двухъядерный процессор на iOS? - PullRequest
25 голосов
/ 30 августа 2011

Мое приложение использует NSOperationQueue для кэширования миниатюр изображений в фоновом потоке. На iPad2 я могу увеличить ограничение числа одновременных задач до 5 или 6, но на одноядерных устройствах, таких как iPad 1, это приводит к полной остановке пользовательского интерфейса.

Итак, я хотел бы обнаружить двухъядерное устройство (в настоящее время это только iPad 2) и соответствующим образом адаптировать ограничение одновременного использования. Я знаю, что я не должен проверять номера моделей, а скорее характеристики устройства. Итак, какую функцию устройства я должен искать, чтобы узнать, является ли процессор двухъядерным?

Ответы [ 6 ]

47 голосов
/ 30 августа 2011

Метод 1

[[NSProcessInfo processInfo] activeProcessorCount];

NSProcessInfo также имеет свойство processorCount.Узнать разницу здесь .

Метод 2

#include <mach/mach_host.h>

unsigned int countCores()
{
  host_basic_info_data_t hostInfo;
  mach_msg_type_number_t infoCount;

  infoCount = HOST_BASIC_INFO_COUNT;
  host_info( mach_host_self(), HOST_BASIC_INFO, (host_info_t)&hostInfo, &infoCount ) ;

  return (unsigned int)(hostInfo.max_cpus);
}

Метод 3

#include <sys/sysctl.h>

unsigned int countCores()
{
  size_t len;
  unsigned int ncpu;

  len = sizeof(ncpu);
  sysctlbyname ("hw.ncpu",&ncpu,&len,NULL,0);

  return ncpu;
}
4 голосов
/ 03 июня 2014

Просто используйте:

[[NSProcessInfo processInfo] processorCount]

3 голосов
/ 30 сентября 2016

Полагаю, для этого нужен отдельный ответ, а не комментарий:

Интересно, что означает число ядер теперь, когда яблоко принесло более асимметричную обработку с помощью слияния A10?У нас 2,2 ядра или 4 ядра?Apple пренебрегает, чтобы activeProcessorCount плавал, чтобы учесть его фрактальную природу.Обратите внимание, что это было так даже до слияния, потому что тогда у них, вероятно, было тепловое дросселирование.Им нужно либо исправить чрезмерный коммит nsoperationqueue, либо придумать эквивалент с плавающей запятой для activeProcessorCount и отказаться от activeProcessorCount в его текущей форме, которая теряет свою полезность перед лицом недавних улучшений hw

Так что чем быстрее закон Мура попадает взабвение или получает новую блестящую константу, тем более бессмысленным становится подсчет ядра.Если вы не пишете что-то вроде Geek Bench 42, многоядерное издание партитуры.

Жить в конце 2016 года, чтобы решить основную проблему, с которой вы столкнулись, а не взламывать с помощью максимального числа одновременных операций. Я предполагаю, что вы настроили QoS для NSOperationQueue на .Background?

Meдумает, что это более чистый способ решения вашей проблемы с современным ios sdk, а затем подсчитывает их ядра, используя километры веревки, любезно предоставленные albertamg

Также обратите внимание на NSProcessInfoThermalStateDidChangeNotification (macos) и NSProcessInfo.lowPowerModeEnabled (ios)Я предполагаю, что альтернативой наблюдения NSProcessInfoThermalStateDidChangeNotification является KVo для нового значения activeProcessorCount)

, если вы начнете учитывать эти новые реалии, корректировки магических констант для умножения числа ядер станут интересными очень быстро ... и гниют какновое аппаратное обеспечение выходит из cupertino.

И установить его в текущем зоопарке Apple hw будет почти так же просто, как правильно настроить работу на уровне сокетов: doabно только по нескольким в Купетино, когда тень iSteve нависает над плечом, проверяя качество; -)

2 голосов
/ 30 августа 2011

Помимо прочего, вы можете получить эту информацию с помощью системного вызова ...

NSDictionary dictionaryWithObjectsAndKeys:
    [self machineType],@"MachineType",
    [self humanMachineType],@"HumanMachineType",
    [self powerPCTypeString],@"ProcessorType",
    [NSNumber numberWithLong:
                     [self processorClockSpeed]],
                         @"ProcessorClockSpeed",
    [NSNumber numberWithLong:
                     [self processorClockSpeedInMHz]],
                         @"ProcessorClockSpeedInMHz",
    [NSNumber numberWithInt:[self countProcessors]],
                     @"CountProcessors",
    [self computerName],@"ComputerName",
    [self computerSerialNumber],@"ComputerSerialNumber",
    [self operatingSystemString],@"OperatingSystem",
    [self systemVersionString],@"SystemVersion",        
    nil];

Вот ссылка ... http://cocoadev.com/HowToGetHardwareAndNetworkInfo

1 голос
/ 30 августа 2011

Я полагаю:

sysctl(HW_NCPU) 

или

sysctlbyname("hw.ncpu", NULL, &size, NULL, 0);

должно работать.

Вы можете изменить код из: Определить конкретный iPhone / iPod touchмодель

0 голосов
/ 27 июня 2018

В Swift вы можете определить / распечатать количество активных процессоров с помощью следующего кода:

let processInfo = ProcessInfo()
print(processInfo.activeProcessorCount)

Этот код не требует никаких дополнительных заголовочных файлов или платформ и работает полностью изначально,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...