Protocol Buffer versus JSON atau BSON [ditutup]

90

Apakah ada yang punya informasi tentang karakteristik kinerja Protocol Buffer versus BSON (binary JSON) atau versus JSON secara umum?

  • Ukuran kabel
  • Kecepatan serialisasi
  • Kecepatan deserialisasi

Ini tampak seperti protokol biner yang bagus untuk digunakan melalui HTTP. Saya hanya ingin tahu mana yang lebih baik dalam jangka panjang untuk lingkungan C #.

Berikut beberapa info yang saya baca tentang BSON dan Protocol Buffer .

Jeff Meatball Yang
sumber
Beberapa orang berpendapat (saya pikir ini termasuk mantan penulis protobuf) bahwa lebih baik menggunakan format yang lebih besar tetapi lebih murah untuk membuat serialisasi dan kemudian mengompresi output dengan kompresor standar yang cepat.
CodesInChaos
Saya tidak berpikir ini harus dibuka kembali sampai metode perbandingan tertentu diusulkan dalam pertanyaan itu sendiri (jika tidak, ini untuk diskusi yang agak beropini / terlalu luas)
YakovL

Jawaban:

65

Penghematan adalah alternatif lain yang mirip Protocol Buffer juga.

Ada tolok ukur yang baik dari komunitas Java tentang serialisasi / deserialisasi dan ukuran kabel dari teknologi ini: https://github.com/eishay/jvm-serializers/wiki

Secara umum, JSON memiliki ukuran kabel yang sedikit lebih besar dan DeSer yang sedikit lebih buruk, tetapi menang di mana-mana dan kemampuan untuk menafsirkannya dengan mudah tanpa IDL sumber. Poin terakhir adalah sesuatu yang coba dipecahkan oleh Apache Avro , dan ini mengalahkan keduanya dalam hal kinerja.

Microsoft telah merilis paket C # NuGet Microsoft.Hadoop.Avro .

Michael Greene
sumber
1
Ukuran pesan kecil tidak secara otomatis diterjemahkan ke dalam kinerja cepat, lihat artikel ini soa.sys-con.com/node/250512
vtd-xml-author
1
Tautan bagus; satu-satunya hal yang saya tidak yakin adalah komentar tentang Avro - meskipun dapat bekerja lebih efisien untuk kasus penggunaan intinya (banyak entri data serupa), tampaknya tidak berkinerja sangat cepat dalam tolok ukur ini (yang menguji penanganan a permintaan tunggal)
StaxMan
CoDec, MoDem .... Saya suka "SeDes" lebih baik :)
nawfal
52

Berikut adalah beberapa tolok ukur terbaru yang menunjukkan kinerja .NET Serializers populer.

The Pembakaran Monks benchmark menunjukkan kinerja serialisasi sebuah POCO sederhana sementara yang komprehensif benchmark Northwind menunjukkan hasil gabungan dari serialisasi berturut-turut di setiap meja dari dataset Northwind Microsoft.

masukkan deskripsi gambar di sini

Pada dasarnya buffer protokol ( protobuf-net ) sekitar 7x lebih cepat dari serializer perpustakaan kelas Base tercepat di .NET (XML DataContractSerializer). Ini juga lebih kecil dari kompetisi karena juga 2,2x lebih kecil dari format serialisasi Microsoft yang paling kompak (JsonDataContractSerializer).

Serializers Text ServiceStack paling mendekati untuk mencocokkan kinerja protobuf-net biner di mana Json Serializer- nya hanya 2,58x lebih lambat dari protobuf-net.

Mythz
sumber
1
Posting yang bagus - tetapi jika mungkin Anda harus selalu meletakkan bilah kesalahan ke grafik batang Anda saat menunjukkan rata-rata.
jtromans
Mengapa JIL tidak disertakan dalam pengujian? (apakah Anda tahu mengapa?)
Royi Namir
23

buffer protokol dirancang untuk kabel:

  1. ukuran pesan yang sangat kecil - satu aspek adalah representasi integer berukuran variabel yang sangat efisien.
  2. Penguraian kode yang sangat cepat - ini adalah protokol biner.
  3. protobuf menghasilkan C ++ yang sangat efisien untuk encoding dan decoding pesan - petunjuk: jika Anda mengenkode semua var-integer atau item berukuran statis ke dalamnya, ia akan menyandikan dan mendekode dengan kecepatan deterministik.
  4. Ini menawarkan model data yang SANGAT kaya - secara efisien mengkodekan struktur data yang sangat kompleks.

JSON hanyalah teks dan perlu diurai . petunjuk: menyandikan "miliar" int ke dalamnya akan membutuhkan cukup banyak karakter: Billion = 12 karakter (skala panjang), dalam biner cocok dengan uint32_t Sekarang bagaimana dengan mencoba menyandikan ganda? itu akan JAUH lebih buruk.

Hassan Syed
sumber
4
Memang, bagaimanapun, memiliki kelemahan yang agak disayangkan karena tidak menangani warisan dan sementara komposisi adalah alternatif yang valid, saya memilih untuk tidak dipaksa oleh objek transfer data saya untuk menggunakan komposisi daripada warisan.
Mark Green
4
Saya yakin Ekstensi dapat digunakan dengan cara yang sangat mirip dengan warisan ... developers.google.com/protocol-buffers/docs/reference/…
kralyk
1
Ya, ekstensi adalah poin yang sangat bagus. Saya menggunakannya dalam latihan di tempat kerja setiap hari.
Yngve Sneen Lindal
"protokol buffer dirancang untuk kabel" Apa itu "kabel"?
Marcos Pereira
@marcospgp the wireberarti hanya jaringan. Sekarang ketika kita menggunakan begitu banyak jaringan nirkabel, ini mungkin terdengar aneh.
Victor Yarema