Java Academy · Pelajaran

Mengenal Pasti Kesempitan

Ukur sebelum mengoptimumkan

Pelajaran 1 daripada 413 langkah

Mengenal Pasti Kesempitan ialah pelajaran Java Academy percuma di CoddyKit. Ini ialah pelajaran 1 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Java Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Java Academy merangkumi sejumlah 4 pelajaran.

Ukur, Jangan Agak

Peraturan pertama dalam kerja prestasi: ukur sebelum mengoptimumkan.

Gerak hati tentang tempat program Java menghabiskan masanya biasanya salah. Pengkompil JIT, pengutip sampah dan penyimpanan sementara semuanya menafikan anggaran rambang. Analisis profil, cari titik panas sebenar dan baiki bahagian itu.

Takrif Kesesakan

Kesesakan ialah bahagian sistem yang mengehadkan daya pemprosesan keseluruhan atau kependaman.

Mengoptimumkan perkara lain tidak memberikan manfaat yang ketara. Hukum Amdahl menjelaskan perkara ini dengan tepat: jika 90% masa dihabiskan dalam satu kaedah, mempercepatkan 10% yang lain tidak mungkin memberikan peningkatan melebihi 11%.

Kependaman berbanding Daya Pemprosesan

Tentukan perkara yang ingin Anda optimumkan:

  • Kependaman — tempoh yang diperlukan untuk satu permintaan.
  • Daya pemprosesan — bilangan permintaan sesaat.

Kedua-duanya mempunyai pertukaran. Pengelompokan meningkatkan daya pemprosesan tetapi boleh meningkatkan kependaman bagi setiap permintaan. Ketahui sasaran Anda sebelum membuat pelarasan.

Pengukuran Masa Jam Dinding

Pengukuran paling kasar ialah masa jam dinding di sekeliling satu blok kod dengan System.nanoTime().

Ia berguna untuk semakan kewajaran yang pantas, tetapi turut merangkumi pemanasan JIT, jeda GC dan hingar penjadualan OS, jadi berhati-hatilah dengan nombor tunggal.

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));
    }
}

Berwaspada terhadap Pemanasan JIT

Java bermula dengan mentafsir kod bait, kemudian JIT menyusun kaedah yang kerap digunakan kepada kod natif.

Jadi, pelaksanaan awal sesuatu kaedah jauh lebih perlahan daripada pelaksanaan kemudian. Gelung pengukuran naif kebanyakannya mengukur pemanasan. Penanda aras sebenar melakukan pemanasan dahulu, kemudian mengukur keadaan mantap — dan itulah yang dilakukan oleh JMH untuk Anda.

Terikat CPU berbanding Terikat IO

Kelaskan kesesakan:

  • Terikat CPU — utas sibuk melakukan pengiraan; teras digunakan sepenuhnya.
  • Terikat IO — utas menunggu cakera, rangkaian atau pangkalan data.

Alat pemprofilan membezakan kedua-duanya sebagai masa 'pada CPU' berbanding masa 'disekat/menunggu'. Penyelesaiannya berbeza sepenuhnya: algoritma yang lebih pantas berbanding lebih banyak keserentakan atau lebih sedikit perjalanan pergi balik.

Persampelan berbanding Instrumentasi

Dua strategi pemprofilan:

  • Persampelan — ambil jejak tindanan secara berkala. Overhed rendah dan bersifat statistik.
  • Instrumentasi — masukkan pembilang ke dalam setiap kaedah. Tepat, tetapi berat dan boleh memesongkan pengukuran masa.

Untuk persekitaran pengeluaran, utamakan persampelan beroverhed rendah seperti Java Flight Recorder.

Memori sebagai Kesesakan

Sering kali kos sebenar ialah peruntukan, bukan pengiraan. Penciptaan objek yang berlebihan mencetuskan kutipan sampah yang kerap, menggunakan CPU dan menambahkan jeda.

Pantau kadar peruntukan dan masa kutipan sampah. Mengurangkan peruntukan dalam gelung yang kerap digunakan selalunya lebih berkesan daripada melaraskan aritmetik secara mikro.

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");
    }
}

Cari Bahagian Teratas Timbunan

Alat pemprofilan persampelan menghasilkan senarai kaedah yang disusun mengikut kekerapan kaedah tersebut muncul pada tindanan CPU — masa sendiri.

Kaedah di bahagian teratas ialah calon Anda. Namun, pastikan kaedah itu berada pada laluan kritikal: kaedah yang kerap digunakan dalam pencatat log latar belakang mungkin tidak mempengaruhi kependaman yang dialami pengguna.

Wujudkan Garis Dasar

Sebelum mengubah apa-apa, rekodkan ukuran garis dasar di bawah beban yang realistik.

Selepas setiap perubahan, ukur semula dan bandingkan. Tanpa garis dasar, Anda tidak dapat membuktikan bahawa pengoptimuman membantu — dan banyak 'pengoptimuman' sebenarnya memburukkan keadaan. Ubah satu perkara pada satu masa.

Pemprofilan dengan Beban Realistik

Titik kesesakan yang ditemui pada komputer riba yang melahu mungkin bukan titik yang menjejaskan sistem dalam persekitaran produksi.

  • Gunakan saiz data dan tahap keserentakan yang mewakili keadaan sebenar.
  • Hasilkan semula beban kerja yang benar-benar penting kepada pengguna.

Ujian mikro sintetik boleh mengarahkan anda kepada kaedah yang tidak relevan pada skala besar. Lakukan pemprofilan di tempat masalah sebenar berlaku.

Semakan Ringkas

Mengapakah pengukuran masa tunggal yang naif menggunakan System.nanoTime() untuk kaedah Java sering mengelirukan?

Ringkasan

Mencari titik kesesakan dengan cara berdisiplin:

  • Ukur sebelum mengoptimumkan; gerak hati boleh menipu.
  • Pilih matlamat: kependaman atau daya pemprosesan.
  • Tentukan sama ada terikat CPU atau terikat IO; pantau kutipan sampah dan peruntukan memori.
  • Utamakan pemprofil pensampelan berkos rendah.
  • Berwaspada terhadap pemanasan penyusun tepat pada masa; tetapkan garis dasar dan ubah satu perkara pada satu-satu masa.
Percuma untuk bermula

Pelajari Java dengan tutor kecerdasan buatan — percuma

Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.

Kursus
104
Pelajaran
374

Soalan Lazim

Adakah pelajaran “Mengenal Pasti Kesempitan” percuma?

Ya — teks penuh “Mengenal Pasti Kesempitan” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus Java Academy, tingkat taraf kepada CoddyKit PRO. Kursus Java Academy merangkumi sejumlah 4 pelajaran.

Apakah yang akan saya pelajari dalam “Mengenal Pasti Kesempitan”?

Ukur sebelum mengoptimumkan Anda berlatih Java Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.

Adakah saya memerlukan pengalaman untuk memulakan Java Academy?

Tiada pengalaman terdahulu diperlukan. Pembelajaran Java Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 1 daripada 4.

Berapa lamakah pelajaran “Mengenal Pasti Kesempitan” diambil?

Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.

Bolehkah saya menulis dan menjalankan kod dalam pelajaran Java Academy ini?

Ya. Setiap pelajaran Java Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.

Semua pelajaran dalam kursus ini

  1. Mengenal Pasti Kesempitan
  2. Java Flight Recorder
  3. Menganalisis dengan JDK Mission Control
  4. Bendera Penalaan JVM Lazim
← Kembali ke Java Academy