Skip to content

Commit a529f23

Browse files
authored
Merge pull request grpc#17965 from vjpai/alarm_benchmark
Add a microbenchmark for immediately-firing alarms
2 parents fd9005b + f919ace commit a529f23

File tree

7 files changed

+231
-0
lines changed

7 files changed

+231
-0
lines changed

CMakeLists.txt

+48
Original file line numberDiff line numberDiff line change
@@ -538,6 +538,9 @@ add_dependencies(buildtests_cxx auth_property_iterator_test)
538538
add_dependencies(buildtests_cxx backoff_test)
539539
add_dependencies(buildtests_cxx bdp_estimator_test)
540540
if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX)
541+
add_dependencies(buildtests_cxx bm_alarm)
542+
endif()
543+
if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX)
541544
add_dependencies(buildtests_cxx bm_arena)
542545
endif()
543546
if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX)
@@ -11177,6 +11180,51 @@ endif (gRPC_BUILD_TESTS)
1117711180
if (gRPC_BUILD_TESTS)
1117811181
if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX)
1117911182

11183+
add_executable(bm_alarm
11184+
test/cpp/microbenchmarks/bm_alarm.cc
11185+
third_party/googletest/googletest/src/gtest-all.cc
11186+
third_party/googletest/googlemock/src/gmock-all.cc
11187+
)
11188+
11189+
11190+
target_include_directories(bm_alarm
11191+
PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
11192+
PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
11193+
PRIVATE ${_gRPC_SSL_INCLUDE_DIR}
11194+
PRIVATE ${_gRPC_PROTOBUF_INCLUDE_DIR}
11195+
PRIVATE ${_gRPC_ZLIB_INCLUDE_DIR}
11196+
PRIVATE ${_gRPC_BENCHMARK_INCLUDE_DIR}
11197+
PRIVATE ${_gRPC_CARES_INCLUDE_DIR}
11198+
PRIVATE ${_gRPC_GFLAGS_INCLUDE_DIR}
11199+
PRIVATE ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR}
11200+
PRIVATE ${_gRPC_NANOPB_INCLUDE_DIR}
11201+
PRIVATE third_party/googletest/googletest/include
11202+
PRIVATE third_party/googletest/googletest
11203+
PRIVATE third_party/googletest/googlemock/include
11204+
PRIVATE third_party/googletest/googlemock
11205+
PRIVATE ${_gRPC_PROTO_GENS_DIR}
11206+
)
11207+
11208+
target_link_libraries(bm_alarm
11209+
${_gRPC_PROTOBUF_LIBRARIES}
11210+
${_gRPC_ALLTARGETS_LIBRARIES}
11211+
grpc_benchmark
11212+
${_gRPC_BENCHMARK_LIBRARIES}
11213+
grpc++_test_util_unsecure
11214+
grpc_test_util_unsecure
11215+
grpc++_unsecure
11216+
grpc_unsecure
11217+
gpr
11218+
grpc++_test_config
11219+
${_gRPC_GFLAGS_LIBRARIES}
11220+
)
11221+
11222+
11223+
endif()
11224+
endif (gRPC_BUILD_TESTS)
11225+
if (gRPC_BUILD_TESTS)
11226+
if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX)
11227+
1118011228
add_executable(bm_arena
1118111229
test/cpp/microbenchmarks/bm_arena.cc
1118211230
third_party/googletest/googletest/src/gtest-all.cc

Makefile

+49
Original file line numberDiff line numberDiff line change
@@ -1137,6 +1137,7 @@ async_end2end_test: $(BINDIR)/$(CONFIG)/async_end2end_test
11371137
auth_property_iterator_test: $(BINDIR)/$(CONFIG)/auth_property_iterator_test
11381138
backoff_test: $(BINDIR)/$(CONFIG)/backoff_test
11391139
bdp_estimator_test: $(BINDIR)/$(CONFIG)/bdp_estimator_test
1140+
bm_alarm: $(BINDIR)/$(CONFIG)/bm_alarm
11401141
bm_arena: $(BINDIR)/$(CONFIG)/bm_arena
11411142
bm_byte_buffer: $(BINDIR)/$(CONFIG)/bm_byte_buffer
11421143
bm_call_create: $(BINDIR)/$(CONFIG)/bm_call_create
@@ -1654,6 +1655,7 @@ buildtests_cxx: privatelibs_cxx \
16541655
$(BINDIR)/$(CONFIG)/auth_property_iterator_test \
16551656
$(BINDIR)/$(CONFIG)/backoff_test \
16561657
$(BINDIR)/$(CONFIG)/bdp_estimator_test \
1658+
$(BINDIR)/$(CONFIG)/bm_alarm \
16571659
$(BINDIR)/$(CONFIG)/bm_arena \
16581660
$(BINDIR)/$(CONFIG)/bm_byte_buffer \
16591661
$(BINDIR)/$(CONFIG)/bm_call_create \
@@ -1842,6 +1844,7 @@ buildtests_cxx: privatelibs_cxx \
18421844
$(BINDIR)/$(CONFIG)/auth_property_iterator_test \
18431845
$(BINDIR)/$(CONFIG)/backoff_test \
18441846
$(BINDIR)/$(CONFIG)/bdp_estimator_test \
1847+
$(BINDIR)/$(CONFIG)/bm_alarm \
18451848
$(BINDIR)/$(CONFIG)/bm_arena \
18461849
$(BINDIR)/$(CONFIG)/bm_byte_buffer \
18471850
$(BINDIR)/$(CONFIG)/bm_call_create \
@@ -2285,6 +2288,8 @@ test_cxx: buildtests_cxx
22852288
$(Q) $(BINDIR)/$(CONFIG)/backoff_test || ( echo test backoff_test failed ; exit 1 )
22862289
$(E) "[RUN] Testing bdp_estimator_test"
22872290
$(Q) $(BINDIR)/$(CONFIG)/bdp_estimator_test || ( echo test bdp_estimator_test failed ; exit 1 )
2291+
$(E) "[RUN] Testing bm_alarm"
2292+
$(Q) $(BINDIR)/$(CONFIG)/bm_alarm || ( echo test bm_alarm failed ; exit 1 )
22882293
$(E) "[RUN] Testing bm_arena"
22892294
$(Q) $(BINDIR)/$(CONFIG)/bm_arena || ( echo test bm_arena failed ; exit 1 )
22902295
$(E) "[RUN] Testing bm_byte_buffer"
@@ -16186,6 +16191,50 @@ endif
1618616191
endif
1618716192

1618816193

16194+
BM_ALARM_SRC = \
16195+
test/cpp/microbenchmarks/bm_alarm.cc \
16196+
16197+
BM_ALARM_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(BM_ALARM_SRC))))
16198+
ifeq ($(NO_SECURE),true)
16199+
16200+
# You can't build secure targets if you don't have OpenSSL.
16201+
16202+
$(BINDIR)/$(CONFIG)/bm_alarm: openssl_dep_error
16203+
16204+
else
16205+
16206+
16207+
16208+
16209+
ifeq ($(NO_PROTOBUF),true)
16210+
16211+
# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+.
16212+
16213+
$(BINDIR)/$(CONFIG)/bm_alarm: protobuf_dep_error
16214+
16215+
else
16216+
16217+
$(BINDIR)/$(CONFIG)/bm_alarm: $(PROTOBUF_DEP) $(BM_ALARM_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_benchmark.a $(LIBDIR)/$(CONFIG)/libbenchmark.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a
16218+
$(E) "[LD] Linking $@"
16219+
$(Q) mkdir -p `dirname $@`
16220+
$(Q) $(LDXX) $(LDFLAGS) $(BM_ALARM_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_benchmark.a $(LIBDIR)/$(CONFIG)/libbenchmark.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/bm_alarm
16221+
16222+
endif
16223+
16224+
endif
16225+
16226+
$(BM_ALARM_OBJS): CPPFLAGS += -Ithird_party/benchmark/include -DHAVE_POSIX_REGEX
16227+
$(OBJDIR)/$(CONFIG)/test/cpp/microbenchmarks/bm_alarm.o: $(LIBDIR)/$(CONFIG)/libgrpc_benchmark.a $(LIBDIR)/$(CONFIG)/libbenchmark.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a
16228+
16229+
deps_bm_alarm: $(BM_ALARM_OBJS:.o=.dep)
16230+
16231+
ifneq ($(NO_SECURE),true)
16232+
ifneq ($(NO_DEPS),true)
16233+
-include $(BM_ALARM_OBJS:.o=.dep)
16234+
endif
16235+
endif
16236+
16237+
1618916238
BM_ARENA_SRC = \
1619016239
test/cpp/microbenchmarks/bm_arena.cc \
1619116240

build.yaml

+20
Original file line numberDiff line numberDiff line change
@@ -3936,6 +3936,26 @@ targets:
39363936
- grpc
39373937
- gpr
39383938
uses_polling: false
3939+
- name: bm_alarm
3940+
build: test
3941+
language: c++
3942+
src:
3943+
- test/cpp/microbenchmarks/bm_alarm.cc
3944+
deps:
3945+
- grpc_benchmark
3946+
- benchmark
3947+
- grpc++_test_util_unsecure
3948+
- grpc_test_util_unsecure
3949+
- grpc++_unsecure
3950+
- grpc_unsecure
3951+
- gpr
3952+
- grpc++_test_config
3953+
benchmark: true
3954+
defaults: benchmark
3955+
platforms:
3956+
- mac
3957+
- linux
3958+
- posix
39393959
- name: bm_arena
39403960
build: test
39413961
language: c++

test/cpp/microbenchmarks/BUILD

+7
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,13 @@ grpc_cc_binary(
5454
deps = [":helpers"],
5555
)
5656

57+
grpc_cc_binary(
58+
name = "bm_alarm",
59+
testonly = 1,
60+
srcs = ["bm_alarm.cc"],
61+
deps = [":helpers"],
62+
)
63+
5764
grpc_cc_binary(
5865
name = "bm_arena",
5966
testonly = 1,

test/cpp/microbenchmarks/bm_alarm.cc

+64
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
/*
2+
*
3+
* Copyright 2015 gRPC authors.
4+
*
5+
* Licensed under the Apache License, Version 2.0 (the "License");
6+
* you may not use this file except in compliance with the License.
7+
* You may obtain a copy of the License at
8+
*
9+
* http://www.apache.org/licenses/LICENSE-2.0
10+
*
11+
* Unless required by applicable law or agreed to in writing, software
12+
* distributed under the License is distributed on an "AS IS" BASIS,
13+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14+
* See the License for the specific language governing permissions and
15+
* limitations under the License.
16+
*
17+
*/
18+
19+
/* This benchmark exists to ensure that immediately-firing alarms are fast */
20+
21+
#include <benchmark/benchmark.h>
22+
#include <grpc/grpc.h>
23+
#include <grpcpp/alarm.h>
24+
#include <grpcpp/completion_queue.h>
25+
#include <grpcpp/impl/grpc_library.h>
26+
#include "test/core/util/test_config.h"
27+
#include "test/cpp/microbenchmarks/helpers.h"
28+
#include "test/cpp/util/test_config.h"
29+
30+
namespace grpc {
31+
namespace testing {
32+
33+
auto& force_library_initialization = Library::get();
34+
35+
static void BM_Alarm_Tag_Immediate(benchmark::State& state) {
36+
TrackCounters track_counters;
37+
CompletionQueue cq;
38+
Alarm alarm;
39+
void* output_tag;
40+
bool ok;
41+
auto deadline = grpc_timeout_seconds_to_deadline(0);
42+
while (state.KeepRunning()) {
43+
alarm.Set(&cq, deadline, nullptr);
44+
cq.Next(&output_tag, &ok);
45+
}
46+
track_counters.Finish(state);
47+
}
48+
BENCHMARK(BM_Alarm_Tag_Immediate);
49+
50+
} // namespace testing
51+
} // namespace grpc
52+
53+
// Some distros have RunSpecifiedBenchmarks under the benchmark namespace,
54+
// and others do not. This allows us to support both modes.
55+
namespace benchmark {
56+
void RunTheBenchmarksNamespaced() { RunSpecifiedBenchmarks(); }
57+
} // namespace benchmark
58+
59+
int main(int argc, char** argv) {
60+
::benchmark::Initialize(&argc, argv);
61+
::grpc::testing::InitTest(&argc, &argv, false);
62+
benchmark::RunTheBenchmarksNamespaced();
63+
return 0;
64+
}

tools/run_tests/generated/sources_and_headers.json

+21
Original file line numberDiff line numberDiff line change
@@ -2708,6 +2708,27 @@
27082708
"third_party": false,
27092709
"type": "target"
27102710
},
2711+
{
2712+
"deps": [
2713+
"benchmark",
2714+
"gpr",
2715+
"grpc++_test_config",
2716+
"grpc++_test_util_unsecure",
2717+
"grpc++_unsecure",
2718+
"grpc_benchmark",
2719+
"grpc_test_util_unsecure",
2720+
"grpc_unsecure"
2721+
],
2722+
"headers": [],
2723+
"is_filegroup": false,
2724+
"language": "c++",
2725+
"name": "bm_alarm",
2726+
"src": [
2727+
"test/cpp/microbenchmarks/bm_alarm.cc"
2728+
],
2729+
"third_party": false,
2730+
"type": "target"
2731+
},
27112732
{
27122733
"deps": [
27132734
"benchmark",

tools/run_tests/generated/tests.json

+22
Original file line numberDiff line numberDiff line change
@@ -3415,6 +3415,28 @@
34153415
],
34163416
"uses_polling": false
34173417
},
3418+
{
3419+
"args": [],
3420+
"benchmark": true,
3421+
"ci_platforms": [
3422+
"linux",
3423+
"mac",
3424+
"posix"
3425+
],
3426+
"cpu_cost": 1.0,
3427+
"exclude_configs": [],
3428+
"exclude_iomgrs": [],
3429+
"flaky": false,
3430+
"gtest": false,
3431+
"language": "c++",
3432+
"name": "bm_alarm",
3433+
"platforms": [
3434+
"linux",
3435+
"mac",
3436+
"posix"
3437+
],
3438+
"uses_polling": true
3439+
},
34183440
{
34193441
"args": [],
34203442
"benchmark": true,

0 commit comments

Comments
 (0)