理解效能瓶頸

Java 程式碼最佳化

Pavlos Kosmetatos

Lead Engineer @Wealthyhood

什麼是效能瓶頸?

它們是限制應用程式速度與效率的約束

想像把水倒進漏斗——最窄處決定流速!

水流過漏斗

Java 程式碼最佳化

瓶頸的種類

CPU 受限的瓶頸

  • 複雜計算
  • 演算法低效

I/O 受限的瓶頸

  • 資料庫操作
  • 網路呼叫
  • 檔案操作

記憶體受限的瓶頸(之後課程會介紹)

Java 程式碼最佳化

用 System.nanoTime() 量測效能

  • System.nanoTime()-高精度時間量測
    • 量測經過時間
    • 以奈秒(10 億奈秒=1 秒)回傳 long 整數
  • System.currentTimeMillis() 不同,量測的是牆上時間

$$

long startTime = System.nanoTime();
// Code to measure
long endTime = System.nanoTime();
long duration = endTime - startTime;
Java 程式碼最佳化

使用 System.nanoTime()

// Measuring ArrayList.contains() performance
import java.util.ArrayList;
import java.util.List;

List<Integer> numbers = new ArrayList<>();
for (int i = 0; i < 100000; i++) {
    numbers.add(i);
}

long startTime = System.nanoTime(); boolean found = numbers.contains(99999); // O(n) operation long endTime = System.nanoTime();
Java 程式碼最佳化

使用 System.nanoTime()

long duration = endTime - startTime;
System.out.println("Time taken: " + duration + " ns");
// Convert to milliseconds
System.out.println("Time taken: " + duration / 1_000_000.0 + " ms");
Time taken: 1239000000 ns
Time taken: 1239ms
  • ArrayList.contains()O(n) 操作
Java 程式碼最佳化

效能量測最佳實務

  • 執行多次量測
Java 程式碼最佳化

執行多次量測

long totalTime = 0;
for (int i = 0; i < 3; i++) {
    long start = System.nanoTime();
    findElementLinear(data, target);
    long iterationTime = System.nanoTime() - start;
    totalTime += iterationTime;
    System.out.println("Run " + (i+1) + ": " + iterationTime + " ns");
}
double averageTime = totalTime / 3.0;
System.out.println("Average: " + (long)averageTime + " ns");
Run 1: 3245678 ns
Run 2: 3198432 ns
Run 3: 3301234 ns
Average: 3248448 ns
Java 程式碼最佳化

效能量測最佳實務

  • 執行多次量測
  • 比較相對效能
// Assume we have calculated avgTimeA and avgTimeB already
System.out.println("Operation A is" + (avgTimeA / avgTimeB) + "x slower");
Operation A is 4x slower
Java 程式碼最佳化

一起來練習吧!

Java 程式碼最佳化

Preparing Video For Download...