xref: /aosp_15_r20/external/protobuf/benchmarks/README.md (revision 1b3f573f81763fcece89efc2b6a5209149e44ab8)
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