Zacznij terazZacznij za darmo

Analiza czasu procesora

Optymalizujesz aplikację do analizy finansowej, która wykonuje różne obliczenia. Aby dokładnie zrozumieć wykorzystanie procesora, musisz zaimplementować narzędzie mierzące rzeczywisty czas CPU zużywany przez poszczególne operacje. Dzięki temu zidentyfikujesz, które obliczenia są naprawdę obciążające procesor.

Niezbędne pakiety lang.management zostały już za ciebie zaimportowane.

To ćwiczenie jest częścią kursu

Optymalizacja kodu w Javie

Zobacz kurs

Instrukcje do ćwiczenia

  • Pobierz instancję ThreadMXBean z klasy ManagementFactory.
  • Pobierz czas procesora dla bieżącego wątku.

Interaktywne ćwiczenie praktyczne

Spróbuj tego ćwiczenia, uzupełniając ten przykładowy kod.

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");
    }
}
Edytuj i uruchom kod