Аналіз часу CPU
Ви оптимізуєте застосунок для фінансового аналізу, який виконує обчислення. Щоб точно зрозуміти використання процесора, потрібно реалізувати утиліту, що вимірює точний час CPU, витрачений різними операціями. Це допоможе визначити, які обчислення справді є ресурсоємними для CPU.
Потрібні пакети lang.management уже імпортовано для вас.
Ця вправа є частиною курсу
Оптимізація коду в Java
Інструкції до вправи
- Отримайте екземпляр
ThreadMXBeanіз класуManagementFactory. - Отримайте час CPU для поточного потоку.
Інтерактивна практична вправа
Спробуйте виконати цю вправу, доповнивши цей зразок коду.
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");
}
}