diff options
| author | levlam <levlam@telegram.org> | 2021-11-03 14:18:16 +0300 |
|---|---|---|
| committer | levlam <levlam@telegram.org> | 2021-11-03 14:18:16 +0300 |
| commit | ffa48e523a0f5e9730d11df70638e895728a01cf (patch) | |
| tree | 4a5ef69ded2e7a2d5d05955054baa3c09d973aae /benchmark | |
| parent | f964067da655a3092b0ae1db86792835c202424f (diff) | |
Add Actor life cycle benchmark.
Diffstat (limited to 'benchmark')
| -rw-r--r-- | benchmark/bench_actor.cpp | 55 |
1 files changed, 50 insertions, 5 deletions
diff --git a/benchmark/bench_actor.cpp b/benchmark/bench_actor.cpp index 63cc1fca3..bfcaa65a7 100644 --- a/benchmark/bench_actor.cpp +++ b/benchmark/bench_actor.cpp @@ -18,6 +18,51 @@ #pragma comment(linker, "/STACK:16777216") #endif +class CreateActorBench final : public td::Benchmark { + private: + td::ConcurrentScheduler scheduler_; + + struct TestActor final : public td::Actor { + static td::int32 actor_count_; + + void start_up() final { + actor_count_++; + stop(); + } + + void tear_down() final { + if (--actor_count_ == 0) { + td::Scheduler::instance()->finish(); + } + } + }; + + void start_up() final { + scheduler_.init(0); + scheduler_.start(); + } + + void tear_down() final { + scheduler_.finish(); + } + + public: + td::string get_description() const final { + return "CreateActor"; + } + + void run(int n) final { + for (int i = 0; i < n; i++) { + scheduler_.create_actor_unsafe<TestActor>(0, "TestActor").release(); + } + while (scheduler_.run_main(10)) { + // empty + } + } +}; + +td::int32 CreateActorBench::TestActor::actor_count_; + template <int type> class RingBench final : public td::Benchmark { public: @@ -26,11 +71,11 @@ class RingBench final : public td::Benchmark { private: int actor_n_ = -1; int thread_n_ = -1; - std::vector<td::ActorId<PassActor>> actor_array_; + td::vector<td::ActorId<PassActor>> actor_array_; td::ConcurrentScheduler *scheduler_ = nullptr; public: - std::string get_description() const final { + td::string get_description() const final { static const char *types[] = {"later", "immediate", "raw", "tail", "lambda"}; static_assert(0 <= type && type < 5, ""); return PSTRING() << "Ring (send_" << types[type] << ") (threads_n = " << thread_n_ << ")"; @@ -89,7 +134,7 @@ class RingBench final : public td::Benchmark { scheduler_ = new td::ConcurrentScheduler(); scheduler_->init(thread_n_); - actor_array_ = std::vector<td::ActorId<PassActor>>(actor_n_); + actor_array_ = td::vector<td::ActorId<PassActor>>(actor_n_); for (int i = 0; i < actor_n_; i++) { actor_array_[i] = scheduler_->create_actor_unsafe<PassActor>(thread_n_ ? i % thread_n_ : 0, "PassActor").release(); @@ -118,7 +163,7 @@ class RingBench final : public td::Benchmark { template <int type> class QueryBench final : public td::Benchmark { public: - std::string get_description() const final { + td::string get_description() const final { static const char *types[] = {"callback", "immediate future", "delayed future", "dummy", "lambda", "lambda_future"}; static_assert(0 <= type && type < 6, ""); return PSTRING() << "QueryBench: " << types[type]; @@ -269,7 +314,7 @@ class QueryBench final : public td::Benchmark { int main() { td::init_openssl_threads(); - SET_VERBOSITY_LEVEL(VERBOSITY_NAME(DEBUG)); + bench(CreateActorBench()); bench(RingBench<4>(504, 0)); bench(RingBench<3>(504, 0)); bench(RingBench<0>(504, 0)); |
