From 2488042ff411b6ddad9fa65e8bb13c0d13b2d7cf Mon Sep 17 00:00:00 2001 From: David Morgan <davidmorgan@google.com> Date: Tue, 26 Apr 2022 15:53:43 +0200 Subject: [PATCH 1/2] Cache type to raw type name mapping. --- built_value/lib/src/built_json_serializers.dart | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/built_value/lib/src/built_json_serializers.dart b/built_value/lib/src/built_json_serializers.dart index 08b96c4d..2a4bb556 100644 --- a/built_value/lib/src/built_json_serializers.dart +++ b/built_value/lib/src/built_json_serializers.dart @@ -316,8 +316,13 @@ class BuiltJsonSerializersBuilder implements SerializersBuilder { } } +Map<Type, String> _rawNameMap = <Type, String>{}; + String _getRawName(Type? type) { + var maybeResult = _rawNameMap[type]; + if (maybeResult != null) return maybeResult; var name = type.toString(); var genericsStart = name.indexOf('<'); - return genericsStart == -1 ? name : name.substring(0, genericsStart); + var result = genericsStart == -1 ? name : name.substring(0, genericsStart); + return _rawNameMap[type] = result; } From 509a577cec257c85243a736d33c45d9c2e2bce4b Mon Sep 17 00:00:00 2001 From: David Morgan <davidmorgan@google.com> Date: Tue, 26 Apr 2022 16:31:11 +0200 Subject: [PATCH 2/2] Add cache for raw names. --- CHANGELOG.md | 5 +++++ built_value/lib/src/built_json_serializers.dart | 4 +++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 42967e51..57146521 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,10 @@ # Changelog +# 8.3.0 + +- Serialization performance: if `toString` is used to map types, cache the + result to improve performance. + # 8.2.1 - Fix deps: allow `built_value_generator` to use `built_value 8.2.0`. diff --git a/built_value/lib/src/built_json_serializers.dart b/built_value/lib/src/built_json_serializers.dart index 2a4bb556..cadfa0ab 100644 --- a/built_value/lib/src/built_json_serializers.dart +++ b/built_value/lib/src/built_json_serializers.dart @@ -316,7 +316,9 @@ class BuiltJsonSerializersBuilder implements SerializersBuilder { } } -Map<Type, String> _rawNameMap = <Type, String>{}; +/// Raw name uses `toString` which is not particularly fast, so cache the +/// results. +Map<Type?, String> _rawNameMap = <Type?, String>{}; String _getRawName(Type? type) { var maybeResult = _rawNameMap[type];