Есть ли API, который сообщает, является ли устройство Android двухъядерным или нет?
Я делаю двухъядерную оптимизацию с помощью многопоточности, и она работает следующим образом: если устройство имеет двухъядерный процессор, для вычислений создаются два потока, а если устройство имеет только одноядерный процессор, то только один поток создан, чтобы делать вычисления.
Мой вопрос: как моя программа узнает, является ли устройство двухъядерным или нет? Я просто хочу иметь одну программу, которая может работать как на двухъядерных, так и на одноядерных устройствах, поэтому она должна знать эту информацию.
код как это:
if( xxx_API_is_device_dual_core() ) // Inside if() is the expected API
{
saveThread = new SaveThread[2];
}
else
{
saveThread = new SaveThread[1];
}
Большое спасибо за любую помощь!
2 ответа
Не запускается ли Runtime.availableProcessors() правильно на 2-ядерном устройстве?
Кажется, что Runtime.availableProcessors() не работает правильно для всех устройств Android (например, он возвращает только "1" на моем двухъядерном Galaxy S II). Может быть некоторая путаница между физическими процессорами и виртуальными процессорами, также называемыми ядрами.
Самый надежный метод, который я нашел, описан в этом сообщении на форуме. По сути, вы должны считать виртуальные процессорные устройства в /sys/devices/system/cpu/. Это будет работать с двухъядерными и четырехъядерными устройствами без изменений.
Я протестировал этот метод на своих Galaxy S II (2 ядра) и Asus Transformer Prime (4 ядра), и он сообщает правильно. Вот пример кода (взят из моего ответа на этот вопрос):
/**
* Gets the number of cores available in this device, across all processors.
* Requires: Ability to peruse the filesystem at "/sys/devices/system/cpu"
* @return The number of cores, or 1 if failed to get result
*/
private int getNumCores() {
//Private Class to display only CPU devices in the directory listing
class CpuFilter implements FileFilter {
@Override
public boolean accept(File pathname) {
//Check if filename is "cpu", followed by a single digit number
if(Pattern.matches("cpu[0-9]", pathname.getName())) {
return true;
}
return false;
}
}
try {
//Get directory containing CPU info
File dir = new File("/sys/devices/system/cpu/");
//Filter to only list the devices we care about
File[] files = dir.listFiles(new CpuFilter());
//Return the number of cores (virtual CPU devices)
return files.length;
} catch(Exception e) {
//Default to return 1 core
return 1;
}
}