Protokol Arabellekleri ile JSON veya BSON [kapalı]


91

Protokol Tamponlarının BSON'a (ikili JSON) veya genel olarak JSON'a karşı performans özellikleri hakkında bilgisi olan var mı?

  • Tel boyutu
  • Serileştirme hızı
  • Seriyi kaldırma hızı

Bunlar, HTTP üzerinden kullanım için iyi ikili protokoller gibi görünüyor. Bir C # ortamı için uzun vadede hangisinin daha iyi olacağını merak ediyorum.

İşte BSON ve Protokol Tamponları hakkında okuduğum bazı bilgiler .


Bazıları (bence bu eski bir protobuf yazarını içeriyor), formatı serileştirmek için daha büyük ancak daha ucuz bir fikir kullanmanın ve ardından çıktıyı hızlı bir standart sıkıştırıcıyla sıkıştırmanın daha iyi bir fikir olduğunu iddia ediyor.
CodesInChaos


Sorunun kendisinde belirli bir karşılaştırma yöntemi
önerilinceye

Her formatın güçlü ve zayıf yönleri açısından belki daha fazla ve yanıt bir karar ağacı içerebilir.
Technophile

Yanıtlar:


65

Thrift , başka bir Protokol Tampon benzeri alternatiftir.

Java topluluğundan, bu teknolojilerin serileştirme / seriyi kaldırma ve kablo boyutu konusunda iyi karşılaştırmalar var: https://github.com/eishay/jvm-serializers/wiki

Genel olarak, JSON biraz daha büyük kablo boyutuna ve biraz daha kötü DeSer'a sahiptir, ancak her yerde ve kaynak IDL olmadan onu kolayca yorumlama becerisinde kazanır. Son nokta, Apache Avro'nun çözmeye çalıştığı bir şey ve her ikisini de performans açısından geride bırakıyor.

Microsoft, bir C # NuGet paketi Microsoft.Hadoop.Avro yayınladı .


1
Küçük mesaj boyutu otomatik olarak hızlı performansa dönüşmez, bu makaleye bakın soa.sys-con.com/node/250512
vtd-xml-yazar

1
İyi bağlantı; Emin olmadığım tek şey, Avro hakkında yorum yapmaktır - temel kullanım durumları için (tonlarca benzer veri girişi) daha verimli çalışabilirken, bu kıyaslamada çok hızlı performans göstermiyor gibi görünüyor ( tek istek)
StaxMan

CoDec, MoDem .... "SeDes" i daha çok seviyorum :)
nawfal


53

İşte bazı yeni kriterler popüler NET serileştiricileri performanslarını gösteren.

Yanan Monks kriterler kapsamlı iken basit bir POCO seri performansını sergilemek Northwind kriterler Microsoft'un Northwind veri kümesinin her Tabloya satır seri birleşik sonuçlarını göstermektedir.

görüntü açıklamasını buraya girin

Temel olarak protokol arabellekleri ( protobuf-net ), .NET'teki (XML DataContractSerializer) en hızlı Base sınıf kitaplığı Serializer'dan yaklaşık 7 kat daha hızlıdır. Ayrıca Microsofts'un en kompakt serileştirme formatından (JsonDataContractSerializer) 2.2 kat daha küçük olduğu için rakiplerinden daha küçüktür.

ServiceStack'in Metin serileştiricileri, Json Serileştiricisinin protobuf - net'ten yalnızca 2.58 kat daha yavaş olduğu ikili protobuf - net'in performansıyla eşleşmeye en yakın olanlardır.


1
Harika gönderi - ancak mümkünse ortalamaları gösterirken çubuk grafiklerinize her zaman hata çubukları koymalısınız.
jtromans

JIL neden testlere dahil edilmiyor? (Nedenini bir fikrin var mı?)
Royi Namir

23

protokol arabellekleri kablo için tasarlanmıştır:

  1. çok küçük mesaj boyutu - bir özellik, çok verimli değişken boyutlu tamsayı gösterimidir.
  2. Çok hızlı kod çözme - bu ikili bir protokoldür.
  3. protobuf, mesajları kodlamak ve çözmek için süper verimli C ++ üretir - ipucu: tüm var-tam sayılarını veya statik boyutlu öğeleri içine kodlarsanız, belirleyici bir hızda kodlar ve kodunu çözer.
  4. ÇOK zengin bir veri modeli sunar - çok karmaşık veri yapılarını verimli bir şekilde kodlar.

JSON sadece metindir ve ayrıştırılması gerekir . ipucu: içine bir "milyar" int kodlamak oldukça fazla karakter gerektirir: Milyar = 12 karakter (uzun ölçek), ikili olarak bir uint32_t'ye sığar Şimdi bir ikiliyi kodlamaya ne dersiniz? bu FAR FAR daha kötü olurdu.


4
Bununla birlikte, kalıtımı ele almamanın oldukça talihsiz bir dezavantajına sahiptir ve kompozisyon geçerli bir alternatif olsa da, veri aktarım nesnem tarafından kalıtım yerine kompozisyonu kullanmaya zorlanmamayı tercih ederim.
Mark Green

4
Uzantıların kalıtıma çok benzer bir şekilde kullanılabileceğine inanıyorum ... developer.google.com/protocol-buffers/docs/reference/…
kralyk

1
Evet, uzantılar çok iyi bir nokta. Her gün işte pratikte kullanıyorum.
Yngve Sneen Lindal

"protokol arabellekleri kablo için tasarlanmıştır" "Kablo" nedir?
Marcos Pereira

@marcospgp the wireyalnızca ağ anlamına gelir. Şimdi bu kadar çok kablosuz ağ kullandığımızda kulağa tuhaf gelebilir.
Victor Yarema
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.