Saya perlu mendapatkan waktu eksekusi dalam milidetik.
Saya awalnya mengajukan pertanyaan ini kembali pada tahun 2008. Jawaban yang diterima kemudian adalah menggunakan Date (). GetTime () yang baru. Namun, kita semua dapat setuju sekarang bahwa menggunakan API standard.now () API lebih tepat. Karena itu saya mengubah jawaban yang diterima untuk yang satu ini.
javascript
profiling
Julius A
sumber
sumber
Date
cara klasik , yang memberi Andams
dan cukup untuk sebagian besar kasus saya pikir albertech.blogspot.com/2015/07/ ... ... tapi ya Anda harus benar-benar melihatPerformance.now
performance.now()
tidak bekerja di Node.new Date().getTime()
akan bekerja di Node.Jawaban:
Menggunakan performance.now () :
Menggunakan console.time :
(tidak standar)( standar hidup )Catatan :
String yang diteruskan ke
time()
dantimeEnd()
metode harus cocok(agar penghitung waktu selesai seperti yang diharapkan).
sumber
gunakan Date baru (). getTime ()
ex.
sumber
window.performance.now
. Lihat stackoverflow.com/a/15641427/632951Jangan gunakan Date (). Baca di bawah.
Gunakan
performance.now()
:Ini bekerja pada:
IE 10 ++
FireFox 15 ++
Chrome 24 ++
Safari 8 ++
Opera 15 ++
Android 4.4 ++
dll
console.time
mungkin layak untuk Anda , tetapi itu tidak standar § :Selain dukungan browser,
performance.now
tampaknya memiliki potensi untuk memberikan timing yang lebih akurat karena tampaknya versi telanjangconsole.time
.<kata-kata kasar> Juga, TIDAK PERNAH menggunakan
Date
untuk apa-apa karena itu dipengaruhi oleh perubahan "waktu sistem". Yang berarti kami akan mendapatkan hasil yang tidak valid — seperti "waktu negatif" - ketika pengguna tidak memiliki waktu sistem yang akurat:(Atur jam sistem Anda menjadi satu tahun yang lalu dan buka Gmail agar kita semua dapat tertawa. Mungkin suatu hari nanti kita akan memiliki Hall of Shame for JS
Date
.)now()
Fungsi Google Spreadsheet juga mengalami masalah ini.Satu-satunya waktu yang akan Anda gunakan
Date
adalah ketika Anda ingin menunjukkan kepada pengguna waktu sistemnya. Bukan ketika Anda ingin mendapatkan yang waktu atau ukuran apapun.sumber
Jika Anda perlu mendapatkan waktu eksekusi fungsi pada mesin pengembangan lokal Anda Anda, Anda dapat menggunakan alat profil browser Anda, atau perintah konsol seperti
console.time()
danconsole.timeEnd()
.Semua browser modern memiliki profiler JavaScript bawaan. Profiler ini harus memberikan pengukuran paling akurat karena Anda tidak perlu mengubah kode yang ada, yang dapat memengaruhi waktu eksekusi fungsi.
Untuk profil JavaScript Anda:
Atau, pada mesin pengembangan Anda, Anda dapat menambahkan instrumentasi ke kode Anda dengan
console.time()
danconsole.timeEnd()
. Fungsi-fungsi ini, didukung di Firefox11 +, Chrome2 + dan IE11 +, melaporkan penghitung waktu yang Anda mulai / hentikanconsole.time()
.time()
mengambil nama penghitung waktu yang ditentukan pengguna sebagai argumen, dantimeEnd()
kemudian melaporkan waktu eksekusi sejak penghitung waktu dimulai:Perhatikan bahwa hanya Firefox yang mengembalikan waktu yang telah berlalu di
timeEnd()
panggilan. Browser lain hanya melaporkan hasilnya ke konsol pengembang: nilai kembalinyatimeEnd()
tidak terdefinisi.Jika Anda ingin mendapatkan waktu eksekusi fungsi di alam , Anda harus memasukkan kode Anda. Anda memiliki beberapa opsi. Anda cukup menyimpan waktu mulai dan berakhir dengan menanyakan
new Date().getTime()
:Namun,
Date
objek hanya memiliki resolusi milidetik dan akan dipengaruhi oleh perubahan jam sistem OS. Di browser modern, ada opsi yang lebih baik.Pilihan yang lebih baik adalah menggunakan Waktu Resolusi Tinggi , alias
window.performance.now()
.now()
lebih baik daripada tradisionalDate.getTime()
dalam dua cara penting:now()
adalah ganda dengan resolusi submillisecond yang mewakili jumlah milidetik sejak awal navigasi halaman. Ini mengembalikan jumlah mikrodetik dalam fraksional (misalnya nilai 1000,123 adalah 1 detik dan 123 mikrodetik).now()
meningkat secara monoton. Hal ini penting karenaDate.getTime()
dapat mungkin melompat ke depan atau bahkan mundur pada panggilan berikutnya. Khususnya, jika waktu sistem OS diperbarui (mis. Sinkronisasi jam atom),Date.getTime()
juga diperbarui.now()
dijamin akan selalu meningkat secara monoton, sehingga tidak terpengaruh oleh waktu sistem OS - itu akan selalu menjadi waktu jam dinding (dengan asumsi jam dinding Anda bukan atom ...).now()
dapat digunakan di hampir setiap tempat itunew Date().getTime()
, dan+ new Date
sebagainyaDate.now()
. Pengecualiannya adalah bahwaDate
dannow()
waktu tidak tercampur, karenaDate
didasarkan pada unix-epoch (jumlah milidetik sejak 1970), sedangkannow()
jumlah milidetik sejak navigasi halaman Anda dimulai (sehingga akan jauh lebih kecil daripadaDate
).Berikut ini contoh cara penggunaan
now()
:now()
didukung di Chrome stable, Firefox 15+, dan IE10. Ada juga beberapa polyfill yang tersedia.Satu opsi lain untuk mengukur waktu eksekusi di alam liar adalah UserTiming . UserTiming berperilaku serupa dengan
console.time()
danconsole.timeEnd()
, tetapi menggunakan Stempel Waktu Resolusi Tinggi yang sama yangnow()
menggunakan (sehingga Anda mendapatkan jam sub-milidetik yang meningkat secara monoton), dan menyimpan cap waktu dan durasi ke PerformanceTimeline .UserTiming memiliki konsep tanda (cap waktu) dan ukuran (durasi). Anda dapat menentukan sebanyak mungkin yang Anda inginkan, dan mereka ditampilkan di PerformanceTimeline .
Untuk menyimpan cap waktu, Anda menelepon
mark(startMarkName)
. Untuk mendapatkan durasi sejak tanda pertama Anda, Anda cukup meneleponmeasure(measurename, startMarkname)
. Durasi tersebut kemudian disimpan di PerformanceTimeline di samping tanda Anda.UserTiming tersedia di IE10 + dan Chrome25 +. Ada juga polyfill yang tersedia (yang saya tulis).
sumber
performance.now
danDate
adalah alasan keberadaannya.Untuk mendapatkan nilai yang tepat, Anda harus menggunakan antarmuka Kinerja . Ini didukung dalam versi modern Firefox, Chrome, Opera dan IE. Berikut ini adalah contoh cara penggunaannya:
Date.getTime()
atauconsole.time()
tidak baik untuk mengukur waktu eksekusi yang tepat. Anda dapat menggunakannya jika perkiraan kasar cepat OK untuk Anda. Dengan perkiraan kasar saya maksudkan Anda bisa mendapatkan 15-60 ms dari waktu nyata.Periksa pos brilian ini tentang mengukur waktu eksekusi dalam JavaScript. Penulis juga memberikan beberapa tautan tentang keakuratan waktu JavaScript, layak dibaca.
sumber
Gunakan Firebug, aktifkan Konsol dan Javascript. Klik Profil. Muat ulang. Klik Profil lagi. Lihat laporannya.
sumber
console.time()
danconsole.timeEnd()
juga sekarang.Tolok ukur
Keluaran
performance.now () adalah opsional - cukup masukkan false ke dalam fungsi konstruktor StopWatch.
sumber
process.hrtime () tersedia dalam Node.js - ia mengembalikan nilai dalam nanodetik
sumber
hrtime[0] * 1000 + hrtime[1] / 1000000
-> ya, saya lebih suka menggunakanvar hrtime
juga! : PAnda dapat menggunakan add operator juga di sini
sumber
Untuk memperluas kode vsync lebih lanjut untuk memiliki kemampuan untuk mengembalikan timeEnd sebagai nilai di NodeJS gunakan potongan kode kecil ini.
Sekarang gunakan kode seperti ini:
Ini memberi Anda lebih banyak kemungkinan. Anda dapat menyimpan waktu eksekusi untuk digunakan untuk keperluan lain seperti menggunakannya dalam persamaan, atau disimpan dalam database, dikirim ke klien jarak jauh melalui soket web, disajikan pada halaman web, dll.
sumber
Dimungkinkan untuk menggunakan hanya satu variabel:
timer/1000
- untuk mengkonversi milidetik ke detik.toFixed(5)
- untuk memotong angka ekstrasumber
Karena
console.time
danperformance.now
tidak didukung di beberapa peramban utama (yaitu IE10), saya membuat utilitas ramping yang memanfaatkan metode terbaik yang tersedia. Namun, tidak ada penanganan kesalahan untuk penggunaan palsu (panggilanEnd()
timer tidak diinisialisasi).Gunakan dan tingkatkan sesuai keinginan Anda.
sumber
Ini dapat membantu Anda.
var t0 = date.now(); doSomething(); var t1 = date.now(); console.log("Call to doSomething took approximate" + (t1 - t0)/1000 + " seconds.")
sumber
Inilah dekorator untuk fungsi pengaturan waktu
Pemakaian:
Jika Anda menggunakan fungsi-fungsi async, Anda dapat membuat
timed
async dan menambahkanawait
sebelum f (... args), dan itu akan berfungsi untuk itu. Semakin rumit jika Anda ingin satu dekorator menangani fungsi sinkronisasi dan asinkron.sumber
Terima kasih, Achim Koellner, akan sedikit memperluas jawaban Anda:
Harap perhatikan, bahwa Anda tidak boleh melakukan apa pun selain dari apa yang ingin Anda ukur (misalnya,
console.log
juga akan membutuhkan waktu untuk dijalankan dan akan memengaruhi tes kinerja).Perhatikan, bahwa untuk mengukur waktu eksekusi fungsi asinkron, Anda harus memasukkan
var timeInMilliseconds = process.hrtime(t0)[1]/1000000;
di dalam callback. Sebagai contoh,sumber
Beberapa bulan yang lalu saya mengumpulkan rutinitas saya sendiri yang kali fungsi menggunakan Date.now () - meskipun pada saat itu metode yang diterima tampaknya performance.now () - karena objek kinerja belum tersedia (dibangun -in) dalam rilis Node.js yang stabil.
Hari ini saya melakukan penelitian lebih lanjut dan menemukan metode lain untuk menentukan waktu. Karena saya juga menemukan cara menggunakan ini dalam kode Node.js, saya pikir saya akan membagikannya di sini.
Berikut ini adalah gabungan dari contoh yang diberikan oleh w3c dan Node.js :
CATATAN:
Jika Anda ingin menggunakan
performance
objek di aplikasi Node.js, Anda harus menyertakan persyaratan berikut:const { performance } = require('perf_hooks')
sumber
performance.mark('end')
dalam hal iniada beberapa cara untuk mencapai tujuan ini:
menggunakan console.time
ini adalah cara yang paling efisien: menggunakan performance.now () , mis
gunakan + (tambahkan operator) atau getTime ()
Inilah yang terjadi ketika Anda menerapkan operator unary plus ke instance Date: Dapatkan nilai instance Date dalam pertanyaan. Konversikan ke Number
CATATAN:
getTime()
memberikan kinerja yang lebih baik daripada operator unary +.sumber
InitTime terkait dengan
string
.return Singleton.getInstance().initTime(label); // Returns the time init
return Singleton.getInstance().endTime(label); // Returns the total time between init and end
sumber
Jika Anda ingin mengukur waktu antara beberapa hal yang tidak bersarang Anda dapat menggunakan ini:
Mirip dengan console.time (), tetapi penggunaannya lebih mudah jika Anda tidak perlu melacak timer sebelumnya.
Jika Anda menyukai warna biru dari console.time (), Anda dapat menggunakan baris ini sebagai gantinya
sumber
Dalam kasus saya, saya memilih untuk menggunakan @ grammar suger dan mengompilasinya dengan babel.
Masalah dari metode ini adalah bahwa fungsi harus berada di dalam objek.
Contoh Kode JS
.babelrc (untuk babel 6)
sumber
Stopwatch dengan siklus kumulatif
Bekerja dengan server dan klien (Node atau DOM), menggunakan
Performance
API. Baik ketika Anda memiliki banyak siklus kecil misalnya dalam suatu fungsi yang disebut 1000 kali yang memproses 1000 objek data tetapi Anda ingin melihat bagaimana setiap operasi dalam fungsi ini menambahkan hingga total.Jadi yang ini menggunakan timer global modul (tunggal). Sama seperti pola singleton kelas, hanya sedikit lebih mudah digunakan, tetapi Anda harus meletakkan ini dalam
stopwatch.js
file mis terpisah .sumber
Cara terbaik adalah menggunakan
performance hooks
modul. Meskipun tidak stabil, Anda dapatmark
menentukan area spesifik kode Anda danmeasure
diduration
antara area yang ditandai.Coba di sini
sumber
sumber
Dengan kinerja
NodeJs: Diperlukan untuk mengimpor kelas kinerja
Menggunakan console.time
sumber
console.time("myTimer");
console.timeLog("myTimer");
console.timeEnd("myTimer");
Anda dapat membaca lebih lanjut tentang ini di MDN dan di dokumentasi Node.js .
Tersedia di Chrome, Firefox, Opera dan NodeJS. (bukan di Edge atau Internet Explorer).
sumber
Seperti yang dinyatakan sebelumnya periksa dan gunakan timer built-in. Tetapi jika Anda ingin atau perlu menulis sendiri di sini adalah dua sen saya:
Kompilasi sukses!
sumber
Jawaban yang diterima salah !
Karena JavaScript tidak sinkron, nilai akhir variabel dari jawaban yang diterima akan salah.
Eksekusi untuk mungkin sangat cepat sehingga Anda tidak dapat melihat bahwa hasilnya salah. Anda dapat mengujinya dengan kode yang melakukan beberapa permintaan:
Jadi peringatan akan meminta dengan sangat cepat tetapi di konsol Anda akan melihat bahwa permintaan ajax terus berlanjut.
Inilah cara yang harus Anda lakukan: https://developer.mozilla.org/en-US/docs/Web/API/Performance.now
sumber