proxygen
BatonBenchmark.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 <thread>
20 
21 #include <folly/Benchmark.h>
25 
26 using namespace folly;
27 using namespace folly::test;
29 
30 BENCHMARK(baton_pingpong_blocking, iters) {
31  run_pingpong_test<true, std::atomic>(iters);
32 }
33 
34 BENCHMARK(baton_pingpong_nonblocking, iters) {
35  run_pingpong_test<false, std::atomic>(iters);
36 }
37 
39 
40 BENCHMARK(baton_pingpong_emulated_futex_blocking, iters) {
41  run_pingpong_test<true, EmulatedFutexAtomic>(iters);
42 }
43 
44 BENCHMARK(baton_pingpong_emulated_futex_nonblocking, iters) {
45  run_pingpong_test<false, EmulatedFutexAtomic>(iters);
46 }
47 
49 
50 BENCHMARK(posix_sem_pingpong, iters) {
51  sem_t sems[3];
52  sem_t* a = sems + 0;
53  sem_t* b = sems + 2; // to get it on a different cache line
54 
55  sem_init(a, 0, 0);
56  sem_init(b, 0, 0);
57  auto thr = std::thread([=] {
58  for (size_t i = 0; i < iters; ++i) {
59  sem_wait(a);
60  sem_post(b);
61  }
62  });
63  for (size_t i = 0; i < iters; ++i) {
64  sem_post(a);
65  sem_wait(b);
66  }
67  thr.join();
68 }
69 
70 // I am omitting a benchmark result snapshot because these microbenchmarks
71 // mainly illustrate that PreBlockAttempts is very effective for rapid
72 // handoffs. The performance of Baton and sem_t is essentially identical
73 // to the required futex calls for the blocking case
74 
75 int main(int argc, char** argv) {
76  gflags::ParseCommandLineFlags(&argc, &argv, true);
78  return 0;
79 }
char b
int main(int argc, char **argv)
—— Concurrent Priority Queue Implementation ——
Definition: AtomicBitSet.h:29
void runBenchmarks()
Definition: Benchmark.cpp:456
char ** argv
char a
BENCHMARK(fbFollyGlobalBenchmarkBaseline)
Definition: Benchmark.cpp:84
BENCHMARK_DRAW_LINE()