프로토콜 버퍼 대 JSON 또는 BSON [닫힘]


90

누구든지 프로토콜 버퍼 대 BSON (이진 JSON) 또는 일반적으로 JSON의 성능 특성에 대한 정보가 있습니까?

  • 와이어 크기
  • 직렬화 속도
  • 역 직렬화 속도

HTTP를 통해 사용하기에 좋은 바이너리 프로토콜처럼 보입니다. C # 환경에서 장기적으로 어느 것이 더 좋을지 궁금합니다.

다음은 BSONProtocol Buffers 에서 읽은 정보입니다 .


일부는 (전 protobuf 작성자도 포함한다고 생각합니다) 더 크지 만 더 저렴한 형식을 사용하여 형식을 직렬화 한 다음 빠른 표준 압축기로 출력을 압축하는 것이 더 나은 아이디어라고 주장합니다.
CodesInChaos 2013-04-23


질문 자체에서 특정 비교 방법이 제안 될 때까지 다시 열어야한다고 생각하지 않습니다 (그렇지 않으면 다소 의견이 많은 토론 / 너무 광범위 함)
YakovL

답변:


65

Thrift 는 프로토콜 버퍼와 유사한 또 다른 대안입니다.

이러한 기술의 직렬화 / 역 직렬화 및 와이어 크기에 대한 Java 커뮤니티의 좋은 벤치 마크가 있습니다. https://github.com/eishay/jvm-serializers/wiki

일반적으로 JSON은 와이어 크기가 약간 더 크고 DeSer가 약간 더 나쁘지만 편재성과 소스 IDL없이 쉽게 해석 할 수있는 능력이 있습니다. 마지막 요점은 Apache Avro 가 해결하려는 문제이며 성능 측면에서 두 가지 모두를 능가합니다.

Microsoft는 C # NuGet 패키지 Microsoft.Hadoop.Avro를 출시했습니다 .


1
작은 메시지 크기는 빠른 성능으로 자동 변환되지 않습니다.이 기사를 참조하십시오. soa.sys-con.com/node/250512
vtd-xml-author

1
좋은 링크; 내가 확신하지 못하는 유일한 것은 Avro에 대한 의견입니다. 핵심 사용 사례 (유사한 수많은 데이터 항목)에서 더 효율적으로 작동 할 수는 있지만이 벤치 마크에서는 매우 빠르게 수행되지 않는 것 같습니다. 단일 요청)
StaxMan 2011 년

코덱, 모뎀 .... 내가 더 나은 "SeDes": 같은
nawfal


52

다음은 인기있는 .NET Serializer의 성능을 보여주는 최근 벤치 마크 입니다.

불타는 승려 벤치 마크는 종합 동안 간단한 POCO를 직렬화의 성능을 보여 Northwind를 벤치 마크는 마이크로 소프트의 Northwind를 데이터 세트의 모든 테이블에서 행을 직렬화의 결합 된 결과를 보여줍니다.

여기에 이미지 설명 입력

기본적으로 프로토콜 버퍼 ( protobuf-net )는 .NET (XML DataContractSerializer)에서 가장 빠른 Base 클래스 라이브러리 Serializer보다 약 7 배 빠릅니다. 또한 Microsoft의 가장 컴팩트 한 직렬화 형식 (JsonDataContractSerializer)보다 2.2 배 작기 때문에 경쟁 제품보다 작습니다.

ServiceStack의 Text serializer는 Json Serializer 가 protobuf-net보다 2.58 배 더 느린 바이너리 protobuf-net의 성능에 가장 가깝 습니다.


1
훌륭한 포스트-그러나 가능하다면 평균을 표시 할 때 항상 막대 차트에 오차 막대를 배치해야합니다.
jtromans 2013 년

JIL이 테스트에 포함되지 않은 이유는 무엇입니까? (당신은 왜 어떤 생각을 가지고 있습니까?)
Royi Namir

23

프로토콜 버퍼는 와이어 용으로 설계되었습니다.

  1. 매우 작은 메시지 크기-한 가지 측면은 매우 효율적인 가변 크기 정수 표현입니다.
  2. 매우 빠른 디코딩-바이너리 프로토콜입니다.
  3. protobuf는 메시지 인코딩 및 디코딩을 위해 매우 효율적인 C ++를 생성합니다. 힌트 : 모든 var-integer 또는 정적 크기 항목을 인코딩하면 결정 론적 속도로 인코딩 및 디코딩됩니다.
  4. 매우 복잡한 데이터 구조를 효율적으로 인코딩하는 매우 풍부한 데이터 모델을 제공합니다.

JSON은 텍스트 일 ​​뿐이며 구문 분석 이 필요합니다 . 힌트 : "billion"int를 인코딩하려면 많은 문자가 필요합니다. Billion = 12 char 's (long scale), 바이너리에서는 uint32_t에 맞습니다. 이제 double을 인코딩하는 것은 어떻습니까? 그것은 훨씬 더 나쁠 것입니다.


4
그러나 상속을 처리하지 않는 다소 불행한 단점이 있으며 구성이 유효한 대안이지만 데이터 전송 개체가 상속보다는 구성을 사용하도록 강요하지 않는 것을 선호합니다.
Mark Green

4
확장 기능이 상속과 매우 유사한 방식으로 사용될 수 있다고 생각합니다 ... developers.google.com/protocol-buffers/docs/reference/…
kralyk

1
예, 확장은 매우 좋은 점입니다. 나는 매일 직장에서 실제로 사용합니다.
Yngve Sneen Lindal

"프로토콜 버퍼는 와이어 용으로 설계되었습니다" "와이어"란 무엇입니까?
Marcos Pereira

@marcospgp the wire는 단지 네트워크를 의미합니다. 이제 우리가 너무 많은 무선 네트워크를 사용하면 이상하게 들릴 수 있습니다.
Victor Yarema
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.