|  | // 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 |