24 std::this_thread::sleep_for(std::chrono::milliseconds{1});
28 #if FOLLY_HAS_COROUTINES 29 #include <experimental/coroutine> 36 Wait get_return_object() {
40 std::experimental::suspend_never initial_suspend() {
44 std::experimental::suspend_never final_suspend() {
52 void unhandled_exception() {
53 promise_.set_exception(std::current_exception());
60 explicit Wait(std::future<void> future) : future_(
std::move(future)) {}
62 Wait(Wait&&) =
default;
69 if (future_.valid()) {
75 std::future<void> future_;
81 InlineTask(
const InlineTask&) =
delete;
82 InlineTask(InlineTask&& other)
89 bool await_ready()
const {
93 std::experimental::coroutine_handle<> await_suspend(
94 std::experimental::coroutine_handle<> awaiter) {
97 return std::experimental::coroutine_handle<promise_type>::from_promise(
102 std::experimental::coroutine_handle<promise_type>::from_promise(
111 InlineTask get_return_object() {
112 return InlineTask(
this);
115 template <
typename U>
116 void return_value(U&&
value) {
117 *valuePtr_ = std::forward<U>(
value);
120 void unhandled_exception() {
124 std::experimental::suspend_always initial_suspend() {
128 class FinalSuspender {
130 explicit FinalSuspender(std::experimental::coroutine_handle<> awaiter)
137 auto await_suspend(std::experimental::coroutine_handle<>) {
141 void await_resume() {}
144 std::experimental::coroutine_handle<> awaiter_;
147 FinalSuspender final_suspend() {
148 return FinalSuspender(
std::move(awaiter_));
152 friend class InlineTask;
155 std::experimental::coroutine_handle<> awaiter_;
159 friend class promise_type;
161 explicit InlineTask(promise_type* promise) :
promise_(promise) {}
167 InlineTask<ExpensiveCopy> co_nestedCalls(
size_t times) {
170 ret = co_await co_nestedCalls(times - 1);
175 void coroNRVO(
size_t times,
size_t iters) {
176 for (
size_t iter = 0; iter < iters; ++iter) {
177 [](
size_t times) -> Wait {
178 (void)co_await co_nestedCalls(
times);
203 for (
size_t iter = 0; iter < iters; ++iter) {
217 gflags::ParseCommandLineFlags(&argc, &argv,
true);
constexpr detail::Map< Move > move
BENCHMARK(NRVOOneAwait, iters)
ExpensiveCopy(const ExpensiveCopy &)
int main(int argc, char **argv)
static const char *const value
void NRVO(size_t times, size_t iters)
T exchange(T &obj, U &&new_value)
ExpensiveCopy nestedCalls(size_t times)
Future< Unit > times(const int n, F &&thunk)