Apakah System.nanoTime () sama sekali tidak berguna?

153

Seperti yang didokumentasikan dalam posting blog Waspadai System.nanoTime () di Jawa , pada sistem x86, Java's System.nanoTime () mengembalikan nilai waktu menggunakan CPU penghitung khusus . Sekarang pertimbangkan kasus berikut yang saya gunakan untuk mengukur waktu panggilan:

long time1= System.nanoTime();
foo();
long time2 = System.nanoTime();
long timeSpent = time2-time1;

Sekarang dalam sistem multi-core, bisa jadi setelah mengukur waktu1, utas dijadwalkan untuk prosesor yang berbeda yang penghitungnya lebih kecil dari pada CPU sebelumnya. Dengan demikian kita bisa mendapatkan nilai dalam time2 yang kurang dari time1. Dengan demikian kita akan mendapatkan nilai negatif dalam timeSpent.

Mempertimbangkan kasus ini, bukankah itu System.nanotime cukup berguna untuk saat ini?

Saya tahu bahwa mengubah waktu sistem tidak mempengaruhi nanotime. Itu bukan masalah yang saya jelaskan di atas. Masalahnya adalah bahwa setiap CPU akan menyimpan penghitung yang berbeda sejak dihidupkan. Penghitung ini bisa lebih rendah pada CPU kedua dibandingkan dengan CPU pertama. Karena utas dapat dijadwalkan oleh OS ke CPU kedua setelah mendapatkan waktu1, nilai timeSpent mungkin salah dan bahkan negatif.

pdeva
sumber
2
Saya tidak punya jawaban tetapi saya setuju dengan Anda. Mungkin itu harus dianggap sebagai bug di JVM.
Aaron Digulla
2
posting itu tidak benar dan tidak menggunakan TSC lambat tetapi Anda harus hidup dengan: bugs.sun.com/bugdatabase/view_bug.do?bug_id=6440250 TSC juga dapat digunakan melalui hypervisor tetapi kemudian lambat lagi.
bestsss
1
Dan tentu saja, Anda dapat berjalan di mesin virtual di mana CPU dapat muncul di tengah jalan melalui sesi: D
Limited Atonement

Jawaban:

206

Jawaban ini ditulis pada tahun 2011 dari sudut pandang apa yang sebenarnya dilakukan oleh Sun JDK pada sistem operasi saat itu. Itu sudah lama sekali! jawaban leventov menawarkan perspektif yang lebih mutakhir.

Posting itu salah, dan nanoTimeaman. Ada komentar pada posting yang menghubungkan ke posting blog oleh David Holmes , seorang pria realtime dan concurrency di Sun. Ia mengatakan:

System.nanoTime () diimplementasikan menggunakan API QueryPerformanceCounter / QueryPerformanceFrequency [...] Mekanisme default yang digunakan oleh QPC ditentukan oleh lapisan Abstraksi Perangkat Keras (HAL) [...] Default ini berubah tidak hanya di seluruh perangkat keras tetapi juga di seluruh OS versi. Misalnya Windows XP Paket Layanan 2 mengubah hal-hal untuk menggunakan timer manajemen daya (PMTimer) daripada penghitung timestamp prosesor (TSC) karena masalah dengan TSC yang tidak disinkronkan pada prosesor yang berbeda dalam sistem SMP, dan karena faktanya frekuensinya dapat bervariasi (dan karenanya hubungannya dengan waktu yang berlalu) berdasarkan pengaturan manajemen daya.

Jadi, pada Windows, ini merupakan masalah hingga WinXP SP2, tetapi tidak sekarang.

Saya tidak dapat menemukan bagian II (atau lebih) yang berbicara tentang platform lain, tetapi artikel itu tidak menyertakan komentar bahwa Linux telah mengalami dan memecahkan masalah yang sama dengan cara yang sama, dengan tautan ke FAQ untuk clock_gettime (CLOCK_REALTIME) , yang mengatakan:

  1. Apakah clock_gettime (CLOCK_REALTIME) konsisten di semua prosesor / inti? (Apakah lengkungan itu penting? Mis. Ppc, arm, x86, amd64, sparc).

Ini seharusnya atau itu dianggap kereta.

Namun, pada x86 / x86_64, dimungkinkan untuk melihat TSC freq yang tidak disinkronkan atau variabel menyebabkan inkonsistensi waktu. 2.4 kernel benar-benar tidak memiliki perlindungan terhadap hal ini, dan kernel 2.6 awal tidak terlalu baik di sini. Pada 2.6.18 dan lebih tinggi dari logika untuk mendeteksi ini lebih baik dan kami biasanya akan kembali ke sumber data yang aman.

ppc selalu memiliki timebase yang disinkronkan, sehingga seharusnya tidak menjadi masalah.

Jadi, jika tautan Holmes dapat dibaca sebagai menyiratkan nanoTimepanggilan itu clock_gettime(CLOCK_REALTIME), maka itu aman pada kernel 2.6.18 pada x86, dan selalu pada PowerPC (karena IBM dan Motorola, tidak seperti Intel, benar-benar tahu cara mendesain mikroprosesor).

Sayangnya, tidak disebutkan SPARC atau Solaris. Dan tentu saja, kami tidak tahu apa yang IBM JVM lakukan. Tapi Sun JVM di Windows dan Linux modern bisa melakukannya dengan benar.

EDIT: Jawaban ini didasarkan pada sumber yang dikutipnya. Tetapi saya masih khawatir bahwa itu mungkin benar-benar salah. Beberapa informasi terbaru akan sangat berharga. Saya baru saja menemukan tautan ke artikel empat tahun yang lebih baru tentang jam Linux yang dapat bermanfaat.

Tom Anderson
sumber
13
Bahkan WinXP SP2 tampaknya menderita. Menjalankan contoh kode asli, dengan void foo() { Thread.sleep(40); }saya mendapat waktu negatif (-380 ms!) Menggunakan Athlon 64 X2 4200+prosesor tunggal
Luke Usherwood
Saya kira tidak ada yang diperbarui tentang ini, wrt. perilaku di Linux, BSD atau platform lain?
Tomer Gabel
6
Jawaban yang bagus, harus menambahkan tautan ke eksplorasi yang lebih baru dari topik ini: shipilev.net/blog/2014/nanotrusting-nanotime
Nitsan Wakart
1
@ SOFe: Oh, itu memalukan. Untungnya ada di arsip web . Saya akan melihat apakah saya dapat melacak versi saat ini.
Tom Anderson
1
Catatan: OpenJDK tidak mendukung spesifikasi sampai OpenJDK 8u192, lihat bugs.openjdk.java.net/browse/JDK-8184271 . Pastikan untuk menggunakan setidaknya versi terbaru dari OpenJDK 8, atau OpenJDK 11+.
leventov
35

Saya melakukan sedikit pencarian dan menemukan bahwa jika seseorang menjadi jagoan maka ya itu mungkin dianggap tidak berguna ... dalam situasi tertentu ... itu tergantung pada seberapa sensitif waktu kebutuhan Anda ...

Lihatlah kutipan ini dari situs Java Sun:

Jam waktu nyata dan System.nanoTime () keduanya didasarkan pada panggilan sistem yang sama dan karenanya jam yang sama.

Dengan Java RTS, semua API berbasis waktu (misalnya, Pengatur Waktu, Utas Berkala, Pemantauan Batas Waktu, dan sebagainya) didasarkan pada pengatur waktu resolusi tinggi. Dan, bersama dengan prioritas waktu nyata, mereka dapat memastikan bahwa kode yang sesuai akan dieksekusi pada waktu yang tepat untuk kendala waktu nyata. Sebaliknya, Java SE API biasa hanya menawarkan beberapa metode yang mampu menangani waktu resolusi tinggi, tanpa jaminan eksekusi pada waktu tertentu. Menggunakan System.nanoTime () antara berbagai titik dalam kode untuk melakukan pengukuran waktu yang berlalu harus selalu akurat.

Java juga memiliki peringatan untuk metode nanoTime () :

Metode ini hanya dapat digunakan untuk mengukur waktu yang berlalu dan tidak terkait dengan gagasan lain tentang waktu sistem atau jam dinding. Nilai yang dikembalikan mewakili nanodetik sejak beberapa waktu tetap tapi sewenang-wenang (mungkin di masa depan, sehingga nilai mungkin negatif). Metode ini memberikan ketepatan nanosecond, tetapi tidak harus memiliki ketepatan nanosecond. Tidak ada jaminan yang dibuat tentang seberapa sering nilai berubah. Perbedaan panggilan berturut-turut yang rentang lebih besar dari sekitar 292,3 tahun (2 63 nanodetik) tidak akan secara akurat menghitung waktu yang berlalu karena luapan numerik.

Tampaknya satu-satunya kesimpulan yang dapat ditarik adalah bahwa nanoTime () tidak dapat diandalkan sebagai nilai yang akurat. Dengan demikian, jika Anda tidak perlu mengukur waktu yang hanya berjarak nano detik, maka metode ini cukup baik bahkan jika nilai yang dihasilkan negatif. Namun, jika Anda membutuhkan ketelitian yang lebih tinggi, mereka tampaknya menyarankan agar Anda menggunakan JAVA RTS.

Jadi untuk menjawab pertanyaan Anda ... no nanoTime () tidak berguna .... itu bukan metode yang paling bijaksana untuk digunakan dalam setiap situasi.

mezoid
sumber
3
> metode ini cukup baik bahkan jika nilai yang dikembalikan negatif. Saya tidak mengerti, jika nilai dalam timespent negatif, lalu bagaimana berguna sama sekali dalam mengukur waktu yang diambil di foo ()?
pdeva
3
tidak apa-apa karena yang Anda khawatirkan adalah nilai absolut dari perbedaannya. yaitu jika pengukuran Anda adalah waktu t di mana t = t2 - t1 maka Anda ingin tahu | t | .... jadi bagaimana jika nilainya negatif ... bahkan dengan masalah multi-inti dampaknya jarang akan menjadi beberapa nanodetik pula.
mezoid
3
Untuk membuat cadangan @ Harun: t2 dan t1 mungkin negatif tetapi (t2-t1) tidak boleh negatif.
jfs
2
Harun: itulah tepatnya maksud saya. t2-t1 seharusnya tidak boleh negatif jika tidak kita memiliki bug.
pdeva
12
@ pdeva - tetapi Anda salah memahami apa yang dikatakan dokter. Anda mengajukan non-masalah. Ada beberapa titik waktu yang dianggap "0". Nilai yang dikembalikan oleh nanoTime () akurat relatif terhadap waktu itu. Ini peningkatan waktu yang monoton. Anda mungkin saja mendapatkan serangkaian angka dari bagian negatif dari garis waktu itu. -100, -99, -98(Nilai jelas jauh lebih besar dalam praktek). Mereka pergi ke arah yang benar (meningkat), jadi tidak ada masalah di sini.
ToolmakerSteve
18

Tidak perlu diperdebatkan, cukup gunakan sumbernya. Di sini, SE 6 untuk Linux, buat kesimpulan sendiri:

jlong os::javaTimeMillis() {
  timeval time;
  int status = gettimeofday(&time, NULL);
  assert(status != -1, "linux error");
  return jlong(time.tv_sec) * 1000  +  jlong(time.tv_usec / 1000);
}


jlong os::javaTimeNanos() {
  if (Linux::supports_monotonic_clock()) {
    struct timespec tp;
    int status = Linux::clock_gettime(CLOCK_MONOTONIC, &tp);
    assert(status == 0, "gettime error");
    jlong result = jlong(tp.tv_sec) * (1000 * 1000 * 1000) + jlong(tp.tv_nsec);
    return result;
  } else {
    timeval time;
    int status = gettimeofday(&time, NULL);
    assert(status != -1, "linux error");
    jlong usecs = jlong(time.tv_sec) * (1000 * 1000) + jlong(time.tv_usec);
    return 1000 * usecs;
  }
}
blais
sumber
7
Itu hanya membantu jika Anda tahu apa yang API lakukan. API yang digunakan diimplementasikan oleh sistem operasi; kode ini benar wrt. spesifikasi API yang digunakan (clock_gettime / gettimeofday), tetapi seperti yang ditunjukkan, beberapa sistem operasi yang tidak up-to-date memiliki implementasi buggy.
Blaisorblade
18

Sejak Java 7, System.nanoTime()dijamin aman dengan spesifikasi JDK. System.nanoTime()Javadoc memperjelas bahwa semua doa yang teramati dalam JVM (yaitu, di semua utas) adalah monoton:

Nilai yang dikembalikan mewakili nanodetik sejak beberapa waktu asal tetap tetapi sewenang-wenang (mungkin di masa depan, sehingga nilai mungkin negatif). Asal yang sama digunakan oleh semua doa metode ini dalam mesin virtual Java; contoh mesin virtual lainnya cenderung menggunakan asal yang berbeda.

Implementasi JVM / JDK bertanggung jawab untuk meniadakan ketidakkonsistenan yang dapat diamati ketika utilitas OS yang mendasarinya dipanggil (misalnya yang disebutkan dalam jawaban Tom Anderson ).

Mayoritas jawaban lama lainnya untuk pertanyaan ini (ditulis pada 2009-2012) menyatakan FUD yang mungkin relevan untuk Java 5 atau Java 6 tetapi tidak lagi relevan untuk versi Jawa modern.

Perlu disebutkan, meskipun JDK menjamin nanoTime()keamanan, ada beberapa bug di OpenJDK yang membuatnya tidak menjunjung tinggi jaminan ini pada platform tertentu atau dalam keadaan tertentu (misalnya JDK-8040140 , JDK-8184271 ). Tidak ada bug terbuka (dikenal) di OpenJDK wrt nanoTime()saat ini, tetapi penemuan bug baru atau regresi dalam rilis OpenJDK yang lebih baru seharusnya tidak mengejutkan siapa pun.

Dengan mengingat hal itu, kode yang digunakan nanoTime()untuk pemblokiran waktunya, tunggu interval, batas waktu, dll. Sebaiknya memperlakukan perbedaan waktu negatif (batas waktu) sebagai nol daripada membuang pengecualian. Praktek ini juga disukai karena konsisten dengan perilaku semua metode menunggu waktunya di semua kelas di java.util.concurrent.*, misalnya Semaphore.tryAcquire(), Lock.tryLock(), BlockingQueue.poll(), dll

Meskipun demikian, nanoTime()harus tetap lebih disukai untuk menerapkan pemblokiran waktunya, tunggu interval, batas waktu, dll. currentTimeMillis()Karena yang terakhir adalah subjek dari fenomena "waktu mundur" (misalnya karena koreksi waktu server), yaitu currentTimeMillis()tidak cocok untuk mengukur interval waktu sama sekali. Lihat jawaban ini untuk informasi lebih lanjut.

Alih-alih menggunakan nanoTime()untuk pengukuran waktu eksekusi kode secara langsung, kerangka kerja benchmarking khusus dan profiler sebaiknya digunakan, misalnya JMH dan async-profiler dalam mode profil jam dinding .

leventov
sumber
6

Linux mengoreksi perbedaan antara CPU, tetapi Windows tidak. Saya sarankan Anda menganggap System.nanoTime () hanya akurat sekitar 1 mikro-detik. Cara sederhana untuk mendapatkan penghitungan waktu yang lebih lama adalah dengan menelepon foo () 1000 atau lebih dan membagi waktu dengan 1000.

Peter Lawrey
sumber
2
Bisakah Anda memberikan referensi (perilaku di Linux dan Windows)?
jfs
Sayangnya metode yang diusulkan umumnya sangat tidak tepat karena setiap peristiwa yang jatuh ke dalam slot pembaruan jam dinding +/- 100 ms sering akan mengembalikan nol untuk operasi sub-detik. Jumlah dari 9 operasi masing-masing dengan durasi nol adalah, yah, nol, dibagi sembilan adalah ... nol. Sebaliknya, menggunakan System.nanoTime () akan memberikan durasi acara yang relatif akurat (bukan nol), yang kemudian dijumlahkan dan dibagi dengan jumlah acara akan memberikan rata-rata yang sangat tepat.
Darrell Teague
@DarrellTeague menjumlahkan 1000 acara dan menambahkannya sama dengan waktu ujung ke ujung.
Peter Lawrey
@DarrellTeague System.nanoTime () akurat hingga 1 mikro-detik atau lebih baik (bukan 100.000 mikrodetik) pada sebagian besar sistem. Rata-rata banyak operasi hanya relevan ketika Anda turun ke beberapa mikro-detik, dan hanya pada sistem tertentu.
Peter Lawrey
1
Permintaan maaf karena ada beberapa kebingungan tentang bahasa yang digunakan dalam "menjumlahkan" peristiwa. Ya, jika waktu ditandai di awal katakan operasi 1000 detik, mereka berjalan dan kemudian waktu ditandai lagi di akhir dan dibagi - yang akan bekerja untuk beberapa sistem yang sedang dikembangkan untuk mendapatkan perkiraan durasi untuk suatu waktu tertentu peristiwa.
Darrell Teague
5

Sama sekali tidak berguna. Penggemar waktu yang tepat menunjukkan masalah multi-core, tetapi dalam aplikasi kata-kata sebenarnya seringkali secara radikal lebih baik daripada currentTimeMillis ().

Ketika menghitung posisi grafik dalam bingkai menyegarkan nanoTime () mengarah ke gerakan JAUH lebih halus dalam program saya.

Dan saya hanya menguji pada mesin multi-core.

Yuvi Masory
sumber
5

Saya telah melihat waktu berlalu negatif yang dilaporkan dari menggunakan System.nanoTime (). Agar jelas, kode yang dimaksud adalah:

    long startNanos = System.nanoTime();

    Object returnValue = joinPoint.proceed();

    long elapsedNanos = System.nanoTime() - startNanos;

dan variabel 'elapsedNanos' memiliki nilai negatif. (Saya yakin bahwa panggilan perantara juga membutuhkan waktu kurang dari 293 tahun, yang merupakan titik meluap untuk nanos yang disimpan dalam waktu lama :)

Ini terjadi menggunakan IBM v1.5 JRE 64bit pada perangkat keras IBM P690 (multi-core) yang menjalankan AIX. Saya hanya melihat kesalahan ini terjadi sekali, jadi sepertinya sangat jarang. Saya tidak tahu penyebabnya - apakah ini masalah khusus perangkat keras, cacat JVM - Saya tidak tahu. Saya juga tidak tahu implikasi untuk akurasi nanoTime () secara umum.

Untuk menjawab pertanyaan awal, saya tidak berpikir nanoTime tidak berguna - ini menyediakan waktu sub-milidetik, tetapi ada risiko aktual (bukan hanya teoritis) karena tidak akurat yang perlu Anda perhitungkan.

Basil Vandegriend
sumber
Sayangnya, sepertinya ada beberapa masalah OS / hardware. Dokumentasi menyatakan bahwa nilai inti mungkin negatif tetapi (negatif lebih besar dikurangi negatif lebih kecil) masih harus menjadi nilai positif. Memang asumsinya adalah bahwa di utas yang sama, panggilan nanoTime () harus selalu mengembalikan nilai positif atau negatif. Belum pernah melihat ini pada berbagai sistem Unix dan Windows selama bertahun-tahun tetapi terdengar mungkin terutama jika perangkat keras / OS membagi operasi yang tampaknya atom di prosesor.
Darrell Teague
@BasilVandegriend itu bukan bug di mana pun. Sesuai dokumentasi, jarang System.nanoTime () dalam contoh Anda yang kedua dapat berjalan pada CPU yang berbeda dan nilai-nilai nanoTime yang dihitung pada CPU itu bisa saja lebih rendah daripada nilai yang dihitung pada CPU pertama. Jadi, nilai -ve untuk elapsedNanos dimungkinkan
tanpa akhir
2

Ini sepertinya tidak menjadi masalah pada Core 2 Duo yang menjalankan Windows XP dan JRE 1.5.0_06.

Dalam tes dengan tiga utas saya tidak melihat System.nanoTime () mundur. Prosesor sama-sama sibuk, dan utas pergi tidur sesekali untuk memancing ulir bergerak.

[EDIT] Saya kira itu hanya terjadi pada prosesor yang terpisah secara fisik, yaitu penghitung disinkronkan untuk beberapa core pada die yang sama.

starblue
sumber
2
Mungkin tidak akan terjadi setiap saat, tetapi karena cara nanotime () diimplementasikan, kemungkinan selalu ada.
pdeva
Saya kira itu hanya terjadi pada prosesor yang terpisah secara fisik, yaitu bahwa penghitung disinkronkan untuk beberapa core pada die yang sama.
starblue
Bahkan itu tergantung pada implementasi spesifik, IIRC. Tapi itu sesuatu yang seharusnya diurus OS.
Blaisorblade
1
Penghitung RDTSC pada banyak core dari prosesor x86 yang sama belum tentu disinkronkan - beberapa sistem modern membiarkan core yang berbeda berjalan pada kecepatan yang berbeda.
Jules
2

Tidak, ini bukan ... Itu hanya tergantung pada CPU Anda, periksa Pengatur Waktu Presisi Tinggi untuk bagaimana / mengapa semuanya diperlakukan berbeda sesuai dengan CPU.

Pada dasarnya, baca sumber Java Anda dan periksa apa versi Anda dengan fungsi tersebut, dan jika berfungsi melawan CPU Anda akan menjalankannya.

IBM bahkan menyarankan Anda menggunakannya untuk tolok ukur kinerja (pos tahun 2008, tetapi diperbarui).

Ric Tokyo
sumber
Karena semua implementasi didefinisikan bahaviour, "caveat emptor!"
David Schmitt
2

Saya menghubungkan ke apa yang pada dasarnya adalah diskusi yang sama di mana Peter Lawrey memberikan jawaban yang baik. Mengapa saya mendapatkan waktu berlalu negatif menggunakan System.nanoTime ()?

Banyak orang menyebutkan bahwa di Java System.nanoTime () dapat mengembalikan waktu negatif. Saya minta maaf karena mengulangi apa yang sudah dikatakan orang lain.

  1. nanoTime () bukan jam tetapi penghitung siklus CPU.
  2. Nilai pengembalian dibagi dengan frekuensi agar terlihat seperti waktu.
  3. Frekuensi CPU dapat berfluktuasi.
  4. Ketika utas Anda dijadwalkan pada CPU lain, ada kemungkinan mendapatkan nanoTime () yang menghasilkan perbedaan negatif. Itu logis. Penghitung di seluruh CPU tidak disinkronkan.
  5. Dalam banyak kasus, Anda bisa mendapatkan hasil yang cukup menyesatkan tetapi Anda tidak akan bisa mengatakannya karena delta tidak negatif. Pikirkan tentang itu.
  6. (belum dikonfirmasi) Saya pikir Anda mungkin mendapatkan hasil negatif bahkan pada CPU yang sama jika instruksi disusun ulang. Untuk mencegahnya, Anda harus menggunakan penghalang memori yang membuat cerita bersambung dari instruksi Anda.

Akan keren jika System.nanoTime () mengembalikan coreID di mana ia dieksekusi.

Pusaran
sumber
1
Semua poin kecuali 3. dan 5. salah. 1. nanoTime () bukan penghitung siklus CPU, ini adalah waktu nano . 2. Bagaimana nilai nanoTime dihasilkan khusus untuk platform. 4. Tidak, perbedaannya tidak boleh negatif, menurut spesifikasi nanoTime (). Mengasumsikan OpenJDK tidak memiliki bug wrt nanoTime (), dan saat ini tidak ada bug yang belum terselesaikan. 6. panggilan nanoTime tidak dapat dipesan ulang dalam utas karena ini adalah metode asli dan JVM menghormati perintah program. JVM tidak pernah memesan ulang pemanggilan metode asli karena tidak tahu apa yang terjadi di dalamnya dan karenanya tidak dapat membuktikan bahwa pengurutan ulang seperti itu akan aman.
leventov
Mengenai 5. nanoTime () hasil perbedaan memang bisa menyesatkan, tetapi tidak untuk alasan yang disajikan dalam poin lain dalam asnwer ini. Melainkan karena alasan yang disajikan di sini: shipilev.net/blog/2014/nanotrusting-nanotime
leventov
Ironisnya, mengenai 6. telah ada bug di OpenJDK secara khusus karena pemesanan ulang: bugs.openjdk.java.net/browse/JDK-8184271 . Di OpenJDK, nanoTime () adalah intrinsik dan diizinkan untuk disusun ulang, itu adalah bug.
leventov
@leventov, jadi apakah nanotime () aman untuk digunakan? artinya, ia tidak dapat mengembalikan nilai negatif dan ~ akurat sejauh waktu berjalan. Saya tidak melihat titik mengekspos fungsi API yang penuh dengan masalah. Posting ini adalah bukti, dimulai tahun 2009 dan masih dikomentari pada tahun 2019. Untuk hal-hal penting misi, saya membayangkan orang-orang bergantung pada kartu waktu seperti Symmetricom
Vortex
1
Nomor 4 Anda mengatakan tentang perbedaan negatif , bukan nilai: "ada kemungkinan mendapatkan nanoTime () yang menghasilkan perbedaan negatif."
leventov
1

Java adalah lintas platform, dan nanoTime tergantung pada platform. Jika Anda menggunakan Java - saat tidak menggunakan nanoTime. Saya menemukan bug nyata di implementasi jvm yang berbeda dengan fungsi ini.

penjepit daging
sumber
0

Dokumentasi Java 5 juga merekomendasikan penggunaan metode ini untuk tujuan yang sama.

Metode ini hanya dapat digunakan untuk mengukur waktu yang berlalu dan tidak terkait dengan gagasan lain tentang waktu sistem atau jam dinding.

Java 5 API Doc


sumber
0

Juga, System.currentTimeMillies()berubah ketika Anda mengubah jam sistem Anda, sementara System.nanoTime()tidak, sehingga yang terakhir lebih aman untuk mengukur durasi.

RobAu
sumber
-3

nanoTimesangat tidak aman untuk menentukan waktu. Saya mencobanya pada algoritma pengujian primality dasar saya dan memberikan jawaban yang secara harfiah terpisah satu sama lain untuk input yang sama. Jangan gunakan metode konyol itu. Saya membutuhkan sesuatu yang lebih akurat dan tepat daripada mendapatkan waktu milis, tetapi tidak seburuk itu nanoTime.

sarvesh
sumber
tanpa sumber atau penjelasan yang lebih baik, komentar ini tidak berguna
ic3