proxygen
CallOnceBenchmark.cpp
Go to the documentation of this file.
1 /*
2  * Copyright 2016-present Facebook, Inc.
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 
18 
19 #include <deque>
20 #include <mutex>
21 #include <thread>
22 
23 #include <folly/Benchmark.h>
24 
25 #include <glog/logging.h>
26 
27 DEFINE_int32(threads, 16, "benchmark concurrency");
28 
29 template <typename CallOnceFunc>
30 void bm_impl(CallOnceFunc&& fn, size_t iters) {
31  std::deque<std::thread> threads;
32  for (size_t i = 0u; i < size_t(FLAGS_threads); ++i) {
33  threads.emplace_back([&fn, iters] {
34  for (size_t j = 0u; j < iters; ++j) {
35  fn();
36  }
37  });
38  }
39  for (std::thread& t : threads) {
40  t.join();
41  }
42 }
43 
44 BENCHMARK(StdCallOnceBench, iters) {
46  int out = 0;
47  bm_impl([&] { std::call_once(flag, [&] { ++out; }); }, iters);
48  CHECK_EQ(1, out);
49 }
50 
51 BENCHMARK(FollyCallOnceBench, iters) {
53  int out = 0;
54  bm_impl([&] { folly::call_once(flag, [&] { ++out; }); }, iters);
55  CHECK_EQ(1, out);
56 }
57 
58 /*
59 $ call_once_benchmark --bm_min_iters=100000000 --threads=16
60 ============================================================================
61 folly/synchronization/test/CallOnceBenchmark.cpprelative time/iter iters/s
62 ============================================================================
63 StdCallOnceBench 2.40ns 416.78M
64 FollyCallOnceBench 651.94ps 1.53G
65 ============================================================================
66 */
67 
68 int main(int argc, char** argv) {
69  gflags::ParseCommandLineFlags(&argc, &argv, true);
71  return 0;
72 }
BENCHMARK(StdCallOnceBench, iters)
void bm_impl(CallOnceFunc &&fn, size_t iters)
void runBenchmarks()
Definition: Benchmark.cpp:456
DEFINE_int32(threads, 16,"benchmark concurrency")
static once_flag flag
Definition: Random.cpp:75
std::vector< std::thread::id > threads
FOLLY_ALWAYS_INLINE void call_once(basic_once_flag< Mutex, Atom > &flag, F &&f, Args &&...args)
Definition: CallOnce.h:56
char ** argv
basic_once_flag< TimedMutex > once_flag
Definition: CallOnce.h:23
int main(int argc, char **argv)