Contoh dalam artikel ini merangkum teknik pengoptimalan kinerja Java. Bagikan dengan semua orang untuk referensi Anda. Analisis spesifiknya adalah sebagai berikut:
Di sini kami mengacu pada beberapa buku dan sumber jaringan, yang cocok untuk sebagian besar aplikasi Java.
Dalam program JAVA, sebagian besar penyebab masalah kinerja bukan terletak pada bahasa JAVA, namun pada program itu sendiri. Mengembangkan kebiasaan coding yang baik sangatlah penting dan dapat meningkatkan kinerja program secara signifikan.
1. Coba gunakan pengubah terakhir.
Kelas dengan pengubah akhir tidak diturunkan. Pada API inti JAVA banyak contoh penerapan final, seperti java.lang.String. Menentukan final untuk kelas String mencegah pengguna mengganti metode length(). Selain itu, jika suatu kelas bersifat final, semua metode kelas tersebut 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%.
2. Cobalah untuk menggunakan kembali benda-benda.
Terutama ketika menggunakan objek String, StringBuffer harus digunakan ketika penggabungan string terjadi. Karena sistem tidak hanya harus menghabiskan waktu untuk menghasilkan objek, sistem mungkin juga perlu menghabiskan waktu mengumpulkan sampah dan memproses objek-objek ini di masa depan. Oleh karena itu, menghasilkan terlalu banyak objek akan berdampak besar pada kinerja program.
3. Coba gunakan variabel lokal.
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.
4. 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 disetel ke 0, variabel float dan double disetel ke 0,0, dan nilai logika disetel ke PALSU. 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.
Ada catatan di sini. Saat menyetel nilai awal untuk variabel anggota tetapi perlu memanggil metode lain, yang terbaik adalah memasukkannya ke dalam metode seperti initXXX(), karena memanggil metode secara langsung untuk menetapkan nilai dapat menghasilkan nilai nol. pengecualian pointer karena kelas belum diinisialisasi. public int state = this.getState();
5. Dalam pengembangan sistem aplikasi Java+Oracle, bahasa SQL yang tertanam di Java harus menggunakan huruf besar sebanyak mungkin untuk mengurangi beban parsing parser Oracle.
6. Selama proses pemrograman Java, lakukan koneksi database dan operasi aliran I/O. Setelah digunakan, tutup tepat waktu untuk melepaskan sumber daya. Karena pengoperasian pada objek berukuran besar tersebut akan menyebabkan banyak overhead sistem.
7. Pembuatan objek yang berlebihan akan menghabiskan sejumlah besar memori sistem, dan dalam kasus yang parah, dapat menyebabkan kebocoran memori. Oleh karena itu, sangat penting untuk memastikan daur ulang objek yang kedaluwarsa secara tepat waktu.
GC JVM tidak terlalu pintar, jadi disarankan untuk mengaturnya secara manual ke null setelah objek digunakan.
8. Saat menggunakan mekanisme sinkronisasi, coba gunakan sinkronisasi metode daripada sinkronisasi blok kode.
9. Minimalkan penghitungan ganda variabel.
Misalnya
untuk(int i=0;i<daftar.ukuran();i++)
harus dimodifikasi menjadi
untuk(int i=0,len=daftar.ukuran();i<len;i++)
10. Terapkan strategi berkreasi hanya saat Anda membutuhkannya.
Misalnya:
String str="abc";if(i==1){ daftar.tambahkan(str);}
Harus dimodifikasi menjadi:
if(i==1){String str="abc"; daftar.tambahkan(str);}
11. Gunakan pengecualian dengan hati-hati, karena pengecualian merugikan kinerja.
Melempar pengecualian terlebih dahulu akan membuat objek baru. Konstruktor antarmuka Throwable memanggil metode lokal 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.
12. Jangan gunakan pernyataan Try/Catch dalam loop. Try/Catch harus ditempatkan pada level terluar dari loop.
Error adalah kelas untuk mendapatkan kesalahan sistem, atau kesalahan mesin virtual. Tidak semua pengecualian kesalahan dapat diperoleh. Jika mesin virtual melaporkan kesalahan Pengecualian, Anda harus menggunakan Error untuk mendapatkannya.
13. Mengatur kapasitas awal StringBuffer melalui konstruktornya dapat meningkatkan kinerja secara signifikan.
Kapasitas default StringBuffer adalah 16. Ketika kapasitas StringBuffer mencapai kapasitas maksimum, maka kapasitasnya akan ditingkatkan menjadi 2 kali + 2 dari kapasitas saat ini, yaitu 2*n+2. Setiap kali StringBuffer mencapai kapasitas maksimumnya, dia harus membuat array objek baru dan kemudian menyalin array objek lama, yang membuang banyak waktu. Oleh karena itu, perlu untuk menetapkan nilai kapasitas awal yang wajar untuk StringBuffer!
14. Gunakan java.util.Vector secara wajar.
Vektor mirip dengan StringBuffer. Setiap kali kapasitas diperluas, semua elemen yang ada harus ditugaskan ke ruang penyimpanan baru. Kapasitas penyimpanan default Vector adalah 10 elemen, dan kapasitasnya menjadi dua kali lipat.
vector.add(index,obj) Metode ini dapat memasukkan elemen obj ke posisi indeks, tetapi indeks dan elemen berikutnya harus dipindahkan ke bawah sebanyak satu posisi (menambah indeksnya sebesar 1). Buruk untuk kinerja kecuali diperlukan.
Aturan yang sama berlaku untuk metode hapus(int indeks), yang menghapus elemen pada posisi tertentu dalam vektor ini. Geser semua elemen berikutnya ke kiri (kurangi indeksnya sebesar 1). Mengembalikan elemen yang dihapus dari vektor ini. Oleh karena itu, menghapus elemen terakhir dari vektor jauh lebih murah dibandingkan menghapus elemen pertama. Cara terbaik adalah menggunakan metode deleteAllElements() untuk menghapus semua elemen.
Jika Anda ingin menghapus suatu elemen dalam vektor, Anda dapat menggunakan vector.remove(obj); Anda tidak perlu mengambil sendiri posisi elemen lalu menghapusnya, seperti int index = indexOf(obj); indeks);
15. Saat menyalin data dalam jumlah besar, gunakan System.arraycopy();
16. Pemfaktoran ulang kode untuk meningkatkan keterbacaan kode.
17. Membuat instance objek tanpa menggunakan kata kunci new.
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.
Berikut ini adalah implementasi khas dari pola Pabrik.
public static Credit getNewCredit(){ return new Credit();} Kode yang ditingkatkan menggunakan metode clone(), private static Credit BaseCredit = new Credit(); public static Credit getNewCredit(){ return (Credit)BaseCredit.clone(); ;}
18. Jika perpindahan dapat digunakan untuk perkalian dan pembagian, maka perpindahan harus digunakan semaksimal mungkin, namun sebaiknya ditambahkan komentar, karena operasi perpindahan tidak intuitif dan sulit untuk dipahami.
19. Jangan mendeklarasikan array sebagai: public static final.
20. penjelajahan HaspMap.
Peta<String, String[]> paraMap = new HashMap<String, String[]>();for( Entri<String, String[]> entri : paraMap.entrySet() ){ String appFieldDefId = entri.getKey(); String[] nilai = entri.getValue();}
Gunakan nilai hash untuk mengambil Entri yang sesuai untuk perbandingan guna mendapatkan hasil. Setelah mendapatkan nilai entri, langsung dapatkan kunci dan nilainya.
21. Penggunaan larik (array) dan ArrayList.
Array array adalah yang paling efisien, namun kapasitasnya tetap dan tidak dapat diubah secara dinamis. Kapasitas ArrayList dapat ditingkatkan secara dinamis, namun efisiensinya dikorbankan.
22. Thread tunggal harus mencoba menggunakan HashMap dan ArrayList. Kecuali diperlukan, tidak disarankan untuk menggunakan HashTable dan Vector.
23. Perbedaan antara StringBuffer dan StringBuilder adalah: java.lang.StringBuffer adalah rangkaian karakter variabel thread-safe. Buffer string mirip dengan String, tetapi tidak dapat dimodifikasi. StringBuilder Kelas StringBuilder umumnya harus digunakan sebagai preferensi terhadap kelas ini karena mendukung semua operasi yang sama, namun lebih cepat karena tidak melakukan sinkronisasi. Untuk mendapatkan performa yang lebih baik, Anda harus mencoba menentukan kapasitasnya saat membuat StringBuffer atau StringBuilder. Tentu saja tidak perlu jika tidak melebihi 16 karakter.
Dalam situasi yang sama, penggunaan StringBuilder hanya dapat mencapai peningkatan kinerja 10% hingga 15% dibandingkan penggunaan StringBuffer, namun akan menimbulkan risiko ketidakamanan multi-threading. Setelah pertimbangan menyeluruh, disarankan untuk menggunakan StringBuffer.
24. Cobalah untuk menggunakan tipe data dasar daripada objek.
25. Gunakan penghitungan numerik sederhana daripada penghitungan fungsi yang rumit , seperti mencari tabel untuk menyelesaikan soal fungsi trigonometri.
26. Menggunakan analogi konkrit lebih efisien dibandingkan menggunakan antarmuka, namun fleksibilitas strukturalnya berkurang, namun IDE modern dapat mengatasi masalah ini.
27. Pertimbangkan untuk menggunakan metode statis
Jika Anda tidak perlu mengakses bagian luar objek, jadikan metode Anda statis. Ini akan dipanggil lebih cepat karena tidak memerlukan tabel panduan fungsi virtual. Rekan ini juga merupakan praktik yang baik, karena dia memberi tahu Anda cara membedakan sifat metode, memanggil metode ini tidak akan mengubah keadaan objek.
28. Penggunaan metode GET dan SET intrinsik harus dihindari sebisa mungkin.
Dalam pemrograman Android, pemanggilan metode virtual akan menimbulkan banyak biaya, yang lebih mahal daripada kueri atribut instan. Kita sebaiknya hanya menggunakan metode get dan set ketika melakukan panggilan outsourcing, namun ketika melakukan panggilan secara internal, kita harus memanggil mereka secara langsung.
29. Hindari penggunaan enumerasi dan angka floating point.
30. Array dua dimensi memakan lebih banyak ruang memori dibandingkan array satu dimensi, sekitar 10 kali perhitungan.
31. Basis data SQLite membaca semua data di seluruh tabel dengan sangat cepat, tetapi kueri bersyarat membutuhkan waktu 30-50 MS. Saat melakukan ini, setiap orang harus memperhatikan untuk menggunakannya sesedikit mungkin, terutama penelusuran bersarang!
Saya harap artikel ini bermanfaat untuk pemrograman Java semua orang.