coroutine_traits.cpp 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. #include <library/cpp/threading/future/future.h>
  2. #include <library/cpp/threading/future/core/coroutine_traits.h>
  3. #include <benchmark/benchmark.h>
  4. class TContext {
  5. public:
  6. TContext()
  7. : NextInputPromise_(NThreading::NewPromise<bool>())
  8. {}
  9. ~TContext() {
  10. UpdateNextInput(false);
  11. }
  12. NThreading::TFuture<bool> NextInput() {
  13. return NextInputPromise_.GetFuture();
  14. }
  15. void UpdateNextInput(bool hasInput = true) {
  16. auto prevNextInputPromise = NextInputPromise_;
  17. NextInputPromise_ = NThreading::NewPromise<bool>();
  18. prevNextInputPromise.SetValue(hasInput);
  19. }
  20. private:
  21. NThreading::TPromise<bool> NextInputPromise_;
  22. };
  23. static void TestPureFutureChainSubscribe(benchmark::State& state) {
  24. TContext context;
  25. size_t cnt = 0;
  26. std::function<void(const NThreading::TFuture<bool>&)> processInput = [&context, &cnt, &processInput](const NThreading::TFuture<bool>& hasInput) {
  27. if (hasInput.GetValue()) {
  28. benchmark::DoNotOptimize(++cnt);
  29. context.NextInput().Subscribe(processInput);
  30. }
  31. };
  32. processInput(NThreading::MakeFuture<bool>(true));
  33. for (auto _ : state) {
  34. context.UpdateNextInput();
  35. }
  36. context.UpdateNextInput(false);
  37. }
  38. static void TestPureFutureChainApply(benchmark::State& state) {
  39. TContext context;
  40. size_t cnt = 0;
  41. std::function<void(const NThreading::TFuture<bool>&)> processInput = [&context, &cnt, &processInput](const NThreading::TFuture<bool>& hasInput) {
  42. if (hasInput.GetValue()) {
  43. benchmark::DoNotOptimize(++cnt);
  44. context.NextInput().Apply(processInput);
  45. }
  46. };
  47. processInput(NThreading::MakeFuture<bool>(true));
  48. for (auto _ : state) {
  49. context.UpdateNextInput();
  50. }
  51. context.UpdateNextInput(false);
  52. }
  53. static void TestCoroFutureChain(benchmark::State& state) {
  54. TContext context;
  55. size_t cnt = 0;
  56. auto coroutine = [&context, &cnt]() -> NThreading::TFuture<void> {
  57. while (co_await context.NextInput()) {
  58. benchmark::DoNotOptimize(++cnt);
  59. }
  60. };
  61. auto coroutineFuture = coroutine();
  62. for (auto _ : state) {
  63. context.UpdateNextInput();
  64. }
  65. context.UpdateNextInput(false);
  66. coroutineFuture.GetValueSync();
  67. }
  68. BENCHMARK(TestPureFutureChainSubscribe);
  69. BENCHMARK(TestPureFutureChainApply);
  70. BENCHMARK(TestCoroFutureChain);