README.md 3.44 KB
Newer Older
1 2 3 4 5 6 7

# Protocol Buffers Benchmarks

This directory contains benchmarking schemas and data sets that you
can use to test a variety of performance scenarios against your
protobuf language runtime.

Yilun Chong's avatar
Yilun Chong committed
8
## Prerequisite
9

10
First, you need to follow the instruction in the root directory's README to
Yilun Chong's avatar
Yilun Chong committed
11
build your language's protobuf, then:
12

Yilun Chong's avatar
Yilun Chong committed
13
### CPP
Yilun Chong's avatar
Yilun Chong committed
14
You need to install [cmake](https://cmake.org/) before building the benchmark.
15

16 17
We are using [google/benchmark](https://github.com/google/benchmark) as the
benchmark tool for testing cpp. This will be automaticly made during build the
Yilun Chong's avatar
Yilun Chong committed
18
cpp benchmark.
19

Yilun Chong's avatar
Yilun Chong committed
20
### Java
21 22 23
We're using maven to build the java benchmarks, which is the same as to build
the Java protobuf. There're no other tools need to install. We're using
[google/caliper](https://github.com/google/caliper) as benchmark tool, which
Yilun Chong's avatar
Yilun Chong committed
24
can be automaticly included by maven.
Yilun Chong's avatar
Yilun Chong committed
25

Yilun Chong's avatar
Yilun Chong committed
26
### Python
27
We're using python C++ API for testing the generated
Yilun Chong's avatar
Yilun Chong committed
28
CPP proto version of python protobuf, which is also a prerequisite for Python
29 30 31
protobuf cpp implementation. You need to install the correct version of Python
C++ extension package before run generated CPP proto version of Python
protobuf's benchmark. e.g. under Ubuntu, you need to
Yilun Chong's avatar
Yilun Chong committed
32 33

```
34
$ sudo apt-get install python-dev
Yilun Chong's avatar
Yilun Chong committed
35 36
$ sudo apt-get install python3-dev
```
37
And you also need to make sure `pkg-config` is installed.
Yilun Chong's avatar
Yilun Chong committed
38

Yilun Chong's avatar
Yilun Chong committed
39 40
### Big data

41 42
There's some optional big testing data which is not included in the directory
initially, you need to run the following command to download the testing data:
Yilun Chong's avatar
Yilun Chong committed
43 44

```
45
$ ./download_data.sh
Yilun Chong's avatar
Yilun Chong committed
46 47
```

48 49
After doing this the big data file will automaticly generated in the
benchmark directory.
Yilun Chong's avatar
Yilun Chong committed
50 51 52

## Run instructions

53 54
To run all the benchmark dataset:

Yilun Chong's avatar
Yilun Chong committed
55
### Java:
56 57 58 59 60

```
$ make java
```

Yilun Chong's avatar
Yilun Chong committed
61
### CPP:
62 63

```
64
$ make cpp
65 66
```

Yilun Chong's avatar
Yilun Chong committed
67 68
### Python:

69 70
We have three versions of python protobuf implementation: pure python, cpp
reflection and cpp generated code. To run these version benchmark, you need to:
Yilun Chong's avatar
Yilun Chong committed
71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87

#### Pure Python:

```
$ make python-pure-python
```

#### CPP reflection:

```
$ make python-cpp-reflection
```

#### CPP generated code:

```
$ make python-cpp-generated-code
88 89
```

90 91
To run a specific dataset:

Yilun Chong's avatar
Yilun Chong committed
92
### Java:
93 94

```
95
$ make java-benchmark
Yilun Chong's avatar
Yilun Chong committed
96
$ ./java-benchmark $(specific generated dataset file name) [-- $(caliper option)]
97 98
```

Yilun Chong's avatar
Yilun Chong committed
99
### CPP:
100 101

```
102
$ make cpp-benchmark
103 104 105
$ ./cpp-benchmark $(specific generated dataset file name)
```

Yilun Chong's avatar
Yilun Chong committed
106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128
### Python:

#### Pure Python:

```
$ make python-pure-python-benchmark
$ ./python-pure-python-benchmark $(specific generated dataset file name)
```

#### CPP reflection:

```
$ make python-cpp-reflection-benchmark
$ ./python-cpp-reflection-benchmark $(specific generated dataset file name)
```

#### CPP generated code:

```
$ make python-cpp-generated-code-benchmark
$ ./python-cpp-generated-code-benchmark $(specific generated dataset file name)
```

Yilun Chong's avatar
Yilun Chong committed
129 130
## Benchmark datasets

131
Each data set is in the format of benchmarks.proto:
Yilun Chong's avatar
Yilun Chong committed
132

133 134 135 136
1. name is the benchmark dataset's name.
2. message_name is the benchmark's message type full name (including package and message name)
3. payload is the list of raw data.

Yilun Chong's avatar
Yilun Chong committed
137 138
The schema for the datasets is described in `benchmarks.proto`.

139
Benchmark likely want to run several benchmarks against each data set (parse,
140 141 142 143 144 145
serialize, possibly JSON, possibly using different APIs, etc).

We would like to add more data sets.  In general we will favor data sets
that make the overall suite diverse without being too large or having
too many similar tests.  Ideally everyone can run through the entire
suite without the test run getting too long.