10 poin oleh GN⁺ 2025-08-05 | Belum ada komentar. | Bagikan ke WhatsApp
  • 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.

Belum ada komentar.