1*6777b538SAndroid Build Coastguard Worker 2*6777b538SAndroid Build Coastguard Worker# Protocol Buffers Benchmarks 3*6777b538SAndroid Build Coastguard Worker 4*6777b538SAndroid Build Coastguard WorkerThis directory contains benchmarking schemas and data sets that you 5*6777b538SAndroid Build Coastguard Workercan use to test a variety of performance scenarios against your 6*6777b538SAndroid Build Coastguard Workerprotobuf language runtime. If you are looking for performance 7*6777b538SAndroid Build Coastguard Workernumbers of officially supported languages, see [Protobuf Performance]( 8*6777b538SAndroid Build Coastguard Workerhttps://github.com/protocolbuffers/protobuf/blob/main/docs/performance.md). 9*6777b538SAndroid Build Coastguard Worker 10*6777b538SAndroid Build Coastguard Worker## Prerequisite 11*6777b538SAndroid Build Coastguard Worker 12*6777b538SAndroid Build Coastguard WorkerFirst, you need to follow the instruction in the root directory's README to 13*6777b538SAndroid Build Coastguard Workerbuild your language's protobuf, then: 14*6777b538SAndroid Build Coastguard Worker 15*6777b538SAndroid Build Coastguard Worker### CPP 16*6777b538SAndroid Build Coastguard WorkerYou need to install [cmake](https://cmake.org/) before building the benchmark. 17*6777b538SAndroid Build Coastguard Worker 18*6777b538SAndroid Build Coastguard WorkerWe are using [google/benchmark](https://github.com/google/benchmark) as the 19*6777b538SAndroid Build Coastguard Workerbenchmark tool for testing cpp. This will be automatically made during build the 20*6777b538SAndroid Build Coastguard Workercpp benchmark. 21*6777b538SAndroid Build Coastguard Worker 22*6777b538SAndroid Build Coastguard WorkerThe cpp protobuf performance can be improved by linking with 23*6777b538SAndroid Build Coastguard Worker[TCMalloc](https://google.github.io/tcmalloc). 24*6777b538SAndroid Build Coastguard Worker 25*6777b538SAndroid Build Coastguard Worker### Java 26*6777b538SAndroid Build Coastguard WorkerWe're using maven to build the java benchmarks, which is the same as to build 27*6777b538SAndroid Build Coastguard Workerthe Java protobuf. There're no other tools need to install. We're using 28*6777b538SAndroid Build Coastguard Worker[google/caliper](https://github.com/google/caliper) as benchmark tool, which 29*6777b538SAndroid Build Coastguard Workercan be automatically included by maven. 30*6777b538SAndroid Build Coastguard Worker 31*6777b538SAndroid Build Coastguard Worker### Python 32*6777b538SAndroid Build Coastguard WorkerWe're using python C++ API for testing the generated 33*6777b538SAndroid Build Coastguard WorkerCPP proto version of python protobuf, which is also a prerequisite for Python 34*6777b538SAndroid Build Coastguard Workerprotobuf cpp implementation. You need to install the correct version of Python 35*6777b538SAndroid Build Coastguard WorkerC++ extension package before run generated CPP proto version of Python 36*6777b538SAndroid Build Coastguard Workerprotobuf's benchmark. e.g. under Ubuntu, you need to 37*6777b538SAndroid Build Coastguard Worker 38*6777b538SAndroid Build Coastguard Worker``` 39*6777b538SAndroid Build Coastguard Worker$ sudo apt-get install python-dev 40*6777b538SAndroid Build Coastguard Worker$ sudo apt-get install python3-dev 41*6777b538SAndroid Build Coastguard Worker``` 42*6777b538SAndroid Build Coastguard WorkerAnd you also need to make sure `pkg-config` is installed. 43*6777b538SAndroid Build Coastguard Worker 44*6777b538SAndroid Build Coastguard Worker### Go 45*6777b538SAndroid Build Coastguard WorkerGo protobufs are maintained at [github.com/golang/protobuf]( 46*6777b538SAndroid Build Coastguard Workerhttp://github.com/golang/protobuf). If not done already, you need to install the 47*6777b538SAndroid Build Coastguard Workertoolchain and the Go protoc-gen-go plugin for protoc. 48*6777b538SAndroid Build Coastguard Worker 49*6777b538SAndroid Build Coastguard WorkerTo install protoc-gen-go, run: 50*6777b538SAndroid Build Coastguard Worker 51*6777b538SAndroid Build Coastguard Worker``` 52*6777b538SAndroid Build Coastguard Worker$ go get -u github.com/golang/protobuf/protoc-gen-go 53*6777b538SAndroid Build Coastguard Worker$ export PATH=$PATH:$(go env GOPATH)/bin 54*6777b538SAndroid Build Coastguard Worker``` 55*6777b538SAndroid Build Coastguard Worker 56*6777b538SAndroid Build Coastguard WorkerThe first command installs `protoc-gen-go` into the `bin` directory in your local `GOPATH`. 57*6777b538SAndroid Build Coastguard WorkerThe second command adds the `bin` directory to your `PATH` so that `protoc` can locate the plugin later. 58*6777b538SAndroid Build Coastguard Worker 59*6777b538SAndroid Build Coastguard Worker### PHP 60*6777b538SAndroid Build Coastguard WorkerPHP benchmark's requirement is the same as PHP protobuf's requirements. The benchmark will automatically 61*6777b538SAndroid Build Coastguard Workerinclude PHP protobuf's src and build the c extension if required. 62*6777b538SAndroid Build Coastguard Worker 63*6777b538SAndroid Build Coastguard Worker### Node.js 64*6777b538SAndroid Build Coastguard WorkerNode.js benchmark need [node](https://nodejs.org/en/)(higher than V6) and [npm](https://www.npmjs.com/) package manager installed. This benchmark is using the [benchmark](https://www.npmjs.com/package/benchmark) framework to test, which needn't to manually install. And another prerequisite is [protobuf js](https://github.com/protocolbuffers/protobuf/tree/main/js), which needn't to manually install either 65*6777b538SAndroid Build Coastguard Worker 66*6777b538SAndroid Build Coastguard Worker### C# 67*6777b538SAndroid Build Coastguard WorkerThe C# benchmark code is built as part of the main Google.Protobuf 68*6777b538SAndroid Build Coastguard Workersolution. It requires the .NET Core SDK, and depends on 69*6777b538SAndroid Build Coastguard Worker[BenchmarkDotNet](https://github.com/dotnet/BenchmarkDotNet), which 70*6777b538SAndroid Build Coastguard Workerwill be downloaded automatically. 71*6777b538SAndroid Build Coastguard Worker 72*6777b538SAndroid Build Coastguard Worker## Run instructions 73*6777b538SAndroid Build Coastguard Worker 74*6777b538SAndroid Build Coastguard WorkerTo run all the benchmark dataset: 75*6777b538SAndroid Build Coastguard Worker 76*6777b538SAndroid Build Coastguard Worker### Java: 77*6777b538SAndroid Build Coastguard Worker 78*6777b538SAndroid Build Coastguard WorkerFirst build the Java binary in the usual way with Maven: 79*6777b538SAndroid Build Coastguard Worker 80*6777b538SAndroid Build Coastguard Worker``` 81*6777b538SAndroid Build Coastguard Worker$ cd java 82*6777b538SAndroid Build Coastguard Worker$ mvn install 83*6777b538SAndroid Build Coastguard Worker``` 84*6777b538SAndroid Build Coastguard Worker 85*6777b538SAndroid Build Coastguard WorkerAssuming that completes successfully, 86*6777b538SAndroid Build Coastguard Worker 87*6777b538SAndroid Build Coastguard Worker``` 88*6777b538SAndroid Build Coastguard Worker$ cd ../benchmarks 89*6777b538SAndroid Build Coastguard Worker$ make java 90*6777b538SAndroid Build Coastguard Worker``` 91*6777b538SAndroid Build Coastguard Worker 92*6777b538SAndroid Build Coastguard Worker### CPP: 93*6777b538SAndroid Build Coastguard Worker 94*6777b538SAndroid Build Coastguard Worker``` 95*6777b538SAndroid Build Coastguard Worker$ make cpp 96*6777b538SAndroid Build Coastguard Worker``` 97*6777b538SAndroid Build Coastguard Worker 98*6777b538SAndroid Build Coastguard WorkerFor linking with tcmalloc: 99*6777b538SAndroid Build Coastguard Worker 100*6777b538SAndroid Build Coastguard Worker``` 101*6777b538SAndroid Build Coastguard Worker$ env LD_PRELOAD={directory to libtcmalloc.so} make cpp 102*6777b538SAndroid Build Coastguard Worker``` 103*6777b538SAndroid Build Coastguard Worker 104*6777b538SAndroid Build Coastguard Worker### Python: 105*6777b538SAndroid Build Coastguard Worker 106*6777b538SAndroid Build Coastguard WorkerWe have three versions of python protobuf implementation: pure python, cpp 107*6777b538SAndroid Build Coastguard Workerreflection and cpp generated code. To run these version benchmark, you need to: 108*6777b538SAndroid Build Coastguard Worker 109*6777b538SAndroid Build Coastguard Worker#### Pure Python: 110*6777b538SAndroid Build Coastguard Worker 111*6777b538SAndroid Build Coastguard Worker``` 112*6777b538SAndroid Build Coastguard Worker$ make python-pure-python 113*6777b538SAndroid Build Coastguard Worker``` 114*6777b538SAndroid Build Coastguard Worker 115*6777b538SAndroid Build Coastguard Worker#### CPP reflection: 116*6777b538SAndroid Build Coastguard Worker 117*6777b538SAndroid Build Coastguard Worker``` 118*6777b538SAndroid Build Coastguard Worker$ make python-cpp-reflection 119*6777b538SAndroid Build Coastguard Worker``` 120*6777b538SAndroid Build Coastguard Worker 121*6777b538SAndroid Build Coastguard Worker#### CPP generated code: 122*6777b538SAndroid Build Coastguard Worker 123*6777b538SAndroid Build Coastguard Worker``` 124*6777b538SAndroid Build Coastguard Worker$ make python-cpp-generated-code 125*6777b538SAndroid Build Coastguard Worker``` 126*6777b538SAndroid Build Coastguard Worker 127*6777b538SAndroid Build Coastguard Worker### Go 128*6777b538SAndroid Build Coastguard Worker``` 129*6777b538SAndroid Build Coastguard Worker$ make go 130*6777b538SAndroid Build Coastguard Worker``` 131*6777b538SAndroid Build Coastguard Worker 132*6777b538SAndroid Build Coastguard Worker 133*6777b538SAndroid Build Coastguard Worker### PHP 134*6777b538SAndroid Build Coastguard WorkerWe have two version of php protobuf implementation: pure php, php with c extension. To run these version benchmark, you need to: 135*6777b538SAndroid Build Coastguard Worker#### Pure PHP 136*6777b538SAndroid Build Coastguard Worker``` 137*6777b538SAndroid Build Coastguard Worker$ make php 138*6777b538SAndroid Build Coastguard Worker``` 139*6777b538SAndroid Build Coastguard Worker#### PHP with c extension 140*6777b538SAndroid Build Coastguard Worker``` 141*6777b538SAndroid Build Coastguard Worker$ make php_c 142*6777b538SAndroid Build Coastguard Worker``` 143*6777b538SAndroid Build Coastguard Worker 144*6777b538SAndroid Build Coastguard Worker### Node.js 145*6777b538SAndroid Build Coastguard Worker``` 146*6777b538SAndroid Build Coastguard Worker$ make js 147*6777b538SAndroid Build Coastguard Worker``` 148*6777b538SAndroid Build Coastguard Worker 149*6777b538SAndroid Build Coastguard WorkerTo run a specific dataset or run with specific options: 150*6777b538SAndroid Build Coastguard Worker 151*6777b538SAndroid Build Coastguard Worker### Java: 152*6777b538SAndroid Build Coastguard Worker 153*6777b538SAndroid Build Coastguard Worker``` 154*6777b538SAndroid Build Coastguard Worker$ make java-benchmark 155*6777b538SAndroid Build Coastguard Worker$ ./java-benchmark $(specific generated dataset file name) [$(caliper options)] 156*6777b538SAndroid Build Coastguard Worker``` 157*6777b538SAndroid Build Coastguard Worker 158*6777b538SAndroid Build Coastguard Worker### CPP: 159*6777b538SAndroid Build Coastguard Worker 160*6777b538SAndroid Build Coastguard Worker``` 161*6777b538SAndroid Build Coastguard Worker$ make cpp-benchmark 162*6777b538SAndroid Build Coastguard Worker$ ./cpp-benchmark $(specific generated dataset file name) [$(benchmark options)] 163*6777b538SAndroid Build Coastguard Worker``` 164*6777b538SAndroid Build Coastguard Worker 165*6777b538SAndroid Build Coastguard Worker### Python: 166*6777b538SAndroid Build Coastguard Worker 167*6777b538SAndroid Build Coastguard WorkerFor Python benchmark we have `--json` for outputting the json result 168*6777b538SAndroid Build Coastguard Worker 169*6777b538SAndroid Build Coastguard Worker#### Pure Python: 170*6777b538SAndroid Build Coastguard Worker 171*6777b538SAndroid Build Coastguard Worker``` 172*6777b538SAndroid Build Coastguard Worker$ make python-pure-python-benchmark 173*6777b538SAndroid Build Coastguard Worker$ ./python-pure-python-benchmark [--json] $(specific generated dataset file name) 174*6777b538SAndroid Build Coastguard Worker``` 175*6777b538SAndroid Build Coastguard Worker 176*6777b538SAndroid Build Coastguard Worker#### CPP reflection: 177*6777b538SAndroid Build Coastguard Worker 178*6777b538SAndroid Build Coastguard Worker``` 179*6777b538SAndroid Build Coastguard Worker$ make python-cpp-reflection-benchmark 180*6777b538SAndroid Build Coastguard Worker$ ./python-cpp-reflection-benchmark [--json] $(specific generated dataset file name) 181*6777b538SAndroid Build Coastguard Worker``` 182*6777b538SAndroid Build Coastguard Worker 183*6777b538SAndroid Build Coastguard Worker#### CPP generated code: 184*6777b538SAndroid Build Coastguard Worker 185*6777b538SAndroid Build Coastguard Worker``` 186*6777b538SAndroid Build Coastguard Worker$ make python-cpp-generated-code-benchmark 187*6777b538SAndroid Build Coastguard Worker$ ./python-cpp-generated-code-benchmark [--json] $(specific generated dataset file name) 188*6777b538SAndroid Build Coastguard Worker``` 189*6777b538SAndroid Build Coastguard Worker 190*6777b538SAndroid Build Coastguard Worker### Go: 191*6777b538SAndroid Build Coastguard Worker``` 192*6777b538SAndroid Build Coastguard Worker$ make go-benchmark 193*6777b538SAndroid Build Coastguard Worker$ ./go-benchmark $(specific generated dataset file name) [go testing options] 194*6777b538SAndroid Build Coastguard Worker``` 195*6777b538SAndroid Build Coastguard Worker 196*6777b538SAndroid Build Coastguard Worker### PHP 197*6777b538SAndroid Build Coastguard Worker#### Pure PHP 198*6777b538SAndroid Build Coastguard Worker``` 199*6777b538SAndroid Build Coastguard Worker$ make php-benchmark 200*6777b538SAndroid Build Coastguard Worker$ ./php-benchmark $(specific generated dataset file name) 201*6777b538SAndroid Build Coastguard Worker``` 202*6777b538SAndroid Build Coastguard Worker#### PHP with c extension 203*6777b538SAndroid Build Coastguard Worker``` 204*6777b538SAndroid Build Coastguard Worker$ make php-c-benchmark 205*6777b538SAndroid Build Coastguard Worker$ ./php-c-benchmark $(specific generated dataset file name) 206*6777b538SAndroid Build Coastguard Worker``` 207*6777b538SAndroid Build Coastguard Worker 208*6777b538SAndroid Build Coastguard Worker### Node.js 209*6777b538SAndroid Build Coastguard Worker``` 210*6777b538SAndroid Build Coastguard Worker$ make js-benchmark 211*6777b538SAndroid Build Coastguard Worker$ ./js-benchmark $(specific generated dataset file name) 212*6777b538SAndroid Build Coastguard Worker``` 213*6777b538SAndroid Build Coastguard Worker 214*6777b538SAndroid Build Coastguard Worker### C# 215*6777b538SAndroid Build Coastguard WorkerFrom `csharp/src/Google.Protobuf.Benchmarks`, run: 216*6777b538SAndroid Build Coastguard Worker 217*6777b538SAndroid Build Coastguard Worker``` 218*6777b538SAndroid Build Coastguard Worker$ dotnet run -c Release 219*6777b538SAndroid Build Coastguard Worker``` 220*6777b538SAndroid Build Coastguard Worker 221*6777b538SAndroid Build Coastguard WorkerWe intend to add support for this within the makefile in due course. 222*6777b538SAndroid Build Coastguard Worker 223*6777b538SAndroid Build Coastguard Worker## Benchmark datasets 224*6777b538SAndroid Build Coastguard Worker 225*6777b538SAndroid Build Coastguard WorkerEach data set is in the format of benchmarks.proto: 226*6777b538SAndroid Build Coastguard Worker 227*6777b538SAndroid Build Coastguard Worker1. name is the benchmark dataset's name. 228*6777b538SAndroid Build Coastguard Worker2. message_name is the benchmark's message type full name (including package and message name) 229*6777b538SAndroid Build Coastguard Worker3. payload is the list of raw data. 230*6777b538SAndroid Build Coastguard Worker 231*6777b538SAndroid Build Coastguard WorkerThe schema for the datasets is described in `benchmarks.proto`. 232*6777b538SAndroid Build Coastguard Worker 233*6777b538SAndroid Build Coastguard WorkerBenchmark likely want to run several benchmarks against each data set (parse, 234*6777b538SAndroid Build Coastguard Workerserialize, possibly JSON, possibly using different APIs, etc). 235*6777b538SAndroid Build Coastguard Worker 236*6777b538SAndroid Build Coastguard WorkerWe would like to add more data sets. In general we will favor data sets 237*6777b538SAndroid Build Coastguard Workerthat make the overall suite diverse without being too large or having 238*6777b538SAndroid Build Coastguard Workertoo many similar tests. Ideally everyone can run through the entire 239*6777b538SAndroid Build Coastguard Workersuite without the test run getting too long. 240