Analyse du temps CPU
Vous optimisez une application d'analyse financière qui effectue des calculs. Pour bien comprendre l'utilisation du processeur, vous devez mettre en place un utilitaire qui mesure précisément le temps CPU consommé par différentes opérations, ce qui vous aidera à repérer les calculs réellement exigeants pour le processeur.
Les modules nécessaires de lang.management ont été importés pour vous.
Cette activité fait partie du cours
Optimiser le code en Java
Instructions de l’exercice
- Récupérez l'instance de
ThreadMXBeanà partir de la classeManagementFactory. - Obtenez le temps CPU du fil d'exécution courant.
Exercice interactif pratique
Essayez cet exercice en complétant ce code d’exemple.
public class Main {
public static long getCpuTimeNano() {
// Retrieve the ThreadMXBean instance
ThreadMXBean threadMXBean = ____.____()
if (threadMXBean.isThreadCpuTimeSupported()) {
threadMXBean.setThreadCpuTimeEnabled(true);
// Return the current thread CPU time
return ____(Thread.currentThread().threadId());
} else {
System.out.println("CPU time measurement not supported");
return 0;
}
}
public static long calculateSum(long n) {
long sum = 0;
for (long i = 1; i <= n; i++) {
sum += i;
}
return sum;
}
public static long calculateSquareSum(long n) {
long sum = 0;
for (long i = 1; i <= n; i++) {
sum += i * i;
}
return sum;
}
public static void main(String[] args) {
long n = 100_000_000; // 100 million
long startSum = getCpuTimeNano();
long sum = calculateSum(n);
long endSum = getCpuTimeNano();
System.out.println("CPU time for sum: " +
((endSum - startSum) / 1_000_000.0) + " ms");
long startSquareSum = getCpuTimeNano();
long squareSum = calculateSquareSum(n);
long endSquareSum = getCpuTimeNano();
System.out.println("CPU time for square sum: " +
((endSquareSum - startSquareSum) / 1_000_000.0) + " ms");
double ratio = (endSquareSum - startSquareSum) / (double)(endSum - startSum);
System.out.println("Square sum takes " + ratio +
" times more CPU time than regular sum");
}
}