如何在iOS上检测双核CPU?

时间:2011-08-30 10:39:55

标签: ios

我的应用使用NSOperationQueue在后​​台线程中缓存缩略图图像。在iPad2上,我可以将并发任务计数限制推高到5或6,但在像iPad 1这样的单核设备上,这会使UI停止运行。

所以,我想检测双核设备(目前只有iPad 2)并适当调整并发限制。我知道我不应该检查型号,而是设备功能。那么我应该寻找什么样的设备功能才能告诉我cpu是否是双核心?

7 个答案:

答案 0 :(得分:47)

方法1

[[NSProcessInfo processInfo] activeProcessorCount];

NSProcessInfo也有processorCount属性。了解差异here

方法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;
}

答案 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);

应该有用。

您可以修改以下代码:Detect the specific iPhone/iPod touch model

答案 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
}