• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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