-
Notifications
You must be signed in to change notification settings - Fork 311
/
Copy pathsleep_benchmark.cpp
62 lines (52 loc) · 2.22 KB
/
sleep_benchmark.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#include <benchmark/benchmark.h>
#include <engine/ev/thread_control.hpp>
#include <userver/engine/async.hpp>
#include <userver/engine/run_standalone.hpp>
#include <userver/engine/sleep.hpp>
using namespace std::chrono_literals;
USERVER_NAMESPACE_BEGIN
void sleep_benchmark_us(benchmark::State& state) {
engine::RunStandalone([&] {
const std::chrono::microseconds sleep_duration{state.range(0)};
for ([[maybe_unused]] auto _ : state) {
const auto deadline = engine::Deadline::FromDuration(sleep_duration);
engine::InterruptibleSleepUntil(deadline);
}
});
}
BENCHMARK(sleep_benchmark_us)->RangeMultiplier(2)->Range(1, 1024 * 128)->Unit(benchmark::kMicrosecond);
void run_in_ev_loop_benchmark(benchmark::State& state) {
engine::RunStandalone([&] {
auto& ev_thread = engine::current_task::GetEventThread();
for ([[maybe_unused]] auto _ : state) {
ev_thread.RunInEvLoopAsync([]() {});
}
});
}
BENCHMARK(run_in_ev_loop_benchmark);
[[maybe_unused]] void successful_wait_for_benchmark(benchmark::State& state) {
engine::RunStandalone([&] {
for ([[maybe_unused]] auto _ : state) {
auto task = engine::AsyncNoSpan([] { engine::Yield(); });
task.WaitFor(20ms);
if (!task.IsFinished()) abort();
}
});
}
BENCHMARK(successful_wait_for_benchmark);
void unreached_task_deadline_benchmark(benchmark::State& state, bool has_task_deadline) {
engine::RunStandalone([&] {
for ([[maybe_unused]] auto _ : state) {
const auto sleep_deadline = engine::Deadline::FromDuration(20s);
const auto task_deadline_raw = engine::Deadline::FromDuration(40s);
benchmark::DoNotOptimize(task_deadline_raw);
const auto task_deadline = has_task_deadline ? task_deadline_raw : engine::Deadline{};
auto task = engine::AsyncNoSpan(task_deadline, [&] { engine::InterruptibleSleepUntil(sleep_deadline); });
engine::Yield();
task.SyncCancel();
}
});
}
BENCHMARK_CAPTURE(unreached_task_deadline_benchmark, no_task_deadline, false);
BENCHMARK_CAPTURE(unreached_task_deadline_benchmark, unreached_task_deadline, true);
USERVER_NAMESPACE_END