Repository navigation
Compare polygon contours byte-wise - #2513
Closed
nikosavola wants to merge 2 commits into
Closed
nikosavola wants to merge 2 commits into
nikosavola wants to merge 2 commits into
Conversation
- Uncompressed contours store the logical points 1:1, so for integer coordinates equal bytes mean equal points and memcmp gives the same verdict at SIMD speed - Compressed contours, which reconstruct every second point on access, keep the point-by-point comparison, and so do floating point coordinates (NaN, negative zero) - The rectilinear and hole tag bits live in the pointer, so they do not leak into the bytes
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.
polygon_contour::operator==compared the points one by one through the tagged-pointer iterator, which never vectorizes. Shape repository insertion and deduplication pay for it on every contour they compare.Uncompressed contours store the logical points one to one, so for integer coordinates equal bytes mean equal points and
memcmpgives the same verdict at SIMD speed. Compressed contours, which reconstruct every second point on access, and floating point coordinates (NaN, negative zero) keep the point-by-point comparison. The rectilinear and hole tag bits live in the pointer, not in the array, and astatic_assertpins the point size, so they cannot leak into the compared bytes.Measured with this change alone, g++ -O2 on a Xeon Gold 6248, repository deduplication:
The benchmark is not part of this PR.