Buffer di protocollo rispetto a JSON o BSON [chiuso]


90

Qualcuno ha informazioni sulle caratteristiche delle prestazioni dei buffer di protocollo rispetto a BSON (JSON binario) o rispetto a JSON in generale?

  • Dimensioni del filo
  • Velocità di serializzazione
  • Velocità di deserializzazione

Questi sembrano buoni protocolli binari da usare su HTTP. Mi chiedo solo quale sarebbe la soluzione migliore a lungo termine per un ambiente C #.

Ecco alcune informazioni che stavo leggendo su BSON e sui buffer di protocollo .


Alcuni sostengono (penso che questo includa un ex autore di protobuf) che sia un'idea migliore usare un formato più grande ma più economico per serializzare il formato e quindi comprimere l'output con un compressore standard veloce.
— CodesInChaos


Non penso che questo dovrebbe essere riaperto fino a quando un certo metodo di confronto non viene proposto nella domanda stessa (altrimenti questo è per una discussione piuttosto supponente / troppo ampia)
— YakovL

Risposte:


64

La parsimonia è anche un'altra alternativa simile ai buffer di protocollo.

Ci sono buoni benchmark dalla comunità Java sulla serializzazione / deserializzazione e la dimensione del filo di queste tecnologie: https://github.com/eishay/jvm-serializers/wiki

In generale, JSON ha una dimensione del filo leggermente più grande e un DeSer leggermente peggiore, ma vince in termini di ubiquità e capacità di interpretarlo facilmente senza l'IDL di origine. L'ultimo punto è qualcosa che Apache Avro sta cercando di risolvere e batte entrambi in termini di prestazioni.

Microsoft ha rilasciato un pacchetto NuGet C # Microsoft.Hadoop.Avro .


1
Le dimensioni ridotte dei messaggi non si traducono automaticamente in prestazioni veloci, vedere questo articolo soa.sys-con.com/node/250512
— vtd-xml-author

1
Buon collegamento; l'unica cosa di cui non sono sicuro è un commento su Avro: sebbene possa funzionare in modo più efficiente per i suoi casi d'uso principali (tonnellate di voci di dati simili), non sembra funzionare molto velocemente in questo benchmark (che testa la gestione di un richiesta singola)
— StaxMan

CoDec, MoDem .... Mi piace di più "SeDes" :)
— nawfal


52

Di seguito sono riportati alcuni benchmark recenti che mostrano le prestazioni dei noti serializzatori .NET.

I benchmark Burning Monks mostrano le prestazioni della serializzazione di un semplice POCO mentre i benchmark completi Northwind mostrano i risultati combinati della serializzazione di una riga in ogni tabella del set di dati Northwind di Microsoft.

inserisci qui la descrizione dell'immagine

Fondamentalmente i buffer di protocollo ( protobuf-net ) sono circa 7 volte più veloci del Serializer della libreria di classi Base più veloce in .NET (XML DataContractSerializer). È anche più piccolo della concorrenza in quanto è anche 2,2 volte più piccolo del formato di serializzazione più compatto di Microsoft (JsonDataContractSerializer).

I serializzatori di testo di ServiceStack sono i più vicini alla corrispondenza con le prestazioni del protobuf-net binario, dove il suo serializzatore Json è solo 2,58 volte più lento di protobuf-net.


1
Ottimo post, ma se possibile dovresti sempre inserire barre di errore sui grafici a barre quando mostri le medie.
— jtromans

Perché JIL non è incluso nei test? (hai idea del perché?)
— Royi Namir

22

buffer di protocollo è progettato per il filo:

  1. dimensione del messaggio molto piccola: un aspetto è una rappresentazione di interi di dimensioni variabili molto efficiente.
  2. Decodifica molto veloce: è un protocollo binario.
  3. protobuf genera un C ++ super efficiente per codificare e decodificare i messaggi - suggerimento: se codifichi tutti i var-interi o gli elementi di dimensioni statiche, codificherà e decodificherà a velocità deterministica.
  4. Offre un modello di dati MOLTO ricco - codifica in modo efficiente strutture di dati molto complesse.

JSON è solo testo e deve essere analizzato . suggerimento: codificare un "miliardo" int in esso richiederebbe un bel po 'di caratteri: miliardi = 12 caratteri (scala lunga), in binario si inserisce in un uint32_t Ora che ne dici di provare a codificare un doppio? sarebbe MOLTO MOLTO peggio.


4
Tuttavia, ha lo svantaggio piuttosto sfortunato di non gestire l'ereditarietà e sebbene la composizione sia una valida alternativa, preferisco non essere costretto dal mio oggetto di trasferimento dei dati a utilizzare la composizione piuttosto che l'ereditarietà.
— Mark Green

4
Credo che le estensioni possano essere utilizzate in un modo molto simile all'ereditarietà ... developers.google.com/protocol-buffers/docs/reference/…
— kralyk

1
Sì, le estensioni sono un ottimo punto. Lo uso in pratica al lavoro tutti i giorni.
— Yngve Sneen Lindal,

"buffer di protocollo è progettato per il filo" Cos'è "il filo"?
— Marcos Pereira

@marcospgp the wiresignifica solo rete. Ora, quando usiamo così tante reti wireless, può sembrare strano.
— Victor Yarema
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.