1*1b3f573fSAndroid Build Coastguard Worker#!/bin/bash 2*1b3f573fSAndroid Build Coastguard Worker# 3*1b3f573fSAndroid Build Coastguard Worker# Change to repo root 4*1b3f573fSAndroid Build Coastguard Workercd $(dirname $0)/../../.. 5*1b3f573fSAndroid Build Coastguard Worker 6*1b3f573fSAndroid Build Coastguard Workerset -ex 7*1b3f573fSAndroid Build Coastguard Worker 8*1b3f573fSAndroid Build Coastguard Workerexport OUTPUT_DIR=testoutput 9*1b3f573fSAndroid Build Coastguard Workerrepo_root="$(pwd)" 10*1b3f573fSAndroid Build Coastguard Worker 11*1b3f573fSAndroid Build Coastguard Worker# TODO(jtattermusch): Add back support for benchmarking with tcmalloc for C++ and python. 12*1b3f573fSAndroid Build Coastguard Worker# This feature was removed since it used to use tcmalloc from https://github.com/gperftools/gperftools.git 13*1b3f573fSAndroid Build Coastguard Worker# which is very outdated. See https://github.com/protocolbuffers/protobuf/issues/8725. 14*1b3f573fSAndroid Build Coastguard Worker 15*1b3f573fSAndroid Build Coastguard Worker# download datasets for benchmark 16*1b3f573fSAndroid Build Coastguard Workerpushd benchmarks 17*1b3f573fSAndroid Build Coastguard Workerdatasets=$(for file in $(find . -type f -name "dataset.*.pb" -not -path "./tmp/*"); do echo "$(pwd)/$file"; done | xargs) 18*1b3f573fSAndroid Build Coastguard Workerecho $datasets 19*1b3f573fSAndroid Build Coastguard Workerpopd 20*1b3f573fSAndroid Build Coastguard Worker 21*1b3f573fSAndroid Build Coastguard Worker# build Python protobuf 22*1b3f573fSAndroid Build Coastguard Worker./autogen.sh 23*1b3f573fSAndroid Build Coastguard Worker./configure CXXFLAGS="-fPIC -O2" 24*1b3f573fSAndroid Build Coastguard Workermake -j8 25*1b3f573fSAndroid Build Coastguard Workerpushd python 26*1b3f573fSAndroid Build Coastguard Workerpython3 -m venv env 27*1b3f573fSAndroid Build Coastguard Workersource env/bin/activate 28*1b3f573fSAndroid Build Coastguard Workerpython3 setup.py build --cpp_implementation 29*1b3f573fSAndroid Build Coastguard Workerpip3 install --install-option="--cpp_implementation" . 30*1b3f573fSAndroid Build Coastguard Workerpopd 31*1b3f573fSAndroid Build Coastguard Worker 32*1b3f573fSAndroid Build Coastguard Worker# build and run Python benchmark 33*1b3f573fSAndroid Build Coastguard Worker# We do this before building protobuf C++ since C++ build 34*1b3f573fSAndroid Build Coastguard Worker# will rewrite some libraries used by protobuf python. 35*1b3f573fSAndroid Build Coastguard Workerpushd benchmarks 36*1b3f573fSAndroid Build Coastguard Workermake python-pure-python-benchmark 37*1b3f573fSAndroid Build Coastguard Workermake python-cpp-reflection-benchmark 38*1b3f573fSAndroid Build Coastguard Workermake -j8 python-cpp-generated-code-benchmark 39*1b3f573fSAndroid Build Coastguard Workerecho "[" > tmp/python_result.json 40*1b3f573fSAndroid Build Coastguard Workerecho "benchmarking pure python..." 41*1b3f573fSAndroid Build Coastguard Worker./python-pure-python-benchmark --json --behavior_prefix="pure-python-benchmark" $datasets >> tmp/python_result.json 42*1b3f573fSAndroid Build Coastguard Workerecho "," >> "tmp/python_result.json" 43*1b3f573fSAndroid Build Coastguard Workerecho "benchmarking python cpp reflection..." 44*1b3f573fSAndroid Build Coastguard Workerenv LD_LIBRARY_PATH="${repo_root}/src/.libs" ./python-cpp-reflection-benchmark --json --behavior_prefix="cpp-reflection-benchmark" $datasets >> tmp/python_result.json 45*1b3f573fSAndroid Build Coastguard Workerecho "," >> "tmp/python_result.json" 46*1b3f573fSAndroid Build Coastguard Workerecho "benchmarking python cpp generated code..." 47*1b3f573fSAndroid Build Coastguard Workerenv LD_LIBRARY_PATH="${repo_root}/src/.libs" ./python-cpp-generated-code-benchmark --json --behavior_prefix="cpp-generated-code-benchmark" $datasets >> tmp/python_result.json 48*1b3f573fSAndroid Build Coastguard Workerecho "]" >> "tmp/python_result.json" 49*1b3f573fSAndroid Build Coastguard Workerpopd 50*1b3f573fSAndroid Build Coastguard Worker 51*1b3f573fSAndroid Build Coastguard Worker# build CPP protobuf 52*1b3f573fSAndroid Build Coastguard Worker./configure 53*1b3f573fSAndroid Build Coastguard Workermake clean && make -j8 54*1b3f573fSAndroid Build Coastguard Worker 55*1b3f573fSAndroid Build Coastguard Workerpushd java 56*1b3f573fSAndroid Build Coastguard Workermvn package -B -Dmaven.test.skip=true 57*1b3f573fSAndroid Build Coastguard Workerpopd 58*1b3f573fSAndroid Build Coastguard Worker 59*1b3f573fSAndroid Build Coastguard Workerpushd benchmarks 60*1b3f573fSAndroid Build Coastguard Worker 61*1b3f573fSAndroid Build Coastguard Worker# build and run C++ benchmark 62*1b3f573fSAndroid Build Coastguard Worker# "make clean" deletes the contents of the tmp/ directory, so we move it elsewhere and then restore it once build is done. 63*1b3f573fSAndroid Build Coastguard Worker# TODO(jtattermusch): find a less clumsy way of protecting python_result.json contents 64*1b3f573fSAndroid Build Coastguard Workermv tmp/python_result.json . && make clean && make -j8 cpp-benchmark && mv python_result.json tmp 65*1b3f573fSAndroid Build Coastguard Workerecho "benchmarking cpp..." 66*1b3f573fSAndroid Build Coastguard Workerenv ./cpp-benchmark --benchmark_min_time=5.0 --benchmark_out_format=json --benchmark_out="tmp/cpp_result.json" $datasets 67*1b3f573fSAndroid Build Coastguard Worker 68*1b3f573fSAndroid Build Coastguard Worker# TODO(jtattermusch): add benchmarks for https://github.com/protocolbuffers/protobuf-go. 69*1b3f573fSAndroid Build Coastguard Worker# The original benchmarks for https://github.com/golang/protobuf were removed 70*1b3f573fSAndroid Build Coastguard Worker# because: 71*1b3f573fSAndroid Build Coastguard Worker# * they were broken and haven't been producing results for a long time 72*1b3f573fSAndroid Build Coastguard Worker# * the https://github.com/golang/protobuf implementation has been superseded by 73*1b3f573fSAndroid Build Coastguard Worker# https://github.com/protocolbuffers/protobuf-go 74*1b3f573fSAndroid Build Coastguard Worker 75*1b3f573fSAndroid Build Coastguard Worker# build and run java benchmark (java 11 is required) 76*1b3f573fSAndroid Build Coastguard Workermake java-benchmark 77*1b3f573fSAndroid Build Coastguard Workerecho "benchmarking java..." 78*1b3f573fSAndroid Build Coastguard Worker./java-benchmark -Cresults.file.options.file="tmp/java_result.json" $datasets 79*1b3f573fSAndroid Build Coastguard Worker 80*1b3f573fSAndroid Build Coastguard Worker# TODO(jtattermusch): re-enable JS benchmarks once https://github.com/protocolbuffers/protobuf/issues/8747 is fixed. 81*1b3f573fSAndroid Build Coastguard Worker# build and run js benchmark 82*1b3f573fSAndroid Build Coastguard Worker# make js-benchmark 83*1b3f573fSAndroid Build Coastguard Worker# echo "benchmarking js..." 84*1b3f573fSAndroid Build Coastguard Worker# ./js-benchmark $datasets --json_output=$(pwd)/tmp/node_result.json 85*1b3f573fSAndroid Build Coastguard Worker 86*1b3f573fSAndroid Build Coastguard Worker# TODO(jtattermusch): add php-c-benchmark. Currently its build is broken. 87*1b3f573fSAndroid Build Coastguard Worker 88*1b3f573fSAndroid Build Coastguard Worker# persist raw the results in the build job log (for better debuggability) 89*1b3f573fSAndroid Build Coastguard Workercat tmp/cpp_result.json 90*1b3f573fSAndroid Build Coastguard Workercat tmp/java_result.json 91*1b3f573fSAndroid Build Coastguard Workercat tmp/python_result.json 92*1b3f573fSAndroid Build Coastguard Worker 93*1b3f573fSAndroid Build Coastguard Worker# print the postprocessed results to the build job log 94*1b3f573fSAndroid Build Coastguard Worker# TODO(jtattermusch): re-enable uploading results to bigquery (it is currently broken) 95*1b3f573fSAndroid Build Coastguard Workermake python_add_init 96*1b3f573fSAndroid Build Coastguard Workerenv LD_LIBRARY_PATH="${repo_root}/src/.libs" python3 -m util.result_parser \ 97*1b3f573fSAndroid Build Coastguard Worker -cpp="../tmp/cpp_result.json" -java="../tmp/java_result.json" -python="../tmp/python_result.json" 98*1b3f573fSAndroid Build Coastguard Workerpopd 99*1b3f573fSAndroid Build Coastguard Worker 100