Jebakan Kinerja JSON .Net 7

Jan 10 2023
Kita harus tetap memperhatikan kinerja saat menulis kode sambil menghindari membuat pengoptimalan nano. Terkadang apa yang tampak seperti pengoptimalan hemat membuat perbedaan besar.
Foto oleh Carla Quario di Unsplash

Kita harus tetap memperhatikan kinerja saat menulis kode sambil menghindari membuat pengoptimalan nano. Terkadang apa yang tampak seperti pengoptimalan hemat membuat perbedaan besar. Hari ini kita akan melihat bagaimana System.Text.Json memiliki perangkap penalti kinerja.

Apa yang salah dengan kode ini?

Setiap kali kami menjalankan fungsi ini, ia membuat JsonSerializerOptions baru. Seberapa buruk membuat instance objek baru setiap saat? Secara umum, membuat objek baru setiap saat dapat diabaikan dalam hal performa dan alokasi memori. Namun, saat melakukan profil kinerja, tim saya mendapatkan hasil yang mencurigakan. Waktu yang dibutuhkan untuk fungsi-fungsi itu sama:

  • SendToServiceBus()
  • Serialkan()

Mengapa Serialisasi sangat lambat?

System.Text.Json yang baru menggunakan referensi instance dari JsonSerializerOptions untuk meng-cache metadata serialisasi, jadi jika Anda menyediakan instance baru setiap kali, Anda kehilangan cache, dan kode harus melakukan operasi mahal untuk membuat metadata untuk setiap fungsi panggilan.

Masalahnya sangat umum Microsoft bahkan memiliki seluruh halaman yang didedikasikan untuk ini.

Contoh

Dokumen memberikan contoh tolok ukur ini:

Seperti yang Anda lihat dari dokumen, perbedaannya sangat besar, lebih dari 200 kali lebih mahal. Dan tidak ada yang akan memberitahu Anda tentang hal itu, tidak ada pengecualian atau peringatan. Satu-satunya cara Anda akan menemukannya adalah selama pengujian beban dan pembuatan profil. Itu membuat saya bertanya-tanya apakah ini harus menjadi peringatan, jadi kami mengurangi berapa kali kesalahan ini akan dilakukan.

Kesimpulan

Praktik yang baik seperti mengetahui siklus hidup objek dan mengoptimalkan pembuatan untuk lajang mungkin memberikan hasil lebih dari tampilannya. Jadi saya merekomendasikan belajar saat Anda menginginkan Singleton atau objek baru per permintaan.

Ingatlah bahwa membuat opsi serializer setiap kali memiliki implikasi yang signifikan karena kerangka kerja menyimpan metadata internal terhadap referensi SerializerOptions.

Jika Anda melihat JsonSerializerOptions() baru, pastikan itu dalam pola Singleton.

Selamat mengkode.