- Di mesin V8, performa fungsi JSON.stringify ditingkatkan lebih dari dua kali lipat, sehingga kecepatan serialisasi data ikut membaik
- Dengan memperkenalkan jalur optimasi untuk objek tanpa efek samping, banyak logika pemeriksaan defensif bisa dilewati, menghasilkan peningkatan kecepatan besar pada objek data umum
- Pada pemrosesan string, diterapkan metode tingkat lanjut dari sisi perangkat keras dan memori, seperti pembedaan 1-byte/2-byte, pemanfaatan SIMD, dan perubahan struktur buffer sementara
- Pada proses konversi angka, algoritme Grisu3 yang lama diganti dengan Dragonbox, sehingga konversi juga menjadi lebih cepat secara umum sebelum pemanggilan
Number.toString()
- Untuk beberapa argumen dan bentuk data tertentu, proses akan kembali ke jalur serialisasi umum, tetapi dalam sebagian besar situasi pengembangan web, efek optimasi ini bisa dinikmati secara otomatis
Gambaran umum
JSON.stringify adalah fungsi inti untuk mengubah data menjadi string di JavaScript
- Peningkatan performa fungsi ini juga memberi dampak positif pada pekerjaan yang sangat penting di web, seperti permintaan jaringan atau penyimpanan ke localStorage
- Melalui rekayasa V8 terbaru, kecepatan fitur ini telah meningkat lebih dari dua kali lipat, dan berbagai teknik optimasi utamanya dijelaskan secara rinci
Jalur Fast Path tanpa efek samping
- Inti optimasinya adalah penerapan jalur serialisasi cepat yang hanya bisa digunakan dalam kondisi tanpa efek samping (side effect)
- Dalam kondisi seperti ini, objek ditelusuri dengan struktur iteratif alih-alih rekursif, sehingga tidak memerlukan pemeriksaan stack overflow dan memungkinkan percobaan serialisasi objek yang lebih dalam
- Saat objek data cukup sederhana, V8 memanfaatkan Fast Path ini alih-alih logika umum yang lambat, melewati banyak pemeriksaan dan meningkatkan kecepatan
Menangani berbagai representasi string
- V8 menyimpan string secara berbeda berdasarkan karakter 1-byte/2-byte (ASCII/non-ASCII), dan jika ada satu saja non-ASCII maka seluruhnya akan dikelola sebagai 2-byte
- Demi performa serialisasi string, dibuat dan dikompilasi versi algoritme terpisah untuk tiap tipe string
- Karena selama pemrosesan perlu memeriksa tipe instance string, ketika string 2-byte terdeteksi, serializer 2-byte yang sesuai akan mengambil alih status
- Berkat ini, overhead perpindahan jalur berdasarkan encoding string pada praktiknya hampir tidak ada
- Hasil akhirnya dibuat sebagai buffer 1-byte dan 2-byte terpisah, lalu cukup digabungkan di akhir
Optimasi serialisasi string dengan SIMD
- String JavaScript bisa mengandung karakter yang perlu di-escape saat serialisasi JSON
- String panjang diperiksa beberapa byte sekaligus menggunakan instruksi perangkat keras SIMD (seperti ARM64 Neon)
- String pendek diproses dengan metode SWAR, yaitu menangani beberapa karakter sekaligus melalui operasi bit di register umum
- Apa pun metodenya, dalam sebagian besar kasus seluruh string dapat disalin dengan cepat tanpa transformasi tambahan
Penambahan Express Lane (jalur super cepat)
- Bahkan di dalam Fast Path, disiapkan Express Lane agar serialisasi bisa dilakukan hanya dengan menyalin key tanpa pekerjaan berulang seperti pemeriksaan properti
- Dengan memanfaatkan flag hidden class pada objek, jika key tidak memiliki Symbol, semuanya enumerable, dan dapat diserialisasi tanpa perlu escape, maka objek ditandai sebagai
fast-json-iterable
- Saat menserialisasi objek lain dengan hidden class yang sama, penyalinan key bisa langsung dilakukan tanpa pemeriksaan tambahan
- Teknik ini juga diterapkan di
JSON.parse untuk perbandingan key yang lebih cepat
Algoritme double-to-string yang lebih cepat
- Proses mengubah angka menjadi string juga sangat sering terjadi dan cukup kompleks
- Dengan mengganti algoritme Grisu3 lama ke Dragonbox, peningkatan performa juga terasa pada seluruh pemanggilan
Number.prototype.toString()
Optimasi struktur buffer sementara
- Saat membangun string, sebelumnya digunakan satu buffer kontinu, sehingga ketika ruang habis akan timbul overhead karena perlu menyalin seluruh isi
- Metode baru memakai struktur buffer tersegmentasi, yang menyambungkan beberapa buffer kecil sesuai kebutuhan
- Karena itu, saat ruang tidak cukup, cukup mengalokasikan buffer baru tanpa perlu menyalin seluruh isi
Batasan
- Fast Path hanya bekerja untuk serialisasi data sederhana
- Jika tidak memenuhi kondisi berikut, jalur umum akan digunakan
- Tidak boleh menggunakan argumen replacer atau space (tidak untuk pretty-print atau transformasi)
- Harus berupa objek sederhana tanpa metode kustom toJSON
- Jika ada properti berbasis indeks, akan berpindah ke jalur lambat
- String khusus seperti ConsString tidak ditangani
- Untuk sebagian besar penggunaan umum seperti serialisasi data, pembuatan respons API, dan caching konfigurasi, efek optimasi ini diterapkan secara otomatis
Kesimpulan
- Dengan merombak pendekatan di seluruh area, dari desain dasar
JSON.stringify hingga pemrosesan memori dan karakter, V8 berhasil mencapai peningkatan kecepatan lebih dari 2x berdasarkan benchmark JetStream2
- Peningkatan ini bisa langsung dirasakan pada V8 versi 13.8 (Chrome 138) dan yang lebih baru
Belum ada komentar.