Kiat tentang menulis tolok ukur mikro dari pencipta Java HotSpot :
Aturan 0: Baca makalah yang memiliki reputasi baik tentang JVM dan pembandingan-mikro. Yang bagus adalah Brian Goetz, 2005 . Jangan berharap terlalu banyak dari tolok ukur mikro; mereka hanya mengukur kisaran karakteristik kinerja JVM yang terbatas.
Aturan 1: Selalu sertakan fase pemanasan yang menjalankan kernel pengujian Anda sepenuhnya, cukup untuk memicu semua inisialisasi dan kompilasi sebelum fase waktu. (Lebih sedikit iterasi OK pada fase pemanasan. Aturan praktis adalah beberapa puluh ribu iterasi loop dalam.)
Aturan 2: Selalu jalankan dengan -XX:+PrintCompilation
,, -verbose:gc
dll., Sehingga Anda dapat memverifikasi bahwa kompiler dan bagian lain dari JVM tidak melakukan pekerjaan yang tidak terduga selama fase pengaturan waktu Anda.
Aturan 2.1: Mencetak pesan di fase awal dan akhir waktu dan pemanasan, sehingga Anda dapat memverifikasi bahwa tidak ada output dari Aturan 2 selama fase pengaturan waktu.
Aturan 3: Waspadai perbedaan antara -client
dan -server
, dan OSR dan kompilasi reguler. The -XX:+PrintCompilation
bendera melaporkan kompilasi OSR dengan di-tanda untuk menunjukkan titik masuk non-awal, misalnya: Trouble$1::run @ 2 (41 bytes)
. Lebih suka server ke klien, dan reguler ke OSR, jika Anda mencari kinerja terbaik.
Aturan 4: Waspadai efek inisialisasi. Jangan mencetak untuk pertama kalinya selama fase pengaturan waktu Anda, karena mencetak banyak dan menginisialisasi kelas. Jangan memuat kelas baru di luar fase pemanasan (atau fase pelaporan akhir), kecuali jika Anda menguji pemuatan kelas secara khusus (dan dalam hal ini memuat hanya kelas pengujian). Aturan 2 adalah garis pertahanan pertama Anda terhadap efek seperti itu.
Aturan 5: Waspadai efek deoptimisasi dan kompilasi. Jangan mengambil jalur kode apa pun untuk pertama kalinya dalam fase pengaturan waktu, karena kompilator dapat membuang dan mengkompilasi ulang kode tersebut, berdasarkan pada asumsi optimis sebelumnya bahwa jalur tersebut tidak akan digunakan sama sekali. Aturan 2 adalah garis pertahanan pertama Anda terhadap efek seperti itu.
Aturan 6: Gunakan alat yang tepat untuk membaca pikiran kompiler, dan berharap akan terkejut dengan kode yang dihasilkannya. Periksa kode Anda sendiri sebelum membentuk teori tentang apa yang membuat sesuatu lebih cepat atau lebih lambat.
Aturan 7: Kurangi kebisingan dalam pengukuran Anda. Jalankan benchmark Anda pada mesin yang tenang, dan jalankan beberapa kali, buang outlier. Gunakan -Xbatch
untuk membuat serial kompiler dengan aplikasi, dan mempertimbangkan pengaturan -XX:CICompilerCount=1
untuk mencegah kompiler berjalan paralel dengan dirinya sendiri. Cobalah yang terbaik untuk mengurangi overhead GC, tetapkan Xmx
(cukup besar) sama Xms
dan gunakan UseEpsilonGC
jika tersedia.
Aturan 8: Gunakan perpustakaan untuk patokan Anda karena mungkin lebih efisien dan sudah didebug untuk tujuan tunggal ini. Seperti JMH , Caliper atau Bill dan Tolok Ukur UCSD Paulus yang Sangat Baik untuk Java .