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