[utils] [perf] Performance of fullResolve #2755
Merged
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.
While looking at a larger code base https://gitlab.com/gitlab-org/gitlab, I've came to realize that
fullResolve
takes a lot of CPU cycles, particularly thehashObject
calls inside it.I applied the following patch locally to see how often this is called and how many unique hashes were produced:
For our code base,
fullResolve
is called more than 570 thousand times. The simple in-equality!==
code path is taken 1090 times. Actually only four unique hashes are produced, meaning we only have four unique settings across our code base.I assume that a full object equality comparison might not be needed, and a simple object comparison with
!==
already would reduce the amount ofhashObject
calls by 570x. This is what is implemented in this commit.Time spend in
fullResolve
was reduced by ~38%:The effect might even be more pronounced on machines that are slower when calculating
sha256
hashes or that have less memory, as thehashObject
method tends to create loads of small strings which need to be garbage collected.