Serialisasi dan Deserializing .NET Core vs Go Data

Hai% nama pengguna%


Tugas saya adalah membandingkan kinerja serialisasi untuk .NET Core dan Golang. Setelah mencari di Internet, saya menemukan repositori . Contoh sederhana dari layanan mikro REST dipertimbangkan. Inilah yang saya butuhkan, pikir saya. Setelah melihat hasil tes, saya terkejut. Setelah melihat kode sumber, saya menyadari apa yang salah. Inilah yang saya tidak suka:


  • Untuk serialisasi dan deserialisasi, array 3 elemen dipilih. Ini jelas tidak cukup.
  • Untuk Golang, semua fitur bahasa tidak digunakan, tetapi, seperti yang Anda tahu, pengkodean / json built-in library lambat.
  • Akibatnya, penulis membandingkan kinerja server web kestrel dan net / http.

Kekurangan inilah yang menyebabkan pertimbangan kinerja yang lebih rinci dalam kerangka contoh yang dijelaskan di atas. Saya harap Anda tertarik untuk mengetahui hasilnya.


Komposisi dan deskripsi perangkat lunak


Kode sumber dari repositori di atas juga diambil sebagai basis. Apa yang telah difinalisasi:


  • Untuk server API, fasthttp digunakan.
  • Server API merespons dengan array rekaman.
  • Setiap klien memiliki beberapa metode untuk memeriksa.

Kode yang dimodifikasi tersedia di repositori .


Untuk kejelasan, contoh respons JSON dari API server:


[ { "Id":"id_8299119732867115081", "Name":"name_5541535679032008745", "Time":1566731141 }, ... { "Id":"id_2804604318195309547", "Name":"name_5914011395631118540", "Time":1566731142 } ] 

Pelanggan


Untuk mengevaluasi kinerja di setiap layanan, tiga metode diterapkan:


  • menerima data dari API server dan mengirimkannya tanpa memproses [/ testNoProcess].
  • menerima data dari API server - deserialization, serialisasi menggunakan refleksi dan mengirim [/ testReflection]. Untuk .NETCore, paket Newtonsoft.Json digunakan, untuk Golang, penyandian / json digunakan.
  • menerima data dari server API - deserialization, serialisasi tanpa menggunakan refleksi dan mengirim [/ testNoReflection]. Untuk .NETCore, solusi berbasis Rentang diimplementasikan untuk meminimalkan jumlah alokasi memori. Golang memiliki solusi siap pakai - perpustakaan easyjson , yang telah membuktikan dirinya secara eksklusif di sisi positif.

Berdasarkan tes ini, Anda dapat mengevaluasi kinerja relatif dari server web (kestrel dan net / http), penurunan kinerja saat memproses data menggunakan refleksi dan tanpa itu untuk implementasi dalam kedua bahasa.


Deskripsi metodologi pengujian


Pengujian dilakukan dalam beberapa tahap untuk mengevaluasi kinerja setiap bahasa dan setiap implementasi.
Untuk membuat beban, utilitas bombardier dipilih. Utilitas diluncurkan dengan parameter berikut: -c 125 -d 120s, yang dapat diartikan sebagai berikut: cara menggunakan 125 utas dengan waktu uji 120 detik.


Pengukuran kinerja dilakukan dalam 3 tahap:


  1. Dimensi server RPS API. Pengukuran dilakukan untuk dapat menilai pengaruh metode pemrosesan pada kinerja masing-masing metode.
  2. Pengukuran RPS dari pemrosesan respons menggunakan refleksi.
  3. Ukur pemrosesan respons RPS tanpa menggunakan refleksi.

Berdasarkan pengukuran ini, data diperoleh pada kinerja pemrosesan respons. Pemanfaatan semua inti prosesor adalah 99,8-100%. Untuk penilaian, data awal 10, 30, 100, dan 500 catatan dipilih. Susunan 500 rekaman dalam produksi tidak umum, tetapi saya tertarik untuk melihat bagaimana masing-masing bahasa berperilaku.


Test stand


Semua tes dijalankan pada mesin virtual yang menjalankan Ubuntu Server 18.04 dengan semua pembaruan untuk Agustus 2019. Ini memiliki karakteristik sebagai berikut:


  • Core Prosesor I7-3770K - 4 core.
  • RAM - 4 GB.

Untuk perbandingan kinerja, .NET Core 2.2 dan Golang 1.12 diinstal.


Nah, sekarang saatnya untuk beralih ke yang paling menarik - hasilnya.


Hasil


Di bawah ini adalah tabel dengan hasil tes.


alt text


Anda dapat segera melihat bahwa Golang memiliki server web yang lebih produktif. Perbedaannya adalah sekitar 12% dibandingkan dengan Kestrel di .NET Core.
Berdasarkan data di atas, 2 grafik dibangun. Selanjutnya, Anda dapat dengan jelas melihat perbandingan RPS.


alt text


Karena perpustakaan net / http yang lebih cepat, Golang menunjukkan hasil yang baik untuk data kecil. Dengan peningkatan volume data, kinerja dibandingkan dengan kestrel.


Saat menggunakan refleksi pada ukuran data kecil, RPS kurang lebih sama, dengan mempertimbangkan kesalahan pengukuran. Dengan meningkatnya ukuran data, .NET Core menunjukkan lebih banyak RPS.


Saat menguji tanpa menggunakan refleksi, kedua bahasa menunjukkan peningkatan kinerja. Golang menunjukkan kinerja yang lebih baik karena RPS awalnya lebih tinggi (permintaan per detik) pada tes tanpa diproses. Pada data kecil, keuntungannya signifikan. Dengan peningkatan ukuran data, RPS hampir dibandingkan. Pada tes terbesar dari 500 rekaman, Golang kembali unggul.


alt text


Dalam tes menggunakan refleksi, Golang hilang di semua lini. Penurunan kinerja dalam skenario terburuk lebih dari 60%. Menerapkan serialisasi di luar kotak untuk kinerja umumnya tidak berharga.
Tanpa refleksi, Golang lebih cepat dalam semua tes. Dan dengan pertumbuhan data, keuntungan Golang hanya tumbuh. Bagaimanapun, penolakan untuk menggunakan refleksi memberikan peningkatan kinerja yang signifikan untuk Golang dan .NETCore, yang, secara umum, harus diharapkan.


Kesimpulan


Kesimpulan apa yang bisa diambil dari perbandingan kinerja kecil ini? Saya ingin merumuskan ini dalam bentuk pro dan kontra untuk setiap solusi. Mari kita mulai dengan Golang:


  • Ini memiliki kinerja yang lebih baik, dan dapat ditingkatkan lebih lanjut, misalnya, dengan menggunakan fasthttp sebagai server web.
  • Berkat pembuatan kode - penggunaan metode pemrosesan yang mudah tanpa menggunakan refleksi.
  • Konsumsi memori lebih sedikit.

.NET Core juga memiliki beberapa keunggulan:


  • Kinerja cocok untuk sebagian besar kasus.
  • Menurut pendapat saya, ini adalah salah satu lingkungan pengembangan terbaik dan paling nyaman untuk Visual Studio.

Hasilnya dapat diringkas sebagai berikut: jika Anda memiliki REST API dan Anda merencanakan beban yang besar, logika bisnis yang tidak terlalu rumit, lebih baik menggunakan Golang, dalam kasus lain Anda dapat melakukannya dengan .NET Core. Haruskah saya menulis ulang solusi yang sudah jadi dari .NET Core ke Golang? Setiap orang akan memutuskan sendiri.


Saya harap Anda menemukan bahan ini bermanfaat. Semua baik

Source: https://habr.com/ru/post/id469271/


All Articles