aboutsummaryrefslogtreecommitdiffhomepage
path: root/benchmark
diff options
context:
space:
mode:
authorlevlam <levlam@telegram.org>2021-11-03 14:18:16 +0300
committerlevlam <levlam@telegram.org>2021-11-03 14:18:16 +0300
commitffa48e523a0f5e9730d11df70638e895728a01cf (patch)
tree4a5ef69ded2e7a2d5d05955054baa3c09d973aae /benchmark
parentf964067da655a3092b0ae1db86792835c202424f (diff)
Add Actor life cycle benchmark.
Diffstat (limited to 'benchmark')
-rw-r--r--benchmark/bench_actor.cpp55
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));