5 votes

Comment puis-je déterminer la vitesse maximale du CPU au moment de l'exécution ?

J'aimerais connaître la vitesse maximale du processeur d'un système Android au moment de l'exécution. J'ai vu au moins deux techniques différentes qui permettent d'obtenir la vitesse actuelle du processeur, mais pas la vitesse maximale.

Les privilèges de racine ne devraient pas être nécessaires.

5voto

iambriansreed Points 171

Après avoir creusé un peu dans la source que roxan a mentionnée, il semble que ce qui suit dans /proc peut vous dire quelles sont les vitesses de processeur disponibles et combien de temps a été passé dans chacune :

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

Cependant, il donne quelques autres états qui ne sont pas appropriés. Par exemple, sur mon Samsung Vibrant, j'obtiens :

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

Mais l'horloge standard de la puce est de 1 GHz. Il semble donc qu'il devrait être assez facile de trouver la vitesse la plus élevée répertoriée qui a un temps non nul.

Pour mes besoins, cela devrait être très adéquat.

Edit : J'ai observé que parfois l'ordre dans lequel les fréquences sont listées peut varier, vous voudrez donc itérer dans toute la liste et trouver la plus rapide (plutôt que de vous arrêter au premier non-zéro).

Plus d'édition : Voici une fonction qui fonctionne pour moi :

/**
 * Get max cpu rate.
 *
 * This works by examining the list of CPU frequencies in the pseudo file
 * "/sys/devices/system/cpu/cpu0/cpufreq/stats/time_in_state" and how much time has been spent 
 * in each. It finds the highest non-zero time and assumes that is the maximum frequency (note 
 * that sometimes frequencies higher than that which was designed can be reported.) So it is not
 * impossible that this method will return an incorrect CPU frequency.
 *
 * Also note that (obviously) this will not reflect different CPU cores with different
 * maximum speeds.
 *
 * @return cpu frequency in 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;
}

2voto

roxan Points 5466

J'utilise cette minuscule et géniale application open source appelée L'espion du CPU .

Il vous indique non seulement la fréquence d'horloge maximale du processeur prise en charge par votre téléphone, mais aussi toutes les fréquences d'horloge qu'il prend en charge. Il affiche également le temps total et le pourcentage que le téléphone passe sur chaque fréquence d'horloge.

2voto

choco-loo Points 141

Pour contredire ce qui précède

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

Ne renvoie pas les valeurs correctes. Par exemple, sur mon propre appareil

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

Les fréquences ne sont pas correctement rapportées. Comme vous pouvez le voir, la vitesse d'horloge sur mon appareil est de 1200MHz - mais seulement 1000MHz max apparaît dans time_in_state .

Cependant, ce qui suit est correct

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

0voto

Brent Faust Points 109

Lisez ce fichier pour obtenir le Fréquence maximale :

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

androidalle.com

AndroidAlle est une communauté de androiders où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X