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];