Detail Optimasi Kode
1. Cobalah untuk menentukan bahwa pengubah akhir kelas dan metode. Kelas dengan pengubah akhir dengan pengubah akhir tidak dapat diturunkan. Di Java Core API, ada banyak contoh menerapkan final, seperti java.lang.string, dan seluruh kelas adalah final. Menentukan pengubah akhir untuk suatu kelas dapat mencegah kelas diwarisi, dan menentukan pengubah akhir untuk suatu metode dapat mencegah metode tersebut menjadi ditimpa. Jika kelas ditentukan sebagai final, semua metode kelas itu bersifat final. Kompiler Java akan mencari peluang untuk melapisi semua metode terakhir. Inline sangat penting untuk meningkatkan efisiensi operasi Java.
2. Cobalah untuk menggunakan kembali penggunaan objek, terutama objek string. Ketika gabungan string terjadi, StringBuilder/StringBuffer harus digunakan sebagai gantinya. Karena mesin virtual Java tidak hanya perlu menghabiskan waktu menghasilkan objek, mereka mungkin juga perlu menghabiskan waktu pengumpulan sampah dan memproses objek -objek ini di masa depan, menghasilkan terlalu banyak objek akan memiliki dampak besar pada kinerja program.
3. Gunakan variabel lokal untuk memanggil metode sebanyak mungkin. Parameter berlalu ketika metode panggilan dan variabel sementara yang dibuat dalam panggilan disimpan di tumpukan lebih cepat. Variabel lain, seperti variabel statis, variabel instance, dll., Dibuat di tumpukan, dan kecepatannya lebih lambat. Selain itu, karena variabel yang dibuat dalam tumpukan selesai, konten ini hilang dan tidak diperlukan pengumpulan sampah tambahan.
4. Tutup Aliran Dalam Waktu
Selama pemrograman Java, berhati -hatilah saat melakukan koneksi basis data dan operasi streaming I/O. Setelah digunakan, tutup tepat waktu untuk melepaskan sumber daya. Karena pengoperasian benda -benda besar ini akan menyebabkan overhead sistem besar, dan jika Anda tidak hati -hati, itu akan menyebabkan konsekuensi serius.
5. Cobalah untuk meminimalkan perhitungan variabel berulang, klarifikasi konsep. Bahkan jika hanya ada satu kalimat dalam metode ini, masih dikonsumsi, termasuk membuat bingkai tumpukan, melindungi situs saat memanggil metode, dan memulihkan situs saat memanggil metode tersebut. Jadi misalnya, operasi berikut:
untuk (inti = 0; i <list.size (); i ++)
{...} disarankan untuk menggantinya dengan:
untuk (inti = 0, length = list.size (); i <panjang; i ++)
{...}
Dengan cara ini, ketika list.size () sangat besar, ini mengurangi banyak konsumsi
6. Cobalah untuk mengadopsi strategi pemuatan malas, yaitu, buat saat dibutuhkan
7. Gunakan kelainan dengan hati -hati akan merugikan kinerja. Untuk melempar pengecualian, Anda harus terlebih dahulu membuat objek baru. Konstruktor antarmuka yang dapat dilempar memanggil metode sinkronisasi lokal bernama FillInstackTrace (). Metode FillInstackTrace () memeriksa tumpukan dan mengumpulkan informasi jejak panggilan. Selama pengecualian dilemparkan, mesin virtual Java 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.
8. Jangan gunakan coba ... tangkap ... di loop, itu harus ditempatkan di lapisan terluar
Menurut pendapat yang diajukan oleh netizens, saya pikir ini layak dibahas
9. Jika Anda dapat memperkirakan panjang konten yang akan ditambahkan, tentukan panjang awal untuk kelas pengumpulan dan alat yang diimplementasikan dalam array, seperti arraylist, Linkedllist, StringBuilder, StringBuffer, hashmap, hashset, dll. Ambil StringBuilder sebagai contoh:
(1) StringBuilder() // Default to allocate 16 characters (2) StringBuilder(int size) // Default to allocate 16 characters (3) StringBuilder(String str) // Default to allocate 16 characters + str.length() character space You can set its initialization capacity through the constructor of the class (here we refer not only to the StringBuilder above), which can significantly improve performance. Misalnya, StringBuilder, panjang mewakili jumlah karakter yang dapat dipertahankan oleh StringBuilder saat ini. Karena ketika StringBuilder mencapai kapasitas maksimumnya, ia akan meningkatkan kapasitasnya menjadi 2 kali dan menambahkan 2. Setiap kali StringBuilder mencapai kapasitas maksimumnya, ia harus membuat array karakter baru dan menyalin konten array karakter lama ke array karakter baru - ini adalah operasi yang sangat memakan kinerja. Bayangkan saja, jika Anda dapat memperkirakan bahwa 5000 karakter disimpan dalam array karakter tanpa menentukan panjangnya, kekuatan 2 terdekat dengan 5000 adalah 4096, dan 2 ditambahkan ke setiap ekspansi terlepas dari 2, lalu: lalu:
(1) Berdasarkan 4096, berlaku untuk array karakter berukuran 8194, yang menambah array karakter berukuran 12290 sekaligus. Jika Anda dapat menentukan array karakter berukuran 5000 di awal, itu akan menghemat lebih dari dua kali ruang (2) menyalin 4096 karakter asli ke dalam array karakter baru dengan cara ini, yang tidak hanya akan membuang ruang memori tetapi juga mengurangi efisiensi operasi kode. Oleh karena itu, tidak salah untuk menetapkan kapasitas inisialisasi yang masuk akal untuk kelas pengumpulan dan alat yang diterapkan dalam array yang mendasarinya, yang akan membawa hasil langsung. Namun, perhatikan bahwa koleksi seperti hashmap yang diimplementasikan dalam array + daftar tertaut tidak boleh mengatur ukuran awal sama dengan ukuran perkiraan Anda, karena kemungkinan hanya satu objek yang terhubung ke tabel hampir 0. Disarankan untuk menetapkan ukuran awal ke N.
10. Saat menyalin sejumlah besar data, gunakan perintah System.ArrayCopy ()
11. Penggandaan dan Divisi Penggunaan Operasi Shift
12. Jangan membuat referensi objek terus menerus di loop
Misalnya:
untuk (inti = 1; i <= count; i ++) {objek obj = newObject (); }Pendekatan ini akan menyebabkan referensi objek objek hitungan ada di memori. Jika jumlahnya besar, itu akan mengkonsumsi memori. Disarankan untuk mengubahnya menjadi:
Objek obj = null; for (inti = 0; i <= count; i ++) {obj = newObject ();} Dengan cara ini, hanya ada satu referensi objek objek dalam memori. Setiap kali objek baru () digunakan, referensi objek objek menunjuk ke objek yang berbeda, tetapi hanya ada satu objek dalam memori, yang sangat menghemat ruang memori.
13. Berdasarkan pertimbangan efisiensi dan pemeriksaan jenis, array harus digunakan sebanyak mungkin. ArrayList harus digunakan hanya ketika ukuran array tidak dapat ditentukan.
14. Coba gunakan HashMap, ArrayList, dan StringBuilder. Kecuali jika utas-aman mengharuskannya, tidak disarankan untuk menggunakan hashtable, vector, dan stringBuffer. Tiga yang terakhir memiliki overhead kinerja karena penggunaan mekanisme sinkronisasi.
15. Jangan menyatakan array sebagai final statis publik
Karena ini tidak ada artinya, ini hanya mendefinisikan referensi sebagai final statis, dan konten array masih dapat diubah sesuka hati. Mendeklarasikan array sebagai publik adalah kerentanan keamanan, yang berarti bahwa array dapat diubah oleh kelas eksternal
16. Coba gunakan singleton dalam kesempatan yang sesuai. Menggunakan singleton dapat mengurangi beban beban, mempersingkat waktu pemuatan, dan meningkatkan efisiensi pemuatan. Namun, tidak semua tempat cocok untuk singleton. Sederhananya, singleton terutama berlaku untuk tiga aspek berikut:
(1) Mengontrol penggunaan sumber daya, mengontrol akses bersamaan sumber daya melalui sinkronisasi utas (2) mengontrol pembuatan instance untuk mencapai tujuan menghemat sumber daya (3) mengontrol berbagi data, dan memungkinkan komunikasi antara beberapa proses atau utas yang tidak terkait tanpa membangun asosiasi langsung tanpa membangun hubungan langsung.
17. Cobalah menghindari menggunakan variabel statis sesuka hati
kelas publik A {private static b b b = newB (); } Pada saat ini, siklus hidup variabel statis B sama dengan kelas A. Jika Kelas A tidak dihapus, objek B yang ditunjuk oleh Referensi B akan berada dalam memori sampai program berakhir
18. Clear tidak lagi membutuhkan sesi dalam waktu. Untuk menghapus tidak lagi sesi aktif, banyak server aplikasi memiliki batas waktu sesi default, umumnya 30 menit. Ketika server aplikasi perlu menyimpan lebih banyak sesi, jika ada memori yang tidak mencukupi, sistem operasi akan mentransfer sebagian data ke disk. Server aplikasi juga dapat membuang beberapa sesi yang tidak aktif ke disk sesuai dengan algoritma MRU (paling sering digunakan baru -baru ini), dan bahkan dapat melemparkan pengecualian memori yang tidak memadai. Jika sesi ini akan dibuang ke disk, itu harus diserialisasi terlebih dahulu. Dalam kelompok berskala besar, objek serial itu mahal. Oleh karena itu, ketika sesi tidak lagi diperlukan, metode httpsession yang tidak valid () harus dipanggil tepat waktu untuk menghapus sesi.
19. Untuk koleksi yang mengimplementasikan antarmuka acak, seperti arraylist, Anda harus menggunakan loop yang paling umum daripada loop foreach untuk melintasi ini direkomendasikan oleh JDK kepada pengguna. Penjelasan JDK API tentang antarmuka acak ACCACCESS adalah: mengimplementasikan antarmuka acak ACCEACCESS digunakan untuk menunjukkan bahwa itu mendukung akses acak cepat. Tujuan utama antarmuka ini adalah untuk memungkinkan algoritma umum mengubah perilaku mereka, sehingga dapat memberikan kinerja yang baik ketika diterapkan pada daftar akses acak atau berkelanjutan. Pengalaman praktis menunjukkan bahwa jika contoh kelas yang mengimplementasikan antarmuka acak ACCHACKESS diakses secara acak, efisiensi menggunakan loop biasa akan lebih tinggi daripada menggunakan loop foreach; Sebaliknya, jika diakses secara berurutan, akan lebih efisien untuk menggunakan iterator. Anda dapat menggunakan kode yang mirip dengan yang berikut untuk membuat penilaian:
if (list instanceOfrandomAccess) {for (inti = 0; i <list.size (); i ++) {}} else {iterator <?> iterator = list.iterable (); while (iterator.hasnext ()) {iterator.next ()}} Prinsip implementasi yang mendasari loop foreach adalah iterator, sehingga paruh kedua kalimat "pada gilirannya, jika diakses secara berurutan, menggunakan iterator akan lebih efisien" berarti bahwa instance kelas yang diakses secara berurutan, dan menggunakan loop foreach untuk melintasi.
20. Menggunakan blok kode yang disinkronkan alih-alih metode sinkronisasi telah dijelaskan dengan sangat jelas dalam artikel Blok Metode Kunci yang disinkronkan dalam modul multi-threaded. Kecuali dapat ditentukan bahwa seluruh metode perlu disinkronkan, cobalah menggunakan blok kode yang disinkronkan untuk menghindari menyinkronkan kode -kode yang tidak perlu disinkronkan, yang mempengaruhi efisiensi eksekusi kode.
21. Nyatakan konstanta sebagai final statis dan beri nama mereka dalam modal sehingga konten ini dapat dimasukkan ke dalam kumpulan konstan selama kompilasi, menghindari perhitungan nilai konstan yang dihasilkan selama runtime. Selain itu, menyebutkan nama konstanta dalam modal juga dapat memfasilitasi perbedaan antara konstanta dan variabel
22. Jangan membuat beberapa objek yang tidak digunakan, jangan mengimpor beberapa kelas yang tidak digunakan
Ini tidak masuk akal. Jika "nilai variabel lokal saya tidak digunakan" dan "impor java.util tidak pernah digunakan" muncul dalam kode, maka harap hapus konten yang tidak berguna ini
23. Hindari menggunakan refleksi selama operasi program. Untuk informasi lebih lanjut, silakan lihat refleksi. Refleksi adalah fungsi yang sangat kuat yang disediakan oleh Java kepada pengguna. Fungsi yang kuat seringkali berarti efisiensi rendah. Tidak disarankan untuk menggunakan mekanisme refleksi dalam proses menjalankan program, terutama metode Invoke metode. Jika memang perlu, pendekatan sugestif adalah untuk membuat objek melalui refleksi dan memasukkannya ke dalam memori ketika proyek dimulai - pengguna hanya peduli dengan kecepatan respons tercepat saat berinteraksi dengan rekan, dan tidak peduli berapa lama waktu yang dibutuhkan proyek rekan untuk memulai.
24. Gunakan kumpulan koneksi database dan kumpulan utas, kedua kumpulan, digunakan untuk menggunakan kembali objek. Yang pertama dapat menghindari sering membuka dan penutupan koneksi, dan yang terakhir dapat menghindari seringnya penciptaan dan penghancuran benang.
25. Gunakan aliran input dan output buffered untuk operasi IO
Aliran input dan output buffered, yaitu bufferedreader, bufferedwriter, bufferedInputStream, bufferedoutputStream, yang dapat sangat meningkatkan efisiensi IO
26. Gunakan ArrayList untuk adegan dengan penyisipan lebih berurutan dan akses acak, dan gunakan LinkedList untuk adegan dengan lebih banyak penghapusan elemen dan penyisipan menengah.
Ini diketahui dengan memahami prinsip -prinsip arraylist dan linkedlist
27. Jangan biarkan terlalu banyak parameter formal dalam metode publik
Metode publik adalah metode yang disediakan untuk dunia luar. Jika Anda memberikan metode ini terlalu banyak parameter formal, ada dua kelemahan utama:
1) Melanggar ide pemrograman yang berorientasi objek. Java menekankan bahwa semuanya adalah objek. Terlalu banyak parameter formal tidak sejalan dengan ide pemrograman yang berorientasi objek.
2) Terlalu banyak parameter yang pasti akan menyebabkan peningkatan probabilitas kesalahan dalam panggilan metode. Adapun berapa banyak "terlalu banyak" mengacu pada, 3 atau 4. Misalnya, kami menggunakan JDBC untuk menulis metode insertStudentInfo. Ada 10 bidang informasi siswa yang harus dimasukkan ke dalam tabel siswa. 10 parameter ini dapat dienkapsulasi dalam kelas entitas sebagai parameter formal dari metode INSERT.
28. Saat menulis variabel string dan konstanta string sama, itu adalah trik yang relatif umum untuk menulis konstanta string di depan. Jika ada kode berikut:
String str = "123"; if (str.equals ("123")) {...} Disarankan untuk memodifikasinya menjadi:
String str = "123"; if ("123" .Equals (str)) {...} Ini terutama dapat menghindari pengecualian penunjuk nol
32. Jangan memaksa transformasi ke bawah dari tipe data dasar di luar ruang lingkup
33. Konversi tipe data dasar menjadi string. Tipe Data Dasar.
publicstatic void main (string [] args) {intlooptime = 50000; Integer I = 0; longstarttime = system.currentTimemillis (); untuk (intj = 0; j <looptime; j ++) {string str = string.valueof (i); } System.out.println ("String.ValueOf ():" + (System.CurrentTimeMillis () - StartTime) + "MS"); startTime = system.currentTimeMillis (); untuk (intj = 0; j <looptime; j ++) {string str = i.toString (); } System.out.println ("Integer.ToString ():" + (System.CurrentTimeMillis () - StartTime) + "ms"); startTime = system.currentTimeMillis (); untuk (intj = 0; j <looptime; j ++) {string str = i+""; } System.out.println ("i + /" /":" + (System.currentTimeMillis () - startTime) + "ms");}Hasil berjalan adalah:
String.ValueOf (): 11MSInteger.ToString (): 5ms + "": 25ms
Oleh karena itu, ketika Anda mengonversi tipe data dasar menjadi string di masa depan, Anda harus memberikan prioritas untuk menggunakan metode ToString (). Adapun mengapa, ini sangat sederhana:
1. Metode string.valueof () disebut metode integer.tostring () di bagian bawah, tetapi itu akan membuat penilaian singkat sebelum menelepon.
2. Saya tidak akan berbicara tentang metode integer.tostring (), saya akan menyebutnya secara langsung.
3. Lapisan bawah i + "" menggunakan StringBuilder untuk mengimplementasikannya. Pertama -tama gunakan metode append untuk menyambungkannya, dan kemudian gunakan metode tostring () untuk mendapatkan string. Ini jelas merupakan 2 tercepat, yang tercepat 1, dan 3 yang paling lambat.
Di atas adalah semua konten artikel ini. Saya berharap ini akan membantu untuk pembelajaran semua orang dan saya harap semua orang akan lebih mendukung wulin.com.