Lebih
Cara mengukur waktu yang dibutuhkan oleh sebuah fungsi untuk mengeksekusi
Saya perlu untuk mendapatkan waktu eksekusi dalam milidetik.
awalnya saya bertanya pertanyaan ini kembali pada tahun 2008. Jawaban yang diterima kemudian gunakan new Date().getTime() Namun, kita semua bisa sepakat sekarang yang menggunakan standar kinerja.sekarang() API lebih tepat. Karena itu saya mengubah diterima jawaban untuk yang satu ini.
1037
26
Menggunakan [kinerja.sekarang()][1]:
gunakan new Date().getTime()
ex.
Don't menggunakan Date(). Baca di bawah ini.
Gunakan
kinerja.sekarang()
:Ia bekerja pada:
IE 10 ++
FireFox 15 ++
Chrome 24 ++
Safari 8 ++
Opera 15 ++
Android 4.4 ++
dll, dll
konsol.waktu
mungkin layak untuk anda, tapi itu's non-standar &sekte;:Selain dukungan browser,
kinerja.sekarang
tampaknya memiliki potensi untuk memberikan yang lebih akurat timing seperti yang muncul untuk menjadi yang telanjang-tulang versikonsol.waktu
.<kata-kata kasar> Juga, DON'T PERNAH menggunakan
Upload
untuk apapun ** karena itu's terpengaruh oleh perubahan "sistem waktu". Yang berarti kita akan dapatkan tidak valid hasil —seperti "negatif waktu"— ketika pengguna doesn't memiliki sistem yang akurat waktu:(Mengatur jam sistem anda untuk satu tahun yang lalu dan pergi ke Gmail sehingga kita semua dapat memiliki tertawa yang baik. Mungkin suatu hari nanti kita akan memiliki Hall of Shame untuk JS
Upload
.)Google Spreadsheet's
now()
fungsi juga menderita dari masalah ini.Satu-satunya waktu anda'akan menggunakan
Tanggal
adalah ketika anda ingin menunjukkan pengguna nya sistem waktu jam. Tidak ketika anda ingin mendapatkan the waktu atau untuk mengukur apa-apa.Jika anda perlu untuk mendapatkan fungsi waktu pelaksanaan pada pembangunan lokal mesin, anda dapat menggunakan browser anda's profil yang sesuai, atau konsol perintah seperti
konsol.waktu()
dankonsol.timeEnd()
.Semua browser modern memiliki JavaScript profiler built-in. Ini profiler harus memberikan pengukuran yang paling akurat anda tidak perlu mengubah kode yang ada, yang dapat mempengaruhi fungsi's waktu eksekusi.
Untuk profil anda JavaScript:
Selain itu, pada mesin pengembangan anda, anda dapat menambahkan instrumentasi untuk kode anda dengan
konsol.waktu()
dankonsol.timeEnd()
. Fungsi-fungsi ini, yang didukung di Firefox11+, Chrome2+ dan IE11+, laporan timer yang anda start/stop melaluikonsol.waktu()
.time()
mengambil sebuah user-defined timer nama sebagai argumen, dantimeEnd()
maka laporan pada waktu pelaksanaan sejak waktu dimulai:Perhatikan bahwa hanya Firefox kembali waktu yang telah berlalu dalam
timeEnd()
call. Browser lain hanya melaporkan hasilnya ke konsol pengembang: mengembalikan nilaitimeEnd()
adalah tidak terdefinisi.Jika anda ingin mendapatkan fungsi waktu eksekusi liar, anda akan perlu instrumen kode anda. Anda memiliki beberapa pilihan. Anda hanya dapat menyimpan awal dan akhir kali oleh query
new Date().getTime()
:Namun,
Tanggal
objek hanya memiliki milidetik resolusi dan akan terpengaruh oleh apapun OS's sistem perubahan jam. Di browser modern, ada's merupakan pilihan yang lebih baik.Pilihan yang lebih baik adalah dengan menggunakan Resolusi Tinggi Waktu, alias
jendela.kinerja.now()
.now()
lebih baik daripada tradisionalTanggal.getTime()
dalam dua hal penting:now()
adalah double dengan submillisecond resolusi yang mewakili jumlah milidetik sejak awal halaman's navigasi. Ia mengembalikan jumlah mikrodetik dalam pecahan (misalnya nilai 1000.123 adalah 1 detik dan 123 mikrodetik).now()
adalah monoton meningkat. Hal ini penting sebagaiTanggal.getTime()
dapat mungkin melompat maju atau bahkan mundur pada panggilan berikutnya. Terutama, jika OS's waktu sistem diperbarui (misalnya atom clock sinkronisasi),Tanggal.getTime()
juga diperbarui.now()
dijamin untuk selalu monoton meningkat, sehingga tidak terpengaruh oleh OS's sistem waktu-itu akan selalu menjadi dinding waktu jam (dengan asumsi anda jam dinding bukan atom...).now()
dapat digunakan di hampir setiap tempat yangnew Date().getTime()
,+ Tanggal baru
tTanggal.now()
adalah. Pengecualian adalah bahwaDate
dannow()
times don't campuran, sebagaiTanggal
didasarkan pada unix epoch (jumlah milidetik sejak tahun 1970), sementaranow()
adalah jumlah milidetik sejak navigasi halaman dimulai (sehingga akan jauh lebih kecil dariTanggal
).Berikut ini's contoh bagaimana menggunakan
now()
:now()
didukung di Chrome stabil, Firefox 15+, dan IE10. Ada juga beberapa polyfills yang tersedia.Salah satu pilihan lain untuk mengukur waktu eksekusi di alam liar UserTiming. UserTiming berperilaku demikian pula dengan
konsol.waktu()
dankonsol.timeEnd()
, tapi ini menggunakan Resolusi Tinggi yang sama Timestamp yangnow()
menggunakan (sehingga anda mendapatkan sub-milidetik monotonically increasing jam), dan menghemat waktu dan durasi untuk PerformanceTimeline.UserTiming memiliki konsep tanda (cap) dan langkah-langkah (durasi). Anda dapat menentukan banyak baik seperti yang anda inginkan, dan mereka're terkena pada PerformanceTimeline.
Untuk menyimpan timestamp, anda menelepon
mark(startMarkName)
. Untuk mendapatkan durasi sejak pertama anda tandai, anda cukup memanggilmengukur(measurename, startMarkname)
. Durasi ini kemudian disimpan dalam PerformanceTimeline bersama mark.UserTiming tersedia di IE10+ dan Chrome25+. Ada juga polyfill tersedia (yang saya tulis).
Untuk mendapatkan nilai-nilai yang tepat, anda harus menggunakan Kinerja interface. It's didukung dalam versi modern dari Firefox, Chrome, Opera dan IE. Berikut ini's contoh bagaimana hal itu dapat digunakan:
Saat ini.getTime()
ataukonsol.waktu()
adalah tidak baik untuk mengukur pelaksanaan yang tepat waktu. Anda dapat menggunakannya jika cepat perkiraan kasar adalah OK untuk anda. Dengan perkiraan kasar saya berarti anda bisa mendapatkan 15-60 ms pergeseran dari real time.Cek brilian ini posting pada pengukuran waktu eksekusi dalam JavaScript. Penulis juga memberikan beberapa link tentang ketepatan waktu JavaScript, layak dibaca.
Gunakan Firebug, mengaktifkan kedua Konsol dan Javascript. Klik Profil. Reload. Klik Profil lagi. Melihat laporan.
Acuan
Output
kinerja.sekarang() adalah opsional - hanya lulus palsu ke StopWatch fungsi constructor.
proses.hrtime() tersedia dalam Node.js - mengembalikan nilai dalam nanodetik
anda dapat menggunakan add operator juga di sini
Untuk memperpanjang vsync's kode lebih lanjut untuk memiliki kemampuan untuk mengembalikan timeEnd sebagai nilai dalam NodeJS menggunakan sedikit bagian dari kode.
Sekarang menggunakan kode seperti:
Ini akan memberi anda lebih banyak kemungkinan. Anda dapat menyimpan waktu eksekusi yang akan digunakan untuk tujuan yang lebih suka menggunakan ini dalam persamaan, atau disimpan dalam database, yang dikirim ke klien jauh lebih websockets, disajikan pada halaman web, dll.
Hal ini dimungkinkan untuk hanya menggunakan satu variabel:
timer/1000
- untuk mengkonversi milidetik untuk detik.toFixed(5)
- untuk memangkas angka tambahanSejak
konsol.waktu
dankinerja.sekarang
kan't didukung di beberapa browser utama (yaitu IE10), saya dibuat ramping utilitas yang memanfaatkan metode terbaik yang tersedia. Namun, itu tidak memiliki kesalahan penanganan palsu untuk penggunaan (panggilanEnd()
pada tidak diinisialisasi timer).Menggunakannya dan meningkatkan seperti yang anda inginkan.
Hal ini dapat membantu anda.
var t0 = tanggal.sekarang(); melakukan sesuatu(); var t1 = tanggal.sekarang(); konsol.log("Panggilan untuk melakukan sesuatu yang mengambil perkiraan" + (t1 - t0)/1000 + " detik.")
Berikut ini's dekorator untuk fungsi-fungsi waktu
Penggunaan:
Jika anda're menggunakan async fungsi anda dapat membuat
waktu
async dan menambahkanmenunggu
sebelum f(...args), dan harus bekerja untuk mereka. Hal itu akan lebih rumit jika anda ingin satu dekorator untuk menangani keduanya sinkron dan asinkron fungsi.Terima kasih, Achim Koellner, akan memperluas jawaban anda sedikit:
Harap dicatat, bahwa anda tidak't melakukan apa-apa selain dari apa yang anda inginkan untuk mengukur (misalnya,
console.log
juga akan mengambil waktu untuk mengeksekusi dan akan mempengaruhi kinerja tes).Catatan, bahwa dengan mengukur asynchronous fungsi waktu eksekusi, anda harus menyisipkan
var timeInMilliseconds = proses.hrtime(t0)[1]/1000000;
di dalam callback. Misalnya,Beberapa bulan yang lalu saya menempatkan bersama-sama saya sendiri rutin yang kali menggunakan fungsi Date.sekarang() -- meskipun pada saat itu metode yang diterima tampaknya kinerja.sekarang() -- karena kinerja objek yang belum tersedia (built-in) di kandang Node.js rilis.
Hari ini saya melakukan beberapa penelitian lebih lanjut dan menemukan metode lain untuk waktu. Karena saya juga menemukan cara untuk menggunakan ini dalam Node.js kode, saya pikir saya akan berbagi di sini.
Berikut adalah gabungan dari contoh-contoh yang diberikan oleh w3c dan Node.js:
CATATAN:
Jika anda berniat untuk menggunakan
kinerja
objek dalam Node.js aplikasi, anda harus meliputi membutuhkan:const { kinerja } = require('perf_hooks')
Jika anda ingin mengukur waktu antara beberapa hal-hal yang tidak't bersarang anda bisa menggunakan ini:
Mirip dengan konsol.waktu(), tapi penggunaan yang lebih mudah jika anda don't perlu untuk melacak sebelumnya timer.
Jika anda suka warna biru dari konsol.waktu(), anda dapat menggunakan baris ini bukan
InitTime yang terkait dengan
string
.kembali Singleton.getInstance().initTime(label); // Mengembalikan waktu init
kembali Singleton.getInstance().endTime(label); // Mengembalikan total waktu antara init dan end
Dalam kasus saya, saya perfer untuk menggunakan @ tata bahasa suger dan compile dengan babel. Masalah dari metode ini adalah bahwa fungsi telah berada di dalam objek.
Sampel Kode JS
.babelrc (untuk babel 6)
Stopwatch dengan kumulatif siklus
Bekerja dengan server dan client (Node atau DOM), menggunakan
Kinerja
API. Baik ketika anda memiliki banyak siklus misalnya dalam sebuah fungsi disebut 1000 kali bahwa proses 1000 data objek tetapi anda ingin melihat bagaimana masing-masing operasi pada fungsi ini menambahkan sampai total.Jadi yang satu ini menggunakan modul global (singleton) timer. Sama seperti kelas singleton pattern, hanya sedikit lebih sederhana untuk digunakan, tetapi anda perlu untuk menempatkan ini dalam terpisah misal
stopwatch.js
file.``javascript const k = typeof kinerja !== "undefined" ? kinerja : require('perf_hooks').kinerja; const DIGIT = 2;
mari _timers = {};
const _log = (label, delta?) => { jika (_timers[label]) { konsol.log(
${label}:
+ (delta ?${delta.toFixed(DIGIT)} ms lalu,
: '') +${_timers[label].total.toFixed(DIGIT)} ms total, ${_timers[label].siklus} siklus
); } };ekspor const Stopwatch = { mulai(label) { const sekarang = perf.sekarang(); jika (_timers[label]) { jika (!_timers[label].dimulai) { _timers[label].mulai = sekarang; } } else { _timers[label] = { mulai: sekarang, total: 0, siklus: 0 }; } }, /* Kembali total berlalu milidetik, atau null jika stopwatch tidak't ada. / berhenti(label, log = false) { const sekarang = perf.sekarang(); jika (_timers[label]) { mari delta; jika(_timers[label].dimulai) { delta = sekarang - _timers[label].dimulai; _timers[label].mulai = null; _timers[label].total += delta; _timers[label].siklus++; } log && _log(label, delta); kembali _timers[label].total; } else { return null; } }, /* Log total waktu / log: _log, menghapus(label) { menghapus _timers[label]; } }; ``