| // Copyright 2013 The Flutter Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "flutter/fml/message_loop_task_queues.h" |
| |
| #include <cassert> |
| #include <string> |
| #include <thread> |
| #include <vector> |
| |
| #include "flutter/benchmarking/benchmarking.h" |
| #include "flutter/fml/synchronization/count_down_latch.h" |
| |
| namespace fml { |
| namespace benchmarking { |
| |
| static void BM_RegisterAndGetTasks(benchmark::State& state) { // NOLINT |
| while (state.KeepRunning()) { |
| auto task_queue = fml::MessageLoopTaskQueues::GetInstance(); |
| |
| const int num_task_queues = 10; |
| const int num_tasks_per_queue = 100; |
| const fml::TimePoint past = fml::TimePoint::Now(); |
| |
| for (int i = 0; i < num_task_queues; i++) { |
| task_queue->CreateTaskQueue(); |
| } |
| |
| std::vector<std::thread> threads; |
| |
| CountDownLatch tasks_registered(num_task_queues); |
| CountDownLatch tasks_done(num_task_queues); |
| |
| threads.reserve(num_task_queues); |
| for (int i = 0; i < num_task_queues; i++) { |
| threads.emplace_back([task_runner_id = i, &task_queue, past, &tasks_done, |
| &tasks_registered]() { |
| for (int j = 0; j < num_tasks_per_queue; j++) { |
| task_queue->RegisterTask(TaskQueueId(task_runner_id), [] {}, past); |
| } |
| tasks_registered.CountDown(); |
| tasks_registered.Wait(); |
| const auto now = fml::TimePoint::Now(); |
| int num_invocations = 0; |
| for (;;) { |
| fml::closure invocation = |
| task_queue->GetNextTaskToRun(TaskQueueId(task_runner_id), now); |
| if (!invocation) { |
| break; |
| } |
| num_invocations++; |
| } |
| assert(num_invocations == num_tasks_per_queue); |
| tasks_done.CountDown(); |
| }); |
| } |
| |
| tasks_done.Wait(); |
| |
| for (auto& thread : threads) { |
| thread.join(); |
| } |
| } |
| } |
| |
| BENCHMARK(BM_RegisterAndGetTasks); |
| |
| } // namespace benchmarking |
| } // namespace fml |