From 8270872f865f49cd7c869e7a073adea9a50fca1e Mon Sep 17 00:00:00 2001 From: LongCatIsLooong <31859944+LongCatIsLooong@users.noreply.github.com> Date: Tue, 12 Mar 2024 17:52:24 -0700 Subject: [PATCH] Reland "Add a microbenchmark for text intrinsic height layout (#145007)" (#145037) Add the missing `Directionality` widget and `await test.pump()` call: commit: https://github.com/flutter/flutter/commit/0fd7712fa72449d35b73d108884b5aeb97b3298a Without the `pump` 1s, it sometimes schedules multiple `handleBeginFrame`s and `handleDrawFrame`s. --- .../lib/layout/text_intrinsic_bench.dart | 67 +++++++++++++++++++ dev/devicelab/lib/tasks/microbenchmarks.dart | 1 + 2 files changed, 68 insertions(+) create mode 100644 dev/benchmarks/microbenchmarks/lib/layout/text_intrinsic_bench.dart diff --git a/dev/benchmarks/microbenchmarks/lib/layout/text_intrinsic_bench.dart b/dev/benchmarks/microbenchmarks/lib/layout/text_intrinsic_bench.dart new file mode 100644 index 0000000000..95da4a18fd --- /dev/null +++ b/dev/benchmarks/microbenchmarks/lib/layout/text_intrinsic_bench.dart @@ -0,0 +1,67 @@ +// Copyright 2014 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. + +import 'package:flutter/material.dart'; +import 'package:flutter/rendering.dart'; +import 'package:flutter_test/flutter_test.dart'; + +import '../common.dart'; + +const Duration kBenchmarkTime = Duration(seconds: 15); + +// Use an Align to loosen the constraints. +final Widget intrinsicTextHeight = Directionality( + textDirection: TextDirection.ltr, + child: Align( + child: IntrinsicHeight( + child: Text('A' * 100), + ), + ), +); + +Future main() async { + assert(false, "Don't run benchmarks in debug mode! Use 'flutter run --release'."); + + // We control the framePolicy below to prevent us from scheduling frames in + // the engine, so that the engine does not interfere with our timings. + final LiveTestWidgetsFlutterBinding binding = TestWidgetsFlutterBinding.ensureInitialized() as LiveTestWidgetsFlutterBinding; + + final Stopwatch watch = Stopwatch(); + int iterations = 0; + + await benchmarkWidgets((WidgetTester tester) async { + runApp(intrinsicTextHeight); + // Wait for the UI to stabilize. + await tester.pump(const Duration(seconds: 1)); + + final TestViewConfiguration big = TestViewConfiguration.fromView( + size: const Size(360.0, 640.0), + view: tester.view, + ); + final TestViewConfiguration small = TestViewConfiguration.fromView( + size: const Size(100.0, 640.0), + view: tester.view, + ); + final RenderView renderView = WidgetsBinding.instance.renderViews.single; + binding.framePolicy = LiveTestWidgetsFlutterBindingFramePolicy.benchmark; + + watch.start(); + while (watch.elapsed < kBenchmarkTime) { + renderView.configuration = iterations.isEven ? big : small; + await tester.pumpBenchmark(Duration(milliseconds: iterations * 16)); + iterations += 1; + } + watch.stop(); + }); + + + final BenchmarkResultPrinter printer = BenchmarkResultPrinter(); + printer.addResult( + description: 'Text intrinsic height', + value: watch.elapsedMicroseconds / iterations, + unit: 'µs per iteration', + name: 'text_intrinsic_height_iteration', + ); + printer.printToStdout(); +} diff --git a/dev/devicelab/lib/tasks/microbenchmarks.dart b/dev/devicelab/lib/tasks/microbenchmarks.dart index 6bd01aac1d..8b7a659a34 100644 --- a/dev/devicelab/lib/tasks/microbenchmarks.dart +++ b/dev/devicelab/lib/tasks/microbenchmarks.dart @@ -74,6 +74,7 @@ TaskFunction createMicrobenchmarkTask({ ...await runMicrobench('lib/stocks/build_bench.dart'), ...await runMicrobench('lib/stocks/layout_bench.dart'), ...await runMicrobench('lib/ui/image_bench.dart'), + ...await runMicrobench('lib/layout/text_intrinsic_bench.dart'), }; return TaskResult.success(allResults,