Unverified Commit 1b887c72 authored by Jackson Gardner's avatar Jackson Gardner Committed by GitHub

Skwasm benchmarks. (#129681)

This enables benchmarks for the Skwasm renderer, compiled with
dart2wasm.

Platform views aren't supported in Skwasm yet, so we are skipping those
benchmarks for now.
parent c7511664
...@@ -1093,6 +1093,7 @@ targets: ...@@ -1093,6 +1093,7 @@ targets:
- name: Linux web_benchmarks_html - name: Linux web_benchmarks_html
recipe: devicelab/devicelab_drone recipe: devicelab/devicelab_drone
presubmit: false
timeout: 60 timeout: 60
properties: properties:
dependencies: >- dependencies: >-
...@@ -1108,6 +1109,25 @@ targets: ...@@ -1108,6 +1109,25 @@ targets:
- bin/** - bin/**
- .ci.yaml - .ci.yaml
- name: Linux web_benchmarks_skwasm
bringup: true
recipe: devicelab/devicelab_drone
presubmit: false
timeout: 60
properties:
dependencies: >-
[
{"dependency": "android_sdk", "version": "version:33v6"},
{"dependency": "chrome_and_driver", "version": "version:114.0"}
]
tags: >
["devicelab"]
task_name: web_benchmarks_skwasm
runIf:
- dev/**
- bin/**
- .ci.yaml
- name: Linux web_long_running_tests_1_5 - name: Linux web_long_running_tests_1_5
recipe: flutter/flutter_drone recipe: flutter/flutter_drone
timeout: 60 timeout: 60
......
...@@ -264,6 +264,7 @@ ...@@ -264,6 +264,7 @@
/dev/devicelab/bin/tasks/technical_debt__cost.dart @HansMuller @flutter/framework /dev/devicelab/bin/tasks/technical_debt__cost.dart @HansMuller @flutter/framework
/dev/devicelab/bin/tasks/web_benchmarks_canvaskit.dart @yjbanov @flutter/web /dev/devicelab/bin/tasks/web_benchmarks_canvaskit.dart @yjbanov @flutter/web
/dev/devicelab/bin/tasks/web_benchmarks_html.dart @yjbanov @flutter/web /dev/devicelab/bin/tasks/web_benchmarks_html.dart @yjbanov @flutter/web
/dev/devicelab/bin/tasks/web_benchmarks_skwasm.dart @jacksongardner @flutter/web
/dev/devicelab/bin/tasks/windows_home_scroll_perf__timeline_summary.dart @jonahwilliams @flutter/engine /dev/devicelab/bin/tasks/windows_home_scroll_perf__timeline_summary.dart @jonahwilliams @flutter/engine
/dev/devicelab/bin/tasks/windows_startup_test.dart @loic-sharma @flutter/desktop /dev/devicelab/bin/tasks/windows_startup_test.dart @loic-sharma @flutter/desktop
......
...@@ -130,10 +130,10 @@ class _Tester { ...@@ -130,10 +130,10 @@ class _Tester {
final int frameDurationMs = fullFrameDuration.inMilliseconds; final int frameDurationMs = fullFrameDuration.inMilliseconds;
final int fullFrames = duration.inMilliseconds ~/ frameDurationMs; final int fullFrames = duration.inMilliseconds ~/ frameDurationMs;
final Offset fullFrameOffset = offset * ((frameDurationMs as double) / durationMs); final Offset fullFrameOffset = offset * (frameDurationMs.toDouble() / durationMs);
final Duration finalFrameDuration = duration - fullFrameDuration * fullFrames; final Duration finalFrameDuration = duration - fullFrameDuration * fullFrames;
final Offset finalFrameOffset = offset - fullFrameOffset * (fullFrames as double); final Offset finalFrameOffset = offset - fullFrameOffset * fullFrames.toDouble();
await gesture.down(start, timeStamp: currentTime); await gesture.down(start, timeStamp: currentTime);
......
...@@ -36,6 +36,7 @@ import 'src/web/recorder.dart'; ...@@ -36,6 +36,7 @@ import 'src/web/recorder.dart';
typedef RecorderFactory = Recorder Function(); typedef RecorderFactory = Recorder Function();
const bool isCanvasKit = bool.fromEnvironment('FLUTTER_WEB_USE_SKIA'); const bool isCanvasKit = bool.fromEnvironment('FLUTTER_WEB_USE_SKIA');
const bool isSkwasm = bool.fromEnvironment('FLUTTER_WEB_USE_SKWASM');
/// List of all benchmarks that run in the devicelab. /// List of all benchmarks that run in the devicelab.
/// ///
...@@ -62,14 +63,18 @@ final Map<String, RecorderFactory> benchmarks = <String, RecorderFactory>{ ...@@ -62,14 +63,18 @@ final Map<String, RecorderFactory> benchmarks = <String, RecorderFactory>{
BenchMouseRegionGridHover.benchmarkName: () => BenchMouseRegionGridHover(), BenchMouseRegionGridHover.benchmarkName: () => BenchMouseRegionGridHover(),
BenchMouseRegionMixedGridHover.benchmarkName: () => BenchMouseRegionMixedGridHover(), BenchMouseRegionMixedGridHover.benchmarkName: () => BenchMouseRegionMixedGridHover(),
BenchWrapBoxScroll.benchmarkName: () => BenchWrapBoxScroll(), BenchWrapBoxScroll.benchmarkName: () => BenchWrapBoxScroll(),
if (!isSkwasm) ...<String, RecorderFactory>{
// Platform views are not yet supported with Skwasm.
// https://github.com/flutter/flutter/issues/126346
BenchPlatformViewInfiniteScroll.benchmarkName: () => BenchPlatformViewInfiniteScroll.forward(), BenchPlatformViewInfiniteScroll.benchmarkName: () => BenchPlatformViewInfiniteScroll.forward(),
BenchPlatformViewInfiniteScroll.benchmarkNameBackward: () => BenchPlatformViewInfiniteScroll.backward(), BenchPlatformViewInfiniteScroll.benchmarkNameBackward: () => BenchPlatformViewInfiniteScroll.backward(),
},
BenchMaterial3Components.benchmarkName: () => BenchMaterial3Components(), BenchMaterial3Components.benchmarkName: () => BenchMaterial3Components(),
BenchMaterial3Semantics.benchmarkName: () => BenchMaterial3Semantics(), BenchMaterial3Semantics.benchmarkName: () => BenchMaterial3Semantics(),
BenchMaterial3ScrollSemantics.benchmarkName: () => BenchMaterial3ScrollSemantics(), BenchMaterial3ScrollSemantics.benchmarkName: () => BenchMaterial3ScrollSemantics(),
// CanvasKit-only benchmarks // Skia-only benchmarks
if (isCanvasKit) ...<String, RecorderFactory>{ if (isCanvasKit || isSkwasm) ...<String, RecorderFactory>{
BenchTextLayout.canvasKitBenchmarkName: () => BenchTextLayout.canvasKit(), BenchTextLayout.canvasKitBenchmarkName: () => BenchTextLayout.canvasKit(),
BenchBuildColorsGrid.canvasKitBenchmarkName: () => BenchBuildColorsGrid.canvasKit(), BenchBuildColorsGrid.canvasKitBenchmarkName: () => BenchBuildColorsGrid.canvasKit(),
BenchTextCachedLayout.canvasKitBenchmarkName: () => BenchTextCachedLayout.canvasKit(), BenchTextCachedLayout.canvasKitBenchmarkName: () => BenchTextCachedLayout.canvasKit(),
...@@ -81,7 +86,7 @@ final Map<String, RecorderFactory> benchmarks = <String, RecorderFactory>{ ...@@ -81,7 +86,7 @@ final Map<String, RecorderFactory> benchmarks = <String, RecorderFactory>{
}, },
// HTML-only benchmarks // HTML-only benchmarks
if (!isCanvasKit) ...<String, RecorderFactory>{ if (!isCanvasKit && !isSkwasm) ...<String, RecorderFactory>{
BenchTextLayout.canvasBenchmarkName: () => BenchTextLayout.canvas(), BenchTextLayout.canvasBenchmarkName: () => BenchTextLayout.canvas(),
BenchTextCachedLayout.canvasBenchmarkName: () => BenchTextCachedLayout.canvas(), BenchTextCachedLayout.canvasBenchmarkName: () => BenchTextCachedLayout.canvas(),
BenchBuildColorsGrid.canvasBenchmarkName: () => BenchBuildColorsGrid.canvas(), BenchBuildColorsGrid.canvasBenchmarkName: () => BenchBuildColorsGrid.canvas(),
......
...@@ -8,6 +8,9 @@ import 'package:flutter_devicelab/tasks/web_benchmarks.dart'; ...@@ -8,6 +8,9 @@ import 'package:flutter_devicelab/tasks/web_benchmarks.dart';
/// Runs all Web benchmarks using the CanvasKit rendering backend. /// Runs all Web benchmarks using the CanvasKit rendering backend.
Future<void> main() async { Future<void> main() async {
await task(() async { await task(() async {
return runWebBenchmark(useCanvasKit: true); return runWebBenchmark((
webRenderer: 'canvaskit',
useWasm: false
));
}); });
} }
...@@ -8,6 +8,9 @@ import 'package:flutter_devicelab/tasks/web_benchmarks.dart'; ...@@ -8,6 +8,9 @@ import 'package:flutter_devicelab/tasks/web_benchmarks.dart';
/// Runs all Web benchmarks using the HTML rendering backend. /// Runs all Web benchmarks using the HTML rendering backend.
Future<void> main() async { Future<void> main() async {
await task(() async { await task(() async {
return runWebBenchmark(useCanvasKit: false); return runWebBenchmark((
webRenderer: 'html',
useWasm: false
));
}); });
} }
// 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_devicelab/framework/framework.dart';
import 'package:flutter_devicelab/tasks/web_benchmarks.dart';
/// Runs all Web benchmarks using the Skwasm rendering backend.
Future<void> main() async {
await task(() async {
return runWebBenchmark((
webRenderer: 'skwasm',
useWasm: true
));
});
}
...@@ -25,6 +25,7 @@ class ChromeOptions { ...@@ -25,6 +25,7 @@ class ChromeOptions {
this.windowHeight = 1024, this.windowHeight = 1024,
this.headless, this.headless,
this.debugPort, this.debugPort,
this.enableWasmGC = false,
}); });
/// If not null passed as `--user-data-dir`. /// If not null passed as `--user-data-dir`.
...@@ -53,6 +54,9 @@ class ChromeOptions { ...@@ -53,6 +54,9 @@ class ChromeOptions {
/// mode without a debug port, Chrome quits immediately. For most tests it is /// mode without a debug port, Chrome quits immediately. For most tests it is
/// typical to set [headless] to true and set a non-null debug port. /// typical to set [headless] to true and set a non-null debug port.
final int? debugPort; final int? debugPort;
/// Whether to enable experimental WasmGC flags
final bool enableWasmGC;
} }
/// A function called when the Chrome process encounters an error. /// A function called when the Chrome process encounters an error.
...@@ -104,6 +108,8 @@ class Chrome { ...@@ -104,6 +108,8 @@ class Chrome {
'--no-default-browser-check', '--no-default-browser-check',
'--disable-default-apps', '--disable-default-apps',
'--disable-translate', '--disable-translate',
if (options.enableWasmGC)
'--js-flags=--experimental-wasm-gc',
]; ];
final io.Process chromeProcess = await _spawnChromiumProcess( final io.Process chromeProcess = await _spawnChromiumProcess(
......
...@@ -20,7 +20,12 @@ import '../framework/utils.dart'; ...@@ -20,7 +20,12 @@ import '../framework/utils.dart';
const int benchmarkServerPort = 9999; const int benchmarkServerPort = 9999;
const int chromeDebugPort = 10000; const int chromeDebugPort = 10000;
Future<TaskResult> runWebBenchmark({ required bool useCanvasKit }) async { typedef WebBenchmarkOptions = ({
String webRenderer,
bool useWasm,
});
Future<TaskResult> runWebBenchmark(WebBenchmarkOptions benchmarkOptions) async {
// Reduce logging level. Otherwise, package:webkit_inspection_protocol is way too spammy. // Reduce logging level. Otherwise, package:webkit_inspection_protocol is way too spammy.
Logger.root.level = Level.INFO; Logger.root.level = Level.INFO;
final String macrobenchmarksDirectory = path.join(flutterDirectory.path, 'dev', 'benchmarks', 'macrobenchmarks'); final String macrobenchmarksDirectory = path.join(flutterDirectory.path, 'dev', 'benchmarks', 'macrobenchmarks');
...@@ -28,8 +33,12 @@ Future<TaskResult> runWebBenchmark({ required bool useCanvasKit }) async { ...@@ -28,8 +33,12 @@ Future<TaskResult> runWebBenchmark({ required bool useCanvasKit }) async {
await flutter('clean'); await flutter('clean');
await evalFlutter('build', options: <String>[ await evalFlutter('build', options: <String>[
'web', 'web',
if (benchmarkOptions.useWasm) ...<String>[
'--wasm',
'--wasm-opt=debug',
],
'--dart-define=FLUTTER_WEB_ENABLE_PROFILING=true', '--dart-define=FLUTTER_WEB_ENABLE_PROFILING=true',
'--web-renderer=${useCanvasKit ? 'canvaskit' : 'html'}', '--web-renderer=${benchmarkOptions.webRenderer}',
'--profile', '--profile',
'--no-web-resources-cdn', '--no-web-resources-cdn',
'-t', '-t',
...@@ -115,7 +124,7 @@ Future<TaskResult> runWebBenchmark({ required bool useCanvasKit }) async { ...@@ -115,7 +124,7 @@ Future<TaskResult> runWebBenchmark({ required bool useCanvasKit }) async {
return Response.internalServerError(body: '$error'); return Response.internalServerError(body: '$error');
} }
}).add(createBuildDirectoryHandler( }).add(createBuildDirectoryHandler(
path.join(macrobenchmarksDirectory, 'build', 'web'), path.join(macrobenchmarksDirectory, 'build', benchmarkOptions.useWasm ? 'web_wasm' : 'web'),
)); ));
server = await io.HttpServer.bind('localhost', benchmarkServerPort); server = await io.HttpServer.bind('localhost', benchmarkServerPort);
...@@ -137,6 +146,7 @@ Future<TaskResult> runWebBenchmark({ required bool useCanvasKit }) async { ...@@ -137,6 +146,7 @@ Future<TaskResult> runWebBenchmark({ required bool useCanvasKit }) async {
userDataDirectory: userDataDir, userDataDirectory: userDataDir,
headless: isUncalibratedSmokeTest, headless: isUncalibratedSmokeTest,
debugPort: chromeDebugPort, debugPort: chromeDebugPort,
enableWasmGC: benchmarkOptions.useWasm,
); );
print('Launching Chrome.'); print('Launching Chrome.');
...@@ -149,7 +159,6 @@ Future<TaskResult> runWebBenchmark({ required bool useCanvasKit }) async { ...@@ -149,7 +159,6 @@ Future<TaskResult> runWebBenchmark({ required bool useCanvasKit }) async {
); );
print('Waiting for the benchmark to report benchmark profile.'); print('Waiting for the benchmark to report benchmark profile.');
final String backend = useCanvasKit ? 'canvaskit' : 'html';
final Map<String, dynamic> taskResult = <String, dynamic>{}; final Map<String, dynamic> taskResult = <String, dynamic>{};
final List<String> benchmarkScoreKeys = <String>[]; final List<String> benchmarkScoreKeys = <String>[];
final List<Map<String, dynamic>> profiles = await profileData.future; final List<Map<String, dynamic>> profiles = await profileData.future;
...@@ -161,7 +170,7 @@ Future<TaskResult> runWebBenchmark({ required bool useCanvasKit }) async { ...@@ -161,7 +170,7 @@ Future<TaskResult> runWebBenchmark({ required bool useCanvasKit }) async {
throw 'Benchmark name is empty'; throw 'Benchmark name is empty';
} }
final String namespace = '$benchmarkName.$backend'; final String namespace = '$benchmarkName.${benchmarkOptions.webRenderer}';
final List<String> scoreKeys = List<String>.from(profile['scoreKeys'] as List<dynamic>); final List<String> scoreKeys = List<String>.from(profile['scoreKeys'] as List<dynamic>);
if (scoreKeys.isEmpty) { if (scoreKeys.isEmpty) {
throw 'No score keys in benchmark "$benchmarkName"'; throw 'No score keys in benchmark "$benchmarkName"';
......
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