Dasar-dasar mesin JavaScript: bentuk umum dan cache inline. Bagian 2

Halo semuanya! Kursus "Keamanan Sistem Informasi" dimulai dalam 2 minggu, jadi hari ini kami ingin mempublikasikan bagian kedua dari artikel ini, yang waktunya akan bertepatan dengan peluncurannya. Anda dapat membaca bagian pertama di sini . Jadi mari kita mulai.

Cache Inline (IC)

Gagasan utama di balik formulir adalah konsep cache inline atau IC. Mereka adalah komponen kunci dari JavaScript cepat! Mesin JavaScript menggunakan IC untuk mengingat informasi tentang di mana menemukan properti objek untuk mengurangi jumlah pencarian yang mahal.



Kami memiliki fungsi getX yang mengambil objek sebagai input dan memuat properti x darinya:

 function getX(o) { return ox; } 

Jika kita menjalankan fungsi ini di JSC, kita mendapatkan bytecode berikut:



get_by_id pertama memuat properti 'x' dari argumen pertama (arg1) dan menyimpan hasilnya di loc0 . Pernyataan berikut mengembalikan apa yang kami simpan di loc0 .
JSC juga menyematkan Cache inline dalam get_by_id , yang terdiri dari dua slot yang tidak diinisialisasi.



Sekarang mari kita asumsikan bahwa kita memanggil getX bersama dengan objek { x: 'a' } . Kita sudah tahu bahwa objek ini memiliki properti 'x' , dan bentuknya menyimpan offset dan atribut properti . Saat Anda menjalankan fungsi untuk pertama kalinya, pernyataan get_by_id properti 'x' dan menemukan bahwa nilainya disimpan pada offset 0.



IC get_by_id dibangun dalam instruksi tersebut mengingat bentuk dan mengimbangi di mana properti ditemukan.



Untuk IC berikutnya dimulai, Anda hanya perlu membandingkan formulir, dan jika itu sama dengan sebelumnya, cukup muat nilai dari offset yang disimpan. Secara khusus, jika mesin JavaScript melihat objek dengan bentuk yang ia tulis sebelumnya, ia tidak perlu lagi meminta informasi tentang properti ini secara umum - sebagai gantinya, pencarian mahal untuk informasi tentang properti dapat sepenuhnya dilewati. Ini secara signifikan lebih cepat daripada menghabiskan waktu mencari properti setiap kali.

Penyimpanan array yang efisien

Untuk array, adalah praktik umum untuk menyimpan indeks array. Nilai properti tersebut disebut elemen array. Akan sia-sia untuk menyimpan atribut properti untuk setiap elemen array dalam array yang terpisah. Alih-alih, mesin JavaScript mengandalkan fakta bahwa properti yang diindeks dalam array dapat ditulisi, dihitung, dan dapat dikonfigurasi secara default, dan mereka juga menyimpan elemen array secara terpisah dari properti bernama lainnya.

Pertimbangkan array berikut:

 const array = [ '#jsconfeu', ]; 

Mesin menyimpan array panjang dan titik unit ke bentuk yang berisi offset dan atribut untuk properti 'length' .



Ini mirip dengan apa yang telah kita lihat sebelumnya ... Tapi di mana nilai-nilai elemen array disimpan?



Setiap array memiliki toko dukungan elemen terpisah yang berisi semua nilai properti yang diindeks oleh array. Mesin JavaScript tidak perlu menyimpan atribut properti apa pun untuk elemen-elemen array, karena biasanya dapat ditulisi, dihitung, dan dapat dikonfigurasi.

Tetapi apa yang terjadi jika mereka tiba-tiba menjadi tidak tersedia untuk konfigurasi? Bagaimana jika Anda mengubah atribut properti elemen array?

 // Please don't ever do this! const array = Object.defineProperty( [], '0', { value: 'Oh noes!!1', writable: false, enumerable: false, configurable: false, } ); 

Cuplikan kode di atas mendefinisikan properti yang disebut '0' (dalam hal ini ternyata menjadi indeks array), itu mengubah nilai atribut ke yang non-default.

Dalam kasus ekstrem seperti itu, mesin JavaScript menyajikan seluruh penyimpanan cadangan elemen sebagai kamus yang memetakan indeks array ke atribut properti.



Bahkan jika hanya satu elemen array yang memiliki atribut non-default, seluruh penyimpanan salinan cadangan elemen masuk ke mode operasi yang lambat dan tidak efisien. Hindari Object.defineProperty dalam indeks array! (Saya bahkan tidak tahu mengapa Anda harus menggunakannya pada prinsipnya. Tampaknya aneh dan tidak rasional.)

Kesimpulan

Kami mempelajari bagaimana mesin JavaScript menyimpan objek dan array, bagaimana formulir dan cache inline membantu mengoptimalkan berbagai operasi. Juga di artikel ini, kami ingin memberikan beberapa tips praktis untuk JavaScript yang dapat membantu meningkatkan kinerja kode Anda:

  • Selalu inisialisasi objek Anda dengan cara yang sama sehingga mereka tidak memiliki bentuk berbeda;
  • Jangan main-main dengan atribut properti dari elemen array, beri mereka kesempatan untuk disimpan dengan aman dan bekerja secara efisien.

Sekarang artikelnya bisa dianggap lengkap. Menurut tradisi yang ada, kami menunggu komentar Anda dan mengundang Anda untuk mendaftar webinar terbuka pada kursus "Keamanan Sistem Informasi", yang akan diadakan hari ini oleh analis virus yang terkenal dan paruh waktu guru kami - Alexander Kolesnikov .

Baca bagian pertama.

Source: https://habr.com/ru/post/id447220/


All Articles