Bộ đệm giao thức so với JSON hoặc BSON [đã đóng]


90

Có ai có bất kỳ thông tin nào về đặc điểm hiệu suất của Bộ đệm giao thức so với BSON (JSON nhị phân) hoặc so với JSON nói chung không?

  • Kích thước dây
  • Tốc độ tuần tự hóa
  • Tốc độ giải mã hóa

Đây có vẻ như là các giao thức nhị phân tốt để sử dụng qua HTTP. Tôi chỉ tự hỏi cái nào sẽ tốt hơn về lâu dài cho môi trường C #.

Đây là một số thông tin mà tôi đã đọc trên BSONBộ đệm giao thức .


Một số người tranh luận (tôi nghĩ điều này bao gồm cả một tác giả protobuf trước đây) rằng tốt hơn nên sử dụng một định dạng lớn hơn nhưng rẻ hơn để tuần tự hóa và sau đó nén đầu ra bằng một máy nén tiêu chuẩn nhanh.
CodesInChaos


Tôi không nghĩ rằng điều này sẽ được mở cửa trở lại cho đến khi một phương pháp so sánh nhất định được đề xuất trong câu hỏi riêng của mình (nếu không này là để thảo luận chứ không phải khăng khăng / quá rộng)
YakovL

Câu trả lời:


64

Thrift cũng là một giải pháp thay thế giống như Protocol Buffers.

Có những điểm chuẩn tốt từ cộng đồng Java về tuần tự hóa / giải mã hóa và kích thước dây của các công nghệ này: https://github.com/eishay/jvm-serializers/wiki

Nhìn chung, JSON có kích thước dây lớn hơn một chút và DeSer kém hơn một chút, nhưng chiến thắng ở mức độ phổ biến và khả năng diễn giải nó dễ dàng mà không cần IDL nguồn. Điểm cuối cùng là thứ mà Apache Avro đang cố gắng giải quyết và nó đánh bại cả về hiệu suất.

Microsoft đã phát hành gói C # NuGet Microsoft.Hadoop.Avro .


1
Kích thước thư nhỏ không tự động dịch thành perforamnce nhanh, hãy xem bài viết này soa.sys-con.com/node/250512
vtd-xml-author

1
Liên kết tốt; điều duy nhất tôi không chắc là nhận xét về Avro - mặc dù nó có thể hoạt động hiệu quả hơn cho các trường hợp sử dụng cốt lõi của nó (rất nhiều mục nhập dữ liệu tương tự), nó dường như không hoạt động rất nhanh trong điểm chuẩn này (kiểm tra việc xử lý yêu cầu duy nhất)
StaxMan

CoDec, MoDem .... Tôi thích "SeDes" hơn :)
nawfal


52

Dưới đây là một số điểm chuẩn gần đây cho thấy hiệu suất của .NET Serializers phổ biến.

Các điểm chuẩn của Burning Monks cho thấy hiệu suất của việc tuần tự hóa một POCO đơn giản trong khi các điểm chuẩn toàn diện của Northwind hiển thị kết quả tổng hợp của việc sắp xếp một hàng trong mỗi bảng của tập dữ liệu Northwind của Microsoft.

nhập mô tả hình ảnh ở đây

Về cơ bản bộ đệm giao thức ( protobuf-net ) nhanh hơn khoảng 7 lần so với Serializer thư viện lớp cơ sở nhanh nhất trong .NET (XML DataContractSerializer). Nó cũng nhỏ hơn đối thủ vì nó cũng nhỏ hơn 2,2 lần so với định dạng tuần tự hóa nhỏ gọn nhất của Microsofts (JsonDataContractSerializer).

Bộ tuần tự hóa văn bản của ServiceStack là gần nhất để khớp với hiệu suất của mạng nhị phân protobuf-net trong đó Json Serializer của nó chỉ chậm hơn 2,58 lần so với protobuf-net.


1
Bài đăng tuyệt vời - nhưng nếu có thể, bạn nên luôn đặt các thanh lỗi lên biểu đồ thanh khi hiển thị mức trung bình.
jtromans

Tại sao JIL không được đưa vào các bài kiểm tra? (bạn có biết tại sao không?)
Royi Namir

22

bộ đệm giao thức được thiết kế cho dây:

  1. kích thước thư rất nhỏ - một khía cạnh là biểu diễn số nguyên có kích thước thay đổi rất hiệu quả.
  2. Giải mã rất nhanh - nó là một giao thức nhị phân.
  3. protobuf tạo ra C ++ siêu hiệu quả để mã hóa và giải mã tin nhắn - gợi ý: nếu bạn mã hóa tất cả var-integer hoặc các mục có kích thước tĩnh vào nó, nó sẽ mã hóa và giải mã với tốc độ xác định.
  4. Nó cung cấp một mô hình dữ liệu RẤT phong phú - mã hóa hiệu quả các cấu trúc dữ liệu rất phức tạp.

JSON chỉ là văn bản và nó cần được phân tích cú pháp . gợi ý: mã hóa một "tỷ" int vào nó sẽ mất khá nhiều ký tự: Billion = 12 char's (tỷ lệ dài), trong hệ nhị phân, nó phù hợp với một uint32_t Bây giờ bạn thử mã hóa một đôi thì sao? điều đó sẽ là FAR FAR tệ hơn.


4
Tuy nhiên, nó có nhược điểm khá đáng tiếc là không xử lý được tính kế thừa và trong khi thành phần là một sự thay thế hợp lệ, tôi không muốn bị đối tượng truyền dữ liệu của mình buộc phải sử dụng thành phần thay vì kế thừa.
Mark Green,

4
Tôi tin rằng Extensions có thể được sử dụng trong một cách rất giống với thừa kế ... developers.google.com/protocol-buffers/docs/reference/...
kralyk

1
Có, phần mở rộng là một điểm rất tốt. Tôi sử dụng nó trong thực tế tại nơi làm việc hàng ngày.
Yngve Sneen Lindal

"bộ đệm giao thức được thiết kế cho dây" "Dây" là gì?
Marcos Pereira

@marcospgp the wirechỉ có nghĩa là mạng. Bây giờ khi chúng ta sử dụng quá nhiều mạng không dây, điều đó nghe có vẻ lạ.
Victor Yarema 14/02/19
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.