Protobuf Performance¶
The following benchmark test results were produced on a workstation utilizing an Intel® Xeon® Processor E5-2630 with 32GB of RAM.
This table contains the results of three separate languages:
C++ - For C++, there are three parsing methods:
new - This is for using a new operator for creating a message instance.
new arena - This is for using arena for creating a new message instance.
reuse - This is for reusing the same message instance for parsing.
Java - For Java, there are three parsing/serialization methods:
byte[] - This is for parsing from a Byte Array.
ByteString - This is for parsing from a com.google.protobuf.ByteString.
InputStream - This is for parsing from an InputStream.
Python - For Python, there are three types of Python protobuf for testing:
C+±generated-code - This is for using C++ generated code of the proto file as a dynamic linked library.
C+±reflection - This is for using C++ reflection, for which there’s no generated code, but still using C++ protobuf library as a dynamic linked library.
pure-Python - This is for the pure version of Python, which does not link with any C++ protobuf library.
Parsing performance¶
C++ | C++ with tcmalloc | java | python | |||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
new | new arena | reuse | new | new arena | reuse | byte[] | ByteString | InputStream | C++-generated-code | C++-reflection | pure-Python | |
google_message1_proto2 | 368.717MB/s | 261.847MB/s | 799.403MB/s | 645.183MB/s | 441.023MB/s | 1.122GB/s | 425.437MB/s | 425.937MB/s | 251.018MB/s | 82.8314MB/s | 47.6763MB/s | 3.76299MB/s |
google_message1_proto3 | 294.517MB/s | 229.116MB/s | 469.982MB/s | 434.510MB/s | 394.701MB/s | 591.931MB/s | 357.597MB/s | 378.568MB/s | 221.676MB/s | 82.0498MB/s | 39.9467MB/s | 3.77751MB/s |
google_message2 | 277.242MB/s | 347.611MB/s | 793.67MB/s | 503.721MB/s | 596.333MB/s | 922.533MB/s | 416.778MB/s | 419.543MB/s | 367.145MB/s | 241.46MB/s | 71.5723MB/s | 2.73538MB/s |
google_message3_1 | 213.478MB/s | 291.58MB/s | 543.398MB/s | 539.704MB/s | 717.300MB/s | 927.333MB/s | 684.241MB/s | 704.47MB/s | 648.624MB/s | 209.036MB/s | 142.356MB/s | 15.3324MB/s |
google_message3_2 | 672.685MB/s | 802.767MB/s | 1.21505GB/s | 985.790MB/s | 1.136GB/s | 1.367GB/s | 1.54439GB/s | 1.60603GB/s | 1.33443GB/s | 573.835MB/s | 314.33MB/s | 15.0169MB/s |
google_message3_3 | 207.681MB/s | 140.591MB/s | 535.181MB/s | 369.743MB/s | 262.301MB/s | 556.644MB/s | 279.385MB/s | 304.853MB/s | 107.575MB/s | 32.248MB/s | 26.1431MB/s | 2.63541MB/s |
google_message3_4 | 7.96091GB/s | 7.10024GB/s | 9.3013GB/s | 8.518GB/s | 8.171GB/s | 9.917GB/s | 5.78006GB/s | 5.85198GB/s | 4.62609GB/s | 2.49631GB/s | 2.35442GB/s | 802.061MB/s |
google_message3_5 | 76.0072MB/s | 51.6769MB/s | 237.856MB/s | 178.495MB/s | 111.751MB/s | 329.569MB/s | 121.038MB/s | 132.866MB/s | 36.9197MB/s | 10.3962MB/s | 8.84659MB/s | 1.25203MB/s |
google_message4 | 331.46MB/s | 404.862MB/s | 427.99MB/s | 589.887MB/s | 720.367MB/s | 705.373MB/s | 606.228MB/s | 589.13MB/s | 530.692MB/s | 305.543MB/s | 174.834MB/s | 7.86485MB/s |
Serialization performance¶
C++ | C++ with tcmalloc | java | python | |||||
---|---|---|---|---|---|---|---|---|
byte[] | ByteString | InputStream | C++-generated-code | C++-reflection | pure-Python | |||
google_message1_proto2 | 1.39698GB/s | 1.701GB/s | 1.12915GB/s | 1.13589GB/s | 758.609MB/s | 260.911MB/s | 58.4815MB/s | 5.77824MB/s |
google_message1_proto3 | 959.305MB/s | 939.404MB/s | 1.15372GB/s | 1.07824GB/s | 802.337MB/s | 239.4MB/s | 33.6336MB/s | 5.80524MB/s |
google_message2 | 1.27429GB/s | 1.402GB/s | 1.01039GB/s | 1022.99MB/s | 798.736MB/s | 996.755MB/s | 57.9601MB/s | 4.09246MB/s |
google_message3_1 | 1.31916GB/s | 2.049GB/s | 991.496MB/s | 860.332MB/s | 662.88MB/s | 1.48625GB/s | 421.287MB/s | 18.002MB/s |
google_message3_2 | 2.15676GB/s | 2.632GB/s | 2.14736GB/s | 2.08136GB/s | 1.55997GB/s | 2.39597GB/s | 326.777MB/s | 16.0527MB/s |
google_message3_3 | 650.456MB/s | 1.040GB/s | 593.52MB/s | 580.667MB/s | 346.839MB/s | 123.978MB/s | 35.893MB/s | 2.32834MB/s |
google_message3_4 | 8.70154GB/s | 9.825GB/s | 5.88645GB/s | 5.93946GB/s | 2.44388GB/s | 5.9241GB/s | 4.05837GB/s | 876.87MB/s |
google_message3_5 | 246.33MB/s | 443.993MB/s | 283.278MB/s | 259.167MB/s | 206.37MB/s | 37.0285MB/s | 12.2228MB/s | 1.1979MB/s |
google_message4 | 1.56674GB/s | 2.19601GB/s | 776.907MB/s | 770.707MB/s | 702.931MB/s | 1.49623GB/s | 205.116MB/s | 8.93428MB/s |
* The cpp performance can be improved by using tcmalloc, please follow the (instruction)[https://github.com/protocolbuffers/protobuf/blob/master/benchmarks/README.md] to link with tcmalloc to get the faster result.