Sebagian besar pengembang percaya bahwa optimasi kinerja adalah masalah yang relatif kompleks dan membutuhkan banyak pengalaman dan pengetahuan. Ya, tidak ada yang salah dengan itu. Diakui, mengoptimalkan aplikasi Anda untuk kinerja terbaik bukanlah tugas yang mudah, tetapi itu tidak berarti Anda tidak dapat melakukan apa pun tanpa mendapatkan pengalaman dan pengetahuan ini. Berikut adalah beberapa tips dan praktik terbaik yang mudah diikuti yang dapat membantu Anda membuat aplikasi yang berkinerja baik.
Sebagian besar saran ini berbasis Java, tetapi tidak harus, dan beberapa dapat diterapkan pada semua aplikasi dan bahasa pemrograman. Sebelum kami berbagi tips tuning kinerja berbasis Java, mari kita bahas tips tuning kinerja umum ini.
1. Jangan mengoptimalkan sebelum perlu
Ini mungkin salah satu tipe tuning kinerja terpenting. Anda harus mengikuti praktik terbaik umum dan mencoba mengimplementasikan kasus penggunaan Anda secara efektif. Tapi itu tidak berarti mengganti perpustakaan standar atau membangun optimasi yang kompleks sebelum membuktikan bahwa itu perlu.
Dalam kebanyakan kasus, optimasi prematur memakan banyak waktu, membuat kode sulit dibaca dan dipelihara. Lebih buruk lagi, optimasi ini biasanya tidak membawa manfaat karena Anda menghabiskan banyak waktu mengoptimalkan bagian non-kritis dari aplikasi Anda.
Jadi, bagaimana Anda membuktikan bahwa Anda perlu mengoptimalkan sesuatu?
Pertama, Anda perlu menentukan kecepatan kode aplikasi Anda, misalnya, menentukan waktu respons maksimum untuk semua panggilan API, atau menentukan jumlah catatan yang akan diimpor pada rentang waktu tertentu. Setelah selesai, Anda dapat mengukur bagian mana dari aplikasi yang terlalu lambat untuk ditingkatkan. Setelah melakukan ini, kemudian terus lihat ujung tuning kedua.
2. Gunakan penganalisa untuk menemukan hambatan nyata
Setelah Anda mengikuti nasihat pertama dan menentukan bahwa beberapa bagian dari aplikasi Anda perlu perbaikan, tanyakan pada diri sendiri dari mana harus memulai?
Anda dapat menyelesaikan masalah ini dengan dua cara:
Adapun mengapa metode kedua harus selalu diikuti.
Jawabannya harus jelas, dan pendekatan berbasis penganalisa akan memungkinkan Anda untuk lebih memahami kinerja kode Anda dan memungkinkan Anda untuk fokus pada bagian yang paling penting. Jika Anda pernah menggunakan parser, Anda akan terkejut di bagian mana dari kode yang menyebabkan masalah kinerja. Namun, berkali -kali, tebakan pertama Anda akan membawa Anda ke arah yang salah.
3. Buat rangkaian uji kinerja untuk seluruh aplikasi
Ini adalah trik umum lain untuk membantu Anda menghindari banyak masalah tak terduga yang sering terjadi setelah peningkatan kinerja digunakan ke lingkungan produksi. Anda harus sering mendefinisikan rangkaian uji kinerja yang menguji seluruh aplikasi dan menjalankannya sebelum dan sesudah Anda menyelesaikan peningkatan kinerja.
Uji tambahan ini akan membantu Anda mengidentifikasi dampak fungsional dan kinerja dari perubahan dan memastikan Anda tidak merilis pembaruan yang lebih merugikan daripada kebaikan. Ini sangat penting jika tugas Anda berjalan pada beberapa bagian aplikasi yang berbeda, seperti database atau cache.
4. Pertama selesaikan masalah kemacetan terbesar
Setelah membuat suite tes dan menggunakan penganalisa untuk menganalisis aplikasi, Anda memiliki daftar pertanyaan yang perlu meningkatkan kinerja, yang bagus, tetapi masih belum menjawab pertanyaan di mana Anda harus memulai. Anda dapat mulai dengan yang dapat dilakukan dengan cepat, atau mulai dengan pertanyaan paling penting.
Tentu saja yang pertama sangat menggoda karena akan segera menghasilkan hasil. Terkadang, mungkin perlu meyakinkan anggota tim lain atau manajemen Anda bahwa analisis kinerja sepadan.
Namun secara keseluruhan, saya sarankan mulai dengan masalah kinerja yang paling penting terlebih dahulu. Ini akan memberi Anda peningkatan kinerja terbesar, dan Anda mungkin hanya perlu memperbaiki beberapa masalah ini untuk menyelesaikan kebutuhan kinerja Anda.
Setelah memahami teknik penyetelan kinerja umum, mari kita lihat lebih dekat beberapa teknik tuning khusus Java.
5. Gunakan StringBuilder untuk secara terprogram menghubungkan string
Ada banyak opsi berbeda untuk menghubungkan string di Java. Misalnya, Anda dapat menggunakan + atau + = = stringBuffer tua atau stringbuilder.
Jadi, metode mana yang harus Anda pilih?
Jawabannya tergantung pada kode yang menghubungkan string. Jika Anda secara terprogram menambahkan konten baru ke string, misalnya, dalam loop untuk, Anda harus menggunakan StringBuilder. Lebih mudah digunakan dan memberikan kinerja yang lebih baik daripada StringBuffer. Tetapi ingat bahwa StringBuilder berbeda dari StringBuffer, itu tidak aman dan mungkin tidak cocok untuk semua kasus penggunaan.
Anda hanya perlu membuat instantiate stringBuilder baru dan memanggil metode append untuk menambahkan bagian baru ke string. Setelah Anda menambahkan semua bagian, Anda dapat menghubungi metode tostring () untuk mengambil string koneksi.
Cuplikan kode berikut menunjukkan contoh sederhana. Selama setiap iterasi, loop ini mengubah I menjadi string dan menambahkannya ke ruang StringBuilder SB, jadi pada akhirnya, kode ini ditulis ke "Ini adalah test0123456789" ke file log.
StringBuilder SB = StringBuilder baru ("Ini adalah tes"); untuk (int i = 0; i <10; i ++) {sb.append (i); SB.Append ("");} log.info (sb.tostring ());Seperti yang dapat Anda lihat di cuplikan kode, Anda dapat memberikan elemen pertama dari string untuk metode konstruktor. Ini akan membuat StringBuilder baru dengan string yang disediakan dan 16 kapasitas karakter tambahan. Saat Anda menambahkan lebih banyak karakter ke StringBuilder, JVM secara dinamis akan mengubah ukuran stringbuilder.
Jika Anda sudah tahu berapa banyak karakter yang dikandung string Anda, Anda dapat memberikan nomor ini untuk berbagai metode konstruktor untuk membuat instantiate stringbuilder dengan kapasitas yang ditentukan. Ini lebih lanjut meningkatkan efisiensinya karena tidak memerlukan secara dinamis memperluas kapasitasnya.
6. Gunakan +string koneksi dalam deklarasi
Saat Anda menerapkan aplikasi pertama Anda di Java, seseorang mungkin memberi tahu Anda bahwa Anda tidak boleh menggunakan + untuk menggabungkan string. Ini benar jika Anda menghubungkan string dalam logika aplikasi. String tidak dapat diubah, dan hasil dari setiap gabungan string disimpan dalam objek string baru. Ini membutuhkan memori ekstra dan memperlambat aplikasi, terutama saat menggabungkan beberapa string dalam satu loop.
Dalam kasus ini Anda harus mengikuti Tip 5 dan menggunakan StringBuilder.
Tetapi jika Anda hanya memecah string menjadi beberapa baris untuk meningkatkan keterbacaan kode Anda, bukan itu masalahnya.
Kueri q = em.createqueery ("pilih a.id, a.firstname, a.lastname"+ "dari penulis a"+ "di mana a.id =: id");Dalam kasus ini, Anda harus menggunakan + sederhana untuk menggabungkan string Anda. Kompiler Java akan mengoptimalkannya dan melakukan koneksi pada waktu kompilasi. Oleh karena itu, saat runtime, kode hanya menggunakan 1 karakter dan tidak memerlukan gabungan.
7. Gunakan tipe data dasar sebanyak mungkin
Cara cepat lainnya untuk menghindari overhead, dan untuk meningkatkan kinerja aplikasi adalah dengan menggunakan tipe data primitif alih -alih kelas pembungkus mereka. Oleh karena itu, lebih baik menggunakan int daripada integer, atau ganda daripada ganda. Ini akan membiarkan JVM menyimpan nilai pada tumpukan untuk mengurangi konsumsi memori dan menanganinya lebih efisien.
8. Cobalah untuk menghindari Biginteger dan BigDecimal
Karena kita telah membahas tipe data, mari kita lihat Biginteger dan BigDecimal. Yang terakhir, khususnya, populer karena ketepatannya yang tinggi. Tapi ada harganya.
BigInteger dan BigDecimal membutuhkan lebih banyak memori daripada sederhana atau ganda dan sangat mengurangi semua kecepatan komputasi. Jadi, jika Anda membutuhkan presisi ekstra, atau angka Anda berada di luar jangkauan panjang, yang terbaik adalah berpikir dua kali sebelum melakukannya. Ini mungkin satu -satunya tempat yang perlu Anda ubah dalam masalah peningkatan kinerja Anda, terutama ketika Anda menerapkan algoritma matematika.
9. Pertama periksa level log saat ini
Saran ini jelas, tetapi sayangnya, Anda akan menemukan bahwa banyak kode mengabaikannya. Sebelum membuat pesan debug, Anda harus memeriksa level log saat ini terlebih dahulu.
Berikut adalah dua contoh untuk mengilustrasikan bahwa Anda tidak boleh melakukan ini.
// Jangan lakukan thislog.debug ("user [" + username + "] disebut metode x dengan [" + i + "]"); // atau thislog.debug (string.format ("pengguna [%s] disebut metode x dengan [%d]", username, i)));Dalam kedua kasus, Anda akan melakukan semua langkah yang Anda butuhkan untuk membuat pesan log tanpa mengetahui apakah kerangka log menggunakan pesan log. Sebelum membuat pesan debug, yang terbaik adalah memeriksa level log saat ini terlebih dahulu.
10. Gunakan Apache Commons Stringutils.replace bukan String.replace
Secara umum, metode string.
Salah satu kandidat adalah metode Stringutils.Replace Apache Commons Lang. Seperti yang dijelaskan Lukas Eder dalam posting blog baru -baru ini, itu sangat melebihi string. Replace Metode Java 8.
Itu hanya membutuhkan perubahan kecil. Anda hanya perlu menambahkan ketergantungan Maven ke aplikasi Anda pom.xml untuk proyek Apache's Commons Lang dan mengganti semua panggilan ke String.eeplace Metode dengan Metode Stringutils.Replace.
// ganti thistest.replace ("tes", "tes sederhana"); // dengan thisstringutils.replace (tes, "test", "tes sederhana");11. Sumber daya mahal cache, seperti koneksi database
Caching adalah solusi populer untuk menghindari eksekusi berulang cuplikan kode yang mahal atau sering digunakan. Gagasan umumnya sederhana: jauh lebih murah untuk menggunakan kembali sumber daya ini daripada membuat sumber daya baru lagi dan lagi.
Contoh khas adalah koneksi basis data cache dalam kumpulan. Membuat koneksi baru membutuhkan waktu dan dapat dihindari jika koneksi yang ada digunakan kembali.
Contoh lain juga dapat ditemukan dalam bahasa Java itu sendiri. Misalnya, nilai metode kelas integer menempati nilai antara -128 dan 127. Anda mungkin mengatakan bahwa membuat integer baru tidak terlalu mahal, tetapi sering digunakan, dan caching nilai yang paling umum digunakan memberikan manfaat kinerja.
Tetapi ketika Anda berpikir tentang caching, ingatlah bahwa implementasi cache juga dapat dikenakan overhead. Anda perlu menghabiskan memori tambahan untuk menyimpan sumber daya yang dapat digunakan kembali, sehingga Anda mungkin perlu mengelola cache Anda untuk memungkinkan sumber daya mengakses atau menghapus sumber daya yang sudah ketinggalan zaman.
Jadi, sebelum Anda mulai caching sumber daya apa pun, pastikan untuk sering menggunakannya.
Meringkaskan
Seperti yang Anda lihat, meningkatkan kinerja aplikasi Anda terkadang tidak memerlukan banyak pekerjaan. Sebagian besar saran dalam artikel ini sebenarnya membutuhkan sedikit upaya untuk menerapkannya pada kode.
Tetapi saran yang paling penting adalah bahwa itu sangat memprogram bahasa-independen:
Tautan Asli: 11 Tipe Tuning Kinerja Java Sederhana (Editor/Wei Wei)