Как определить двухъядерный процессор на iOS?
Мое приложение использует NSOperationQueue
для кэширования эскизных изображений в фоновом потоке. На iPad2 я могу установить ограничение количества одновременных задач до 5 или 6, но на одноядерных устройствах, таких как iPad 1, это приведет к остановке пользовательского интерфейса.
Итак, я бы хотел обнаружить двухъядерное устройство (в настоящее время только iPad 2) и соответствующим образом адаптировать параллельный предел. Я знаю, что я не должен проверять номера моделей, а не функции устройства. Итак, какую функцию устройства я должен искать, которая скажет мне, является ли процессор двухъядерным?
Ответы
Ответ 1
Способ 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;
}
Ответ 2
Просто используйте:
[[NSProcessInfo processInfo] processorCount]
Ответ 3
Помимо прочего, вы можете получить эту информацию с помощью системного вызова...
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
Ответ 4
Думаю, для этого нужен отдельный ответ, а не комментарий:
Интересно, что теперь означает количество ядер, что яблоко принесло более асимметричную обработку с помощью сплава A10? У нас есть 2,2 ядра или 4 ядра? яблоко пренебрегли, чтобы сделать activeProcessorCount поплавок, чтобы учесть его фрактальную природу. Обратите внимание, что это было так, что даже до слияния, вероятно, они имели тепловой дроссель. Им нужно либо устранить перенапряжение nsoperationqueue, либо создать эквивалент float для activeProcessorCount и отказаться от activeProcessorCount в его текущей форме, которая теряет свою полезность перед лицом недавних hw-продвижений
Итак, чем быстрее закон Мура впадает в забвение или получает новую блестящую константу
тем более бессмысленным подсчетом ядра становится. Если вы ничего не пишете
из Geek Bench 42, многорежимный выпуск.
Жизнь в конце 2016 года, для решения основной проблемы, с которой вы сталкиваетесь, а не взламывания с помощью максимальной параллельной работы, я предполагаю
вы настроили QoS для NSOperationQueue на .Background?
Я думаю, что это более чистый способ решить вашу проблему с помощью современных
ios sdk, затем подсчитывая "em-сердечники", используя мили канатной любезности albertamg
Также обратите внимание на
NSProcessInfoThermalStateDidChangeNotification (macos) и NSProcessInfo.lowPowerModeEnabled(ios)
(Я предполагаю, что альтернатива наблюдению NSProcessInfoThermalStateDidChangeNotification
является значением KVo для нового значения activeProcessorCount)
если вы начнете учитывать эти новые реалии, корректировки магических констант
для умножения количества ядер будет очень интересно...
и гниют, поскольку новое оборудование выкатывается из купертино.
И это будет почти так же просто, чтобы это правильно
зоопарк Apple hw, чтобы получить правильную работу на уровне сокета:
выполним, но несколькими избранными в Cupetino с тенью iSteve
нависшее над качеством проверки плеча; -)
Ответ 5
Я думаю:
sysctl(HW_NCPU)
или
sysctlbyname("hw.ncpu", NULL, &size, NULL, 0);
должен работать.
вы можете изменить код: Обнаружить конкретную модель iPhone/iPod touch