Optimize PrimitiveMapper for numeric types#340
Merged
schultek merged 2 commits intoMar 8, 2026
Conversation
…g roundtrips When decoding numeric values (int, double, num), the previous implementation always converted through a string intermediary (e.g. double.parse(v.toString())). This is wasteful when the input is already a num. The optimized mappers now check for num first and use direct conversion (toDouble, round), falling back to string parsing only for non-numeric inputs.
fix formatting
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
PrimitiveMapper<int>,PrimitiveMapper<double>, andPrimitiveMapper<num>inmapper_container.dartto avoid unnecessary string roundtrips when the input is already anum.v.round(),v.toDouble(), identity) instead ofnum.parse(v.toString())ordouble.parse(v.toString()), avoiding an intermediate string allocation.Before
After
Rationale
In typical deserialization from JSON (via
dart:convert), numeric values are alreadyintordouble. The previous code always went through a string roundtrip (v.toString()thenparse), which allocates a temporary string for every numeric field decoded. The optimized version short-circuits this with a type check, which is essentially free in Dart.Test plan
test/primitives/primitives_test.dartpasses (coversfromValue<int>('1'),fromValue<double>('1.1'),fromValue<num>(123), and error cases)test/container/container_test.dartpasses (coversfromValue<int>('2')and list decoding with mixed types like['2', 1.5, 0])