Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in / Register
Toggle navigation
P
protobuf
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Packages
Packages
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
submodule
protobuf
Commits
e436ee0a
Unverified
Commit
e436ee0a
authored
Mar 20, 2018
by
Yilun Chong
Committed by
GitHub
Mar 20, 2018
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #4361 from BSBandme/go_benchmark
Add go benchmark
parents
88a4884b
d6323c8c
Hide whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
243 additions
and
15 deletions
+243
-15
Makefile.am
benchmarks/Makefile.am
+88
-11
README.md
benchmarks/README.md
+27
-0
cpp_benchmark.cc
benchmarks/cpp_benchmark.cc
+2
-2
benchmark_message1_proto2.proto
...ts/google_message1/proto2/benchmark_message1_proto2.proto
+0
-0
dataset.google_message1_proto2.pb
.../google_message1/proto2/dataset.google_message1_proto2.pb
+0
-0
benchmark_message1_proto3.proto
...ts/google_message1/proto3/benchmark_message1_proto3.proto
+0
-0
dataset.google_message1_proto3.pb
.../google_message1/proto3/dataset.google_message1_proto3.pb
+0
-0
go_benchmark_test.go
benchmarks/go_benchmark_test.go
+124
-0
py_benchmark.py
benchmarks/py_benchmark.py
+2
-2
No files found.
benchmarks/Makefile.am
View file @
e436ee0a
benchmarks_protoc_inputs_benchmark_wrapper
=
\
benchmarks.proto
benchmarks_protoc_inputs
=
\
benchmarks.proto
\
datasets/google_message1/benchmark_message1_proto3.proto
datasets/google_message1/proto3/benchmark_message1_proto3.proto
benchmarks_protoc_inputs_proto2
=
\
datasets/google_message1/
benchmark_message1_proto2.proto
\
datasets/google_message1/
proto2/benchmark_message1_proto2.proto
\
datasets/google_message2/benchmark_message2.proto
\
datasets/google_message3/benchmark_message3.proto
\
datasets/google_message3/benchmark_message3_1.proto
\
...
...
@@ -26,7 +28,7 @@ make_tmp_dir:
if
USE_EXTERNAL_PROTOC
protoc_middleman
:
make_tmp_dir $(benchmarks_protoc_inputs)
$(PROTOC)
-I
$(srcdir)
-I
$(top_srcdir)
--cpp_out
=
.
--java_out
=
./tmp
$(benchmarks_protoc_inputs)
$(PROTOC)
-I
$(srcdir)
-I
$(top_srcdir)
--cpp_out
=
.
--java_out
=
./tmp
$(benchmarks_protoc_inputs)
$(benchmarks_protoc_inputs_benchmark_wrapper)
touch
protoc_middleman
protoc_middleman2
:
make_tmp_dir $(benchmarks_protoc_inputs_proto2)
...
...
@@ -38,8 +40,8 @@ else
# We have to cd to $(srcdir) before executing protoc because $(protoc_inputs) is
# relative to srcdir, which may not be the same as the current directory when
# building out-of-tree.
protoc_middleman
:
make_tmp_dir $(top_srcdir)/src/protoc$(EXEEXT) $(benchmarks_protoc_inputs) $(well_known_type_protoc_inputs)
oldpwd
=
`
pwd
`
&&
(
cd
$(srcdir)
&&
$$
oldpwd/../src/protoc
$(EXEEXT)
-I
.
-I
$(top_srcdir)
/src
--cpp_out
=
$$
oldpwd
--java_out
=
$$
oldpwd/tmp/java/src/main/java
--python_out
=
$$
oldpwd/tmp
$(benchmarks_protoc_inputs)
)
protoc_middleman
:
make_tmp_dir $(top_srcdir)/src/protoc$(EXEEXT) $(benchmarks_protoc_inputs) $(well_known_type_protoc_inputs)
$(benchmarks_protoc_inputs_benchmark_wrapper)
oldpwd
=
`
pwd
`
&&
(
cd
$(srcdir)
&&
$$
oldpwd/../src/protoc
$(EXEEXT)
-I
.
-I
$(top_srcdir)
/src
--cpp_out
=
$$
oldpwd
--java_out
=
$$
oldpwd/tmp/java/src/main/java
--python_out
=
$$
oldpwd/tmp
$(benchmarks_protoc_inputs)
$(benchmarks_protoc_inputs_benchmark_wrapper)
)
touch
protoc_middleman
protoc_middleman2
:
make_tmp_dir $(top_srcdir)/src/protoc$(EXEEXT) $(benchmarks_protoc_inputs_proto2) $(well_known_type_protoc_inputs)
...
...
@@ -54,14 +56,14 @@ all_data = `find . -type f -name "dataset.*.pb"`
benchmarks_protoc_outputs
=
\
benchmarks.pb.cc
\
datasets/google_message1/benchmark_message1_proto3.pb.cc
datasets/google_message1/
proto3/
benchmark_message1_proto3.pb.cc
benchmarks_protoc_outputs_header
=
\
benchmarks.pb.h
\
datasets/google_message1/benchmark_message1_proto3.pb.h
datasets/google_message1/
proto3/
benchmark_message1_proto3.pb.h
benchmarks_protoc_outputs_proto2_header
=
\
datasets/google_message1/
benchmark_message1_proto2.pb.h
\
datasets/google_message1/
proto2/benchmark_message1_proto2.pb.h
\
datasets/google_message2/benchmark_message2.pb.h
\
datasets/google_message3/benchmark_message3.pb.h
\
datasets/google_message3/benchmark_message3_1.pb.h
\
...
...
@@ -78,7 +80,7 @@ benchmarks_protoc_outputs_proto2_header = \
datasets/google_message4/benchmark_message4_3.pb.h
benchmarks_protoc_outputs_proto2
=
\
datasets/google_message1/
benchmark_message1_proto2.pb.cc
\
datasets/google_message1/
proto2/benchmark_message1_proto2.pb.cc
\
datasets/google_message2/benchmark_message2.pb.cc
\
datasets/google_message3/benchmark_message3.pb.cc
\
datasets/google_message3/benchmark_message3_1.pb.cc
\
...
...
@@ -224,6 +226,78 @@ python-cpp-generated-code: python-cpp-generated-code-benchmark
############# PYTHON RULES END ##############
############# GO RULES BEGIN ##############
benchmarks_protoc_inputs_proto2_message1
=
\
datasets/google_message1/proto2/benchmark_message1_proto2.proto
benchmarks_protoc_inputs_proto2_message2
=
\
datasets/google_message2/benchmark_message2.proto
benchmarks_protoc_inputs_proto2_message3
=
\
datasets/google_message3/benchmark_message3.proto
\
datasets/google_message3/benchmark_message3_1.proto
\
datasets/google_message3/benchmark_message3_2.proto
\
datasets/google_message3/benchmark_message3_3.proto
\
datasets/google_message3/benchmark_message3_4.proto
\
datasets/google_message3/benchmark_message3_5.proto
\
datasets/google_message3/benchmark_message3_6.proto
\
datasets/google_message3/benchmark_message3_7.proto
\
datasets/google_message3/benchmark_message3_8.proto
benchmarks_protoc_inputs_proto2_message4
=
\
datasets/google_message4/benchmark_message4.proto
\
datasets/google_message4/benchmark_message4_1.proto
\
datasets/google_message4/benchmark_message4_2.proto
\
datasets/google_message4/benchmark_message4_3.proto
if
USE_EXTERNAL_PROTOC
go_protoc_middleman
:
make_tmp_dir $(benchmarks_protoc_inputs)
$(PROTOC)
-I
$(srcdir)
-I
$(top_srcdir)
--go_out
=
$$
oldpwd/tmp
$(benchmarks_protoc_inputs)
$(PROTOC)
-I
$(srcdir)
-I
$(top_srcdir)
--go_out
=
$$
oldpwd/tmp
$(benchmarks_protoc_inputs_benchmark_wrapper)
touch
protoc_middleman
go_protoc_middleman2
:
make_tmp_dir $(benchmarks_protoc_inputs_proto2_message1) $(benchmarks_protoc_inputs_proto2_message2) $(benchmarks_protoc_inputs_proto2_message3) $(benchmarks_protoc_inputs_proto2_message4)
$(PROTOC)
-I
$(srcdir)
-I
$(top_srcdir)
--go_out
=
$$
oldpwd/tmp
$(benchmarks_protoc_inputs_proto2_message1)
$(PROTOC)
-I
$(srcdir)
-I
$(top_srcdir)
--go_out
=
$$
oldpwd/tmp
$(benchmarks_protoc_inputs_proto2_message2)
$(PROTOC)
-I
$(srcdir)
-I
$(top_srcdir)
--go_out
=
$$
oldpwd/tmp
$(benchmarks_protoc_inputs_proto2_message3)
$(PROTOC)
-I
$(srcdir)
-I
$(top_srcdir)
--go_out
=
$$
oldpwd/tmp
$(benchmarks_protoc_inputs_proto2_message4)
touch
protoc_middleman2
else
# We have to cd to $(srcdir) before executing protoc because $(protoc_inputs) is
# relative to srcdir, which may not be the same as the current directory when
# building out-of-tree.
go_protoc_middleman
:
make_tmp_dir $(top_srcdir)/src/protoc$(EXEEXT) $(benchmarks_protoc_inputs) $(well_known_type_protoc_inputs)
oldpwd
=
`
pwd
`
&&
(
cd
$(srcdir)
&&
$$
oldpwd/../src/protoc
$(EXEEXT)
-I
.
-I
$(top_srcdir)
/src
--go_out
=
$$
oldpwd/tmp
$(benchmarks_protoc_inputs)
)
oldpwd
=
`
pwd
`
&&
(
cd
$(srcdir)
&&
$$
oldpwd/../src/protoc
$(EXEEXT)
-I
.
-I
$(top_srcdir)
/src
--go_out
=
$$
oldpwd/tmp
$(benchmarks_protoc_inputs_benchmark_wrapper)
)
touch
protoc_middleman
go_protoc_middleman2
:
make_tmp_dir $(top_srcdir)/src/protoc$(EXEEXT) $(benchmarks_protoc_inputs_proto2_message1) $(benchmarks_protoc_inputs_proto2_message2) $(benchmarks_protoc_inputs_proto2_message3) $(benchmarks_protoc_inputs_proto2_message4) $(well_known_type_protoc_inputs)
oldpwd
=
`
pwd
`
&&
(
cd
$(srcdir)
&&
$$
oldpwd/../src/protoc
$(EXEEXT)
-I
.
-I
$(top_srcdir)
/src
--go_out
=
$$
oldpwd/tmp
$(benchmarks_protoc_inputs_proto2_message1)
)
oldpwd
=
`
pwd
`
&&
(
cd
$(srcdir)
&&
$$
oldpwd/../src/protoc
$(EXEEXT)
-I
.
-I
$(top_srcdir)
/src
--go_out
=
$$
oldpwd/tmp
$(benchmarks_protoc_inputs_proto2_message2)
)
oldpwd
=
`
pwd
`
&&
(
cd
$(srcdir)
&&
$$
oldpwd/../src/protoc
$(EXEEXT)
-I
.
-I
$(top_srcdir)
/src
--go_out
=
$$
oldpwd/tmp
$(benchmarks_protoc_inputs_proto2_message3)
)
oldpwd
=
`
pwd
`
&&
(
cd
$(srcdir)
&&
$$
oldpwd/../src/protoc
$(EXEEXT)
-I
.
-I
$(top_srcdir)
/src
--go_out
=
$$
oldpwd/tmp
$(benchmarks_protoc_inputs_proto2_message4)
)
touch
protoc_middleman2
endif
go-benchmark
:
go_protoc_middleman go_protoc_middleman2
@
echo
"Writing shortcut script go-benchmark..."
@
echo
'#! /bin/sh'
>
go-benchmark
@
echo
'mkdir tmp_cc && mv *.cc tmp_cc'
>>
go-benchmark
@
echo
'go test -bench=. -- $$@'
>>
go-benchmark
@
echo
'mv tmp_cc/* . && rm -rf tmp_cc'
>>
go-benchmark
@
chmod
+x go-benchmark
go
:
go_protoc_middleman go_protoc_middleman2 go-benchmark
./go-benchmark
$(all_data)
############# GO RULES END ##############
MAINTAINERCLEANFILES
=
\
Makefile.in
...
...
@@ -241,7 +315,10 @@ CLEANFILES = \
python_cpp_proto_library
\
python-pure-python-benchmark
\
python-cpp-reflection-benchmark
\
python-cpp-generated-code-benchmark
python-cpp-generated-code-benchmark
\
go-benchmark
\
go_protoc_middleman
\
go_protoc_middleman2
clean-local
:
-
rm
-rf
tmp/
*
benchmarks/README.md
View file @
e436ee0a
...
...
@@ -36,6 +36,21 @@ $ sudo apt-get install python3-dev
```
And you also need to make sure
`pkg-config`
is installed.
### Go
Go protobufs are maintained at
[
github.com/golang/protobuf
](
http://github.com/golang/protobuf
)
. If not done already, you need to install the
toolchain and the Go protoc-gen-go plugin for protoc.
To install protoc-gen-go, run:
```
$ go get -u github.com/golang/protobuf/protoc-gen-go
$ export PATH=$PATH:$(go env GOPATH)/bin
```
The first command installs
`protoc-gen-go`
into the
`bin`
directory in your local
`GOPATH`
.
The second command adds the
`bin`
directory to your
`PATH`
so that
`protoc`
can locate the plugin later.
### Big data
There's some optional big testing data which is not included in the directory
...
...
@@ -87,6 +102,11 @@ $ make python-cpp-reflection
$ make python-cpp-generated-code
```
### Go
```
$ make go
```
To run a specific dataset:
### Java:
...
...
@@ -126,6 +146,13 @@ $ make python-cpp-generated-code-benchmark
$ ./python-cpp-generated-code-benchmark $(specific generated dataset file name)
```
### Go:
```
$ make go-benchmark
$ ./go-benchmark $(specific generated dataset file name)
```
## Benchmark datasets
Each data set is in the format of benchmarks.proto:
...
...
benchmarks/cpp_benchmark.cc
View file @
e436ee0a
...
...
@@ -32,8 +32,8 @@
#include <iostream>
#include "benchmark/benchmark_api.h"
#include "benchmarks.pb.h"
#include "datasets/google_message1/benchmark_message1_proto2.pb.h"
#include "datasets/google_message1/benchmark_message1_proto3.pb.h"
#include "datasets/google_message1/
proto2/
benchmark_message1_proto2.pb.h"
#include "datasets/google_message1/
proto3/
benchmark_message1_proto3.pb.h"
#include "datasets/google_message2/benchmark_message2.pb.h"
#include "datasets/google_message3/benchmark_message3.pb.h"
#include "datasets/google_message4/benchmark_message4.pb.h"
...
...
benchmarks/datasets/google_message1/benchmark_message1_proto2.proto
→
benchmarks/datasets/google_message1/
proto2/
benchmark_message1_proto2.proto
View file @
e436ee0a
File moved
benchmarks/datasets/google_message1/dataset.google_message1_proto2.pb
→
benchmarks/datasets/google_message1/
proto2/
dataset.google_message1_proto2.pb
View file @
e436ee0a
File moved
benchmarks/datasets/google_message1/benchmark_message1_proto3.proto
→
benchmarks/datasets/google_message1/
proto3/
benchmark_message1_proto3.proto
View file @
e436ee0a
File moved
benchmarks/datasets/google_message1/dataset.google_message1_proto3.pb
→
benchmarks/datasets/google_message1/
proto3/
dataset.google_message1_proto3.pb
View file @
e436ee0a
File moved
benchmarks/go_benchmark_test.go
0 → 100644
View file @
e436ee0a
package
main
import
(
benchmarkWrapper
"./tmp"
googleMessage1Proto2
"./tmp/datasets/google_message1/proto2"
googleMessage1Proto3
"./tmp/datasets/google_message1/proto3"
googleMessage2
"./tmp/datasets/google_message2"
googleMessage3
"./tmp/datasets/google_message3"
googleMessage4
"./tmp/datasets/google_message4"
"flag"
"github.com/golang/protobuf/proto"
"io/ioutil"
"testing"
)
// Data is returned by the Load function.
type
Dataset
struct
{
name
string
newMessage
func
()
proto
.
Message
marshaled
[][]
byte
unmarshaled
[]
proto
.
Message
}
var
datasets
[]
Dataset
// This is used to getDefaultInstance for a message type.
func
generateNewMessageFunction
(
dataset
benchmarkWrapper
.
BenchmarkDataset
)
func
()
proto
.
Message
{
switch
dataset
.
MessageName
{
case
"benchmarks.proto3.GoogleMessage1"
:
return
func
()
proto
.
Message
{
return
new
(
googleMessage1Proto3
.
GoogleMessage1
)
}
case
"benchmarks.proto2.GoogleMessage1"
:
return
func
()
proto
.
Message
{
return
new
(
googleMessage1Proto2
.
GoogleMessage1
)
}
case
"benchmarks.proto2.GoogleMessage2"
:
return
func
()
proto
.
Message
{
return
new
(
googleMessage2
.
GoogleMessage2
)
}
case
"benchmarks.google_message3.GoogleMessage3"
:
return
func
()
proto
.
Message
{
return
new
(
googleMessage3
.
GoogleMessage3
)
}
case
"benchmarks.google_message4.GoogleMessage4"
:
return
func
()
proto
.
Message
{
return
new
(
googleMessage4
.
GoogleMessage4
)
}
default
:
panic
(
"Unknown message type: "
+
dataset
.
MessageName
)
}
}
func
init
()
{
flag
.
Parse
()
for
_
,
f
:=
range
flag
.
Args
()
{
// Load the benchmark.
b
,
err
:=
ioutil
.
ReadFile
(
f
)
if
err
!=
nil
{
panic
(
err
)
}
// Parse the benchmark.
var
dm
benchmarkWrapper
.
BenchmarkDataset
if
err
:=
proto
.
Unmarshal
(
b
,
&
dm
);
err
!=
nil
{
panic
(
err
)
}
// Determine the concrete protobuf message type to use.
var
ds
Dataset
ds
.
newMessage
=
generateNewMessageFunction
(
dm
)
// Unmarshal each test message.
for
_
,
payload
:=
range
dm
.
Payload
{
ds
.
marshaled
=
append
(
ds
.
marshaled
,
payload
)
m
:=
ds
.
newMessage
()
if
err
:=
proto
.
Unmarshal
(
payload
,
m
);
err
!=
nil
{
panic
(
err
)
}
ds
.
unmarshaled
=
append
(
ds
.
unmarshaled
,
m
)
}
ds
.
name
=
f
datasets
=
append
(
datasets
,
ds
)
}
}
func
Benchmark
(
b
*
testing
.
B
)
{
for
_
,
ds
:=
range
datasets
{
b
.
Run
(
ds
.
name
,
func
(
b
*
testing
.
B
)
{
b
.
Run
(
"Unmarshal"
,
func
(
b
*
testing
.
B
)
{
for
i
:=
0
;
i
<
b
.
N
;
i
++
{
for
j
,
payload
:=
range
ds
.
marshaled
{
out
:=
ds
.
newMessage
()
if
err
:=
proto
.
Unmarshal
(
payload
,
out
);
err
!=
nil
{
b
.
Fatalf
(
"can't unmarshal message %d %v"
,
j
,
err
)
}
}
}
})
b
.
Run
(
"Marshal"
,
func
(
b
*
testing
.
B
)
{
for
i
:=
0
;
i
<
b
.
N
;
i
++
{
for
j
,
m
:=
range
ds
.
unmarshaled
{
if
_
,
err
:=
proto
.
Marshal
(
m
);
err
!=
nil
{
b
.
Fatalf
(
"can't marshal message %d %+v: %v"
,
j
,
m
,
err
)
}
}
}
})
b
.
Run
(
"Size"
,
func
(
b
*
testing
.
B
)
{
for
i
:=
0
;
i
<
b
.
N
;
i
++
{
for
_
,
m
:=
range
ds
.
unmarshaled
{
proto
.
Size
(
m
)
}
}
})
b
.
Run
(
"Clone"
,
func
(
b
*
testing
.
B
)
{
for
i
:=
0
;
i
<
b
.
N
;
i
++
{
for
_
,
m
:=
range
ds
.
unmarshaled
{
proto
.
Clone
(
m
)
}
}
})
b
.
Run
(
"Merge"
,
func
(
b
*
testing
.
B
)
{
for
i
:=
0
;
i
<
b
.
N
;
i
++
{
for
_
,
m
:=
range
ds
.
unmarshaled
{
out
:=
ds
.
newMessage
()
proto
.
Merge
(
out
,
m
)
}
}
})
})
}
}
benchmarks/py_benchmark.py
View file @
e436ee0a
...
...
@@ -17,8 +17,8 @@ elif sys.argv[1] != "false":
raise
IOError
(
"Need string argument
\"
true
\"
or
\"
false
\"
for whether to use cpp generated code"
)
# END CPP GENERATED MESSAGE
import
datasets.google_message1.benchmark_message1_proto2_pb2
as
benchmark_message1_proto2_pb2
import
datasets.google_message1.benchmark_message1_proto3_pb2
as
benchmark_message1_proto3_pb2
import
datasets.google_message1.
proto2.
benchmark_message1_proto2_pb2
as
benchmark_message1_proto2_pb2
import
datasets.google_message1.
proto3.
benchmark_message1_proto3_pb2
as
benchmark_message1_proto3_pb2
import
datasets.google_message2.benchmark_message2_pb2
as
benchmark_message2_pb2
import
datasets.google_message3.benchmark_message3_pb2
as
benchmark_message3_pb2
import
datasets.google_message4.benchmark_message4_pb2
as
benchmark_message4_pb2
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment