-
Notifications
You must be signed in to change notification settings - Fork 61
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Treat map keys matching the same struct field as duplicates. #492
Merged
fxamacker
merged 2 commits into
fxamacker:master
from
benluddy:dupmapkey-same-struct-field
Feb 19, 2024
Merged
Treat map keys matching the same struct field as duplicates. #492
fxamacker
merged 2 commits into
fxamacker:master
from
benluddy:dupmapkey-same-struct-field
Feb 19, 2024
Commits on Feb 14, 2024
-
Add more tests and benchmarks for unknown and duplicate fields.
Signed-off-by: Ben Luddy <bluddy@redhat.com>
Configuration menu - View commit details
-
Copy full SHA for cd8b95e - Browse repository at this point
Copy the full SHA cd8b95eView commit details -
Treat map keys matching the same struct field as duplicates.
This resolves the case where two map keys could match the same struct field without being treated as duplicate map keys. The DupMapKey documentation has been updated accordingly. A map key that matches a previously-matched field will no longer quietly fall back to a case-insensitive match and is now always treated as a duplicate key. Case-sensitive matching of map key to struct field name is now a map lookup to improve the quadratic worst-case: │ manykeys-before.txt │ manykeys-after.txt │ │ sec/op │ sec/op vs base │ UnmarshalMapToStruct/default_options/many_fields_one_key_per_field 24.137µ ± 4% 5.240µ ± 1% -78.29% (p=0.000 n=10) │ manykeys-before.txt │ manykeys-after.txt │ │ B/op │ B/op vs base │ UnmarshalMapToStruct/default_options/many_fields_one_key_per_field 112.0 ± 0% 0.0 ± 0% -100.00% (p=0.000 n=10) │ manykeys-before.txt │ manykeys-after.txt │ │ allocs/op │ allocs/op vs base │ UnmarshalMapToStruct/default_options/many_fields_one_key_per_field 1.000 ± 0% 0.000 ± 0% -100.00% (p=0.000 n=10) This fix cleared the way to optimize the way duplicate keys are tracked, especially for inputs that contain no unknown fields: │ before.txt │ after.txt │ │ sec/op │ sec/op vs base │ UnmarshalMapToStruct/default_options/all_known_fields 642.7n ± 3% 735.4n ± 0% +14.42% (p=0.000 n=10) UnmarshalMapToStruct/default_options/all_known_duplicate_fields 1611.5n ± 1% 521.1n ± 1% -67.66% (p=0.000 n=10) UnmarshalMapToStruct/default_options/all_unknown_fields 1.731µ ± 3% 1.174µ ± 0% -32.18% (p=0.000 n=10) UnmarshalMapToStruct/default_options/all_unknown_duplicate_fields 1.726µ ± 2% 1.076µ ± 0% -37.66% (p=0.000 n=10) UnmarshalMapToStruct/reject_unknown/all_known_fields 638.3n ± 1% 725.5n ± 1% +13.66% (p=0.000 n=10) UnmarshalMapToStruct/reject_unknown/all_known_duplicate_fields 476.1n ± 1% 514.7n ± 0% +8.11% (p=0.000 n=10) UnmarshalMapToStruct/reject_unknown/all_unknown_fields 448.1n ± 1% 398.8n ± 1% -11.00% (p=0.000 n=10) UnmarshalMapToStruct/reject_unknown/all_unknown_duplicate_fields 447.9n ± 0% 399.9n ± 1% -10.71% (p=0.000 n=10) UnmarshalMapToStruct/reject_duplicate/all_known_fields 1825.5n ± 0% 726.0n ± 0% -60.23% (p=0.000 n=10) UnmarshalMapToStruct/reject_duplicate/all_known_duplicate_fields 744.3n ± 0% 440.8n ± 0% -40.78% (p=0.000 n=10) UnmarshalMapToStruct/reject_duplicate/all_unknown_fields 2.885µ ± 1% 3.329µ ± 0% +15.37% (p=0.000 n=10) UnmarshalMapToStruct/reject_duplicate/all_unknown_duplicate_fields 844.8n ± 0% 738.7n ± 1% -12.56% (p=0.000 n=10) UnmarshalMapToStruct/reject_unknown_and_duplicate/all_known_fields 1828.5n ± 0% 723.4n ± 0% -60.44% (p=0.000 n=10) UnmarshalMapToStruct/reject_unknown_and_duplicate/all_known_duplicate_fields 744.3n ± 0% 436.4n ± 0% -41.36% (p=0.000 n=10) UnmarshalMapToStruct/reject_unknown_and_duplicate/all_unknown_fields 643.4n ± 0% 435.3n ± 0% -32.34% (p=0.000 n=10) UnmarshalMapToStruct/reject_unknown_and_duplicate/all_unknown_duplicate_fields 642.1n ± 0% 435.6n ± 1% -32.15% (p=0.000 n=10) geomean 936.7n 748.3n -29.34% │ before.txt │ after.txt │ │ B/op │ B/op vs base │ UnmarshalMapToStruct/default_options/all_known_fields 16.00 ± 0% 0.00 ± 0% -100.00% (p=0.000 n=10) UnmarshalMapToStruct/default_options/all_known_duplicate_fields 16.00 ± 0% 0.00 ± 0% -100.00% (p=0.000 n=10) UnmarshalMapToStruct/default_options/all_unknown_fields 16.00 ± 0% 0.00 ± 0% -100.00% (p=0.000 n=10) UnmarshalMapToStruct/default_options/all_unknown_duplicate_fields 16.00 ± 0% 0.00 ± 0% -100.00% (p=0.000 n=10) UnmarshalMapToStruct/reject_unknown/all_known_fields 16.00 ± 0% 0.00 ± 0% -100.00% (p=0.000 n=10) UnmarshalMapToStruct/reject_unknown/all_known_duplicate_fields 24.00 ± 0% 0.00 ± 0% -100.00% (p=0.000 n=10) UnmarshalMapToStruct/reject_unknown/all_unknown_fields 24.000 ± 0% 8.000 ± 0% -66.67% (p=0.000 n=10) UnmarshalMapToStruct/reject_unknown/all_unknown_duplicate_fields 24.000 ± 0% 8.000 ± 0% -66.67% (p=0.000 n=10) UnmarshalMapToStruct/reject_duplicate/all_known_fields 800.0 ± 0% 0.0 ± 0% -100.00% (p=0.000 n=10) UnmarshalMapToStruct/reject_duplicate/all_known_duplicate_fields 648.00 ± 0% 40.00 ± 0% -93.83% (p=0.000 n=10) UnmarshalMapToStruct/reject_duplicate/all_unknown_fields 800.0 ± 0% 1285.0 ± 0% +60.62% (p=0.000 n=10) UnmarshalMapToStruct/reject_duplicate/all_unknown_duplicate_fields 648.0 ± 0% 248.0 ± 0% -61.73% (p=0.000 n=10) UnmarshalMapToStruct/reject_unknown_and_duplicate/all_known_fields 800.0 ± 0% 0.0 ± 0% -100.00% (p=0.000 n=10) UnmarshalMapToStruct/reject_unknown_and_duplicate/all_known_duplicate_fields 648.00 ± 0% 40.00 ± 0% -93.83% (p=0.000 n=10) UnmarshalMapToStruct/reject_unknown_and_duplicate/all_unknown_fields 616.00 ± 0% 24.00 ± 0% -96.10% (p=0.000 n=10) UnmarshalMapToStruct/reject_unknown_and_duplicate/all_unknown_duplicate_fields 616.00 ± 0% 24.00 ± 0% -96.10% (p=0.000 n=10) geomean 113.6 ? ¹ ² ¹ summaries must be >0 to compute geomean ² ratios must be >0 to compute geomean │ before.txt │ after.txt │ │ allocs/op │ allocs/op vs base │ UnmarshalMapToStruct/default_options/all_known_fields 1.000 ± 0% 0.000 ± 0% -100.00% (p=0.000 n=10) UnmarshalMapToStruct/default_options/all_known_duplicate_fields 1.000 ± 0% 0.000 ± 0% -100.00% (p=0.000 n=10) UnmarshalMapToStruct/default_options/all_unknown_fields 1.000 ± 0% 0.000 ± 0% -100.00% (p=0.000 n=10) UnmarshalMapToStruct/default_options/all_unknown_duplicate_fields 1.000 ± 0% 0.000 ± 0% -100.00% (p=0.000 n=10) UnmarshalMapToStruct/reject_unknown/all_known_fields 1.000 ± 0% 0.000 ± 0% -100.00% (p=0.000 n=10) UnmarshalMapToStruct/reject_unknown/all_known_duplicate_fields 2.000 ± 0% 0.000 ± 0% -100.00% (p=0.000 n=10) UnmarshalMapToStruct/reject_unknown/all_unknown_fields 2.000 ± 0% 1.000 ± 0% -50.00% (p=0.000 n=10) UnmarshalMapToStruct/reject_unknown/all_unknown_duplicate_fields 2.000 ± 0% 1.000 ± 0% -50.00% (p=0.000 n=10) UnmarshalMapToStruct/reject_duplicate/all_known_fields 15.00 ± 0% 0.00 ± 0% -100.00% (p=0.000 n=10) UnmarshalMapToStruct/reject_duplicate/all_known_duplicate_fields 5.000 ± 0% 2.000 ± 0% -60.00% (p=0.000 n=10) UnmarshalMapToStruct/reject_duplicate/all_unknown_fields 15.00 ± 0% 17.00 ± 0% +13.33% (p=0.000 n=10) UnmarshalMapToStruct/reject_duplicate/all_unknown_duplicate_fields 5.000 ± 0% 5.000 ± 0% ~ (p=1.000 n=10) ¹ UnmarshalMapToStruct/reject_unknown_and_duplicate/all_known_fields 15.00 ± 0% 0.00 ± 0% -100.00% (p=0.000 n=10) UnmarshalMapToStruct/reject_unknown_and_duplicate/all_known_duplicate_fields 5.000 ± 0% 2.000 ± 0% -60.00% (p=0.000 n=10) UnmarshalMapToStruct/reject_unknown_and_duplicate/all_unknown_fields 4.000 ± 0% 2.000 ± 0% -50.00% (p=0.000 n=10) UnmarshalMapToStruct/reject_unknown_and_duplicate/all_unknown_duplicate_fields 4.000 ± 0% 2.000 ± 0% -50.00% (p=0.000 n=10) geomean 3.043 ? ² ³ ¹ all samples are equal ² summaries must be >0 to compute geomean ³ ratios must be >0 to compute geomean Signed-off-by: Ben Luddy <bluddy@redhat.com>
Configuration menu - View commit details
-
Copy full SHA for 1d28086 - Browse repository at this point
Copy the full SHA 1d28086View commit details
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.