- Bagaimana cara saya mendapatkan waktu eksekusi metode?
- Apakah ada
Timer
kelas utilitas untuk hal-hal seperti menghitung berapa lama tugas, dll?
Sebagian besar pencarian di Google menghasilkan hasil untuk timer yang menjadwalkan utas dan tugas, yang bukan yang saya inginkan.
java
timing
execution-time
Ogre Psalm33
sumber
sumber
Instant
kelas: stackoverflow.com/a/30975902/1216775Jawaban:
Selalu ada cara kuno:
sumber
Saya pergi dengan jawaban sederhana. Bekerja untukku.
Ini bekerja dengan sangat baik. Resolusi ini jelas hanya untuk milidetik, Anda dapat melakukannya lebih baik dengan System.nanoTime (). Ada beberapa batasan untuk keduanya (irisan jadwal sistem operasi, dll.) Tetapi ini bekerja cukup baik.
Rata-rata di beberapa berjalan (semakin banyak semakin baik) dan Anda akan mendapatkan ide yang layak.
sumber
nanoTime
dijamin akan setidaknya tegas sebagaicurrentTimeMillis
. docs.oracle.com/javase/7/docs/api/java/lang/…currentTimeMillis
itu adalah timestamp yang sebenarnya, dan dapat digunakan untuk mencatat waktu mulai / akhir juga, sementarananoTime
"hanya dapat digunakan untuk mengukur waktu yang berlalu dan tidak terkait dengan gagasan lain tentang sistem atau waktu jam dinding. . "Ayolah teman-teman! Tidak ada yang menyebutkan cara Jambu untuk melakukan itu (yang bisa dibilang luar biasa):
Yang menyenangkan adalah bahwa Stopwatch.toString () melakukan pekerjaan yang baik dalam memilih unit waktu untuk pengukuran. Yaitu jika nilainya kecil, itu akan menghasilkan 38 ns, jika itu panjang, itu akan menunjukkan 5m 3s
Bahkan lebih baik:
Catatan: Google Guava membutuhkan Java 1.6+
sumber
start()
berkali-kali secara berurutan (sama untukstop()
).Menggunakan Instan dan Durasi dari API baru Java 8,
output,
sumber
Duration.between(start, end).getSeconds()
.Duration
juga memiliki metode untuk mengkonversi ke unit waktu lainnya, misalnyatoMillis()
yang mengkonversi ke milidetik.Kumpulkan semua cara yang mungkin bersama menjadi satu tempat.
Tanggal
Sistem. currentTimeMillis ()
Format yang Dapat Dibaca Manusia
Guava: Google Stopwatch JAR «Objek Stopwatch adalah untuk mengukur waktu yang telah berlalu dalam nanodetik.
Apache Commons Lang JAR « StopWatch menyediakan API yang nyaman untuk pengaturan waktu.
JODA -TIME
Java date time API dari Java 8 «Sebuah objek Durasi mewakili periode waktu antara dua objek Instan .
Spring Framework menyediakankelas utilitas StopWatch untuk mengukur waktu yang berlalu di Jawa.
Keluaran:
sumber
Gunakan profiler (JProfiler, Netbeans Profiler, Visual VM, Eclipse Profiler, dll). Anda akan mendapatkan hasil yang paling akurat dan paling tidak mengganggu. Mereka menggunakan mekanisme JVM bawaan untuk pembuatan profil yang juga dapat memberi Anda informasi tambahan seperti tumpukan jejak, jalur eksekusi, dan hasil yang lebih komprehensif jika perlu.
Ketika menggunakan profiler yang terintegrasi penuh, itu sepele untuk membuat profil suatu metode. Klik kanan, Profiler -> Tambahkan ke Metode Root. Kemudian jalankan profiler seperti Anda melakukan uji coba atau debugger.
sumber
Ini mungkin bukan yang Anda ingin saya katakan, tetapi ini adalah penggunaan yang baik dari AOP. Cambuk pencegat proxy di sekitar metode Anda, dan lakukan penghitungan waktu di sana.
Sayangnya, apa, mengapa, dan bagaimana AOP berada di luar cakupan jawaban ini, tetapi itulah kemungkinan saya melakukannya.
Sunting: Berikut ini tautan ke Spring AOP untuk membantu Anda memulai, jika Anda tertarik. Ini adalah implementasi AOP yang paling mudah diakses yang saya temui untuk java.
Juga, mengingat saran orang lain yang sangat sederhana, saya harus menambahkan bahwa AOP adalah untuk saat Anda tidak ingin hal-hal seperti waktu menginvasi kode Anda. Tetapi dalam banyak kasus, pendekatan sederhana dan mudah semacam itu baik-baik saja.
sumber
System.currentTimeMillis();
BUKAN pendekatan yang bagus untuk mengukur kinerja algoritma Anda. Ini mengukur total waktu yang Anda alami sebagai pengguna menonton layar komputer. Ini termasuk juga waktu yang dihabiskan oleh segala sesuatu yang berjalan di komputer Anda di latar belakang. Ini bisa membuat perbedaan besar jika Anda memiliki banyak program yang berjalan di workstation Anda.Pendekatan yang tepat menggunakan
java.lang.management
paket.Dari http://nadeausoftware.com/articles/2008/03/java_tip_how_get_cpu_and_user_time_benchmarking situs web:
getCpuTime()
metode memberi Anda jumlah tersebut:sumber
Dengan Java 8 Anda juga dapat melakukan hal seperti ini dengan setiap metode normal :
dengan TimeIt seperti:
Dengan metode ini Anda dapat membuat pengukuran waktu yang mudah di mana saja dalam kode Anda tanpa merusaknya. Dalam contoh sederhana ini saya hanya mencetak waktu. Bolehkah Anda menambahkan Switch for TimeIt, misalnya untuk hanya mencetak waktu di DebugMode atau sesuatu.
Jika Anda bekerja dengan Function, Anda dapat melakukan sesuatu seperti ini:
sumber
Kita juga dapat menggunakan kelas StopWatch dari Apache commons untuk mengukur waktu.
Kode sampel
sumber
Hanya sedikit putaran, jika Anda tidak menggunakan tooling dan ingin menghitung metode waktu dengan waktu eksekusi yang rendah: jalankan berkali-kali, setiap kali menggandakan berapa kali dieksekusi sampai Anda mencapai satu detik, atau lebih. Dengan demikian, waktu Panggilan ke System.nanoTime dan sebagainya, atau keakuratan System.nanoTime tidak banyak mempengaruhi hasilnya.
Tentu saja, peringatan tentang menggunakan jam dinding berlaku: pengaruh JIT-kompilasi, beberapa thread / proses dll Dengan demikian, Anda harus terlebih dahulu melaksanakan metode yang banyak kali pertama, sehingga compiler JIT melakukan tugasnya, dan kemudian ulangi tes ini beberapa kali dan ambil waktu eksekusi terendah.
sumber
Kami menggunakan anotasi AspectJ dan Java untuk tujuan ini. Jika kita perlu tahu waktu eksekusi untuk suatu metode, kita beri penjelasan sederhana. Versi yang lebih maju dapat menggunakan level log sendiri yang dapat diaktifkan dan dinonaktifkan saat runtime.
sumber
JEP 230: Microbenchmark Suite
FYI, JEP 230: Microbenchmark Suite adalah proyek OpenJDK untuk:
Fitur ini tiba di Java 12 .
Java Microbenchmark Harness (JMH)
Untuk versi Java yang lebih lama, lihatlah proyek Java Microbenchmark Harness (JMH) yang menjadi dasar JEP 230.
sumber
Kode yang sangat bagus.
http://www.rgagnon.com/javadetails/java-0585.html
sumber
long millis = TimeUnit.MILLISECONDS.toMillis(duration) - TimeUnit.SECONDS.toMillis(TimeUnit.MILLISECONDS.toSeconds(duration)); if (days == 0) { res = String.format("%02d:%02d:%02d.%02d", hours, minutes, seconds, millis); } else { res = String.format("%dd%02d:%02d:%02d.%02d", days, hours, minutes, seconds, millis); }
Anda dapat menggunakan Perf4j . Utilitas yang sangat keren. Penggunaannya sederhana
Informasi lebih lanjut dapat ditemukan di Panduan PengembangSunting: Proyek sepertinya mati
sumber
sumber
Saya pada dasarnya melakukan variasi ini, tetapi mempertimbangkan bagaimana kompilasi hotspot bekerja, jika Anda ingin mendapatkan hasil yang akurat, Anda perlu membuang beberapa pengukuran pertama dan pastikan Anda menggunakan metode ini dalam aplikasi dunia nyata (baca aplikasi khusus).
Jika JIT memutuskan untuk mengompilasinya, angka Anda akan sangat bervariasi. jadi sadar saja
sumber
Menggunakan AOP / AspectJ dan
@Loggable
anotasi dari jcabi-aspek Anda dapat melakukannya dengan mudah dan ringkas:Setiap panggilan ke metode ini akan dikirim ke fasilitas logging SLF4J dengan
DEBUG
tingkat logging. Dan setiap pesan log akan menyertakan waktu eksekusi.sumber
Spring menyediakan kelas utilitas org.springframework.util.StopWatch , sesuai JavaDoc :
Pemakaian:
Keluaran:
Dengan Aspek:
sumber
Saya telah menulis metode untuk mencetak waktu eksekusi metode dalam bentuk yang mudah dibaca. Misalnya, untuk menghitung faktorial 1 Juta, dibutuhkan sekitar 9 menit. Jadi waktu eksekusi dapat dicetak sebagai:
Kode di sini:
sumber
Ada beberapa cara untuk melakukan itu. Saya biasanya kembali menggunakan sesuatu seperti ini:
atau hal yang sama dengan System.nanoTime ();
Untuk sesuatu yang lebih pada sisi pembandingan, tampaknya juga ada yang ini: http://jetm.void.fm/ Tidak pernah mencobanya.
sumber
Anda dapat menggunakan perpustakaan Metrik yang menyediakan berbagai alat ukur. Tambahkan ketergantungan:
Dan konfigurasikan untuk lingkungan Anda.
Metode dapat dijelaskan dengan @Timed :
atau sepotong kode yang dibungkus dengan Timer :
Metrik gabungan dapat diekspor ke konsol, JMX, CSV, atau lainnya.
@Timed
contoh keluaran metrik:sumber
Jika Anda ingin waktu jam dinding
sumber
Seperti yang dikatakan "skaffman", gunakan AOP ATAU Anda dapat menggunakan tenunan bytecode run time, seperti halnya alat cakupan metode pengujian unit yang digunakan untuk secara transparan menambahkan info waktu ke metode yang digunakan.
Anda dapat melihat kode yang digunakan oleh alat alat sumber terbuka seperti Emma ( http://downloads.sourceforge.net/emma/emma-2.0.5312-src.zip?modtime=1118607545&big_mirror=0 ). Alat jangkauan opensource lainnya adalah http://prdownloads.sourceforge.net/cobertura/cobertura-1.9-src.zip?download .
Jika Anda akhirnya berhasil melakukan apa yang Anda tetapkan, mohon. bagikan kembali dengan komunitas di sini dengan tugas / toples semut Anda.
sumber
sumber
Saya mengubah kode dari jawaban yang benar untuk mendapatkan hasil dalam hitungan detik:
sumber
Anda dapat menggunakan kelas stopwatch dari proyek pegas inti:
Kode:
Dokumentasi untuk Stopwatch: sederhana, memungkinkan penentuan waktu sejumlah tugas, mengekspos total waktu berjalan dan waktu berjalan untuk setiap tugas yang disebutkan. Menyembunyikan penggunaan System.currentTimeMillis (), meningkatkan keterbacaan kode aplikasi dan mengurangi kemungkinan kesalahan perhitungan. Perhatikan bahwa objek ini tidak dirancang untuk aman-utas dan tidak menggunakan sinkronisasi. Kelas ini biasanya digunakan untuk memverifikasi kinerja selama pembuktian konsep dan dalam pengembangan, bukan sebagai bagian dari aplikasi produksi.
sumber
Anda dapat mencoba cara ini jika hanya ingin tahu waktu.
sumber
Ok, ini adalah kelas sederhana untuk digunakan untuk pengaturan waktu sederhana dari fungsi Anda. Ada contoh di bawahnya.
Contoh penggunaan:
Contoh output konsol:
sumber
Di Java 8 kelas baru bernama
Instant
diperkenalkan. Sesuai dok:Ini dapat digunakan sebagai:
Mencetak
PT7.001S
.sumber