Как определить скорость процессора Android?

Я хотел бы определить, насколько быстро работает устройство, на котором работает мое приложение для Android?

Есть ли API для этого на Android? Или я должен сам тестировать?

Если у устройства медленный процессор, я хотел бы отключить некоторые трудоемкие операции, такие как анимация, или ограничить максимальное количество одновременных HTTP-запросов.


person Dariusz Bacinski    schedule 02.02.2011    source источник


Ответы (4)


На мой взгляд, лучший способ сделать это — отслеживать время, необходимое для выполнения этих действий. Если это занимает слишком много времени, значит, система слишком медленная, и вы можете отключить модные функции, пока она не станет достаточно быстрой.

Чтение скорости процессора или других характеристик и попытка оценить скорость системы — плохая идея. Будущие аппаратные изменения могут сделать эти спецификации бессмысленными.

Посмотрите, например, на Pentium 4 и Core 2. Какой процессор быстрее: Pentium 4 с тактовой частотой 2,4 ГГц или Core 2 с тактовой частотой 1,8 ГГц? Opteron с частотой 2 ГГц быстрее, чем Itanium 2 с частотой 1,4 ГГц? Как вы узнаете, какой процессор ARM на самом деле быстрее?

Чтобы получить оценки скорости системы для Windows Vista и 7, Microsoft фактически тестирует машину. Это единственный полуточный метод определения возможностей системы.

Похоже, хорошим методом является использование SystemClock.uptimeMillis().

person Zan Lynx    schedule 02.02.2011
comment
Должен ли я просто считать время с помощью System.currentTimeMillis()? - person Dariusz Bacinski; 03.02.2011
comment
@darbat: developer.android.com/reference/android/os/SystemClock.html Попробуйте использовать uptimeMillis(). - person Zan Lynx; 03.02.2011
comment
@ZanLynx: я пытаюсь решить ту же проблему, но, по моему опыту, бенчмаркинг процессора на Android очень неточен из-за фоновых процессов. Вы нашли способ смягчить это? - person Simplex; 16.01.2012
comment
@JonnyBoy: Просто делай все, что в твоих силах. Если вы можете адаптироваться на лету, рассчитывая важные операции, это будет лучше всего. Многие анимации GUI делают это, пропуская промежуточные кадры, когда система слишком занята. - person Zan Lynx; 16.01.2012

Попробуйте прочитать /proc/cpuinfo, который содержит информацию о процессоре:

   String[] args = {"/system/bin/cat", "/proc/cpuinfo"};
   ProcessBuilder pb = new ProcessBuilder(args);

   Process process = pb.start();
   InputStream in = process.getInputStream();
   //read the stream
person dogbane    schedule 02.02.2011
comment
Это довольно плохая идея. Я имею в виду, это сработает. Но что будет делать ваше приложение, когда оно будет работать на какой-нибудь будущей версии ЦП, которая будет больше работать на более низкой тактовой частоте? Если бы приложение делало это на Pentium 4, то, когда вышел Core2, приложение выглядело бы глупо. - person Zan Lynx; 02.02.2011
comment
Извините, я должен был адресовать свой комментарий больше darbat. - person Zan Lynx; 02.02.2011

Основываясь на решении @dogbane и этом ответе, это моя реализация для получения значения BogoMIPS:

 /**
 * parse the CPU info to get the BogoMIPS.
 * 
 * @return the BogoMIPS value as a String
 */
public static String getBogoMipsFromCpuInfo(){
    String result = null;
    String cpuInfo = readCPUinfo();
    String[] cpuInfoArray =cpuInfo.split(":");
    for( int i = 0 ; i< cpuInfoArray.length;i++){
        if(cpuInfoArray[i].contains("BogoMIPS")){
            result = cpuInfoArray[i+1];
            break;
        }
    }
    if(result != null) result = result.trim();
    return result;
}

/**
 * @see {https://stackoverflow.com/a/3021088/3014036}
 *
 * @return the CPU info.
 */
public static String readCPUinfo()
{
    ProcessBuilder cmd;
    String result="";
    InputStream in = null;
    try{
        String[] args = {"/system/bin/cat", "/proc/cpuinfo"};
        cmd = new ProcessBuilder(args);
        Process process = cmd.start();
        in = process.getInputStream();
        byte[] re = new byte[1024];
        while(in.read(re) != -1){
            System.out.println(new String(re));
            result = result + new String(re);
        }
    } catch(IOException ex){
        ex.printStackTrace();
    } finally {
            try {
                if(in !=null)
                in.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
    }
    return result;
}
person ahmed_khan_89    schedule 07.01.2015
comment
Мне пришлось изменить разделенное регулярное выражение в приведенном выше коде, чтобы получить правильное чтение для bogoMIPS: String[] cpuInfoArray =cpuInfo.split(":|\\n"); Cheers - person BillyRayCyrus; 08.06.2015

Пожалуйста, обратитесь к следующей ссылке, которая предоставит данные, связанные с процессором.

person chiranjib    schedule 02.02.2011