Как определить двухъядерный процессор на iOS?

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

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

7 ответов

Решение

Способ 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;
}

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

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

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

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

[[NSProcessInfo processInfo] processorCount]

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

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

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

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

Я думаю, что это более чистый способ решения вашей проблемы с современным IOS SDK, а затем подсчитывать их ядра, используя километры веревки любезно предоставленные Albertamg

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

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

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

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

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

Swift 5

Чтобы получить logical количество ядер используйте этот фрагмент:

      let logicalCoresCount = ProcessInfo.processInfo.processorCount

Чтобы получить physical количество ядер используется ниже единицы:

      func physicalCoresCount() -> UInt {

    var size: size_t = MemoryLayout<UInt>.size
    var coresCount: UInt = 0

    sysctlbyname("hw.physicalcpu", &coresCount, &size, nil, 0)

    return coresCount
}

Похоже:

sysctl(HW_NCPU) 

или же

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

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

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

Другие вопросы по тегам