Pertanyaan Cara mengukur waktu yang dibutuhkan oleh suatu fungsi untuk dieksekusi


Saya perlu mendapatkan waktu eksekusi dalam milidetik.

Saya awalnya menanyakan pertanyaan ini pada tahun 2008. Jawaban yang diterima   kemudian digunakan Tanggal baru (). getTime () Namun, kita semua bisa setuju sekarang   yang menggunakan standar performance.now () API lebih banyak   sesuai. Karena itu saya mengubah jawaban yang diterima untuk yang satu ini.


786
2017-11-24 11:09


asal


Jawaban:


Kamu dapat memakai console.time: (tidak standar)

console.time('someFunction');

someFunction(); // run whatever needs to be timed in between the statements

console.timeEnd('someFunction');

Catatan:


1148
2017-12-29 15:05



menggunakan Tanggal baru (). getTime ()

Metode getTime () mengembalikan jumlah milidetik sejak tengah malam tanggal 1 Januari 1970.

ex.

var start = new Date().getTime();

for (i = 0; i < 50000; ++i) {
// do something
}

var end = new Date().getTime();
var time = end - start;
alert('Execution time: ' + time);

572
2017-11-24 11:15



Jangan gunakan Date (). Baca di bawah.

Menggunakan performance.now():

<script>
var a = performance.now();
alert('do something...');
var b = performance.now();
alert('It took ' + (b - a) + ' ms.');
</script>

Ia bekerja pada:

  • IE 10 ++

  • FireFox 15 ++

  • Chrome 24 ++

  • Safari 8 ++

  • Opera 15 ++

  • Android 4.4 ++

  • dll, dll

console.time mungkin layak untukmu, tapi tidak standar §:

Fitur ini tidak standar dan tidak ada pada jalur standar. Jangan menggunakannya di situs produksi yang menghadap Web: tidak akan berfungsi untuk setiap pengguna. Sana mungkin juga ketidakcocokan besar antara implementasi dan perilaku dapat berubah di masa depan.

Selain dukungan browser, performance.now tampaknya memiliki potensi untuk menyediakan timing yang lebih akurat karena tampaknya merupakan versi telanjang-tulang console.time.


<ngambek> Juga, JANGAN PERNAH digunakan Date untuk apa pun karena dipengaruhi oleh perubahan "waktu sistem". Itu artinya kita akan mendapatkan hasil yang tidak valid - seperti "waktu negatif" - saat pengguna tidak memiliki waktu sistem yang akurat:

Pada Oktober 2014, jam sistem saya rusak dan tebak apa.... Saya membuka Gmail dan melihat semua email hari saya "terkirim 0 menit yang lalu". Dan saya pikir Gmail seharusnya dibangun oleh insinyur kelas dunia dari Google .......

(Setel jam sistem Anda ke satu tahun yang lalu dan buka Gmail sehingga kita semua bisa tertawa. Mungkin suatu saat kita akan memiliki Hall of Shame untuk JS Date.)

Google Spreadsheet now() fungsi juga menderita masalah ini.

Satu-satunya waktu yang akan Anda gunakan Date adalah ketika Anda ingin menampilkan pengguna -nya waktu jam sistem. Tidak ketika Anda ingin mendapatkannya itu waktu atau mengukur apa pun.


376
2018-03-26 15:49



Jika Anda perlu mendapatkan waktu eksekusi fungsi pada mesin pengembangan lokal Anda, Anda dapat menggunakan alat profil browser Anda, atau perintah konsol seperti console.time() dan console.timeEnd().

Semua browser modern memiliki profiler JavaScript yang sudah ada di dalamnya. Profiler ini harus memberikan pengukuran yang paling akurat karena Anda tidak perlu mengubah kode yang ada, yang dapat mempengaruhi waktu eksekusi fungsi.

Untuk membuat profil JavaScript Anda:

  • Di Chrome, tekan F12 dan pilih Profil tab, lalu Kumpulkan Profil CPU JavaScript.
  • Di Firefox, instal / buka Firebug, dan klik pada Profil tombol.
  • Di IE 9+, tekan F12, klik Naskah atau Profiler (tergantung pada versi IE Anda).

Atau, di mesin pengembangan Anda, Anda dapat menambahkan instrumentasi ke kode Anda console.time() dan console.timeEnd(). Fungsi-fungsi ini, didukung di Firefox11 +, Chrome2 +, dan IE11 +, melaporkan timer yang Anda mulai / hentikan via console.time(). time() mengambil nama pewaktu yang ditetapkan pengguna sebagai argumen, dan timeEnd() kemudian melaporkan waktu eksekusi sejak pengatur waktu dimulai:

function a() {
  console.time("mytimer");
  ... do stuff ...
  var dur = console.timeEnd("myTimer"); // NOTE: dur only works in FF
}

Perhatikan bahwa hanya Firefox yang mengembalikan waktu yang telah berlalu dalam timeEnd() panggilan. Browser lain hanya melaporkan hasilnya ke konsol pengembang: nilai kembalian dari timeEnd() tidak terdefinisi.

Jika Anda ingin mendapatkan waktu eksekusi fungsi di alam liar, Anda harus mendokumentasikan kode Anda. Anda memiliki beberapa opsi. Anda cukup menyimpan waktu awal dan akhir dengan query new Date().getTime():

function a() {
  var start = new Date().getTime();
  ... do stuff ...
  var end = new Date().getTime();
  var dur = end - start;
}

Namun, itu Date objek hanya memiliki resolusi milidetik dan akan terpengaruh oleh perubahan jam sistem OS apa pun. Di browser modern, ada opsi yang lebih baik.

Pilihan yang lebih baik adalah menggunakan Waktu Resolusi Tinggi, aka window.performance.now(). now() lebih baik daripada tradisional Date.getTime() dalam dua cara penting:

  1. now() adalah ganda dengan resolusi submillisecond yang mewakili jumlah milidetik sejak awal navigasi halaman. Ini mengembalikan jumlah mikrodetik dalam pecahan (misalnya nilai 1000.123 adalah 1 detik dan 123 mikrodetik).

  2. now() secara monoton meningkat. Ini penting karena Date.getTime() bisa mungkin melompat maju atau bahkan mundur pada panggilan berikutnya. Khususnya, jika waktu sistem OS diperbarui (misalnya sinkronisasi jam atom), Date.getTime() juga diperbarui. now() dijamin akan selalu monoton meningkat, sehingga tidak terpengaruh oleh waktu sistem OS - itu akan selalu waktu jam dinding (dengan asumsi jam dinding Anda tidak atom ...).

now() bisa digunakan di hampir setiap tempat itu new Date().getTime(), + new Date dan T Date.now() adalah. Pengecualiannya adalah itu Date dan now() kali tidak mencampur, sebagai Date berdasarkan pada unix-epoch (jumlah milidetik sejak 1970), sementara now() adalah jumlah milidetik sejak navigasi halaman Anda dimulai (jadi itu akan jauh lebih kecil dari Date).

Berikut ini contoh cara menggunakannya now():

function a() {
  var start = window.performance.now();
   ... do stuff ...
  var end = window.performance.now();
  var dur = end - start;
}

now() didukung di Chrome stabil, Firefox 15+, dan IE10. Ada juga beberapa polyfill tersedia.

Satu pilihan lain untuk mengukur waktu eksekusi di alam liar adalah UserTiming. UserTiming berperilaku serupa dengan console.time() dan console.timeEnd(), tetapi menggunakan Timestamp Resolusi Tinggi yang sama itu now() menggunakan (sehingga Anda mendapatkan jam sub-milisekond monoton meningkat), dan menyimpan cap waktu dan jangka waktu ke PerformanceTimeline.

UserTiming memiliki konsep tanda (cap waktu) dan ukuran (durasi). Anda dapat menentukan sebanyak mungkin yang Anda inginkan, dan mereka terpapar di PerformanceTimeline.

Untuk menyimpan stempel waktu, Anda menelepon mark(startMarkName). Untuk mendapatkan durasi sejak tanda pertama Anda, Anda cukup menelepon measure(measurename, startMarkname). Durasi kemudian disimpan di PerformanceTimeline di samping tanda Anda.

function a() {
  window.performance.mark("start");
  ... do stuff ...
  window.performance.measure("myfunctionduration", "start");
}

// duration is window.performance.getEntriesByName("myfunctionduration", "measure")[0];

UserTiming tersedia di IE10 + dan Chrome25 +. Ada juga a polyfill tersedia (yang saya tulis).


44
2018-01-14 19:01



Untuk mendapatkan nilai tepat yang harus Anda gunakan Antarmuka kinerja. Ini didukung dalam versi modern dari Firefox, Chrome, Opera dan IE. Berikut contoh cara penggunaannya:

var performance = window.performance;
var t0 = performance.now();
doWork();
var t1 = performance.now();
console.log("Call to doWork took " + (t1 - t0) + " milliseconds.")

Date.getTime() atau console.time() tidak bagus untuk mengukur waktu eksekusi yang tepat. Anda dapat menggunakannya jika perkiraan kasar cepat tidak masalah bagi Anda. Dengan perkiraan kasar saya berarti Anda bisa mendapatkan pergeseran 15-60 ms dari waktu nyata.

Periksa ini brilian pos pada pengukuran waktu eksekusi di JavaScript. Penulis juga memberikan beberapa tautan tentang keakuratan waktu JavaScript, layak dibaca.


28
2018-02-26 16:13



Gunakan Firebug, aktifkan Konsol dan Javascript. Klik Profil. Muat ulang. Klik Profil lagi. Lihat laporannya.


17
2017-11-24 11:14



var StopWatch = function (performance) {
    this.startTime = 0;
    this.stopTime = 0;
    this.running = false;
    this.performance = performance === false ? false : !!window.performance;
};

StopWatch.prototype.currentTime = function () {
    return this.performance ? window.performance.now() : new Date().getTime();
};

StopWatch.prototype.start = function () {
    this.startTime = this.currentTime();
    this.running = true;
};

StopWatch.prototype.stop = function () {
    this.stopTime = this.currentTime();
    this.running = false;
};

StopWatch.prototype.getElapsedMilliseconds = function () {
    if (this.running) {
        this.stopTime = this.currentTime();
    }

    return this.stopTime - this.startTime;
};

StopWatch.prototype.getElapsedSeconds = function () {
    return this.getElapsedMilliseconds() / 1000;
};

StopWatch.prototype.printElapsed = function (name) {
    var currentName = name || 'Elapsed:';

    console.log(currentName, '[' + this.getElapsedMilliseconds() + 'ms]', '[' + this.getElapsedSeconds() + 's]');
};

Benchmark

var stopwatch = new StopWatch();
stopwatch.start();

for (var index = 0; index < 100; index++) {
    stopwatch.printElapsed('Instance[' + index + ']');
}

stopwatch.stop();

stopwatch.printElapsed();

Keluaran

Instance[0] [0ms] [0s]
Instance[1] [2.999999967869371ms] [0.002999999967869371s]
Instance[2] [2.999999967869371ms] [0.002999999967869371s]
/* ... */
Instance[99] [10.999999998603016ms] [0.010999999998603016s]
Elapsed: [10.999999998603016ms] [0.010999999998603016s]

performance.now () adalah opsional - hanya lulus salah ke fungsi konstruktor StopWatch.


10
2017-08-08 18:54



process.hrtime () tersedia dalam Node.js - mengembalikan nilai dalam nanodetik

var hrTime = process.hrtime()
console.log(hrTime[0] * 1000000 + hrTime[1] / 1000)

9
2018-03-11 09:49



Untuk memperluas kode vsync lebih lanjut untuk memiliki kemampuan untuk mengembalikan timeEnd sebagai nilai di NodeJS, gunakan potongan kode yang kecil ini.

console.timeEndValue = function(label) { // Add console.timeEndValue, to add a return value
   var time = this._times[label];
   if (!time) {
     throw new Error('No such label: ' + label);
   }
   var duration = Date.now() - time;
   return duration;
};

Sekarang gunakan kode seperti ini:

console.time('someFunction timer');

someFunction();

var executionTime = console.timeEndValue('someFunction timer');
console.log("The execution time is " + executionTime);


Ini memberi Anda lebih banyak kemungkinan. Anda dapat menyimpan waktu eksekusi yang akan digunakan untuk tujuan lain seperti menggunakannya dalam persamaan, atau disimpan dalam database, dikirim ke klien jarak jauh melalui soket web, disajikan pada halaman web, dll.


7
2017-08-04 04:23