Unverified Commit 5b6444f3 authored by Yegor's avatar Yegor Committed by GitHub

[web] benchmark and optimize defaultTargetPlatform (#75037)

parent 4ba26191
// 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/foundation.dart';
import 'recorder.dart';
/// Benchmarks the performance of the [defaultTargetPlatform] getter.
///
/// The getter relies on the expensive `window.matchMedia` and if not properly
/// cached can cause performance issues.
class BenchDefaultTargetPlatform extends RawRecorder {
BenchDefaultTargetPlatform() : super(name: benchmarkName);
static const String benchmarkName = 'default_target_platform';
/// A dummy counter just to make sure the compiler doesn't inline the
/// benchmark and make it a no-op.
int counter = 0;
@override
void body(Profile profile) {
profile.record('runtime', () {
for (int i = 0; i < 10000; i++) {
counter += defaultTargetPlatform.index;
}
}, reported: true);
}
}
...@@ -15,6 +15,7 @@ import 'src/web/bench_build_material_checkbox.dart'; ...@@ -15,6 +15,7 @@ import 'src/web/bench_build_material_checkbox.dart';
import 'src/web/bench_card_infinite_scroll.dart'; import 'src/web/bench_card_infinite_scroll.dart';
import 'src/web/bench_child_layers.dart'; import 'src/web/bench_child_layers.dart';
import 'src/web/bench_clipped_out_pictures.dart'; import 'src/web/bench_clipped_out_pictures.dart';
import 'src/web/bench_default_target_platform.dart';
import 'src/web/bench_draw_rect.dart'; import 'src/web/bench_draw_rect.dart';
import 'src/web/bench_dynamic_clip_on_static_picture.dart'; import 'src/web/bench_dynamic_clip_on_static_picture.dart';
import 'src/web/bench_mouse_region_grid_hover.dart'; import 'src/web/bench_mouse_region_grid_hover.dart';
...@@ -37,6 +38,7 @@ const bool isCanvasKit = bool.fromEnvironment('FLUTTER_WEB_USE_SKIA', defaultVal ...@@ -37,6 +38,7 @@ const bool isCanvasKit = bool.fromEnvironment('FLUTTER_WEB_USE_SKIA', defaultVal
/// When adding a new benchmark, add it to this map. Make sure that the name /// When adding a new benchmark, add it to this map. Make sure that the name
/// of your benchmark is unique. /// of your benchmark is unique.
final Map<String, RecorderFactory> benchmarks = <String, RecorderFactory>{ final Map<String, RecorderFactory> benchmarks = <String, RecorderFactory>{
BenchDefaultTargetPlatform.benchmarkName: () => BenchDefaultTargetPlatform(),
BenchBuildImage.benchmarkName: () => BenchBuildImage(), BenchBuildImage.benchmarkName: () => BenchBuildImage(),
BenchCardInfiniteScroll.benchmarkName: () => BenchCardInfiniteScroll.forward(), BenchCardInfiniteScroll.benchmarkName: () => BenchCardInfiniteScroll.forward(),
BenchCardInfiniteScroll.benchmarkNameBackward: () => BenchCardInfiniteScroll.backward(), BenchCardInfiniteScroll.benchmarkNameBackward: () => BenchCardInfiniteScroll.backward(),
......
...@@ -10,13 +10,16 @@ platform.TargetPlatform get defaultTargetPlatform { ...@@ -10,13 +10,16 @@ platform.TargetPlatform get defaultTargetPlatform {
// To get a better guess at the targetPlatform we need to be able to reference // To get a better guess at the targetPlatform we need to be able to reference
// the window, but that won't be available until we fix the platforms // the window, but that won't be available until we fix the platforms
// configuration for Flutter. // configuration for Flutter.
platform.TargetPlatform result = _browserPlatform(); return platform.debugDefaultTargetPlatformOverride ?? _browserPlatform;
if (platform.debugDefaultTargetPlatformOverride != null)
result = platform.debugDefaultTargetPlatformOverride!;
return result;
} }
platform.TargetPlatform _browserPlatform() { // Lazy-initialized and forever cached current browser platform.
//
// Computing the platform is expensive as it uses `window.matchMedia`, which
// needs to parse and evaluate a CSS selector. On some devices this takes up to
// 0.20ms. As `defaultTargetPlatform` is routinely called dozens of times per
// frame this value should be cached.
final platform.TargetPlatform _browserPlatform = () {
final String navigatorPlatform = html.window.navigator.platform?.toLowerCase() ?? ''; final String navigatorPlatform = html.window.navigator.platform?.toLowerCase() ?? '';
if (navigatorPlatform.startsWith('mac')) { if (navigatorPlatform.startsWith('mac')) {
return platform.TargetPlatform.macOS; return platform.TargetPlatform.macOS;
...@@ -41,4 +44,4 @@ platform.TargetPlatform _browserPlatform() { ...@@ -41,4 +44,4 @@ platform.TargetPlatform _browserPlatform() {
return platform.TargetPlatform.linux; return platform.TargetPlatform.linux;
} }
return platform.TargetPlatform.android; return platform.TargetPlatform.android;
} }();
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment