Sebenarnya tidak perlu alternatif
ruby/json sedikit lebih lambat daripada oj, tetapi perbedaannya tidak besar.
oj populer karena performanya, tetapi dapat menimbulkan berbagai masalah.
- Salah satu masalah
oj adalah isu keamanan yang muncul akibat monkey patch melalui Oj.mimic_JSON.
Tanggung jawab monkey patch
Oj.mimic_JSON dan Oj.optimize_rails menggantikan implementasi JSON yang kurang efisien, tetapi dapat menimbulkan masalah.
- Misalnya, opsi
script_safe bisa diabaikan sehingga rentan terhadap serangan XSS.
- Monkey patch harus dilakukan dengan hati-hati, dan perlu ditangani dengan aman seiring evolusi API.
Ketidakstabilan
oj merupakan salah satu penyebab utama crash Ruby dalam operasi skala besar.
oj dikembangkan sangat aktif, sehingga crash baru sering muncul.
- Di codebase
oj ada hack kotor yang sulit dipercaya.
Pekerjaan dasar
- Tujuannya adalah meningkatkan
ruby/json hingga performanya mirip oj agar kebutuhan monkey patch berkurang.
- Benchmark disiapkan dan profiler C digunakan untuk menganalisis performa.
Menghindari pemeriksaan ganda
- Performa ditingkatkan dengan menghindari pemeriksaan UTF-8 yang duplikat dalam benchmark
JSON.dump.
- Dengan menghapus pekerjaan duplikat antara
rb_enc_str_asciionly_p dan isLegalUTF8, diperoleh peningkatan performa 3%.
Periksa kondisi yang lebih murah dan lebih mungkin lebih dulu
- Di fungsi
fbuffer_inc_capa, performa meningkat 15% dengan mengoptimalkan kondisi pemeriksaan apakah buffer sudah dialokasikan.
Mengurangi biaya konfigurasi
- Dengan mengurangi biaya konfigurasi
ruby/json, performa pada microbenchmark meningkat secara signifikan.
Menghindari pointer chasing
- Dengan menghapus pemanggilan
rb_enc_get, performa meningkat 8%.
Tabel lookup
- Menggunakan tabel lookup meningkatkan performa dump string JSON sebesar 30%.
Bersambung
- Masih ada lebih banyak optimasi, tetapi akan dibahas di tulisan berikutnya.
1 komentar
Komentar Hacker News
Penggunaan default
jbuilderdi Rails adalah salah satu faktor yang membuat rendering JSON menjadi lambatjbuilder, kecepatannya menurunPenasaran apakah ada informasi tentang waktu yang dibutuhkan versi baru untuk mem-parsing/meng-encode dump JSON Twitter
Tulisan tentang topik ini sangat mudah dipahami, dan membuat ingin melakukan benchmark serta optimasi kode Ruby
Tulisan dan pekerjaannya luar biasa
Tulisan yang sangat menarik
Suka dengan pekerjaan byroot
Saran tentang profiler C sangat bagus
Trik performa berupa "lookup table" yang digunakan dalam PR Mame sangat mengesankan
String#each_codepointalih-alihString#each_chardapat mengurangi beban GCMembagikan contoh peningkatan performa lebih lanjut di codebase miliknya
Array#packlalu mengubahnya menjadiStringPada CPU modern, petunjuk prediksi cabang tidak berguna
Penasaran apakah Ruby JSON menggunakan intrinsic