From 42e85c645a0ac40bfa8bf5bb86c8c7fa5a0eaed8 Mon Sep 17 00:00:00 2001 From: Kenzie Schmoll Date: Thu, 7 Dec 2023 17:52:57 -0800 Subject: [PATCH 1/3] Add `parse` constructors for the `BenchmarkResults` and `BenchmarkScore` classes --- packages/web_benchmarks/CHANGELOG.md | 4 ++ .../lib/src/benchmark_result.dart | 36 +++++++++---- packages/web_benchmarks/pubspec.yaml | 2 +- .../test/src/benchmark_result_test.dart | 52 +++++++++++++++++++ 4 files changed, 84 insertions(+), 10 deletions(-) create mode 100644 packages/web_benchmarks/test/src/benchmark_result_test.dart diff --git a/packages/web_benchmarks/CHANGELOG.md b/packages/web_benchmarks/CHANGELOG.md index b70677fb31b1..0b91ed7b4e8d 100644 --- a/packages/web_benchmarks/CHANGELOG.md +++ b/packages/web_benchmarks/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.0+1 + +* Adds `parse` constructors for the `BenchmarkResults` and `BenchmarkScore` classes. + ## 1.0.0 * **Breaking change:** replace the `useCanvasKit` parameter in the `serveWebBenchmark` diff --git a/packages/web_benchmarks/lib/src/benchmark_result.dart b/packages/web_benchmarks/lib/src/benchmark_result.dart index 125bc2cd4ec9..ed65590baa47 100644 --- a/packages/web_benchmarks/lib/src/benchmark_result.dart +++ b/packages/web_benchmarks/lib/src/benchmark_result.dart @@ -12,6 +12,16 @@ class BenchmarkScore { required this.value, }); + /// Deserializes a JSON object to create a [BenchmarkScore] object. + factory BenchmarkScore.parse(Map json) { + final String metric = json[_metricKey]! as String; + final double value = (json[_valueKey]! as num).toDouble(); + return BenchmarkScore(metric: metric, value: value); + } + + static const String _metricKey = 'metric'; + static const String _valueKey = 'value'; + /// The name of the metric that this score is categorized under. /// /// Scores collected over time under the same name can be visualized as a @@ -24,8 +34,8 @@ class BenchmarkScore { /// Serializes the benchmark metric to a JSON object. Map toJson() { return { - 'metric': metric, - 'value': value, + _metricKey: metric, + _valueKey: value, }; } } @@ -35,6 +45,20 @@ class BenchmarkResults { /// Constructs a result containing scores from a single run benchmark run. BenchmarkResults(this.scores); + /// Deserializes a JSON object to create a [BenchmarkResults] object. + factory BenchmarkResults.parse(Map json) { + final Map> results = + >{}; + for (final String key in json.keys) { + final List scores = (json[key]! as List) + .cast>() + .map((Map s) => BenchmarkScore.parse(s)) + .toList(); + results[key] = scores; + } + return BenchmarkResults(results); + } + /// Scores collected in a benchmark run. final Map> scores; @@ -44,13 +68,7 @@ class BenchmarkResults { (String benchmarkName, List scores) { return MapEntry>>( benchmarkName, - scores - .map>( - (BenchmarkScore score) => { - 'metric': score.metric, - 'value': score.value, - }) - .toList(), + scores.map((BenchmarkScore score) => score.toJson()).toList(), ); }); } diff --git a/packages/web_benchmarks/pubspec.yaml b/packages/web_benchmarks/pubspec.yaml index c0222abe91c3..e0b94d1e88cb 100644 --- a/packages/web_benchmarks/pubspec.yaml +++ b/packages/web_benchmarks/pubspec.yaml @@ -2,7 +2,7 @@ name: web_benchmarks description: A benchmark harness for performance-testing Flutter apps in Chrome. repository: https://github.com/flutter/packages/tree/main/packages/web_benchmarks issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+web_benchmarks%22 -version: 1.0.0 +version: 1.0.0+1 environment: sdk: ">=3.2.0 <4.0.0" diff --git a/packages/web_benchmarks/test/src/benchmark_result_test.dart b/packages/web_benchmarks/test/src/benchmark_result_test.dart new file mode 100644 index 000000000000..4af7e4890eb8 --- /dev/null +++ b/packages/web_benchmarks/test/src/benchmark_result_test.dart @@ -0,0 +1,52 @@ +// 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. + +import 'package:flutter_test/flutter_test.dart'; +import 'package:web_benchmarks/server.dart'; + +void main() { + group('can serialize and deserialize', () { + test('$BenchmarkResults', () { + final Map data = { + 'foo': >[ + {'metric': 'foo.bar', 'value': 12.34}, + {'metric': 'foo.baz', 'value': 10}, + ], + 'bar': >[ + {'metric': 'bar.foo', 'value': 1.23}, + ] + }; + + final BenchmarkResults benchmarkResults = BenchmarkResults.parse(data); + expect(benchmarkResults.scores.length, 2); + final List fooBenchmarks = + benchmarkResults.scores['foo']!; + final List barBenchmarks = + benchmarkResults.scores['bar']!; + expect(fooBenchmarks.length, 2); + expect(fooBenchmarks[0].metric, 'foo.bar'); + expect(fooBenchmarks[0].value, 12.34); + expect(fooBenchmarks[1].metric, 'foo.baz'); + expect(fooBenchmarks[1].value, 10); + expect(barBenchmarks.length, 1); + expect(barBenchmarks[0].metric, 'bar.foo'); + expect(barBenchmarks[0].value, 1.23); + + expect(benchmarkResults.toJson(), data); + }); + + test('$BenchmarkScore', () { + final Map data = { + 'metric': 'foo', + 'value': 1.234 + }; + + final BenchmarkScore score = BenchmarkScore.parse(data); + expect(score.metric, 'foo'); + expect(score.value, 1.234); + + expect(score.toJson(), data); + }); + }); +} From 91bf5aba798bf8a6888197d9fb96ad8ff2933d05 Mon Sep 17 00:00:00 2001 From: Kenzie Schmoll Date: Thu, 7 Dec 2023 18:17:02 -0800 Subject: [PATCH 2/3] fix version --- packages/web_benchmarks/CHANGELOG.md | 2 +- packages/web_benchmarks/pubspec.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/web_benchmarks/CHANGELOG.md b/packages/web_benchmarks/CHANGELOG.md index 0b91ed7b4e8d..cb26fd04c5f9 100644 --- a/packages/web_benchmarks/CHANGELOG.md +++ b/packages/web_benchmarks/CHANGELOG.md @@ -1,4 +1,4 @@ -## 1.0.0+1 +## 1.0.1 * Adds `parse` constructors for the `BenchmarkResults` and `BenchmarkScore` classes. diff --git a/packages/web_benchmarks/pubspec.yaml b/packages/web_benchmarks/pubspec.yaml index e0b94d1e88cb..7c090ca62add 100644 --- a/packages/web_benchmarks/pubspec.yaml +++ b/packages/web_benchmarks/pubspec.yaml @@ -2,7 +2,7 @@ name: web_benchmarks description: A benchmark harness for performance-testing Flutter apps in Chrome. repository: https://github.com/flutter/packages/tree/main/packages/web_benchmarks issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+web_benchmarks%22 -version: 1.0.0+1 +version: 1.0.1 environment: sdk: ">=3.2.0 <4.0.0" From c50a1cc17c70906daf90459ee59e9ffb2fd27770 Mon Sep 17 00:00:00 2001 From: Kenzie Schmoll Date: Fri, 8 Dec 2023 10:43:16 -0800 Subject: [PATCH 3/3] review comments --- .../web_benchmarks/lib/src/benchmark_result.dart | 16 ++++++++-------- .../test/src/benchmark_result_test.dart | 14 +++++++------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/packages/web_benchmarks/lib/src/benchmark_result.dart b/packages/web_benchmarks/lib/src/benchmark_result.dart index ed65590baa47..445dc9394895 100644 --- a/packages/web_benchmarks/lib/src/benchmark_result.dart +++ b/packages/web_benchmarks/lib/src/benchmark_result.dart @@ -13,7 +13,7 @@ class BenchmarkScore { }); /// Deserializes a JSON object to create a [BenchmarkScore] object. - factory BenchmarkScore.parse(Map json) { + factory BenchmarkScore.parse(Map json) { final String metric = json[_metricKey]! as String; final double value = (json[_valueKey]! as num).toDouble(); return BenchmarkScore(metric: metric, value: value); @@ -32,8 +32,8 @@ class BenchmarkScore { final num value; /// Serializes the benchmark metric to a JSON object. - Map toJson() { - return { + Map toJson() { + return { _metricKey: metric, _valueKey: value, }; @@ -46,13 +46,13 @@ class BenchmarkResults { BenchmarkResults(this.scores); /// Deserializes a JSON object to create a [BenchmarkResults] object. - factory BenchmarkResults.parse(Map json) { + factory BenchmarkResults.parse(Map json) { final Map> results = >{}; for (final String key in json.keys) { final List scores = (json[key]! as List) .cast>() - .map((Map s) => BenchmarkScore.parse(s)) + .map(BenchmarkScore.parse) .toList(); results[key] = scores; } @@ -63,10 +63,10 @@ class BenchmarkResults { final Map> scores; /// Serializes benchmark metrics to JSON. - Map>> toJson() { - return scores.map>>( + Map>> toJson() { + return scores.map>>( (String benchmarkName, List scores) { - return MapEntry>>( + return MapEntry>>( benchmarkName, scores.map((BenchmarkScore score) => score.toJson()).toList(), ); diff --git a/packages/web_benchmarks/test/src/benchmark_result_test.dart b/packages/web_benchmarks/test/src/benchmark_result_test.dart index 4af7e4890eb8..18765d006468 100644 --- a/packages/web_benchmarks/test/src/benchmark_result_test.dart +++ b/packages/web_benchmarks/test/src/benchmark_result_test.dart @@ -8,13 +8,13 @@ import 'package:web_benchmarks/server.dart'; void main() { group('can serialize and deserialize', () { test('$BenchmarkResults', () { - final Map data = { - 'foo': >[ - {'metric': 'foo.bar', 'value': 12.34}, - {'metric': 'foo.baz', 'value': 10}, + final Map data = { + 'foo': >[ + {'metric': 'foo.bar', 'value': 12.34}, + {'metric': 'foo.baz', 'value': 10}, ], - 'bar': >[ - {'metric': 'bar.foo', 'value': 1.23}, + 'bar': >[ + {'metric': 'bar.foo', 'value': 1.23}, ] }; @@ -37,7 +37,7 @@ void main() { }); test('$BenchmarkScore', () { - final Map data = { + final Map data = { 'metric': 'foo', 'value': 1.234 };