Commit 700f1926 authored by Stepan Palamarchuk's avatar Stepan Palamarchuk Committed by Facebook Github Bot

Add benchmark for througput of timed_wait with cancelation

Summary:
This adds a simple benchmark to measure the throughput of calling `Baton::timed_wait` with later fulfillment of Baton without hitting the timeout. This benchmark is useful to make sure that we don't regress when migrating to HHWheelTimer.

It adds 3 case with 1, 5 and 10000 different timeout values used. Below are the results of running the benchmarks:

```
============================================================================
folly/fibers/test/FibersBenchmark.cpp           relative  time/iter  iters/s
============================================================================
FiberManagerCancelledTimeouts_Single_300                   366.57ms     2.73
FiberManagerCancelledTimeouts_Five                         365.44ms     2.74
FiberManagerCancelledTimeouts_TenThousand                  693.06ms     1.44
============================================================================
```

Note, that the 10k case is slower because internally `TimeoutController` has `O(num_timeouts)` loop for looking up the correct queue.

Reviewed By: jmswen

Differential Revision: D13624361

fbshipit-source-id: 4c2324229f524b55d9cf2371ec2acca35db6f4ff
parent 24e19946
......@@ -128,6 +128,56 @@ BENCHMARK(FiberManagerAllocateLargeChunk, iters) {
}
}
void runTimeoutsBenchmark(std::vector<size_t> timeouts) {
constexpr size_t kNumIters = 100000;
constexpr size_t kNumFibers = 100;
size_t iter = 0;
std::vector<folly::fibers::Baton> batons(kNumFibers);
FiberManager manager(std::make_unique<EventBaseLoopController>());
folly::EventBase evb(false /* enableTimeMeasurement */);
dynamic_cast<EventBaseLoopController&>(manager.loopController())
.attachEventBase(evb);
for (size_t i = 0; i < kNumFibers; ++i) {
manager.addTask([i, &iter, &timeouts, &batons] {
while (iter < kNumIters) {
auto tmo = timeouts[iter++ % timeouts.size()];
batons[i].timed_wait(std::chrono::milliseconds(tmo));
batons[i].reset();
}
});
}
while (iter < kNumIters) {
evb.loopOnce();
for (auto& b : batons) {
b.post();
}
}
evb.loopOnce();
}
BENCHMARK(FiberManagerCancelledTimeouts_Single_300) {
runTimeoutsBenchmark({300});
}
BENCHMARK(FiberManagerCancelledTimeouts_Five) {
runTimeoutsBenchmark({300, 350, 500, 1000, 2000});
}
BENCHMARK(FiberManagerCancelledTimeouts_TenThousand) {
constexpr size_t kNumTimeouts = 10000;
std::vector<size_t> tmos(kNumTimeouts);
for (size_t i = 0; i < kNumTimeouts; ++i) {
tmos[i] = 200 + 50 * i;
}
runTimeoutsBenchmark(std::move(tmos));
}
int main(int argc, char** argv) {
folly::init(&argc, &argv, true);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment