| // 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/benchmarking/benchmarking.h" |
| #include "flutter/common/settings.h" |
| #include "flutter/lib/ui/window/platform_message_response_dart.h" |
| #include "flutter/runtime/dart_vm_lifecycle.h" |
| #include "flutter/shell/common/thread_host.h" |
| #include "flutter/testing/dart_isolate_runner.h" |
| #include "flutter/testing/fixture_test.h" |
| |
| #include <future> |
| |
| namespace flutter { |
| |
| class Fixture : public testing::FixtureTest { |
| void TestBody() override{}; |
| }; |
| |
| static void BM_PlatformMessageResponseDartComplete( |
| benchmark::State& state) { // NOLINT |
| ThreadHost thread_host("test", |
| ThreadHost::Type::Platform | ThreadHost::Type::GPU | |
| ThreadHost::Type::IO | ThreadHost::Type::UI); |
| TaskRunners task_runners("test", thread_host.platform_thread->GetTaskRunner(), |
| thread_host.raster_thread->GetTaskRunner(), |
| thread_host.ui_thread->GetTaskRunner(), |
| thread_host.io_thread->GetTaskRunner()); |
| Fixture fixture; |
| auto settings = fixture.CreateSettingsForFixture(); |
| auto vm_ref = DartVMRef::Create(settings); |
| auto isolate = |
| testing::RunDartCodeInIsolate(vm_ref, settings, task_runners, "main", {}, |
| testing::GetFixturesPath(), {}); |
| |
| while (state.KeepRunning()) { |
| state.PauseTiming(); |
| bool successful = isolate->RunInIsolateScope([&]() -> bool { |
| // Simulate a message of 3 MB |
| std::vector<uint8_t> data(3 << 20, 0); |
| std::unique_ptr<fml::Mapping> mapping = |
| std::make_unique<fml::DataMapping>(data); |
| |
| Dart_Handle library = Dart_RootLibrary(); |
| Dart_Handle closure = |
| Dart_GetField(library, Dart_NewStringFromCString("messageCallback")); |
| |
| auto message = fml::MakeRefCounted<PlatformMessageResponseDart>( |
| tonic::DartPersistentValue(isolate->get(), closure), |
| thread_host.ui_thread->GetTaskRunner()); |
| |
| message->Complete(std::move(mapping)); |
| |
| return true; |
| }); |
| FML_CHECK(successful); |
| state.ResumeTiming(); |
| |
| // We skip timing everything above because the copy triggered by |
| // message->Complete is a task posted on the UI thread. The following wait |
| // for a UI task would let us know when that copy is done. |
| std::promise<bool> completed; |
| task_runners.GetUITaskRunner()->PostTask( |
| [&completed] { completed.set_value(true); }); |
| completed.get_future().wait(); |
| } |
| } |
| |
| BENCHMARK(BM_PlatformMessageResponseDartComplete) |
| ->Unit(benchmark::kMicrosecond); |
| |
| } // namespace flutter |