1 poin oleh GN⁺ 2024-12-19 | 1 komentar | Bagikan ke WhatsApp

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

 
GN⁺ 2024-12-19
Komentar Hacker News
  • Penggunaan default jbuilder di Rails adalah salah satu faktor yang membuat rendering JSON menjadi lambat

    • Jika banyak bagian dirender dengan jbuilder, kecepatannya menurun
  • Penasaran 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

    • Terima kasih kepada penulis
  • Tulisan dan pekerjaannya luar biasa

    • Penasaran apakah masih ada alasan untuk menggunakan Oj ke depannya
  • Tulisan yang sangat menarik

    • Untuk optimasi yang tidak terbatas pada Ruby, misalnya saat menggunakan lookup table untuk karakter escape, penasaran mengapa tidak memanfaatkan library yang sudah ada seperti simdjson
  • Suka dengan pekerjaan byroot

    • Selalu kagum dengan kontribusi dan produktivitasnya
    • Ingin terlibat dalam pekerjaan Ruby-core, tetapi kurang termotivasi karena belum menemukan sesuatu yang cocok dengan kemampuan sendiri
    • Jika orang-orang yang bekerja di C terkait Ruby lebih sering menulis, akan ada lebih banyak orang dengan kemampuan untuk lebih memajukan Ruby
  • Saran tentang profiler C sangat bagus

    • Ingin mencoba lagi melakukan optimasi dengan menambahkan kode C ke gem Ruby
  • Trik performa berupa "lookup table" yang digunakan dalam PR Mame sangat mengesankan

    • Menggunakan String#each_codepoint alih-alih String#each_char dapat mengurangi beban GC
  • Membagikan contoh peningkatan performa lebih lanjut di codebase miliknya

    • Mengumpulkan codepoint dengan Array#pack lalu mengubahnya menjadi String
  • Pada CPU modern, petunjuk prediksi cabang tidak berguna

  • Penasaran apakah Ruby JSON menggunakan intrinsic

    • Juga penasaran dengan kompatibilitasnya dengan berbagai JIT