Sebagian besar pengembang menerima begitu saja bahwa optimasi kinerja itu kompleks dan membutuhkan banyak pengalaman dan pengetahuan. Yah, tidak dapat dikatakan bahwa ini benar -benar salah. Mengoptimalkan aplikasi Anda untuk kinerja optimal bukanlah tugas yang mudah. Namun, ini tidak berarti bahwa Anda tidak dapat melakukan apa pun jika Anda tidak memiliki pengetahuan ini. Berikut adalah 11 tips yang mudah diikuti dan praktik terbaik untuk membantu Anda membuat aplikasi yang berkinerja baik.
Sebagian besar saran adalah untuk Java. Tetapi ada beberapa saran yang independen bahasa dan dapat diterapkan pada semua aplikasi dan bahasa pemrograman. Sebelum membahas teknik penyetelan kinerja khusus untuk Java, mari kita lihat tips umum.
1. Jangan mengoptimalkan sampai Anda tahu itu perlu
Ini mungkin salah satu tipe tuning kinerja terpenting. Anda harus mengikuti praktik terbaik umum dan mencoba mengimplementasikan kasus penggunaan Anda secara efisien. Namun, ini tidak berarti bahwa Anda harus mengganti perpustakaan standar atau membangun optimasi yang kompleks sebelum Anda membuktikan perlu.
Dalam kebanyakan kasus, optimasi prematur tidak hanya akan memakan banyak waktu, tetapi juga membuat kode sulit dibaca dan dipelihara. Lebih buruk lagi, optimisasi ini biasanya tidak membawa manfaat apa pun, karena apa yang Anda habiskan banyak waktu mengoptimalkan adalah bagian non-kritis dari aplikasi.
Jadi, bagaimana Anda membuktikan bahwa Anda perlu mengoptimalkan sesuatu?
Pertama, Anda perlu menentukan seberapa cepat kode aplikasi Anda, misalnya, menentukan waktu respons maksimum untuk semua panggilan API, atau menentukan jumlah catatan yang akan diimpor dalam kisaran waktu tertentu. Setelah Anda melakukan ini, Anda dapat mengukur bagian mana dari aplikasi yang terlalu lambat untuk ditingkatkan. Lalu, mari kita lihat trik kedua.
2. Gunakan penganalisa untuk menemukan hambatan nyata
Setelah Anda mengikuti saran pertama dan menentukan bahwa beberapa bagian aplikasi perlu perbaikan, lalu dari mana harus memulai?
Anda dapat menyelesaikan masalah dengan dua cara:
Lihat kode Anda dan mulailah dengan bagian yang terlihat mencurigakan atau Anda merasa mungkin bermasalah.
Atau gunakan penganalisa dan dapatkan informasi terperinci tentang perilaku dan kinerja setiap bagian dari kode.
Semoga saya tidak perlu menjelaskan mengapa saya harus selalu mengikuti metode kedua.
Jelas bahwa pendekatan berbasis parser memungkinkan Anda untuk lebih memahami dampak kinerja kode Anda dan memungkinkan Anda untuk fokus pada bagian yang paling penting. Jika Anda menggunakan parser, Anda harus ingat betapa terkejutnya Anda mengetahui bagian mana dari kode yang memiliki masalah kinerja. Sejujurnya, tebakan pertama saya telah membawa saya ke arah yang salah lebih dari sekali.
3. Buat rangkaian uji kinerja untuk seluruh aplikasi
Ini adalah tip universal lain yang dapat membantu Anda menghindari banyak masalah tak terduga yang sering terjadi setelah menggunakan peningkatan kinerja untuk produksi. Anda harus selalu mendefinisikan rangkaian uji kinerja yang menguji seluruh aplikasi dan menjalankannya sebelum dan sesudah peningkatan kinerja.
Uji tambahan ini akan membantu Anda mengidentifikasi efek samping fungsional dan kinerja dari yang diubah dan memastikan bahwa tidak ada kerugian dari pembaruan yang baik yang disebabkan. Ini sangat penting jika Anda mengerjakan komponen yang digunakan oleh beberapa bagian aplikasi yang berbeda, seperti database atau cache.
4. Kesepakatan pertama dengan kemacetan terbesar
Setelah membuat suite tes dan menganalisis aplikasi menggunakan penganalisa, Anda dapat mencantumkan berbagai masalah yang perlu ditangani untuk meningkatkan kinerja. Ini bagus, tetapi masih tidak menjawab pertanyaan di mana Anda harus memulai. Anda dapat fokus pada solusi tindakan cepat, atau mulai dengan pertanyaan paling penting.
Skema akting cepat dapat menarik pada awalnya karena Anda dapat dengan cepat menunjukkan hasil pertama. Tetapi kadang -kadang, Anda mungkin perlu meyakinkan anggota tim lain atau manajemen bahwa analisis kinerja sepadan - karena tidak ada efek saat ini.
Namun secara keseluruhan, saya merekomendasikan untuk menangani masalah kinerja yang paling penting terlebih dahulu. Ini akan memberi Anda peningkatan kinerja terbesar dan mungkin tidak perlu lagi menyelesaikan beberapa masalah ini untuk memenuhi persyaratan kinerja.
Kiat penyetelan kinerja umum berakhir di sini. Mari kita lihat lebih dekat beberapa tips khusus Java.
5. Gunakan StringBuilder untuk menghubungkan string secara terprogram
Ada banyak opsi berbeda untuk menghubungkan string di Java. Misalnya, Anda dapat menggunakan + atau + = =, serta StringBuffer atau StringBuilder.
Jadi, metode mana yang harus Anda pilih?
Jawabannya tergantung pada kode yang menghubungkan string. Jika Anda menambahkan konten baru ke string secara terprogram, misalnya dalam loop untuk, maka Anda harus menggunakan StringBuilder. Mudah digunakan dan menawarkan kinerja yang lebih baik daripada StringBuffer. Tetapi ingat bahwa dibandingkan dengan StringBuffer, StringBuilder 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 yang terhubung.
Cuplikan kode berikut menunjukkan contoh sederhana. Selama setiap iterasi, loop ini mengubah I ke string dan menambahkannya ke StringBuilder SB bersama dengan ruang. Jadi, pada akhirnya, kode ini akan menulis "Ini adalah test0 1 2 3 4 5 6 7 8 9" dalam 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 ke konstruktor. Ini akan membuat stringBuilder baru yang berisi string yang disediakan dan 16 karakter ekstra kapasitas. Saat Anda menambahkan lebih banyak karakter ke StringBuilder, JVM akan secara dinamis meningkatkan ukuran StringBuilder.
Jika Anda sudah tahu berapa banyak karakter yang akan dikandung string Anda, Anda dapat memberikan nomor itu kepada konstruktor yang berbeda untuk membuat instantiate stringbuilder dengan kapasitas yang ditentukan. Ini lebih lanjut meningkatkan efisiensi karena tidak memerlukan ekspansi dinamis dari kapasitasnya.
6. Gunakan + untuk menggabungkan string dalam sebuah pernyataan
Saat Anda menerapkan aplikasi pertama Anda di Java, seseorang mungkin telah memberi tahu Anda bahwa Anda tidak boleh menggunakan + untuk terhubung ke String. Jika Anda menggabungkan string dalam logika aplikasi, ini benar. String tidak dapat diubah, dan hasil gabungan setiap string disimpan dalam objek string baru. Ini membutuhkan memori ekstra dan akan memperlambat aplikasi Anda, terutama jika Anda menggabungkan beberapa string dalam satu loop.
Dalam kasus ini Anda harus mengikuti Tip 5 dan menggunakan StringBuilder.
Tetapi jika Anda hanya membagi string menjadi beberapa baris untuk meningkatkan keterbacaan kode Anda, itu berbeda.
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 mengoptimalkan ini dan melakukan koneksi pada waktu kompilasi. Jadi, saat runtime, kode Anda hanya akan menggunakan 1 string dan tidak diperlukan koneksi.
7. Gunakan primitif sebanyak mungkin
Cara lain yang mudah dan cepat untuk menghindari overhead dan meningkatkan kinerja aplikasi adalah dengan menggunakan tipe dasar alih -alih kelas pembungkusnya. Oleh karena itu, yang terbaik adalah menggunakan int daripada bilangan bulat dan ganda, bukan ganda. Ini memungkinkan JVM untuk menyimpan nilai pada tumpukan daripada tumpukan untuk mengurangi konsumsi memori dan membuat pemrosesan yang lebih efisien.
8. Cobalah untuk menghindari Biginteger dan BigDecimal
Karena kita sedang mendiskusikan tipe data, mari kita lihatlah BigInteger dan BigDecimal. Secara khusus, yang terakhir populer karena keakuratannya. Tapi ada harganya.
BigInteger dan BigDecimal membutuhkan lebih banyak memori daripada sederhana atau ganda dan akan secara signifikan memperlambat semua perhitungan. Jadi, jika Anda membutuhkan presisi ekstra, atau angka akan melebihi jarak jauh, yang terbaik adalah berpikir dua kali sebelum melakukannya. Ini mungkin satu -satunya cara yang perlu Anda ubah untuk menyelesaikan masalah kinerja, terutama saat menerapkan algoritma matematika.
9. Pertama periksa level log saat ini
Saran ini harus jelas, tetapi sayangnya, banyak programmer kebanyakan mengabaikannya saat menulis kode. Sebelum Anda membuat pesan debug, Anda harus selalu memeriksa level log saat ini terlebih dahulu. Jika tidak, Anda dapat membuat string pesan log yang akan diabaikan nanti.
Berikut adalah dua contoh negatif.
// 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 diperlukan untuk membuat pesan log tanpa mengetahui apakah kerangka log akan menggunakan pesan log. Oleh karena itu, yang terbaik adalah memeriksa level log saat ini sebelum membuat pesan debug.
// do thisif (log.isdebugeNabled ()) {log.debug ("user [" + username + "] disebut metode x dengan [" + i + "]");}10. Gunakan Apache Commons Stringutils.replace bukan String.replace
Secara umum, metode string.
Ada jawaban alternatif untuk Metode Apache Commons Lang. Seperti yang dijelaskan Lukas Eder dalam posting blog baru -baru ini, metode Stringutils.replace jauh lebih unggul daripada metode string.replace Java 8.
Dan itu hanya membutuhkan perubahan kecil. Artinya, tambahkan dependensi Maven dari proyek Apache Commons Lang ke aplikasi pom.xml, dan ganti semua panggilan ke metode string.replace 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 umum. Gagasan umumnya sederhana: lebih murah untuk menggunakan kembali sumber daya ini daripada berulang kali menciptakan sumber daya baru.
Contoh khas adalah koneksi database di kumpulan cache. Koneksi baru membutuhkan waktu untuk membuat, yang dapat dihindari jika Anda menggunakan kembali koneksi yang ada.
Anda juga dapat menemukan contoh lain 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 karena sering digunakan, caching nilai yang paling umum digunakan juga dapat memberikan manfaat kinerja.
Namun, ketika Anda mempertimbangkan 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 agar dapat diakses sumber daya, serta menghapus sumber daya yang sudah ketinggalan zaman.
Jadi, sebelum Anda mulai caching sumber daya apa pun, pastikan bahwa menerapkan cache itu sepadan, yaitu, Anda harus cukup menggunakannya.
Meringkaskan
Seperti yang Anda lihat, kadang -kadang tidak perlu banyak pekerjaan untuk meningkatkan kinerja aplikasi Anda. Sebagian besar saran dalam artikel ini hanya membutuhkan sedikit upaya untuk menerapkannya pada kode Anda.
Tetapi yang paling penting adalah trik yang tidak terkait dengan bahasa pemrograman apa itu:
Jangan mengoptimalkan penggunaan analisis untuk menemukan kemacetan nyata sebelum Anda tahu itu perlu. Penawaran pertama dengan hambatan terbesar.
Di atas adalah semua konten yang dibagikan dalam artikel ini tentang teknik tuning kinerja Java yang sangat sederhana dan mudah dipahami. Saya harap ini akan membantu semua orang. Teman yang tertarik dapat terus merujuk ke situs ini:
Java mengimplementasikan kode terperinci untuk berbagi fungsi platform publik WeChat Moments WeChat
Analisis Komparatif Contoh Kinerja Serialisasi Asli Java dan Serialisasi Kryo
Eksplorasi apakah subkelas pemrograman Java dapat menulis ulang metode statis dari kelas induk
Jika ada kekurangan, silakan tinggalkan pesan untuk menunjukkannya. Terima kasih teman atas dukungan Anda untuk situs ini!