ทำความเข้าใจ Performance Bottleneck

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

Pavlos Kosmetatos

Lead Engineer @Wealthyhood

Performance Bottleneck คืออะไร?

คือ ข้อจำกัด ที่ทำให้แอปพลิเคชันทำงานช้าและไม่มีประสิทธิภาพ

ลองนึกภาพการเทน้ำผ่านกรวย — ส่วนที่แคบที่สุดจะกำหนดอัตราการไหล!

น้ำไหลผ่านกรวย

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

ประเภทของ Bottleneck

CPU-bound bottlenecks

  • การคำนวณที่ซับซ้อน
  • อัลกอริทึมที่ไม่มีประสิทธิภาพ

I/O-bound bottlenecks

  • การดำเนินการกับฐานข้อมูล
  • การเรียกใช้เครือข่าย
  • การดำเนินการกับไฟล์

Memory-bound bottlenecks (จะกล่าวถึงในบทถัดไป)

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

วัด Performance ด้วย System.nanoTime()

  • System.nanoTime() - วัดเวลาแบบความละเอียดสูง
    • วัดเวลาที่ผ่านไป
    • คืนค่าเป็นนาโนวินาที (1 พันล้าน = 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() เป็น operation แบบ O(n)
การปรับแต่งโค้ดใน Java

แนวทางที่ดีในการวัด Performance

  • วัดผลหลายครั้ง
การปรับแต่งโค้ดใน 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

แนวทางที่ดีในการวัด Performance

  • วัดผลหลายครั้ง
  • เปรียบเทียบ Performance แบบสัมพัทธ์
// 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...