Repository navigation
Conversation
Object comparison scanned the other member list per member, twice, so cost grew exponentially with nesting depth; recursion was also unbounded. Compare objects by sorting member-pointer copies once and comparing pairwise (O(n log n) per level, caller's trees untouched), and fail safe past CJSON_NESTING_LIMIT in cJSON_Compare and the TEST-operation compare_json (which additionally no longer reorders the compared trees). Add regression tests for nested/order-insensitive equality and over-limit fail-safe.
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.
Object comparison scanned the other member list per member, twice, so cost grew exponentially with nesting depth (measured ~148x for two added levels at width 6: depth-4 0.004s vs depth-6 0.593s); recursion was also unbounded.
This compares objects by sorting member-pointer copies once and comparing pairwise -- O(n log n) per level, caller's trees untouched (no reordering, unlike compare_json's in-place sort) -- and fails safe past CJSON_NESTING_LIMIT in cJSON_Compare and the TEST-operation compare_json. One sorted pass also replaces the old compare-twice subset check.
Evidence:
Related: open PR #1078 guards recursion depth in the same functions; this additionally fixes the complexity class rather than only capping depth. Happy to rebase onto #1078 if it lands first.