Dua hari yang lalu, seorang rakan dalam kumpulan datang untuk berbual dengan saya semasa temu bual, dia ditanya cara membalas kaedah pengoptimuman prestasi. Artikel ini tertumpu terutamanya pada analisis teori Mari kita lihat secara keseluruhan peraturan yang boleh diikuti untuk pengoptimuman prestasi Java. .
Ikhtisar Pengoptimuman prestasi dibahagikan kepada pengoptimuman perniagaan dan pengoptimuman teknikal mengikut kategori pengoptimuman. Kesan pengoptimuman perniagaan juga sangat besar, tetapi ia tergolong dalam kategori produk dan pengurusan. Sebagai pengaturcara, dalam kerja harian kami, kaedah pengoptimuman yang kami hadapi adalah melalui satu siri cara teknikal untuk mencapai matlamat pengoptimuman yang ditetapkan. Secara kasar saya boleh meringkaskan siri cara teknikal ini ke dalam tujuh kategori berikut:
Pengoptimuman guna semula
Apabila menulis kod, anda akan mendapati terdapat banyak kod berulang yang boleh diekstrak dan dijadikan kaedah awam. Dengan cara ini, anda tidak perlu menulisnya lagi pada kali berikutnya anda menggunakannya.
Idea ini digunakan semula. Penerangan di atas adalah pengoptimuman logik pengekodan Untuk akses data, terdapat situasi penggunaan semula yang sama. Sama ada dalam kehidupan atau pengekodan, perkara yang berulang berlaku sepanjang masa Tanpa penggunaan semula, kerja dan kehidupan akan menjadi lebih memenatkan.
Dalam sistem perisian, apabila melibatkan penggunaan semula data, perkara pertama yang kita fikirkan ialah penimbalan dan caching. Perhatikan perbezaan antara kedua-dua perkataan ini adalah berbeza sama sekali.
Buffer biasanya digunakan untuk menyimpan data sementara dan kemudian memindahkan atau menulisnya dalam kelompok. Kaedah berurutan kebanyakannya digunakan untuk mengurangkan penulisan rawak yang kerap dan perlahan antara peranti yang berbeza terutamanya disasarkan pada operasi tulis.
Cache (Cache) sering digunakan untuk menggunakan semula data baca Dengan menyimpannya di kawasan berkelajuan tinggi, caching disasarkan terutamanya pada operasi baca.
Begitu juga, ini ialah operasi penggabungan objek, seperti kumpulan sambungan pangkalan data, kumpulan benang, dll., yang digunakan dengan sangat kerap di Jawa. Memandangkan kos penciptaan dan pemusnahan objek ini agak tinggi, kami juga akan menyimpan objek ini buat sementara waktu selepas menggunakannya.
Kini, dan kebanyakan perkakasan sedang membangun dengan sangat pantas Jika anda ingin mempercepatkan pelaksanaan tugas tertentu, penyelesaian terpantas dan terbaik ialah membiarkannya dilaksanakan secara selari. Terdapat tiga mod pelaksanaan selari:
Mod pertama ialah berbilang mesin, yang menggunakan pengimbangan beban untuk memisahkan trafik atau pengiraan besar kepada beberapa bahagian dan memprosesnya serentak. Sebagai contoh, Hadoop menggunakan MapReduce untuk memecahkan tugas dan melakukan pengiraan pada berbilang mesin pada masa yang sama.
Mod kedua ialah menggunakan pelbagai proses. Contohnya, Nginx menggunakan model pengaturcaraan NIO The Master menguruskan proses Worker secara bersatu, dan kemudian proses Worker melaksanakan proksi permintaan sebenar Ini juga boleh menggunakan berbilang CPU perkakasan.
Mod ketiga ialah menggunakan multi-threading, yang merupakan pengaturcara Java yang paling terdedah kepada. Netty, sebagai contoh, menggunakan model pengaturcaraan Reaktor dan juga menggunakan NIO, tetapi ia berasaskan benang. Urutan Boss digunakan untuk menerima permintaan dan kemudian menjadualkannya ke urutan Pekerja yang sepadan untuk pengiraan perniagaan sebenar.
Bahasa seperti Golang mempunyai coroutine yang lebih ringan ialah kewujudan yang lebih ringan daripada benang, tetapi ia masih belum matang di Jawa, jadi saya tidak akan memperkenalkannya terlalu banyak, tetapi pada asasnya, ia juga untuk aplikasi berbilang teras, membolehkan tugasan dilaksanakan secara selari.
Satu lagi pengoptimuman untuk pengkomputeran ialah menukar daripada segerak kepada tak segerak, yang biasanya melibatkan perubahan dalam model pengaturcaraan. Dalam mod segerak, permintaan akan disekat sehingga hasil kejayaan atau kegagalan dikembalikan. Walaupun model pengaturcaraannya mudah, ia amat bermasalah apabila berurusan dengan trafik yang tiba-tiba dan condong dalam tempoh masa, dan permintaan boleh gagal dengan mudah.
Operasi tak segerak boleh menyokong pengembangan mendatar dengan mudah, melegakan tekanan serta-merta dan permintaan yang lancar. Permintaan segerak adalah seperti penumbuk memukul plat keluli; Anda boleh bayangkan proses ini, yang terakhir pastinya fleksibel dan pengalamannya lebih mesra pengguna.
Yang terakhir ialah menggunakan beberapa corak reka bentuk biasa untuk mengoptimumkan perniagaan dan meningkatkan pengalaman, seperti mod tunggal, mod proksi, dsb. Contohnya, semasa melukis tetingkap Swing, jika anda ingin memaparkan lebih banyak gambar, anda boleh memuatkan pemegang tempat dahulu, dan kemudian memuatkan sumber yang diperlukan secara perlahan melalui benang latar belakang, yang boleh mengelakkan tetingkap daripada membeku.
Seterusnya, kami akan memperkenalkan pengoptimuman set hasil. Untuk memberikan contoh yang lebih intuitif, kita semua tahu bahawa bentuk perwakilan XML adalah sangat baik, jadi mengapa masih ada JSON? Selain lebih mudah untuk ditulis, sebab penting ialah saiznya menjadi lebih kecil, dan kecekapan penghantaran dan kecekapan penghuraian menjadi lebih tinggi Seperti Protobuf Google, saiznya lebih kecil. Walaupun kebolehbacaan dikurangkan, kecekapan boleh dipertingkatkan dengan ketara dalam beberapa senario konkurensi tinggi (seperti RPC), yang merupakan pengoptimuman tipikal set hasil.
Ini kerana perkhidmatan web semasa kami semuanya dalam mod C/S. Apabila data dihantar dari pelayan kepada pelanggan, beberapa salinan perlu diedarkan Jumlah data berkembang dengan cepat Setiap kali jumlah storan yang kecil dikurangkan, akan terdapat peningkatan yang ketara dalam prestasi dan kos penghantaran.
Seperti Nginx, pemampatan GZIP biasanya dihidupkan untuk memastikan kandungan yang dihantar padat. Pelanggan hanya memerlukan sedikit kuasa pengkomputeran untuk memudahkan penyahmampatan. Oleh kerana operasi ini tidak berpusat, penalti prestasi ditetapkan.
Memahami prinsip ini, kita dapat melihat idea umum untuk mengoptimumkan set hasil Anda harus cuba memastikan data yang dikembalikan semudah mungkin. Jika terdapat beberapa medan yang tidak diperlukan oleh klien, kemudian alih keluarnya dalam kod atau terus dalam pertanyaan SQL.
Bagi sesetengah perniagaan yang tidak mempunyai keperluan tinggi pada ketepatan masa tetapi keperluan tinggi pada keupayaan pemprosesan. Kita mesti belajar daripada pengalaman penimbal, meminimumkan interaksi sambungan rangkaian dan menggunakan pemprosesan kelompok untuk meningkatkan kelajuan pemprosesan.
Set keputusan mungkin akan digunakan dua kali, dan anda boleh menambahkannya pada cache, tetapi ia masih kurang kelajuan. Pada masa ini, adalah perlu untuk mengoptimumkan pemprosesan pengumpulan data, menggunakan indeks atau bitmap Bitmap untuk mempercepatkan akses data.
Dalam perkembangan biasa kita, kita akan melibatkan banyak sumber yang dikongsi. Sebahagian daripada sumber yang dikongsi ini berdiri sendiri, seperti HashMap, sesetengahnya adalah storan luaran, seperti baris pangkalan data, sesetengahnya adalah sumber tunggal, seperti Setnx bagi kunci Redis tertentu, seperti urus niaga; , urus niaga teragih, dsb.
Sebenarnya, terdapat banyak isu prestasi yang berkaitan dengan kunci. Kebanyakan kita memikirkan kunci baris pangkalan data, kunci meja, pelbagai kunci di Jawa, dll. Di peringkat yang lebih rendah, seperti kunci tahap arahan CPU, kunci tahap arahan JVM, kunci dalaman sistem pengendalian, dan lain-lain, boleh dikatakan bahawa mereka ada di mana-mana.
Hanya konkurensi boleh menyebabkan konflik sumber. Iaitu, pada masa yang sama, hanya satu permintaan pemprosesan boleh mendapatkan sumber yang dikongsi. Cara untuk menyelesaikan konflik sumber adalah dengan mengunci. Contoh lain ialah transaksi, yang pada asasnya adalah sejenis kunci.
Mengikut tahap kunci, kunci boleh dibahagikan kepada kunci optimis dan kunci pesimis pasti lebih cekap mengikut jenis kunci, kunci dibahagikan kepada kunci adil dan kunci tidak adil, terdapat Beberapa perbezaan halus.
Kandungan untuk sumber akan menyebabkan masalah prestasi yang serius, jadi akan ada beberapa kajian tentang baris gilir tanpa kunci, dan peningkatan prestasi akan menjadi besar.
Algoritma boleh meningkatkan prestasi perniagaan yang kompleks dengan ketara, tetapi dalam perniagaan sebenar, ia selalunya merupakan variasi. Apabila storan menjadi lebih murah dan lebih murah, dalam sesetengah perniagaan di mana CPU sangat ketat, ruang sering didagangkan untuk masa untuk mempercepatkan pemprosesan.
Algoritma ini tergolong dalam penalaan kod melibatkan banyak kemahiran pengekodan dan memerlukan pengguna untuk mengetahui API bahasa yang digunakan. Kadangkala, penggunaan fleksibel algoritma dan struktur data juga merupakan bahagian penting dalam pengoptimuman kod. Sebagai contoh, kaedah yang biasa digunakan untuk mengurangkan kerumitan masa termasuk rekursi, pembahagian dua, pengisihan, pengaturcaraan dinamik, dsb.
Pelaksanaan yang cemerlang memberi impak yang lebih besar kepada sistem berbanding pelaksanaan yang lemah. Sebagai contoh, sebagai pelaksanaan Senarai, LinkedList dan ArrayList adalah beberapa susunan magnitud yang berbeza dalam prestasi capaian rawak untuk contoh lain, CopyOnWriteList menggunakan kaedah salin atas tulis, yang boleh mengurangkan konflik kunci dengan ketara dalam senario di mana terdapat lebih banyak bacaan dan kurang; menulis. Bila hendak menggunakan penyegerakan dan bila untuk selamat untuk benang, ia juga mempunyai keperluan yang lebih tinggi pada keupayaan pengekodan kami.
Bahagian ilmu ini memerlukan kita memberi perhatian untuk mengumpulnya dalam kerja harian kita Dalam kelas berikut, lebih banyak mata pengetahuan yang penting akan dipilih dan dijelaskan.
Dalam pengaturcaraan harian, cuba gunakan beberapa komponen dengan konsep reka bentuk yang baik dan prestasi yang unggul. Contohnya, dengan Netty, anda tidak perlu lagi memilih komponen Mina yang lebih lama. Apabila mereka bentuk sistem, mengambil kira faktor prestasi, jangan pilih protokol yang memakan masa seperti SOAP. Untuk contoh lain, penganalisis sintaks yang baik (seperti menggunakan JavaCC) akan jauh lebih cekap daripada ungkapan biasa.
Ringkasnya, jika kesesakan sistem ditemui melalui analisis ujian, komponen utama mesti diganti dengan komponen yang lebih cekap. Dalam kes ini, corak penyesuai adalah sangat penting. Inilah sebabnya mengapa banyak syarikat suka menambah lapisan abstraksi di atas komponen sedia ada dan apabila komponen asas ditukar, aplikasi lapisan atas tidak menyedarinya.
Oleh kerana Java berjalan pada mesin maya JVM, banyak cirinya dihadkan oleh JVM. Mengoptimumkan mesin maya JVM juga boleh meningkatkan prestasi program JAVA pada tahap tertentu. Jika parameter dikonfigurasikan secara tidak betul, ia mungkin menyebabkan akibat yang serius seperti OOM.
Pengumpul sampah yang digunakan secara meluas ialah G1 Dengan konfigurasi parameter yang sangat sedikit, memori boleh dikitar semula dengan cekap. Pengumpul sampah CMS telah dialih keluar di Java 14. Memandangkan masa GCnya tidak dapat dikawal, penggunaannya harus dielakkan jika boleh.
Penalaan prestasi JVM melibatkan pertukaran dalam semua aspek, yang selalunya memberi kesan kepada seluruh badan, dan kesan semua aspek perlu dipertimbangkan secara menyeluruh. Oleh itu, adalah amat penting untuk memahami beberapa prinsip operasi dalam JVM Ini akan membantu kami memperoleh pemahaman yang lebih mendalam tentang kod dan membantu kami menulis kod yang lebih cekap.
Di atas ialah 7 arahan umum pengoptimuman kod Melalui pengenalan ringkas, kami akan memberi pemahaman umum tentang kandungan pengoptimuman prestasi. Tujuh arahan utama ini adalah arahan yang paling penting dalam pengoptimuman kod Sudah tentu, pengoptimuman prestasi juga termasuk pengoptimuman pangkalan data, pengoptimuman sistem pengendalian, pengoptimuman seni bina dan kandungan lain Ini bukan fokus kami pengenalan.
Atas ialah kandungan terperinci Temu bual: Adakah anda tahu kaedah yang tersedia untuk pengoptimuman prestasi Java?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!