xref: /aosp_15_r20/external/cronet/third_party/protobuf/benchmarks/README.md (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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