パフォーマンスのボトルネックを理解する

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...