5 votos

¿Cómo puedo determinar la velocidad máxima de la CPU en tiempo de ejecución?

Me gustaría saber la velocidad máxima de la CPU para el procesador en un sistema Android en tiempo de ejecución. He visto al menos un par de técnicas diferentes que dan como resultado la frecuencia actual de la CPU, pero no la máxima.

Los privilegios de root no deberían ser necesarios.

5voto

stephelton Puntos 208

Después de investigar un poco en la fuente que mencionó roxan, parece que lo siguiente en /proc puede decirle qué velocidades de CPU están disponibles y cuánto tiempo se ha pasado en cada una:

/sys/devices/system/cpu/cpu0/cpufreq/stats/time_in_state

Sin embargo, proporciona algunos otros estados que no son apropiados. Por ejemplo, en mi Samsung Vibrant, obtengo:

1400000 0
1300000 0
1200000 0
1000000 214141
800000 40092
400000 25273
200000 6159308
100000 389

Pero el reloj estándar del chip es de 1 GHz. Por lo tanto, parece fácil encontrar la velocidad más alta de la lista que tiene un tiempo distinto de cero.

Para mis propósitos, esto debería ser adecuado.

Editar: He observado que a veces el orden en el que se enumeran las frecuencias puede variar, por lo que querrá iterar a través de toda la lista y encontrar la más rápida (en lugar de detenerse en la primera que no sea cero).

Más edición: Aquí hay una función que me funciona:

/**
 * Obtener la velocidad máxima de la CPU.
 *
 * Esto funciona examinando la lista de frecuencias de CPU en el archivo seudó "/sys/devices/system/cpu/cpu0/cpufreq/stats/time_in_state" y cuánto tiempo se ha pasado en cada una. Encuentra el tiempo más alto que no es cero y asume que es la frecuencia máxima (notar que a veces se pueden informar frecuencias más altas que las diseñadas). Por lo tanto, no es imposible que este método devuelva una frecuencia de CPU incorrecta.
 *
 * También tenga en cuenta que (obviamente) esto no reflejará diferentes núcleos de CPU con velocidades máximas diferentes.
 *
 * @return frecuencia de la CPU en MHz
 */
public static int getMaxCPUFreqMHz() {

    int maxFreq = -1;
    try {

        RandomAccessFile reader = new RandomAccessFile("/sys/devices/system/cpu/cpu0/cpufreq/stats/time_in_state", "r");

        boolean done = false;
        while (!done) {
            String line = reader.readLine();
            if (null == line) {
                done = true;
                break;
            }
            String[] splits = line.split("\\s+");
            assert (splits.length == 2);
            int timeInState = Integer.parseInt(splits[1]);
            if (timeInState > 0) {
                int freq = Integer.parseInt(splits[0]) / 1000;
                if (freq > maxFreq) {
                    maxFreq = freq;
                }
            }
        }

    } catch (IOException ex) {
        ex.printStackTrace();
    }

    return maxFreq;
}

0 votos

Gracias, pero las preguntas de desarrollo están fuera de tema aquí :D

0 votos

Sí, me di cuenta de que esto no se colocó apropiadamente. Aunque no puedo moverlo :)

2voto

roxan Puntos 4926

Utilizo esta increíble aplicación pequeña y de código abierto llamada CPU spy.

No solo muestra la velocidad máxima del reloj de la CPU que soporta tu teléfono, también muestra todas las velocidades de reloj que tu teléfono admite. También mostrará el tiempo total y el porcentaje que el teléfono pasa en cada velocidad de reloj.

0 votos

Gracias, tal vez eche un vistazo al código fuente allí. Debería haber especificado, sin embargo; estoy buscando hacer esto en un juego que estoy escribiendo.

2voto

choco-loo Puntos 131

Para contradecir lo anterior

/sys/devices/system/cpu/cpu0/cpufreq/stats/time_in_state

No devuelve los valores correctos. Por ejemplo, en mi propio dispositivo

cat /sys/devices/system/cpu/cpu0/cpufreq/stats/time_in_state
1000000 192
800000 3
600000 12915
300000 20519

# cat /proc/cpuinfo
cat /proc/cpuinfo
Processor       : ARMv7 Processor rev 2 (v7l)
BogoMIPS        : 1197.81
Features        : swp half thumb fastmult vfp edsp thumbee neon vfpv3
CPU implementer : 0x41
CPU architecture: 7
CPU variant     : 0x3
CPU part        : 0xc08
CPU revision    : 2

Hardware        : mapphone_UMTS
Revision        : 0000
Serial          : 0000000000000000
CPU Tier        : 10

Las frecuencias no se informan correctamente. Como puedes ver, la velocidad del reloj en mi dispositivo es de 1200MHz, pero en time_in_state solo muestra un máximo de 1000MHz.

Sin embargo, lo siguiente es correcto

cat /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_max_freq
1200000

0voto

Rubistro Puntos 101

Lea este archivo para obtener la frecuencia máxima:

/sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_max

PreguntAndroid.com

PreguntAndroid es una comunidad de usuarios de Android en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X