Idiom bahasa jawa
1. siklus
Dalam loop penting, hilangkan pemanggilan metode saat menentukan penghentian loop.
Misalnya: kemauan
for(int i=0; i<koleksi.ukuran();i++){ ... }
Ganti dengan…
for(int i=0; n=koleksi.ukuran();i<n;i++){...}
Biasanya, memindahkan item yang tidak terkait dengan indeks perulangan ke luar perulangan.
for(int i=0; terminal=x.panjang;i<terminal;i++){x[i] = x[i]/scaleA *scaleB;}
Seharusnya:
Skala ganda = scaleB*scaleA;for(int i=0; terminal=x.length;i<terminal;i++){x[i] = x[i]/scale;}
2. rangkaian
Hilangkan penggabungan string
Saat membuat string panjang, selalu gunakan StringBuffter, bukan String
Pra-alokasikan ruang StringBuffer StringBuffer sb = new StringBuffer(5000);
3. Tipe data dasar
Gunakan tipe data dasar dalam loop penting (data int biasanya lebih cepat daripada data panjang/ganda)
Kelas pembungkus tipe data dasar (Boolean, Integer, dll.) terutama digunakan ketika parameter metode yang diteruskan harus berupa referensi ke suatu objek (bukan tipe data dasar)
Gunakan pengubah final statis pada semua ekspresi aljabar konstan untuk membuat konstanta lebih mudah direferensikan (kompiler menghitung ekspresi konstanta terlebih dahulu)
4. abnormal
Pengecualian hanya digunakan untuk satu kondisi kesalahan yang sebenarnya sehingga melempar pengecualian dan mengeksekusi blok tangkapan akan memakan biaya yang mahal (terutama karena mendapatkan snapshot dari tumpukan thread saat membuat pengecualian)
Pengecualian dilempar hanya ketika kondisinya benar-benar luar biasa. Untuk memunculkan pengecualian, Anda terlebih dahulu membuat objek baru.
Konstruktor antarmuka Throwable memanggil metode asli bernama fillInStackTrace(). Metode fillInStackTrace() memeriksa tumpukan dan mengumpulkan informasi pelacakan panggilan.
Setiap kali pengecualian muncul, VM harus menyesuaikan tumpukan panggilan karena objek baru dibuat selama pemrosesan.
Pengecualian hanya boleh digunakan untuk penanganan kesalahan dan tidak boleh digunakan untuk mengontrol aliran program.
Lakukan optimasi compiler dan runtime dengan menempatkan beberapa pemanggilan metode dalam blok coba/tangkap alih-alih mengimplementasikan beberapa blok coba/tangkap untuk setiap pemanggilan metode
coba{ Some.method1(); //Sulit untuk java1.4 }catch(method1Exception e){ menangani pengecualian
1 // untuk mengoptimalkan kode ini } try{ Some.method2(); //Sulit untuk java1.4 }catch(method2Exception e){ menangani pengecualian
2 // untuk mengoptimalkan kode ini } try{ Some.method3(); //Sulit untuk java1.4 }catch(method3Exception e){ menangani pengecualian
3 // untuk mengoptimalkan kode ini
}
harus ditulis sebagai:
coba{ Some.method1(); Some.method2(); Some.method3(); //Sulit untuk java1.4 }catch(method1Exception e){ menangani pengecualian 1 }catch(method2Exception e){ menangani pengecualian 2 }catch( metode3Pengecualian e){ menangani pengecualian 3 }
5. tolok ukur
Perhatikan bahwa semua tip ini akan bervariasi antara platform dan mesin virtual
Misalnya: di beberapa container servlet, lebih cepat mengeluarkan byte melalui OutputStream
2. Di container lain, akan lebih cepat mengeluarkan karakter melalui PrintWriter
Kiat-kiat ini menjelaskan rekomendasi paling portabel
Anda mungkin perlu menjalankan beberapa tolok ukur untuk menentukan mana yang tercepat di platform Anda
6. Buat instance kelas tanpa menggunakan kata kunci baru
Saat Anda membuat instance kelas menggunakan kata kunci new, semua konstruktor dalam rantai konstruktor dipanggil secara otomatis.
Namun jika suatu objek mengimplementasikan antarmuka Cloneable, kita dapat memanggil metode clone() miliknya. Metode clone() tidak memanggil konstruktor kelas apa pun.
Saat menggunakan Pola Desain, jika Anda menggunakan mode Pabrik untuk membuat objek, sangat mudah menggunakan metode clone() untuk membuat instance objek baru.
Misalnya, berikut ini adalah implementasi khas dari pola Pabrik:
Kredit statis publik getNewCredit() { kembalikan Kredit baru();
Setelah pengoptimalan:
Kredit statis pribadi BaseCredit = Kredit baru(); Kredit statis publik getNewCredit() { return (Kredit) BaseCredit.clone();}
Ide di atas juga berguna untuk pemrosesan array.
7. Gunakan I/O non-pemblokiran
JDK dengan versi Java yang lebih rendah tidak mendukung API I/O non-pemblokiran. Untuk menghindari pemblokiran I/O, beberapa aplikasi membuat thread dalam jumlah besar (dalam kasus yang lebih baik, kumpulan buffer digunakan). Teknik ini dapat dilihat di banyak aplikasi yang harus mendukung aliran I/O secara bersamaan, seperti server Web, aplikasi penawaran dan lelang, dll. Namun, membuat thread Java memerlukan overhead yang besar.
JDK 1.4 memperkenalkan perpustakaan I/O non-pemblokiran (java.nio). Jika aplikasi Anda memerlukan JDK versi lama, ada paket yang mendukung I/O non-pemblokiran.
8. Jangan menginisialisasi variabel berulang kali
Secara default, saat memanggil konstruktor suatu kelas, Java akan menginisialisasi variabel ke nilai tertentu: semua objek disetel ke null, variabel integer (byte, short, int, long) disetel ke 0, dan variabel float dan double disetel ke 0,0, nilai logika disetel ke false.
Hal ini harus diperhatikan terutama ketika suatu kelas diturunkan dari kelas lain, karena ketika sebuah objek dibuat menggunakan kata kunci new, semua konstruktor dalam rantai konstruktor akan dipanggil secara otomatis.
9. Cobalah untuk menentukan pengubah akhir kelas
Kelas dengan pengubah akhir tidak diturunkan. Di Java core API, banyak contoh penerapan final, seperti java.lang.String. Menentukan final untuk kelas String mencegah orang mengganti metode length().
Selain itu, jika suatu kelas ditetapkan sebagai final, semua metode kelas tersebut akan bersifat final. Kompiler Java akan mencari peluang untuk memasukkan semua metode akhir (ini tergantung pada implementasi kompiler tertentu). Hal ini dapat meningkatkan kinerja rata-rata 50%.
10. Gunakan variabel lokal bila memungkinkan
Parameter yang diteruskan saat memanggil metode dan variabel sementara yang dibuat selama panggilan disimpan di tumpukan (Stack), yang lebih cepat. Variabel lain, seperti variabel statis, variabel instan, dll., dibuat di Heap dan lebih lambat. Selain itu, bergantung pada kompiler/JVM tertentu, variabel lokal dapat dioptimalkan lebih lanjut. Lihat Menggunakan Variabel Tumpukan Jika Memungkinkan.
11. Perkalian dan pembagian
Perhatikan kode berikut:
untuk (val = 0; val < 100000; val +=5) { alterX = val * 8; Hasil saya = val * 2;
Setelah pengoptimalan:
untuk (val = 0; val <100000; val += 5) { alterX = val << 3; Hasil saya = val << 1;
Kode yang dimodifikasi tidak lagi melakukan operasi perkalian dengan 8, melainkan menggunakan operasi setara dengan menggeser 3 bit ke kiri. Setiap pergeseran ke kiri sebesar 1 bit setara dengan mengalikan dengan 2. Sejalan dengan itu, operasi pergeseran ke kanan sebesar 1 bit setara dengan membagi dengan 2. Perlu disebutkan bahwa meskipun operasi shiftnya cepat, ini mungkin membuat kode lebih sulit untuk dipahami, jadi sebaiknya tambahkan beberapa komentar.
Kredit statis pribadi BaseCredit = Kredit baru(); Kredit statis publik getNewCredit() {pengembalian (Kredit) BaseCredit.clone();}