我的应用使用NSOperationQueue
在后台线程中缓存缩略图图像。在iPad2上,我可以将并发任务计数限制推高到5或6,但在像iPad 1这样的单核设备上,这会使UI停止运行。
所以,我想检测双核设备(目前只有iPad 2)并适当调整并发限制。我知道我不应该检查型号,而是设备功能。那么我应该寻找什么样的设备功能才能告诉我cpu是否是双核心?
答案 0 :(得分:47)
[[NSProcessInfo processInfo] activeProcessorCount];
NSProcessInfo
也有processorCount
属性。了解差异here。
#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);
}
#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;
}
答案 1 :(得分:4)
只需使用:
[[NSProcessInfo processInfo] processorCount]
答案 2 :(得分:3)
我想这需要一个单独的答案而不是评论:
我想知道核心数量意味着苹果带来了更多的非对称处理与A10融合?我们有2.2核或4核吗?苹果忽略了使activeProcessorCount浮动来解释它的分形性质。请注意,即使在融合之前它们也是如此,因此它们当时可能会受到热量限制。他们需要修复nsoperationqueue的过度使用,或者为activeProcessorCount提供一个浮动等价物,并且以当前形式弃用activeProcessorCount,面对最近的hw进步而失去其效用
因此,摩尔定律越快被遗忘或获得闪亮的新常数 核心计数变得越无意义。除非你在写某种东西 Geek Bench 42,多核评分版。
生活在2016年底,为了解决您面临的根本问题,而不是通过最大并发操作道具进行攻击 您已将NSOperationQueue的QoS调整为.Background?
我认为这是用现代方法解决问题的一种更清洁的方法 ios sdk然后使用albertamg提供的数英里绳索计算'em核心
另外请看一下 NSProcessInfoThermalStateDidChangeNotification(macos)和NSProcessInfo.lowPowerModeEnabled(ios) (我想是观察NSProcessInfoThermalStateDidChangeNotification的替代方法 是关于activeProcessorCount新值的KVo)
如果你开始考虑那些新的现实,那就是魔术常数的调整 对于核心数量的倍增会很快变得有趣...... 随着新硬件推出cupertino而腐烂。
就目前而言,将它变得如此简单 Apple hw的动物园,以使套接字级网络正常工作: 可行,但在Cupetino选择少数与iSteve阴影 隐约可见肩膀检查质量; - )
答案 3 :(得分:2)
除此之外,您还可以通过系统调用获取该信息......
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 :(得分:1)
我想:
sysctl(HW_NCPU)
或
sysctlbyname("hw.ncpu", NULL, &size, NULL, 0);
应该有用。
答案 5 :(得分:0)
在 Swift 中,您可以使用以下代码检测/打印活动处理器的数量:
let processInfo = ProcessInfo()
print(processInfo.activeProcessorCount)
此代码不需要任何其他头文件或框架,并且可以完全本机运行。
答案 6 :(得分:0)
Swift 5
要获得 logical
核数,请使用以下代码段:
let logicalCoresCount = ProcessInfo.processInfo.processorCount
要获得 physical
个内核数,请使用以下 1 个:
func physicalCoresCount() -> UInt {
var size: size_t = MemoryLayout<UInt>.size
var coresCount: UInt = 0
sysctlbyname("hw.physicalcpu", &coresCount, &size, nil, 0)
return coresCount
}