เริ่มต้นใช้งานเริ่มต้นใช้งานได้ฟรี

การวิเคราะห์เวลา CPU

คุณกำลังปรับปรุงประสิทธิภาพแอปพลิเคชันวิเคราะห์ทางการเงินที่ทำการคำนวณต่าง ๆ เพื่อให้เข้าใจการใช้งานโปรเซสเซอร์อย่างแม่นยำ จึงต้องสร้างยูทิลิตีที่วัดเวลา CPU ที่การดำเนินการแต่ละอย่างใช้จริง ซึ่งจะช่วยระบุได้ว่าการคำนวณใดใช้ทรัพยากร CPU อย่างเข้มข้นที่สุด

แพ็กเกจ lang.management ที่จำเป็นได้ถูก import ไว้ให้แล้ว

แบบฝึกหัดนี้เป็นส่วนหนึ่งของหลักสูตร

การปรับแต่งโค้ดใน Java

ดูคอร์ส

คำแนะนำการฝึกหัด

  • ดึง instance ของ 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");
    }
}
แก้ไขและรันโค้ด