Mengoptimalkan program melalui spesifikasi kode Java, mengoptimalkan penggunaan memori, dan mencegah kebocoran memori
Sumber daya yang tersedia untuk program untuk memanfaatkan (memori, waktu CPU, bandwidth jaringan, dll.) Terbatas. Optimalisasi biasanya mencakup dua aspek: Mengurangi ukuran kode dan meningkatkan efisiensi kode yang berjalan. Artikel ini terutama membahas cara meningkatkan efisiensi kode.
Dalam program Java, sebagian besar alasan masalah kinerja tidak ada dalam bahasa Java, tetapi dalam program itu sendiri. Sangat penting untuk mengembangkan kebiasaan menulis kode yang baik, seperti dengan benar dan secara cerdik menerapkan kelas java.lang.string dan java.util.vector class, yang secara signifikan dapat meningkatkan kinerja program. Mari kita analisis masalah ini secara rinci di bawah ini.
1. Cobalah untuk menentukan bahwa pengubah akhir kelas.
Di Java Core API, ada banyak contoh penerapan final, seperti java.lang.string. Menentukan final untuk kelas string mencegah orang menimpa metode panjang (). Selain itu, jika kelas ditentukan sebagai final, semua metode kelas itu bersifat final. Kompiler Java akan mencari peluang untuk menyambung semua metode akhir (ini terkait dengan implementasi kompiler spesifik). Langkah ini dapat meningkatkan kinerja dengan rata -rata 50%.
2. Cobalah untuk menggunakan kembali objek.
Terutama saat menggunakan objek string, StringBuffer digunakan sebagai gantinya ketika gabungan string terjadi. Karena sistem tidak hanya membutuhkan waktu untuk menghasilkan objek, mungkin juga membutuhkan waktu untuk mengumpulkan dan memproses objek -objek ini di masa depan. Oleh karena itu, menghasilkan terlalu banyak objek akan memiliki dampak besar pada kinerja program.
3. Coba gunakan variabel lokal.
Variabel lain, seperti variabel statis, variabel instance, dll., Dibuat di tumpukan dan lebih lambat. Selain itu, variabel lokal dapat dioptimalkan lebih lanjut tergantung pada kompiler/JVM spesifik. Lihat "Gunakan variabel tumpukan bila memungkinkan".
4. Jangan mengulangi inisialisasi variabel <br /> secara default, saat memanggil konstruktor kelas, java akan menginisialisasi variabel ke nilai tertentu: semua objek diatur ke null, variabel integer (byte, pendek, int, long) set ke 0, float dan variabel ganda diatur ke 0,0, dan nilai logis diatur ke false. Ini harus sangat diperhatikan ketika suatu kelas berasal dari yang lain, karena ketika suatu objek dibuat dengan kata kunci baru, semua konstruktor dalam rantai konstruktor secara otomatis dipanggil.
5. Dalam pengembangan Java + Oracle Application System, cobalah menggunakan bentuk huruf besar di Java untuk mengurangi beban penguraian oracle parser.
6. Selama pemrograman Java, berhati -hatilah saat melakukan koneksi basis data dan operasi streaming I/O.
Karena pengoperasian benda -benda besar ini akan menyebabkan overhead sistem besar, dan jika Anda tidak hati -hati, itu akan menyebabkan konsekuensi serius.
7. Karena JVM memiliki mekanisme GC sendiri, ia tidak memerlukan terlalu banyak pertimbangan dari pengembang program, yang mengurangi beban pengembang sampai batas tertentu, tetapi juga kehilangan bahaya tersembunyi. Dalam sistem. Dalam kasus yang parah, kebocoran memori akan disebabkan, jadi sangat penting untuk memastikan daur ulang objek yang sudah kadaluwarsa tepat
Kondisi untuk JVM untuk mendaur ulang sampah adalah bahwa objek tidak dirujuk; Oleh karena itu, disarankan agar kami secara manual mengaturnya ke nol setelah objek digunakan.
8. Saat menggunakan mekanisme sinkronisasi, cobalah menggunakan sinkronisasi metode alih -alih sinkronisasi blok kode.
9. Minimalkan perhitungan berulang variabel <br /> misalnya: untuk (int i = 0; i <list.size; i ++) {
...
}
Harus diganti dengan:
untuk (int i = 0, int len = list.size (); i <len; i ++) {
...
}
10. Cobalah untuk mengadopsi strategi pemuatan malas, yaitu, mulailah membuat saat dibutuhkan.
Misalnya: string str = "aaa";
if (i == 1) {
list.add (str);
}
Harus diganti dengan:
if (i == 1) {
String str = "aaa";
list.add (str);
}
11. Gunakan kelainan dengan hati -hati
Kelainan tidak baik untuk kinerja. Untuk melempar pengecualian, Anda harus terlebih dahulu membuat objek baru. Konstruktor antarmuka yang dapat dilempar memanggil metode lokal (asli) bernama FillInstackTrace (), dan metode FillInstackTrace () memeriksa tumpukan dan mengumpulkan informasi jejak panggilan. Selama pengecualian dilemparkan, VM harus menyesuaikan tumpukan panggilan karena objek baru dibuat selama pemrosesan. Pengecualian hanya dapat digunakan untuk penanganan kesalahan dan tidak boleh digunakan untuk mengontrol aliran program.
12. Jangan menggunakannya dalam satu lingkaran:
Mencoba {
} menangkap() {
}
Itu harus ditempatkan pada lapisan terluar.
13. Penggunaan StringBuffer:
StringBuffer mewakili string variabel, writable.
Ada tiga metode konstruksi:
StringBuffer (); // Default Dialokasikan 16 Karakter Ruang
StringBuffer (ukuran int);
StringBuffer (String str); // Tetapkan 16 karakter + str.length () Ruang karakter Anda dapat mengatur kapasitas inisialisasi melalui konstruktor StringBuffer, yang secara signifikan dapat meningkatkan kinerja.
Konstruktor yang disebutkan di sini adalah StringBuffer (panjang int), dan parameter panjang menunjukkan jumlah karakter yang dapat dipegang oleh StringBuffer saat ini. Anda juga dapat menggunakan metode EnsureCapacity (Int Minimum Capasity) untuk mengatur kapasitasnya setelah objek StringBuffer dibuat. Pertama, mari kita lihat perilaku default StringBuffer, dan kemudian temukan cara yang lebih baik untuk meningkatkan kinerja.
StringBuffer mempertahankan array karakter secara internal. Ketika StringBuffer mencapai kapasitas maksimumnya, ia akan meningkatkan kapasitasnya hingga 2 kali kapasitas saat ini dan menambahkan 2, yaitu (2*nilai lama +2). Jika Anda menggunakan nilai default, setelah inisialisasi, lalu tambahkan karakter ke dalamnya. hingga 70 (2*34+2). Apa pun yang terjadi, selama StringBuffer mencapai kapasitas maksimumnya, ia harus membuat array karakter baru dan kemudian menyusun kembali karakter lama dan baru. Oleh karena itu, tidak salah untuk selalu menetapkan nilai kapasitas inisialisasi yang masuk akal untuk StringBuffer, yang akan membawa perolehan kinerja segera. Ini menunjukkan peran menyesuaikan proses inisialisasi StringBuffer. Jadi, menggunakan nilai kapasitas yang sesuai untuk menginisialisasi StringBuffer selalu merupakan saran yang optimal.
14. Gunakan Java Class Java.util.vector secara wajar.
Sederhananya, vektor adalah array dari java.lang.Object Instances. Vektor mirip dengan array, dan elemen -elemennya dapat diakses melalui indeks dalam bentuk bilangan bulat. Namun, setelah pembuatan objek jenis vektor, ukuran objek dapat diperluas dan dikurangi sesuai dengan penambahan atau penghapusan elemen. Harap pertimbangkan contoh berikut dari menambahkan elemen ke vektor:
Objek bj = objek baru ();
Vektor v = vektor baru (100000);
untuk (int i = 0;
I <100000;
Kecuali jika ada alasan yang benar -benar cukup untuk meminta elemen baru dimasukkan di depan vektor setiap saat, kode di atas buruk untuk kinerja. Dalam konstruktor default, kapasitas penyimpanan awal vektor adalah 10 elemen. Kelas vektor seperti kelas StringBuffer Object. Cuplikan kode berikut adalah pesanan besarnya lebih cepat dari contoh sebelumnya:
Objek bj = objek baru ();
Vektor v = vektor baru (100000);
untuk (int i = 0; i <100000; i ++) {v.add (obj);
Aturan yang sama berlaku untuk metode REMOP () dari kelas vektor. Karena setiap elemen dalam vektor tidak dapat berisi "ruang" antara setiap elemen, menghapus elemen lain kecuali elemen terakhir menyebabkan elemen setelah elemen yang dihapus bergerak maju. Artinya, menghapus elemen terakhir dari vektor beberapa kali lebih sedikit "overhead" daripada menghapus elemen pertama.
Dengan asumsi bahwa kami ingin menghapus semua elemen dari vektor sebelumnya, kami dapat menggunakan kode ini:
untuk (int i = 0; i <100000; i ++)
{
V.Remove (0);
}
Namun, dibandingkan dengan kode berikut, kode sebelumnya adalah pesanan besarnya lebih lambat:
untuk (int i = 0; i <100000; i ++)
{
v.remove (v.size ()-1);
}
Cara terbaik untuk menghapus semua elemen dari objek V tipe vektor adalah:
V.RemoveAllelements ();
Misalkan objek v vektor tipe berisi string "halo". Pertimbangkan kode berikut, yang menghapus string "halo" dari vektor ini:
String s = "halo";
int i = v.indexof (s);
if (i! = -1) v.remove (s);
Kode ini terlihat tidak salah, tetapi juga buruk untuk kinerja. Dalam kode ini, metode indexOf () mencari V secara berurutan untuk menemukan string "Hello", dan metode RemeCE (s) juga perlu mencari dalam urutan yang sama. Versi yang ditingkatkan adalah:
String s = "halo";
int i = v.indexof (s);
if (i! = -1) v.remove (i);
Dalam versi ini, kami secara langsung memberikan posisi indeks yang tepat dari elemen yang akan dihapus dalam metode Remove (), sehingga menghindari pencarian kedua. Versi yang lebih baik adalah:
String s = "halo";
Akhirnya, mari kita lihat cuplikan kode tentang kelas vektor:
untuk (int i = 0; i ++; i <v.length)
Jika V berisi 100.000 elemen, cuplikan kode ini akan menghubungi metode V.Size () 100.000 kali. Meskipun metode ukuran adalah metode sederhana, masih membutuhkan overhead dari panggilan metode, setidaknya JVM perlu mengkonfigurasi dan menghapus lingkungan tumpukan untuk itu. Di sini, kode di dalam loop for tidak akan memodifikasi ukuran objek tipe vektor V dengan cara apa pun, sehingga kode di atas paling baik ditulis ulang ke dalam bentuk berikut:
ukuran int = v.size (); untuk (int i = 0; i ++; i <ukuran)
Meskipun ini adalah perubahan sederhana, masih memenangkan kinerja. Bagaimanapun, setiap siklus CPU sangat berharga.
15. Saat menyalin sejumlah besar data, gunakan perintah System.ArrayCopy ().
16. Kode refactoring: Tingkatkan keterbacaan kode .
Misalnya:
kelas publik shopcart {private list carts;… public void add (item objek) {if (carts == null) {carts = new arraylist ();} crts.add (item);} public void hapus (item objek) {if (carts. berisi (item)) {carts.remove (item);}} Daftar publik getCarts () {// mengembalikan daftar balas-only collections.unmodifiaBleList (carts);} // metode ini tidak direkomendasikan // ini GetCarts (). Tambah (item);} 17. Buat instance kelas tanpa menggunakan kata kunci baru
Saat membuat instance kelas dengan kata kunci baru, semua konstruktor dalam rantai konstruktor akan dipanggil secara otomatis. Tetapi jika suatu objek mengimplementasikan antarmuka yang dapat dikloning, kita dapat memanggil metode klon (). Metode klon () tidak memanggil konstruktor kelas apa pun.
Saat menggunakan pola desain, jika Anda menggunakan mode pabrik untuk membuat objek, sangat mudah untuk menggunakan metode klon () untuk membuat instance objek baru. Misalnya, berikut ini adalah implementasi khas dari pola pabrik:
kredit statis public getNewCredit () {
mengembalikan kredit baru ();
}
Kode yang ditingkatkan menggunakan metode klon () sebagai berikut:
Kredit Statis Pribadi Basecredit = Kredit Baru ();
kredit statis public getNewCredit () {
pengembalian (kredit) basecredit.clone ();
}
Gagasan di atas juga sangat berguna untuk pemrosesan array.
18. Perkalian dan Divisi
Pertimbangkan kode berikut:
untuk (val = 0; val <100000; val += 5) {
alterx = val * 8;
}
Mengganti perkalian dengan operasi shift dapat sangat meningkatkan kinerja. Ini kode yang dimodifikasi:
untuk (val = 0; val <100000; val += 5) {
alterx = val << 3;
}
Kode yang dimodifikasi tidak lagi berlipat ganda dengan 8, tetapi sebaliknya menggunakan shift kiri yang setara dengan 3 bit, dengan 1 bit per shift kiri setara dengan dikalikan dengan 2. Dengan demikian, pergeseran kanan dengan operasi 1 bit setara dengan membagi dengan 2. Perlu disebutkan bahwa meskipun operasi shift cepat, mungkin membuat kode sulit dipahami, jadi yang terbaik adalah menambahkan beberapa komentar.
19. Tutup sesi yang tidak berguna di halaman JSP.
Kesalahpahaman yang umum adalah bahwa sesi ini dibuat ketika ada akses klien. , Gunakan <> untuk menutupnya. Karena sesi mengkonsumsi sumber daya memori, jika Anda tidak berencana untuk menggunakan sesi, Anda harus menutupnya di semua JSP.
Untuk halaman yang tidak perlu melacak status sesi, penutupan sesi yang dibuat secara otomatis dapat menyimpan beberapa sumber daya. Gunakan Petunjuk halaman berikut: <%@ page session = "false"%>
20. JDBC dan I/O
Jika suatu aplikasi perlu mengakses dataset skala besar, Anda harus mempertimbangkan untuk menggunakan ekstraksi blok. Secara default, JDBC mengekstrak 32 baris data setiap kali. Sebagai contoh, misalkan kita ingin melintasi set rekaman 5000 baris, JDBC harus menghubungi basis data 157 kali sebelum dapat mengekstrak semua data. Jika ukuran blok diubah menjadi 512, jumlah panggilan ke database akan dikurangi menjadi 10 kali.
21. Penggunaan Servlet dan Memori <BR /> Banyak pengembang menyimpan sejumlah besar informasi ke sesi pengguna sesuka hati. Terkadang, benda -benda yang disimpan dalam sesi tidak didaur ulang oleh mekanisme pengumpulan sampah tepat waktu. Dari perspektif kinerja, gejala yang khas adalah bahwa pengguna merasa bahwa sistem melambat secara berkala, tetapi tidak dapat menghubungkan alasannya dengan komponen tertentu. Jika Anda memantau ruang tumpukan JVM, itu dimanifestasikan sebagai fluktuasi penggunaan memori yang tidak normal.
Ada dua cara utama untuk menyelesaikan masalah memori jenis ini. Metode pertama adalah mengimplementasikan antarmuka httpsessionBindingListener di semua kacang dengan ruang lingkup sesi. Dengan cara ini, selama metode ValueUnbound () diimplementasikan, sumber daya yang digunakan oleh kacang dapat secara eksplisit dirilis.
Cara lain adalah dengan membatalkan sesi sesegera mungkin. Sebagian besar server aplikasi memiliki opsi untuk mengatur interval pembatalan sesi. Selain itu, metode setMaxInactiveInterval () sesi juga dapat disebut secara terprogram.
22. Gunakan tanda buffer
Beberapa server aplikasi telah menambahkan fungsi penandaan buffer untuk JSP. Misalnya, BEA's WebLogic Server mendukung fitur ini sejak versi 6.0, dan proyek Open Symphony juga mendukung fitur ini. Tag buffering JSP dapat buffer kedua fragmen halaman dan seluruh halaman. Ketika halaman JSP dieksekusi, jika fragmen target sudah ada di buffer, kode yang menghasilkan fragmen tidak perlu lagi dieksekusi. Penggerak Level Level Menangkap Permintaan ke URL yang ditentukan dan buffer seluruh halaman hasil. Fitur ini sangat berguna untuk keranjang belanja, katalog, dan beranda portal. Untuk aplikasi tersebut, buffering tingkat halaman dapat menyimpan hasil eksekusi halaman untuk permintaan berikutnya.
23. Pilih mekanisme kutipan yang tepat
Dalam sistem aplikasi JSP yang khas, bagian header dan footer sering diekstraksi, dan kemudian header dan footer diperkenalkan sesuai kebutuhan. Saat ini, ada dua metode utama untuk memperkenalkan sumber daya eksternal ke dalam halaman JSP: termasuk arahan dan termasuk tindakan.
Sertakan Directive: Misalnya < %@ termasuk file = "copyright.html" %>. Petunjuk ini memperkenalkan sumber daya yang ditentukan pada waktu kompilasi. Sebelum kompilasi, halaman dengan arahan termasuk dan sumber daya yang ditentukan digabungkan ke dalam file. Sumber daya eksternal yang direferensikan ditentukan pada waktu kompilasi, yang lebih efisien daripada menentukan sumber daya saat runtime.
Sertakan Tindakan: Misalnya <JSP: Sertakan halaman = "Copyright.jsp" />. Tindakan ini memperkenalkan hasil yang dihasilkan setelah halaman yang ditentukan dieksekusi. Karena selesai saat runtime, kontrol hasil output lebih fleksibel. Namun, hanya hemat biaya untuk digunakan termasuk tindakan ketika konten yang dikutip sering diubah, atau ketika halaman yang dirujuk tidak dapat ditentukan sebelum permintaan untuk halaman utama muncul.
24. Clear No Lagi Diperlukan Sesi dalam Waktu
Untuk menghapus sesi yang tidak lagi aktif, banyak server aplikasi memiliki batas waktu sesi default, biasanya 30 menit. Ketika server aplikasi perlu menyimpan lebih banyak sesi, jika kapasitas memori tidak cukup, sistem operasi akan mentransfer sebagian data memori ke disk. Simpan ke disk dan bahkan mungkin membuang pengecualian "di luar memori". Dalam sistem skala besar, sesi serialisasi mahal. Ketika sesi tidak lagi diperlukan, metode httpsession.Invalidate () harus dipanggil tepat waktu untuk menghapus sesi. Metode httpsession.invalidate () biasanya dapat dipanggil pada halaman keluar aplikasi.
25. Jangan menyatakan array sebagai: final statis publik.
26. Diskusi tentang efisiensi traversal hashmap
Sering ada operasi traversal pada pasangan kunci dan nilai di hashmap, dan ada dua metode: peta <string, string []> paramap = baru
HashMap <String, String []> (); ............ // Set loop pertama <string> applFieldDefids = paramap.keyset (); ] values = paramap.get (appieldDefid); ......} // loop kedua untuk (entri <string, string []> entri: paramap.entryset ()) {string appieldDefid = entry.getKey ( ); String [] values = entry.getValue (); .......} Implementasi pertama secara signifikan kurang efisien daripada implementasi kedua.
Analisis adalah sebagai berikut set <string> applfieldDefids = paramap.keyset ();
Kodenya adalah sebagai berikut:
set publik <k> keyset () {set <k> ks = keyset; return (ks! = null? ks: (keyset = new keyset ()));} Keyset kelas pribadi memperluas Abstractset <K> {Public iterator <K <K > iterator () {return newKeyIterator ();} public int size () {return size;} public boolean berisi (objek o) {return containskey (o);} boolean publik hapus (objek o) {return hashmap.this.removeentrykey (o)! = null;} public void clear () {hashmap.this.clear ();}}Bahkan, ia mengembalikan kunci kelas pribadi, yang diwarisi dari Abstractset dan mengimplementasikan antarmuka yang ditetapkan.
Mari kita lihat sintaksis untuk/di loop
untuk (deklarasi: ekspresi)
penyataan
Selama fase eksekusi, diterjemahkan ke dalam formula berikut
untuk (iterator <E> #i = (ekspresi) .iterator (); #i.hashNext ();) {
deklarasi = #i.next ();
penyataan
}
Oleh karena itu, hashmap.keyset (). Iterator () dipanggil dalam pernyataan pertama untuk (String AppieldDefid: AppieldDefids)
Metode ini memanggil newKeyiterator ()
Iterator <k> newKeyiterator () {
mengembalikan keyiterator baru ();
}
KeyIterator kelas pribadi memperluas Hashiterator <K> {
publik k next () {
kembalikan nextEntry (). getKey ();
}
}
Jadi di FOR, iterator yang digunakan di loop kedua untuk (entri <string, string []> entri: paramap.entryset ()) disebut sebagai berikut.
baik
Entriditerator kelas pribadi memperluas hashiterator <map.entry <k, v >> {
Public Map.entry <k, v> next () {
kembalikan nextEntry ();
}
}
Pada saat ini, loop pertama mendapatkan kunci, dan loop kedua mendapatkan efisiensi masuk hashmap adalah bahwa loop kedua tercermin dalam loop. Gunakan Get (Kunci Objek) HashMap untuk mendapatkan nilai nilai sekarang lihat metode Get (Kunci Objek) HashMap
public v get (kunci objek) {
Objek k = masknull (kunci);
int hash = hash (k);
int i = indexfor (hash, table.length); // tabel entri []
Entri <k, v> e = tabel;
while (true) {
if (e == null)
kembali nol;
if (e.hash == hash && eq (k, e.key))
mengembalikan nilai E.;
E = E.Next;
}
}
Bahkan, itu adalah menggunakan nilai hash untuk mendapatkan entri yang sesuai lagi untuk membandingkan dan mendapatkan hasilnya.
Pada loop kedua memperoleh nilai entri dan kemudian secara langsung mengambil kunci dan nilai, yang lebih efisien daripada loop pertama. Bahkan, menurut konsep peta, harus lebih baik menggunakan loop kedua.
27. Penggunaan array (array) dan arrylist
Array ([]): Yang paling efisien; tetapi kapasitasnya diperbaiki dan tidak dapat diubah secara dinamis;
ArrayList: Kapasitas dapat tumbuh secara dinamis; tetapi efisiensi pengorbanan;
Berdasarkan efisiensi dan jenis verifikasi, array harus digunakan sebanyak mungkin.
ArrayList adalah versi array yang kompleks
ArrayList merangkum array tipe objek metode array.
Ketika ArrayList menyimpan suatu objek, informasi jenis dibuang dan semua objek diblokir sebagai objek.
Catatan: JDK5 telah menambahkan dukungan untuk obat generik, dan jenis pemeriksaan dapat dilakukan saat menggunakan ArrayList.
Dari sudut pandang ini, perbedaan antara arraylist dan array terutama disebabkan oleh efisiensi peningkatan kapasitas dinamis.
28. Cobalah untuk menggunakan hashmap dan arraylist .
29. Perbedaan antara StringBuffer dan StringBuilder:
Java.lang.StringBuffer Urutan karakter yang dapat diubah oleh Thread-Safe. Buffer string seperti string, tetapi tidak dapat dimodifikasi.
StringBuilder. Dibandingkan dengan kelas ini, kelas Java.lang.stringbuilder biasanya lebih disukai karena mendukung semua operasi yang sama, tetapi lebih cepat karena tidak melakukan sinkronisasi. Untuk kinerja yang lebih baik, kapasitas pengaduk atau pengaduk harus ditentukan sebanyak mungkin. Tentu saja, jika string yang Anda operasikan tidak melebihi 16 karakter, Anda tidak akan membutuhkannya. Dalam kasus yang sama, menggunakan StirngBuilder hanya dapat mencapai sekitar 10% -15% peningkatan kinerja dibandingkan dengan menggunakan StringBuffer, tetapi membutuhkan risiko multi-threading tidak aman. Dalam pemrograman modular nyata, programmer yang bertanggung jawab untuk modul tertentu mungkin tidak dapat dengan jelas menentukan apakah modul akan dimasukkan ke dalam lingkungan multi-threaded, jadi: kecuali Anda dapat menentukan bahwa hambatan sistem Anda ada di stringbuffer, dan Pastikan modul Anda tidak akan berjalan dalam mode multithreaded, jika tidak gunakan StringBuffer.
Suplemen Lainnya:
1. Bersihkan objek yang tidak lagi digunakan dalam waktu dan diatur ke nol
2. Gunakan kata kunci final, statis dan lainnya sebanyak mungkin
3. Gunakan benda buffered sebanyak mungkin
Cara mengoptimalkan kode untuk membuat file sumber java dan file kelas yang dikompilasi lebih kecil
1 Cobalah menggunakan warisan. Semakin banyak metode yang Anda warisi, semakin sedikit kode yang ingin Anda tulis.
2 Buka opsi optimasi kompiler java: javac -o opsi ini akan menghapus nomor baris dalam file kelas dan mendeklarasikan beberapa metode segmen kecil pribadi, statis, dan akhir sebagai panggilan metode inline
3 Ekstrak kode umum
4 Jangan menginisialisasi array besar. Disimpan dalam array, Anda pertama -tama dapat memasukkan data ini ke dalam string, dan kemudian menguraikan string ke dalam array selama runtime
5. Jenis tanggal objek akan memakan banyak ruang.
tipe panjang, lalu konversi ke jenis tanggal saat digunakan
6. Coba gunakan nama pendek untuk nama kelas, nama metode dan nama variabel.
7 Tentukan variabel tipe akhir statis ke dalam antarmuka
8 Jika operasi aritmatika dapat digunakan untuk gerakan kiri / kanan, jangan gunakan * dan / operasi.
2. Jangan menginisialisasi variabel dua kali
Java menginisialisasi variabel ke nilai yang diketahui secara default dengan memanggil konstruktor kelas yang unik. Semua objek diatur ke null, bilangan bulat (byte, pendek, int, long) diatur ke 0, float dan double diatur ke 0,0, dan variabel boolean diatur ke false. Ini sangat penting untuk kelas yang meluas dari kelas lain, sama seperti semua rangkaian konstruktor secara otomatis dipanggil saat membuat objek menggunakan kata kunci baru.
3. Buat final kelas sedapat mungkin
Kelas yang ditandai final tidak dapat diperpanjang. Ada banyak contoh teknologi ini di Java API inti, seperti java.lang.string. Menandai kelas string sebagai final mencegah pengembang dari menciptakan metode panjang yang mereka terapkan sendiri.
Singkatnya, jika kelasnya final, semua metode kelas adalah final. Kompiler Java dapat menyambung semua metode (ini tergantung pada implementasi kompiler). Dalam tes saya, saya telah melihat peningkatan kinerja rata -rata sebesar 50%.
9. Pengecualian dilemparkan ke tempat yang perlu dilemparkan.
coba {some.method1 (); (Method2Exception e) {// Tangani Exception 2} coba {some.method3 (); Kode yang telah diunduh lebih mudah dioptimalkan oleh kompiler
coba {some.method1 (); Catch (Method3Exception E) {// Tangani Pengecualian 3}
10. Optimalisasi untuk Loop
Mengganti…
untuk (int i = 0; i <collection.size (); i ++) {
...
}
dengan…
untuk (int i = 0, n = collection.size (); i <n; i ++) {
...
}
5. Dalam pengembangan Sistem Aplikasi Java + Oracle, cobalah menggunakan pernyataan SQL yang tertanam dalam bentuk dalam Java untuk mengurangi beban parser Oracle Parser.
10. Cobalah untuk mengadopsi strategi pemuatan malas, yaitu, mulailah membuat saat dibutuhkan.
Misalnya: string str = "aaa";
if (i == 1) {
list.add (str);
}
Harus diganti dengan:
if (i == 1) {
String str = "aaa";
list.add (str);
}
12. Jangan menggunakannya dalam satu lingkaran:
Mencoba {
} menangkap() {
}
Itu harus ditempatkan di lapisan terluar
Di atas adalah semua tentang artikel ini.
Harap luangkan waktu untuk berbagi artikel dengan teman Anda atau tinggalkan komentar. Kami akan dengan tulus berterima kasih atas dukungan Anda!