0Pricing
Java Academy · Pelajaran

Mengidentifikasi Bottleneck

Ukur sebelum mengoptimalkan.

Mengidentifikasi Bottleneck adalah pelajaran Java Academy gratis di CoddyKit. Ini adalah pelajaran 1 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Java Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Java Academy mencakup 4 pelajaran total.

Ukur, Jangan Menebak

Aturan pertama dalam pekerjaan kinerja: ukur sebelum mengoptimalkan.

Intuisi tentang di mana program Java menghabiskan waktunya biasanya keliru. Kompilator tepat waktu, pengumpul sampah, dan penembolokan semuanya membuat perkiraan tanpa pengukuran menjadi tidak dapat diandalkan. Buat profil, temukan titik panas sebenarnya, lalu perbaiki bagian itu.

Definisi Hambatan

Hambatan adalah bagian sistem yang membatasi keseluruhan laju pemrosesan atau latensi.

Mengoptimalkan bagian lain tidak memberikan manfaat yang terlihat. Hukum Amdahl menjelaskan hal ini secara tepat: jika 90% waktu dihabiskan dalam satu metode, mempercepat 10% lainnya tidak akan pernah menghasilkan peningkatan lebih dari 11%.

Latensi vs Laju Pemrosesan

Tentukan hal yang ingin Anda optimalkan:

  • Latensi — berapa lama satu permintaan berlangsung.
  • Laju pemrosesan — berapa banyak permintaan yang diproses per detik.

Keduanya memiliki pertukaran. Pengelompokan meningkatkan laju pemrosesan, tetapi dapat meningkatkan latensi setiap permintaan. Ketahui sasaran Anda sebelum melakukan penyesuaian.

Pengukuran Waktu Jam Dinding

Pengukuran paling sederhana adalah waktu jam dinding di sekitar satu blok kode dengan System.nanoTime().

Hal ini berguna untuk pemeriksaan kewajaran secara cepat, tetapi mencakup pemanasan kompilator tepat waktu, jeda pengumpulan sampah, dan gangguan penjadwalan OS, jadi jangan terlalu percaya pada satu angka.

public class Main {
    public static void main(String[] args) {
        long start = System.nanoTime();
        long sum = 0;
        for (int i = 0; i < 10_000_000; i++) sum += i;
        long elapsed = System.nanoTime() - start;
        System.out.println("Sum: " + sum);
        System.out.println("Elapsed ms: " + (elapsed / 1_000_000.0));
    }
}

Waspadai Pemanasan Kompilator Tepat Waktu

Java mulai menafsirkan bytecode, lalu kompilator tepat waktu mengompilasi metode yang sering digunakan menjadi kode asli.

Karena itu, proses awal suatu metode jauh lebih lambat daripada proses berikutnya. Pengulangan pengukuran yang naif sebagian besar hanya mengukur pemanasan. Tolok ukur nyata melakukan pemanasan terlebih dahulu, lalu mengukur keadaan stabil — dan itulah yang dilakukan JMH untuk Anda.

Terikat CPU vs Terikat IO

Klasifikasikan hambatannya:

  • Terikat CPU — utas sibuk melakukan perhitungan; inti prosesor berada pada kapasitas penuh.
  • Terikat IO — utas menunggu disk, jaringan, atau basis data.

Alat pembuat profil membedakan keduanya sebagai waktu 'menggunakan CPU' dibandingkan waktu 'terblokir/menunggu'. Solusinya sepenuhnya berbeda: algoritme yang lebih cepat, atau menambah konkurensi maupun mengurangi perjalanan bolak-balik.

Pengambilan Sampel vs Instrumentasi

Dua strategi pembuatan profil:

  • Pengambilan sampel — ambil jejak tumpukan secara berkala. Beban tambahan rendah dan bersifat statistik.
  • Instrumentasi — sisipkan penghitung ke setiap metode. Akurat, tetapi berat dan dapat mengubah hasil pengukuran.

Untuk produksi, pilih pengambilan sampel dengan beban tambahan rendah seperti Java Flight Recorder.

Memori sebagai Hambatan

Sering kali biaya sebenarnya adalah alokasi, bukan perhitungan. Pembuatan objek yang berlebihan memicu pengumpulan sampah yang sering, menghabiskan CPU, dan menambah jeda.

Perhatikan laju alokasi dan waktu pengumpulan sampah. Mengurangi alokasi dalam pengulangan yang sering dijalankan biasanya lebih berdampak daripada menyesuaikan aritmetika secara kecil-kecilan.

import java.util.ArrayList;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        // Allocation-heavy: a new String each iteration
        List<String> garbage = new ArrayList<>();
        for (int i = 0; i < 5; i++) {
            garbage.add("item-" + i);
        }
        System.out.println("Allocated " + garbage.size() + " strings");
        System.out.println("In a hot loop, this churn drives GC pressure");
    }
}

Temukan Puncak Tumpukan

Alat pembuat profil berbasis pengambilan sampel menghasilkan daftar metode yang diurutkan berdasarkan seberapa sering metode tersebut muncul dalam tumpukan CPU — yaitu waktu mandiri.

Metode di urutan teratas adalah kandidat Anda. Namun, pastikan metode itu berada di jalur kritis: metode yang sering dijalankan dalam pencatat log latar belakang mungkin tidak memengaruhi latensi yang dirasakan pengguna.

Tetapkan Tolok Ukur

Sebelum mengubah apa pun, catat pengukuran tolok ukur di bawah beban yang realistis.

Setelah setiap perubahan, ukur kembali dan bandingkan. Tanpa tolok ukur, Anda tidak dapat membuktikan bahwa pengoptimalan membantu — dan banyak 'pengoptimalan' justru memperburuk keadaan. Ubahlah satu hal pada satu waktu.

Membuat Profil dengan Beban Kerja Realistis

Titik kemacetan yang ditemukan pada laptop yang sedang tidak digunakan mungkin bukan titik yang paling berdampak di lingkungan produksi.

  • Gunakan ukuran data dan konkurensi yang mewakili kondisi nyata.
  • Reproduksi beban kerja yang benar-benar penting bagi pengguna.

Pengujian mikro sintetis dapat mengarahkan Anda ke metode yang tidak relevan pada skala besar. Buat profil di tempat masalah kinerja benar-benar terjadi.

Pemeriksaan Singkat

Mengapa pengukuran tunggal dan naif terhadap metode Java dengan System.nanoTime() sering menyesatkan?

Rangkuman

Menemukan titik kemacetan dengan cara yang disiplin:

  • Lakukan pengukuran sebelum mengoptimalkan; intuisi dapat menyesatkan.
  • Tentukan tujuan: latensi atau laju pemrosesan.
  • Klasifikasikan sebagai terikat CPU atau terikat IO; perhatikan pengumpulan sampah dan alokasi.
  • Utamakan alat pembuatan profil dengan pengambilan sampel yang memiliki beban tambahan rendah.
  • Waspadai pemanasan kompilasi; tetapkan garis dasar dan ubah satu hal setiap kali.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Mengidentifikasi Bottleneck” gratis?

Ya — teks lengkap “Mengidentifikasi Bottleneck” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Java Academy, upgrade ke CoddyKit PRO. Kursus Java Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Mengidentifikasi Bottleneck”?

Ukur sebelum mengoptimalkan. Kamu berlatih Java Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai Java Academy?

Tidak diperlukan pengalaman sebelumnya. Java Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 1 dari 4.

Berapa lama pelajaran “Mengidentifikasi Bottleneck” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran Java Academy ini?

Ya. Setiap pelajaran Java Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Mengidentifikasi Bottleneck
  2. Java Flight Recorder
  3. Menganalisis dengan JDK Mission Control
  4. Flag Penyetelan JVM Umum
← Kembali ke Java Academy