1# Copyright (c) 2009-2021, Google LLC 2# All rights reserved. 3# 4# Use of this source code is governed by a BSD-style 5# license that can be found in the LICENSE file or at 6# https://developers.google.com/open-source/licenses/bsd 7 8load("@rules_python//python:defs.bzl", "py_binary") 9load("//bazel:cc_proto_library.bzl", "cc_proto_library") 10load("//bazel:proto_library.bzl", "proto_library") 11load( 12 "//bazel:upb_proto_library.bzl", 13 "upb_c_proto_library", 14 "upb_proto_reflection_library", 15) 16load( 17 ":build_defs.bzl", 18 "cc_optimizefor_proto_library", 19 "expand_suffixes", 20 "tmpl_cc_binary", 21) 22 23package(default_applicable_licenses = ["//:license"]) 24 25licenses(["notice"]) 26 27proto_library( 28 name = "descriptor_proto", 29 srcs = ["descriptor.proto"], 30) 31 32upb_c_proto_library( 33 name = "benchmark_descriptor_upb_proto", 34 deps = [":descriptor_proto"], 35) 36 37upb_proto_reflection_library( 38 name = "benchmark_descriptor_upb_proto_reflection", 39 deps = [":descriptor_proto"], 40) 41 42upb_proto_reflection_library( 43 name = "ads_upb_proto_reflection", 44 deps = ["@com_google_googleapis//:ads_proto"], 45) 46 47cc_proto_library( 48 name = "benchmark_descriptor_cc_proto", 49 deps = [":descriptor_proto"], 50) 51 52proto_library( 53 name = "benchmark_descriptor_sv_proto", 54 srcs = ["descriptor_sv.proto"], 55) 56 57cc_proto_library( 58 name = "benchmark_descriptor_sv_cc_proto", 59 deps = [":benchmark_descriptor_sv_proto"], 60) 61 62cc_test( 63 name = "benchmark", 64 testonly = 1, 65 srcs = ["benchmark.cc"], 66 deps = [ 67 ":ads_upb_proto_reflection", 68 ":benchmark_descriptor_cc_proto", 69 ":benchmark_descriptor_sv_cc_proto", 70 ":benchmark_descriptor_upb_proto", 71 ":benchmark_descriptor_upb_proto_reflection", 72 "//:protobuf", 73 "//src/google/protobuf/json", 74 "//upb:base", 75 "//upb:json", 76 "//upb:mem", 77 "//upb:reflection", 78 "//upb:wire", 79 "@com_github_google_benchmark//:benchmark_main", 80 "@com_google_absl//absl/container:flat_hash_set", 81 "@com_google_absl//absl/log:absl_check", 82 "@com_google_googletest//:gtest", 83 "@com_google_googletest//:gtest_main", 84 ], 85) 86 87# Size benchmarks. 88 89SIZE_BENCHMARKS = { 90 "empty": "Empty", 91 "descriptor": "FileDescriptorSet", 92 "100_msgs": "Message100", 93 "200_msgs": "Message200", 94 "100_fields": "Message", 95 "200_fields": "Message", 96} 97 98py_binary( 99 name = "gen_synthetic_protos", 100 srcs = ["gen_synthetic_protos.py"], 101 python_version = "PY3", 102) 103 104py_binary( 105 name = "gen_upb_binary_c", 106 srcs = ["gen_upb_binary_c.py"], 107 python_version = "PY3", 108) 109 110py_binary( 111 name = "gen_protobuf_binary_cc", 112 srcs = ["gen_protobuf_binary_cc.py"], 113 python_version = "PY3", 114) 115 116genrule( 117 name = "do_gen_synthetic_protos", 118 outs = [ 119 "100_msgs.proto", 120 "200_msgs.proto", 121 "100_fields.proto", 122 "200_fields.proto", 123 ], 124 cmd = "$(execpath :gen_synthetic_protos) $(RULEDIR)", 125 tools = [":gen_synthetic_protos"], 126) 127 128proto_library( 129 name = "100_msgs_proto", 130 srcs = ["100_msgs.proto"], 131) 132 133proto_library( 134 name = "200_msgs_proto", 135 srcs = ["200_msgs.proto"], 136) 137 138proto_library( 139 name = "100_fields_proto", 140 srcs = ["100_fields.proto"], 141) 142 143proto_library( 144 name = "200_fields_proto", 145 srcs = ["200_fields.proto"], 146) 147 148proto_library( 149 name = "empty_proto", 150 srcs = ["empty.proto"], 151) 152 153[( 154 upb_c_proto_library( 155 name = k + "_upb_proto", 156 deps = [":" + k + "_proto"], 157 ), 158 cc_proto_library( 159 name = k + "_cc_proto", 160 deps = [":" + k + "_proto"], 161 ), 162 tmpl_cc_binary( 163 name = k + "_upb_binary", 164 testonly = 1, 165 args = [ 166 package_name() + "/" + k + ".upb.h", 167 "upb_benchmark_" + v, 168 ], 169 gen = ":gen_upb_binary_c", 170 deps = [ 171 ":" + k + "_upb_proto", 172 ], 173 ), 174 tmpl_cc_binary( 175 name = k + "_protobuf_binary", 176 testonly = 1, 177 args = [ 178 package_name() + "/" + k + ".pb.h", 179 "upb_benchmark::" + v, 180 ], 181 gen = ":gen_protobuf_binary_cc", 182 deps = [ 183 ":" + k + "_cc_proto", 184 ], 185 ), 186 cc_optimizefor_proto_library( 187 name = k + "_cc_lite_proto", 188 srcs = [k + ".proto"], 189 outs = [k + "_lite.proto"], 190 optimize_for = "LITE_RUNTIME", 191 ), 192 tmpl_cc_binary( 193 name = k + "_lite_protobuf_binary", 194 testonly = 1, 195 args = [ 196 package_name() + "/" + k + "_lite.pb.h", 197 "upb_benchmark::" + v, 198 ], 199 gen = ":gen_protobuf_binary_cc", 200 deps = [ 201 ":" + k + "_cc_lite_proto", 202 ], 203 ), 204 cc_optimizefor_proto_library( 205 name = k + "_cc_codesize_proto", 206 srcs = [k + ".proto"], 207 outs = [k + "_codesize.proto"], 208 optimize_for = "CODE_SIZE", 209 ), 210 tmpl_cc_binary( 211 name = k + "_codesize_protobuf_binary", 212 testonly = 1, 213 args = [ 214 package_name() + "/" + k + "_codesize.pb.h", 215 "upb_benchmark::" + v, 216 ], 217 gen = ":gen_protobuf_binary_cc", 218 deps = [ 219 ":" + k + "_cc_codesize_proto", 220 ], 221 ), 222) for k, v in SIZE_BENCHMARKS.items()] 223 224genrule( 225 name = "size_data", 226 testonly = 1, 227 srcs = expand_suffixes( 228 SIZE_BENCHMARKS.keys(), 229 suffixes = [ 230 "_upb_binary", 231 "_protobuf_binary", 232 "_lite_protobuf_binary", 233 "_codesize_protobuf_binary", 234 ], 235 ), 236 outs = ["size_data.txt"], 237 # We want --format=GNU which counts rodata with data, not text. 238 cmd = "size $$([ $$OSTYPE == 'linux-gnu' ] && echo '--format=GNU -d' || echo '') $(SRCS) > $@", 239 # "size" sometimes isn't available remotely. 240 local = 1, 241 tags = ["no-remote-exec"], 242) 243