1 /*
2 * Copyright (c) Facebook, Inc. and its affiliates.
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17 #include <folly/Benchmark.h>
18 #include <folly/io/async/EventBase.h>
19 #include <folly/portability/GFlags.h>
20
21 using namespace folly;
22
23 class CountedLoopCallback : public EventBase::LoopCallback {
24 public:
CountedLoopCallback(EventBase * eventBase,unsigned int count)25 CountedLoopCallback(EventBase* eventBase, unsigned int count)
26 : eventBase_(eventBase), count_(count) {}
27
runLoopCallback()28 void runLoopCallback() noexcept override {
29 --count_;
30 if (count_ > 0) {
31 eventBase_->runInLoop(this);
32 }
33 }
34
35 private:
36 EventBase* eventBase_;
37 unsigned int count_;
38 };
39
BENCHMARK(timeMeasurementsOn,n)40 BENCHMARK(timeMeasurementsOn, n) {
41 EventBase eventBase;
42
43 while (n--) {
44 CountedLoopCallback c(&eventBase, 10);
45 eventBase.runInLoop(&c);
46 eventBase.loop();
47 }
48 }
49
BENCHMARK_RELATIVE(timeMeasurementsOff,n)50 BENCHMARK_RELATIVE(timeMeasurementsOff, n) {
51 EventBase eventBase(/* enableTimeMeasurement */ false);
52
53 while (n--) {
54 CountedLoopCallback c(&eventBase, 10);
55 eventBase.runInLoop(&c);
56 eventBase.loop();
57 }
58 }
59
60 /**
61 * --bm_min_iters=1000000
62 *
63 * ============================================================================
64 * folly/io/async/test/EventBaseBenchmark.cpp relative time/iter iters/s
65 * ============================================================================
66 * timeMeasurementsOn 1.25us 798.33K
67 * timeMeasurementsOff 214.47% 584.04ns 1.71M
68 * ============================================================================
69 */
70
main(int argc,char ** argv)71 int main(int argc, char** argv) {
72 gflags::ParseCommandLineFlags(&argc, &argv, true);
73 runBenchmarks();
74 }
75