Mengukur fungsi JavaScript ' Prestasi
Katakan anda mempunyai fungsi yang berfungsi tetapi mengesyaki ia tidak cekap dan merancang untuk membuat penambahbaikan. Bagaimana untuk membuktikan andaian ini? Apakah amalan terbaik untuk menguji prestasi fungsi JavaScript? Umumnya, cara terbaik ialah menggunakan fungsi terbina dalam
untuk mengukur masa sebelum dan selepas fungsi dilaksanakan. Artikel ini akan membincangkan cara mengukur masa dan cara pelaksanaan kod untuk mengelakkan beberapa perangkap biasa. performance.now()
mata utama
- Prestasi dalam pembangunan web adalah kritikal dan boleh diperbaiki dengan mengesahkan kelajuan kod. Cara terbaik untuk menguji prestasi fungsi JavaScript adalah menggunakan fungsi terbina dalam
- untuk mengukur masa sebelum dan selepas fungsi dilaksanakan.
performance.now()
API Masa Resolusi Tinggi menyediakan fungsi yang dipanggil yang mengembalikan objek - . Ini memberikan gambaran yang tepat tentang masa yang berlalu, menjadikannya lebih tepat daripada objek terbina dalam
now()
.DOMHighResTimeStamp
Date
Apabila mengukur masa pelaksanaan fungsi, berhati -hatilah untuk tidak secara tidak sengaja mengukur kandungan yang tidak penting. Pastikan satu -satunya operasi untuk mengukur antara dua adalah pelaksanaan fungsi yang dipersoalkan. -
performance.now()
Ini adalah ralat biasa untuk mengukur masa pelaksanaan fungsi sekali sahaja. Masa pelaksanaan berbeza -beza berdasarkan pelbagai faktor, jadi disyorkan untuk mengulangi fungsi dan mengira masa purata atau median. - Konteks adalah penting apabila membandingkan kelajuan fungsi yang berbeza. Kelajuan fungsi berbeza mengikut tugas tertentu yang dilakukannya. Oleh itu, untuk menulis aplikasi web yang lebih cepat, adalah penting untuk membuat pengukuran dan perbandingan.
API Masa Resolusi Tinggi menyediakan fungsi yang dipanggil yang mengembalikan objek Jika anda menjalankan kod ini dalam penyemak imbas anda, anda harus melihat sesuatu seperti yang berikut: Berikut menunjukkan demonstrasi langsung kod ini:
dan memberikan nilainya kepada pembolehubah Tetapi dalam kes ini, kami akan mengukur masa yang diperlukan untuk memanggil fungsi Begitu juga, kita tidak tahu bagaimana masa pelaksanaan diperuntukkan. Adakah tugasan yang berubah -ubah, panggilan jejak #2 - mengukur hanya sekali
Risiko pendekatan ini adalah bahawa enjin JavaScript pelayar kami boleh melakukan pengoptimuman sekunder, yang bermaksud bahawa kali kedua fungsi dipanggil dengan input yang sama, ia boleh mendapat manfaat daripada mengingati output pertama, dan hanya menggunakannya lagi. Untuk menyelesaikan masalah ini, anda boleh menggunakan banyak rentetan input yang berbeza dan bukannya berulang kali menghantar rentetan input yang sama (seperti "Peter"). Jelas sekali, masalah dengan ujian dengan input yang berbeza adalah bahawa fungsi yang kita ukur secara semulajadi memerlukan masa yang berlainan. Mungkin beberapa input akan menghasilkan masa pelaksanaan yang lebih lama daripada yang lain. jejak #3-ketergantungan secara purata Di bahagian sebelumnya, kami mengetahui bahawa ia adalah kebiasaan yang baik untuk mengulangi sesuatu dan menggunakan input yang berbeza. Walau bagaimanapun, kita harus ingat bahawa masalah dengan input yang berbeza adalah bahawa masa pelaksanaan mungkin lebih lama daripada semua input lain. Oleh itu, mari kita mundur dan hantar input yang sama. Katakan kami menghantar input yang sama sepuluh kali dan mencetak masa yang diperlukan setiap kali. Output mungkin kelihatan seperti ini: Perhatikan bahawa kali pertama, nombor itu sama sekali berbeza dari sembilan kali yang lain. Ini kemungkinan besar kerana enjin JavaScript dalam penyemak imbas kami telah melakukan beberapa pengoptimuman dan memerlukan beberapa pemanasan. Kita tidak boleh mengelakkan ini, tetapi kita boleh mempertimbangkan beberapa ubat yang baik untuk mencegah kesimpulan palsu. Salah satu cara adalah untuk mengira purata masa untuk sembilan kali terakhir. Satu lagi pendekatan yang lebih praktikal adalah untuk mengumpul semua hasil dan mengira median. Pada asasnya, ini adalah semua hasil dalam rangka dan pilih yang tengah. Di sinilah Kami telah belajar bahawa ia sentiasa merupakan idea yang baik untuk mengukur sesuatu yang beberapa kali dan purata. Selain itu, contoh terakhir memberitahu kita bahawa lebih baik menggunakan median dan bukannya purata. Sekarang, sebenarnya, penggunaan yang baik untuk mengukur masa pelaksanaan fungsi adalah untuk memahami mana dari beberapa fungsi lebih cepat. Katakan kami mempunyai dua fungsi yang mengambil jenis input yang sama dan menghasilkan hasil yang sama, tetapi secara dalaman mereka bekerja dengan cara yang berbeza. Katakan kita mahu fungsi yang kembali benar atau palsu jika rentetan wujud dalam pelbagai rentetan lain, tetapi ini adalah kes-insensitif. Dalam erti kata lain, kita tidak boleh menggunakan kami segera menyedari bahawa ini dapat diperbaiki kerana gelung mari kita lihat mana yang lebih cepat sekarang. Kami melakukan ini dengan menjalankan setiap fungsi 10 kali dan mengumpul semua pengukuran: kami menjalankannya dan mendapatkan output berikut: Berikut menunjukkan demonstrasi langsung contoh ini: [pautan codepen harus dimasukkan di sini, kerana saya tidak dapat mengakses laman web luaran, ia tidak dapat disediakan] Apa sebenarnya yang berlaku? Fungsi pertama adalah tiga kali lebih cepat. Ini tidak sepatutnya berlaku! Penjelasannya mudah, tetapi halus. Fungsi pertama menggunakan Kesimpulan Semasa kami cuba menunjukkan bagaimana untuk mendapatkan masa pelaksanaan yang tepat di JavaScript menggunakan (bahagian Soalan Lazim ditinggalkan, kerana ia sangat diduplikasi dengan kandungan di atas, hanya menyimpan mata utama.) now()
. Ini adalah nombor titik terapung yang mencerminkan masa semasa dalam milisaat, dan tepat hingga satu ribu milisaat. Individu, nombor ini tidak begitu berharga untuk analisis anda, tetapi perbezaan antara dua nombor tersebut dapat menggambarkan dengan tepat berapa banyak masa yang telah berlalu. Di samping menjadi lebih tepat daripada objek terbina dalam DOMHighResTimeStamp
, ia juga "membosankan". Ini bermakna, hanya meletakkan, ia tidak dipengaruhi oleh sistem (seperti sistem operasi komputer riba anda) secara berkala membetulkan masa sistem. Untuk meletakkannya dengan mudah, menentukan dua contoh dan mengira perbezaan tidak mewakili masa berlalu. Takrif matematik "monotonik" ialah perubahan
(untuk fungsi atau kuantiti) perubahan sedemikian rupa sehingga tidak pernah berkurangan atau tidak pernah meningkatkan Date
. Satu lagi cara untuk menerangkannya ialah membayangkan menggunakannya dalam tempoh masa di mana jam itu bertukar ke hadapan atau ke belakang. Sebagai contoh, apabila jam negara anda bersetuju untuk melangkau satu jam untuk memaksimumkan cahaya matahari pada siang hari. Jika anda ingin membuat contoh Date
satu jam sebelum jam dipanggil kembali, dan kemudian satu lagi contoh selepas itu, lihat perbezaannya, ia akan menunjukkan sesuatu seperti "1 jam 3 saat 123 milisaat". Menggunakan dua contoh
, perbezaannya akan menjadi "3 saat 123 milisaat dan 456789 ribu milisaat". Dalam bahagian ini, saya tidak akan terperinci mengenai API ini. Jadi, jika anda ingin mengetahui lebih lanjut dan melihat beberapa contohnya menggunakannya, saya cadangkan anda membaca artikel yang menemui API Masa Resolusi Tinggi. Sekarang bahawa anda telah mempelajari apa API masa resolusi tinggi dan bagaimana untuk menggunakannya, mari kita menyelam ke dalam beberapa perangkap yang berpotensi. Tetapi sebelum melakukan ini, mari kita tentukan fungsi yang dipanggil Date
, yang akan kita gunakan untuk seluruh artikel ini. Date
performance.now()
makeHash()
Pelaksanaan fungsi ini dapat diukur seperti berikut: function makeHash(source) {
var hash = 0;
if (source.length === 0) return hash;
for (var i = 0; i < source.length; i++) {
var char = source.charCodeAt(i);
hash = ((hash << 5) - hash) + char;
hash = hash & hash; // Convert to 32bit integer
}
return hash;
}
var t0 = performance.now();
var result = makeHash('Peter');
var t1 = performance.now();
console.log('Took', (t1 - t0).toFixed(4), 'milliseconds to generate:', result);
<code>Took 0.2730 milliseconds to generate: 77005292</code>
dan yang lain
, satu -satunya perkara yang kita lakukan ialah memanggil fungsi performance.now()
. Ini memberi kita masa yang diperlukan untuk melaksanakan fungsi tanpa apa -apa lagi. Pengukuran ini juga boleh dilakukan seperti berikut: performance.now()
makeHash()
result
Terdapat demonstrasi langsung coretan kod ini di bawah: var t0 = performance.now();
console.log(makeHash('Peter')); // 不好的主意!
var t1 = performance.now();
console.log('Took', (t1 - t0).toFixed(4), 'milliseconds');
makeHash('Peter')
dan masa yang diperlukan untuk menghantar dan mencetak output itu pada konsol. Kami tidak tahu berapa lama masa yang diperlukan untuk kedua -dua operasi ini. Anda hanya tahu masa gabungan. Selain itu, masa yang diperlukan untuk menghantar dan mencetak berbeza -beza sangat bergantung pada apa yang sedang berlaku dalam penyemak imbas atau bahkan dalam penyemak imbas pada masa itu.
Mungkin anda tahu betapa lambatnya. Walau bagaimanapun, melaksanakan pelbagai fungsi adalah sama salah, walaupun setiap fungsi tidak melibatkan sebarang I/O. Contohnya: console.log
atau panggilan function makeHash(source) {
var hash = 0;
if (source.length === 0) return hash;
for (var i = 0; i < source.length; i++) {
var char = source.charCodeAt(i);
hash = ((hash << 5) - hash) + char;
hash = hash & hash; // Convert to 32bit integer
}
return hash;
}
toLowerCase()
toString()
Satu lagi kesilapan biasa adalah untuk membuat pengukuran hanya sekali, meringkaskan masa yang diambil, dan membuat kesimpulan berdasarkan masa itu. Pada masa yang berlainan, ini mungkin berbeza. Masa pelaksanaan bergantung pada pelbagai faktor:
masa pemanasan kompil (contohnya, masa apabila kod itu disusun menjadi bytecode)
Berikut menunjukkan demonstrasi langsung contoh ini: var t0 = performance.now();
var result = makeHash('Peter');
var t1 = performance.now();
console.log('Took', (t1 - t0).toFixed(4), 'milliseconds to generate:', result);
function makeHash(source) {
var hash = 0;
if (source.length === 0) return hash;
for (var i = 0; i < source.length; i++) {
var char = source.charCodeAt(i);
hash = ((hash << 5) - hash) + char;
hash = hash & hash; // Convert to 32bit integer
}
return hash;
}
performance.now()
sangat berguna, kerana anda boleh mendapatkan nombor yang boleh anda gunakan seperti yang anda suka. Mari cuba lagi, tetapi kali ini kita akan menggunakan fungsi median: var t0 = performance.now();
var result = makeHash('Peter');
var t1 = performance.now();
console.log('Took', (t1 - t0).toFixed(4), 'milliseconds to generate:', result);
jejak #4 - Bandingkan fungsi dalam urutan yang boleh diramal
Array.prototype.indexOf
kerana ia tidak sensitif. Ini adalah pelaksanaan seperti ini: <code>Took 0.2730 milliseconds to generate: 77005292</code>
haystack.forEach
selalu melintasi semua elemen, walaupun kami mempunyai perlawanan awal. Mari cuba tulis versi yang lebih baik menggunakan lama untuk gelung. var t0 = performance.now();
console.log(makeHash('Peter')); // 不好的主意!
var t1 = performance.now();
console.log('Took', (t1 - t0).toFixed(4), 'milliseconds');
var t0 = performance.now();
var name = 'Peter';
var result = makeHash(name.toLowerCase()).toString();
var t1 = performance.now();
console.log('Took', (t1 - t0).toFixed(4), 'milliseconds to generate:', result);
var t0 = performance.now();
for (var i = 0; i < 10; i++) {
makeHash('Peter');
}
var t1 = performance.now();
console.log('Took', ((t1 - t0) / 10).toFixed(4), 'milliseconds to generate');
haystack.forEach
manfaat dari beberapa pengoptimuman peringkat rendah dalam enjin JavaScript pelayar, dan kami tidak mendapat pengoptimuman ini apabila kami menggunakan teknik pengindeksan array. Ia membuktikan maksud kami: anda tidak akan tahu kecuali anda mengukurnya! performance.now()
, kami tersandung pada senario penanda aras di mana intuisi kami adalah bertentangan dengan kesimpulan yang kami datang dengan hasil empirikal kami. Intinya ialah jika anda ingin menulis aplikasi web yang lebih cepat, kod JavaScript anda perlu dioptimumkan. Kerana komputer adalah (hampir) makhluk hidup, mereka tidak dapat diramalkan dan mengejutkan. Cara yang paling boleh dipercayai untuk mengetahui bahawa penambahbaikan kod kami akan menghasilkan kelajuan pelaksanaan yang lebih cepat adalah pengukuran dan perbandingan. Kami tidak pernah tahu sekeping kod mana yang lebih cepat, dan jika kita mempunyai pelbagai cara untuk melakukan perkara yang sama, sebab lain ialah konteksnya penting. Dalam bahagian sebelumnya, kami melakukan carian rentetan kes-insensitif, mencari rentetan dalam 26 rentetan lain. Sekiranya kita terpaksa mencari rentetan dalam 100,000 rentetan lain, kesimpulannya kemungkinan besar akan berbeza. Senarai di atas tidak lengkap, kerana terdapat lebih banyak perangkap untuk mengetahui. Sebagai contoh, mengukur senario yang tidak praktikal atau hanya mengambil pengukuran pada enjin JavaScript. Tetapi pasti bahawa performance.now()
adalah aset besar untuk pemaju JavaScript yang ingin menulis aplikasi web yang lebih cepat dan lebih baik. Akhir sekali, ingatlah bahawa mengukur masa pelaksanaan hanya menghasilkan satu dimensi "kod yang lebih baik". Memori dan kerumitan kod juga perlu dipertimbangkan. Bagaimana dengan anda? Adakah anda pernah menggunakan fungsi ini untuk menguji prestasi kod anda? Jika tidak, bagaimana anda meneruskan pada peringkat ini? Sila kongsi pendapat anda dalam komen di bawah. Mari mulakan perbincangan!
Atas ialah kandungan terperinci Mengukur fungsi JavaScript ' Prestasi. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

Video Face Swap
Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas











JavaScript adalah asas kepada pembangunan web moden, dan fungsi utamanya termasuk pengaturcaraan yang didorong oleh peristiwa, penjanaan kandungan dinamik dan pengaturcaraan tak segerak. 1) Pengaturcaraan yang didorong oleh peristiwa membolehkan laman web berubah secara dinamik mengikut operasi pengguna. 2) Penjanaan kandungan dinamik membolehkan kandungan halaman diselaraskan mengikut syarat. 3) Pengaturcaraan Asynchronous memastikan bahawa antara muka pengguna tidak disekat. JavaScript digunakan secara meluas dalam interaksi web, aplikasi satu halaman dan pembangunan sisi pelayan, sangat meningkatkan fleksibiliti pengalaman pengguna dan pembangunan silang platform.

Trend terkini dalam JavaScript termasuk kebangkitan TypeScript, populariti kerangka dan perpustakaan moden, dan penerapan webassembly. Prospek masa depan meliputi sistem jenis yang lebih berkuasa, pembangunan JavaScript, pengembangan kecerdasan buatan dan pembelajaran mesin, dan potensi pengkomputeran IoT dan kelebihan.

Enjin JavaScript yang berbeza mempunyai kesan yang berbeza apabila menguraikan dan melaksanakan kod JavaScript, kerana prinsip pelaksanaan dan strategi pengoptimuman setiap enjin berbeza. 1. Analisis leksikal: Menukar kod sumber ke dalam unit leksikal. 2. Analisis Tatabahasa: Menjana pokok sintaks abstrak. 3. Pengoptimuman dan Penyusunan: Menjana kod mesin melalui pengkompil JIT. 4. Jalankan: Jalankan kod mesin. Enjin V8 mengoptimumkan melalui kompilasi segera dan kelas tersembunyi, Spidermonkey menggunakan sistem kesimpulan jenis, menghasilkan prestasi prestasi yang berbeza pada kod yang sama.

JavaScript adalah bahasa utama pembangunan web moden dan digunakan secara meluas untuk kepelbagaian dan fleksibiliti. 1) Pembangunan front-end: Membina laman web dinamik dan aplikasi satu halaman melalui operasi DOM dan kerangka moden (seperti React, Vue.js, sudut). 2) Pembangunan sisi pelayan: Node.js menggunakan model I/O yang tidak menyekat untuk mengendalikan aplikasi konkurensi tinggi dan masa nyata. 3) Pembangunan aplikasi mudah alih dan desktop: Pembangunan silang platform direalisasikan melalui reaktnatif dan elektron untuk meningkatkan kecekapan pembangunan.

Python lebih sesuai untuk pemula, dengan lengkung pembelajaran yang lancar dan sintaks ringkas; JavaScript sesuai untuk pembangunan front-end, dengan lengkung pembelajaran yang curam dan sintaks yang fleksibel. 1. Sintaks Python adalah intuitif dan sesuai untuk sains data dan pembangunan back-end. 2. JavaScript adalah fleksibel dan digunakan secara meluas dalam pengaturcaraan depan dan pelayan.

Artikel ini menunjukkan integrasi frontend dengan backend yang dijamin oleh permit, membina aplikasi edtech SaaS yang berfungsi menggunakan Next.Js. Frontend mengambil kebenaran pengguna untuk mengawal penglihatan UI dan memastikan permintaan API mematuhi dasar peranan

Peralihan dari C/C ke JavaScript memerlukan menyesuaikan diri dengan menaip dinamik, pengumpulan sampah dan pengaturcaraan asynchronous. 1) C/C adalah bahasa yang ditaip secara statik yang memerlukan pengurusan memori manual, manakala JavaScript ditaip secara dinamik dan pengumpulan sampah diproses secara automatik. 2) C/C perlu dikumpulkan ke dalam kod mesin, manakala JavaScript adalah bahasa yang ditafsirkan. 3) JavaScript memperkenalkan konsep seperti penutupan, rantaian prototaip dan janji, yang meningkatkan keupayaan pengaturcaraan fleksibiliti dan asynchronous.

Saya membina aplikasi SaaS multi-penyewa berfungsi (aplikasi edTech) dengan alat teknologi harian anda dan anda boleh melakukan perkara yang sama. Pertama, apakah aplikasi SaaS multi-penyewa? Aplikasi SaaS Multi-penyewa membolehkan anda melayani beberapa pelanggan dari Sing
