1. Gambaran keseluruhan
Dalam artikel ini, kita akan melihat bagaimana mengukur masa yang berlalu di Jawa. Walaupun ini mungkin terdengar mudah, ada beberapa perangkap yang mesti kita perhatikan.
Kami akan meneroka kelas Java standard dan pakej luaran yang menyediakan fungsi untuk mengukur masa yang berlalu.
2. Pengukuran Mudah
2.1. currentTimeMillis ()
Apabila kita memenuhi syarat untuk mengukur waktu yang berlalu di Java, kita mungkin akan melakukannya seperti:
long start = System.currentTimeMillis(); // ... long finish = System.currentTimeMillis(); long timeElapsed = finish - start;
Sekiranya kita melihat kodnya, masuk akal. Kami mendapat cap waktu pada permulaan dan kami mendapat cap waktu lain apabila kod selesai. Masa yang berlalu adalah perbezaan antara dua nilai ini.
Walau bagaimanapun, hasilnya mungkin dan tidak tepat kerana System.currentTimeMillis () mengukur masa jam dinding . Waktu jam dinding mungkin berubah kerana banyak sebab, misalnya mengubah waktu sistem dapat mempengaruhi hasilnya atau lompatan kedua akan mengganggu hasilnya.
2.2. nanoTime ()
Kaedah lain dalam kelas java.lang.System ialah nanoTime () . Sekiranya kita melihat dokumentasi Java, kita akan dapati pernyataan berikut:
"Kaedah ini hanya dapat digunakan untuk mengukur waktu yang berlalu dan tidak terkait dengan gagasan lain tentang sistem atau waktu jam dinding."
Mari gunakannya:
long start = System.nanoTime(); // ... long finish = System.nanoTime(); long timeElapsed = finish - start;
Kodnya pada dasarnya sama seperti sebelumnya. Satu-satunya perbezaan adalah kaedah yang digunakan untuk mendapatkan cap waktu - nanoTime () dan bukannya currentTimeMillis () .
Mari kita perhatikan juga bahawa nanoTime () , mengembalikan masa dalam nanodetik. Oleh itu, jika masa yang berlalu diukur dalam unit masa yang berbeza, kita mesti mengubahnya dengan sewajarnya.
Sebagai contoh, untuk menukar kepada milisaat, kita mesti membahagikan hasilnya dalam nanodetik dengan 1.000.000.
Jurang lain dengan nanoTime () adalah bahawa walaupun memberikan ketepatan nanodetik, ia tidak menjamin resolusi nanodetik (iaitu seberapa kerap nilainya dikemas kini).
Walau bagaimanapun, ia menjamin bahawa resolusi sekurang-kurangnya sama baiknya dengan currentTimeMillis () .
3. Java 8
Jika kita menggunakan Java 8 - kita boleh cuba baru java.time.Instant dan java.time.Duration kelas. Kedua-duanya tidak berubah-ubah, aman dalam benang dan menggunakan skala waktu mereka sendiri, Java Time-Scale, seperti halnya semua kelas dalam java.time API baru .
3.1. Skala Masa Java
Cara tradisional untuk mengukur masa adalah dengan membahagikan sehari menjadi 24 jam 60 minit 60 saat, yang memberikan 86.400 saat sehari. Walau bagaimanapun, hari suria tidak selalu sama lama.
Skala waktu UTC sebenarnya membolehkan satu hari mempunyai 86.399 atau 86.401 SI saat. SI detik adalah saintifik "Standard International second" dan ditentukan oleh tempoh radiasi atom cesium 133). Ini diperlukan agar hari selari dengan Matahari.
Skala Waktu Java membahagikan setiap hari kalendar menjadi 86.400 subbahagian, yang dikenali sebagai detik . Tidak ada detik lompatan.
3.2. Kelas Segera
The Instant kelas mewakili segera pada garis masa. Pada dasarnya, ia adalah cap waktu berangka sejak zaman Java standard 1970-01-01T00: 00: 00Z .
Untuk mendapatkan cap waktu terkini, kita boleh menggunakan kaedah statik Instant.now () . Kaedah ini membolehkan memasukkan parameter Jam pilihan . Sekiranya dihilangkan, ia menggunakan jam sistem di zon waktu lalai.
Kita boleh menyimpan masa mula dan selesai dalam dua pemboleh ubah, seperti contoh sebelumnya. Seterusnya, kita dapat mengira masa yang berlalu antara kedua-dua instan.
Kami juga boleh menggunakan kelas Duration dan kaedah antara () untuk mendapatkan durasi antara dua objek Instan . Akhirnya, kita perlu menukar Tempoh menjadi milisaat:
Instant start = Instant.now(); // CODE HERE Instant finish = Instant.now(); long timeElapsed = Duration.between(start, finish).toMillis();
4. Jam Randik
Pindah ke perpustakaan, Apache Commons Lang menyediakan kelas StopWatch yang dapat digunakan untuk mengukur masa yang berlalu.
4.1. Ketergantungan Maven
Kita boleh mendapatkan versi terbaru dengan mengemas kini pom.xml:
org.apache.commons commons-lang3 3.7
Versi ketergantungan terkini boleh diperiksa di sini.
4.2. Mengukur Masa yang Berlalu Dengan StopWatch
Pertama sekali, kita perlu mendapatkan contoh kelas dan kemudian kita dapat mengukur masa yang berlalu:
StopWatch watch = new StopWatch(); watch.start();
Setelah jam tangan berjalan, kita dapat melaksanakan kod yang ingin kita aras dan kemudian pada akhirnya, kita hanya memanggil kaedah berhenti () . Akhirnya, untuk mendapatkan hasil sebenar, kami memanggil getTime () :
watch.stop(); System.out.println("Time Elapsed: " + watch.getTime()); // Prints: Time Elapsed: 2501
StopWatch mempunyai beberapa kaedah penolong tambahan yang dapat kami gunakan untuk menghentikan sebentar atau meneruskan pengukuran kami. Ini mungkin bermanfaat sekiranya kita perlu membuat penanda aras kita lebih kompleks.
Akhir sekali, mari kita ambil perhatian bahawa kelas ini tidak selamat dari benang.
5. Kesimpulan
Terdapat banyak cara untuk mengukur masa di Jawa. Kami telah membahas cara yang sangat "tradisional" (dan tidak tepat) dengan menggunakan currentTimeMillis () . Selain itu, kami memeriksa StopWatch Apache Common dan melihat kelas baru yang terdapat di Java 8.
Secara keseluruhan, untuk pengukuran sederhana dan betul dari masa yang berlalu, kaedah nanoTime () sudah mencukupi. Ia juga lebih pendek untuk menaip daripada currentTimeMillis () .
Namun, perhatikan bahawa untuk penanda aras yang tepat, bukannya mengukur waktu secara manual, kita dapat menggunakan kerangka kerja seperti Java Microbenchmark Harness (JMH). Topik ini melangkaui ruang lingkup artikel ini tetapi kami menerangkannya di sini.
Akhirnya, seperti biasa, kod yang digunakan semasa perbincangan boleh didapati di GitHub.