ios - 16gb - iphone a1387 caracteristicas
¿Cómo detecto una CPU de doble núcleo en iOS? (6)
Mi aplicación utiliza un NSOperationQueue
para almacenar en caché las imágenes en miniatura en un hilo de fondo. En el iPad2 puedo aumentar el límite de conteo de tareas concurrentes hasta 5 o 6, pero en dispositivos de un solo núcleo como el iPad 1, esto hace que la interfaz de usuario se detenga.
Por lo tanto, me gustaría detectar un dispositivo de doble núcleo (actualmente solo iPad 2) y adaptar el límite concurrente de manera adecuada. Sé que no debo comprobar los números de modelo, sino las características del dispositivo. Entonces, ¿qué característica del dispositivo debería buscar que me diga si la CPU es de doble núcleo?
Método 1
[[NSProcessInfo processInfo] activeProcessorCount];
NSProcessInfo
también tiene una propiedad processorCount
. Aprende la diferencia here .
Método 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);
}
Método 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;
}
En Swift puede detectar / imprimir el número de procesadores activos con el siguiente código:
let processInfo = ProcessInfo()
print(processInfo.activeProcessorCount)
Este código no necesita ningún archivo de cabecera o marco adicional y funciona de forma completamente nativa.
Entre otras cosas, puede obtener esa información a través de una llamada al sistema ...
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];
Aquí está la referencia ... http://cocoadev.com/HowToGetHardwareAndNetworkInfo
Solo usa:
[[NSProcessInfo processInfo] processorCount]
Supongo que esto necesita una respuesta por separado en lugar de un comentario:
Me pregunto qué significa la cantidad de núcleos ahora que Apple produjo un procesamiento más asimétrico con la fusión A10. ¿Tenemos 2.2 núcleos o 4 núcleos? Apple descuidó hacer que activeProcessorCount flote para tener en cuenta su naturaleza fractal. note que era así incluso antes de la fusión porque probablemente tenían una regulación térmica en ese entonces. Necesitan arreglar la sobrecomiso de nsoperationqueue o crear un equivalente flotante para activeProcessorCount y dejar de usar activeProcessorCount en su forma actual, que está perdiendo su utilidad ante los recientes avances de hw.
Por lo tanto, cuanto más rápido caiga en el olvido la ley de Moore o reciba una nueva y brillante constante, el conteo de núcleos tendrá menos sentido. A menos que estés escribiendo una especie de Geek Bench 42, edición de partitura multinúcleo.
Viviendo a fines de 2016, para abordar el problema subyacente al que se enfrenta en lugar de piratearlo con la operación simultánea máxima, supongo que ha ajustado la QoS para la NSOperationQueue a .Background?
Pienso que esta es una forma más limpia de resolver su problema con ios sdk moderno y luego contarlos con millas de cuerda cortesía de albertamg
También eche un vistazo a NSProcessInfoThermalStateDidChangeNotification (macos) y NSProcessInfo.lowPowerModeEnabled (ios) (supongo que una alternativa a la observación de NSProcessInfoThermalStateDidChangeNotification es KVo en activeProcessorCount nuevo valor)
Si empiezas a explicar esas nuevas realidades, los ajustes de las constantes mágicas para multiplicar el recuento de núcleos se volverían interesantes muy rápido ... y se pudriría a medida que el nuevo hardware salga de cupertino.
Y será casi tan fácil hacerlo correctamente en el zoológico actual de Apple como hacer que las redes a nivel de socket funcionen correctamente: es posible, pero al seleccionar algunos en Cupetino con iSteve shadow que se avecina sobre la calidad de verificación del hombro ;-)
Supongo:
sysctl(HW_NCPU)
o
sysctlbyname("hw.ncpu", NULL, &size, NULL, 0);
Deberia trabajar.
puede modificar el código de: Detectar el modelo específico de iPhone / iPod touch