โปรโตคอลบัฟเฟอร์เทียบกับ JSON หรือ BSON [ปิด]


91

ใครมีข้อมูลเกี่ยวกับลักษณะการทำงานของ Protocol Buffers เทียบกับ BSON (binary JSON) หรือเทียบกับ JSON โดยทั่วไปหรือไม่?

  • ขนาดสายไฟ
  • ความเร็วอนุกรม
  • ความเร็ว Deserialization

สิ่งเหล่านี้ดูเหมือนจะเป็นโปรโตคอลไบนารีที่ดีสำหรับใช้ผ่าน HTTP ฉันแค่สงสัยว่าอะไรจะดีกว่าในระยะยาวสำหรับสภาพแวดล้อม C #

นี่คือข้อมูลบางอย่างที่ผมได้อ่านบนBSONและพิธีสารบัฟเฟอร์


บางคนโต้แย้ง (ฉันคิดว่าสิ่งนี้รวมถึงผู้เขียน protobuf ในอดีต) ว่าควรใช้รูปแบบที่ใหญ่กว่า แต่ถูกกว่าในการทำให้เป็นอนุกรมแล้วบีบอัดเอาต์พุตด้วยคอมเพรสเซอร์มาตรฐานที่รวดเร็ว
CodesInChaos


ฉันไม่คิดว่าควรเปิดใหม่จนกว่าจะมีการเสนอวิธีการเปรียบเทียบบางอย่างในคำถามนั้นเอง (มิฉะนั้นจะเป็นการอภิปรายที่มีความคิดเห็นค่อนข้างกว้าง / กว้างเกินไป)
YakovL

ในแง่ของจุดแข็งและจุดอ่อนของแต่ละรูปแบบและคำตอบอาจรวมถึงโครงสร้างการตัดสินใจ
Technophile

คำตอบ:


65

Thriftเป็นอีกทางเลือกหนึ่งที่เหมือน Protocol Buffers เช่นกัน

มีเกณฑ์มาตรฐานที่ดีจากชุมชน Java เกี่ยวกับการทำให้เป็นอนุกรม / การแยกส่วนและขนาดสายไฟของเทคโนโลยีเหล่านี้: https://github.com/eishay/jvm-serializers/wiki

โดยทั่วไป JSON มีขนาดสายที่ใหญ่กว่าเล็กน้อยและ DeSer แย่กว่าเล็กน้อย แต่ชนะในความแพร่หลายและความสามารถในการตีความได้ง่ายโดยไม่ต้องใช้ IDL ต้นทาง ประเด็นสุดท้ายคือสิ่งที่Apache Avroกำลังพยายามแก้ไขและมันเอาชนะทั้งในด้านประสิทธิภาพ

ไมโครซอฟท์ได้เปิดตัวแพคเกจ C # NuGet Microsoft.Hadoop.Avro


1
ข้อความขนาดเล็กไม่ได้แปลเป็นประสิทธิภาพที่รวดเร็วโดยอัตโนมัติโปรดดูบทความนี้soa.sys-con.com/node/250512
vtd-xml-author

1
ลิงค์ที่ดี; สิ่งเดียวที่ฉันไม่แน่ใจคือความคิดเห็นเกี่ยวกับ Avro - ในขณะที่สามารถทำงานได้อย่างมีประสิทธิภาพมากขึ้นสำหรับกรณีการใช้งานหลัก (รายการข้อมูลที่คล้ายกันจำนวนมาก) ดูเหมือนว่าจะทำงานได้ไม่เร็วนักในเกณฑ์มาตรฐานนี้ (ซึ่งทดสอบการจัดการกับ คำขอเดียว)
StaxMan

CoDec, MoDem .... ชอบ "SeDes" ดีกว่า :)
nawfal

75

โพสต์นี้เปรียบเทียบความเร็วและขนาดการทำให้เป็นอนุกรมใน. NET รวมถึง JSON, BSON และ XML

ข้อความแสดงแทน

ข้อความแสดงแทน

http://james.newtonking.com/archive/2010/01/01/net-serialization-performance-comparison.aspx


9
คำตอบนี้ไม่มีข้อมูลเกี่ยวกับ Protocol Buffers
Victor Yarema

53

นี่คือผลการวัดล่าสุดบางส่วนที่แสดงประสิทธิภาพของ. NET Serializers ยอดนิยม

มาตรฐานการเผาไหม้พระสงฆ์แสดงประสิทธิภาพการทำงานของ serializing POCO ง่ายในขณะที่ครอบคลุมมาตรฐาน Northwindแสดงผลรวมของ serializing แถวในตารางของชุดข้อมูล Northwind ไมโครซอฟท์ทุก

ป้อนคำอธิบายภาพที่นี่

โดยทั่วไปโปรโตคอลบัฟเฟอร์ ( protobuf-net ) เร็วกว่า Serializer ไลบรารีคลาสฐานที่เร็วที่สุดประมาณ7 เท่าใน. NET (XML DataContractSerializer) นอกจากนี้ยังมีขนาดเล็กกว่าคู่แข่งเนื่องจากมีขนาดเล็กกว่ารูปแบบอนุกรมที่กะทัดรัดที่สุดของ Microsofts ถึง2.2 เท่า (JsonDataContractSerializer)

Serializer ข้อความของ ServiceStack ใกล้เคียงที่สุดกับประสิทธิภาพของ binary protobuf-net โดยที่Json Serializerช้ากว่า protobuf-net เพียง2.58เท่า


1
โพสต์ที่ดี - แต่ถ้าเป็นไปได้คุณควรใส่แถบข้อผิดพลาดลงในแผนภูมิแท่งของคุณเสมอเมื่อแสดงค่าเฉลี่ย
jtromans

ทำไม JIL ถึงไม่รวมอยู่ในการทดสอบ? (คุณมีความคิดว่าทำไม?)
Royi Namir

23

บัฟเฟอร์โปรโตคอลออกแบบมาสำหรับสายไฟ:

  1. ขนาดข้อความเล็กมาก - ด้านหนึ่งคือการแสดงจำนวนเต็มขนาดตัวแปรที่มีประสิทธิภาพมาก
  2. ถอดรหัสเร็วมาก - เป็นโปรโตคอลไบนารี
  3. protobuf สร้าง C ++ ที่มีประสิทธิภาพสูงสำหรับการเข้ารหัสและถอดรหัสข้อความ - คำใบ้: หากคุณเข้ารหัสจำนวนเต็ม var หรือรายการขนาดคงที่ทั้งหมดลงในนั้นจะเข้ารหัสและถอดรหัสด้วยความเร็วที่กำหนด
  4. มีรูปแบบข้อมูลที่สมบูรณ์มาก - เข้ารหัสโครงสร้างข้อมูลที่ซับซ้อนมากได้อย่างมีประสิทธิภาพ

JSON เป็นเพียงข้อความและจะต้องมีการแยกวิเคราะห์ คำใบ้: การเข้ารหัส int เป็น "พันล้าน" จะต้องใช้อักขระค่อนข้างมาก: Billion = 12 char's (long scale) ในไบนารีจะพอดีกับ uint32_t ทีนี้ลองเข้ารหัสสองครั้งล่ะ นั่นจะแย่กว่า FAR FAR


4
อย่างไรก็ตามมีข้อเสียที่ค่อนข้างน่าเสียดายในการไม่จัดการการถ่ายทอดทางพันธุกรรมและในขณะที่การจัดองค์ประกอบเป็นทางเลือกที่ถูกต้องฉันไม่ต้องการให้ออบเจ็กต์การถ่ายโอนข้อมูลของฉันบังคับให้ใช้องค์ประกอบมากกว่าการสืบทอด
Mark Green

4
ฉันเชื่อว่าส่วนขยายสามารถใช้ในลักษณะที่คล้ายกับการสืบทอด ... developer.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.