Buffers de protocolo versus JSON ou BSON [fechado]

90

Alguém tem alguma informação sobre as características de desempenho dos Buffers de protocolo versus BSON (JSON binário) ou JSON em geral?

  • Tamanho do fio
  • Velocidade de serialização
  • Velocidade de desserialização

Estes parecem bons protocolos binários para uso em HTTP. Só estou me perguntando o que seria melhor a longo prazo para um ambiente C #.

Aqui estão algumas informações que eu estava lendo sobre BSON e buffers de protocolo .

Jeff Meatball Yang
fonte
Alguns argumentam (acho que isso inclui um ex-autor do protobuf) que é uma ideia melhor usar um formato maior, mas mais barato para serializar e, em seguida, compactar a saída com um compressor padrão rápido.
CodesInChaos
Não acho que isso deva ser reaberto até que um certo método de comparação seja proposto na própria questão (caso contrário, isso é para uma discussão bastante opinativa / ampla demais)
YakovL

Respostas:

64

Thrift também é outra alternativa semelhante a Buffers de protocolo.

Existem bons benchmarks da comunidade Java sobre serialização / desserialização e tamanho do fio dessas tecnologias: https://github.com/eishay/jvm-serializers/wiki

Em geral, JSON tem tamanho de fio ligeiramente maior e DeSer um pouco pior, mas vence em onipresença e na capacidade de interpretá-lo facilmente sem o IDL de origem. O último ponto é algo que o Apache Avro está tentando resolver e supera ambos em termos de desempenho.

A Microsoft lançou um pacote C # NuGet Microsoft.Hadoop.Avro .

Michael Greene
fonte
1
O tamanho pequeno da mensagem não se traduz automaticamente em desempenho rápido, consulte este artigo soa.sys-con.com/node/250512
vtd-xml-author
1
Bom link; a única coisa sobre a qual não tenho certeza é o comentário sobre o Avro - embora pudesse funcionar de forma mais eficiente para seus principais casos de uso (toneladas de entradas de dados semelhantes), não parece ter um desempenho muito rápido neste benchmark (que testa o manuseio de um solicitação única)
StaxMan
CoDec, MoDem .... Eu gosto mais de "SeDes" :)
nawfal
52

Aqui estão alguns benchmarks recentes mostram o desempenho de serializadores .NET populares.

Os benchmarks do Burning Monks mostram o desempenho da serialização de um POCO simples, enquanto os benchmarks abrangentes do Northwind mostram os resultados combinados da serialização de uma linha em cada tabela do conjunto de dados Northwind da Microsoft.

insira a descrição da imagem aqui

Basicamente, os buffers de protocolo ( protobuf-net ) são cerca de 7 vezes mais rápidos do que a biblioteca de classes base Serializer mais rápida em .NET (XML DataContractSerializer). Ele também é menor do que a concorrência, pois também é 2,2x menor do que o formato de serialização mais compacto da Microsoft (JsonDataContractSerializer).

Os serializadores de texto do ServiceStack são os que mais se aproximam do desempenho do protobuf-net binário, onde seu serializador Json é apenas 2,58x mais lento do que o protobuf-net.

mito
fonte
1
Excelente postagem - mas se possível, você deve sempre colocar barras de erro em seus gráficos de barras ao mostrar as médias.
jtromans
Por que o JIL não está incluído nos testes? (você tem alguma ideia do porquê?)
Royi Namir
22

buffers de protocolo são projetados para o fio:

  1. tamanho de mensagem muito pequeno - um aspecto é uma representação de inteiro de tamanho variável muito eficiente.
  2. Decodificação muito rápida - é um protocolo binário.
  3. protobuf gera C ++ supereficiente para codificar e decodificar as mensagens - dica: se você codificar todos os inteiros var ou itens de tamanho estático nele, ele irá codificar e decodificar em velocidade determinística.
  4. Ele oferece um modelo de dados MUITO rico - codificando com eficiência estruturas de dados muito complexas.

JSON é apenas texto e precisa ser analisado . dica: codificar um "bilhão" int nele levaria muitos caracteres: Bilhões = 12 caracteres (escala longa), em binário cabe em um uint32_t Agora, que tal tentar codificar um duplo? isso seria MUITO pior.

Hassan Syed
fonte
4
No entanto, ele tem o lado negativo de não lidar com a herança e, embora a composição seja uma alternativa válida, prefiro não ser forçado por meu objeto de transferência de dados a usar composição em vez de herança.
Mark Green,
4
Acredito que as extensões podem ser usadas de uma forma muito semelhante à herança ... developers.google.com/protocol-buffers/docs/reference/…
kralyk
1
Sim, as extensões são um ponto muito bom. Eu uso na prática no trabalho todos os dias.
Yngve Sneen Lindal
"buffers de protocolo são projetados para o fio" O que é "o fio"?
Marcos Pereira
@marcospgp the wiresignifica apenas rede. Agora, quando usamos tantas redes sem fio, pode parecer estranho.
Victor Yarema