-
Notifications
You must be signed in to change notification settings - Fork 10.5k
[string] ARC hack around hashValue #14118
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
Conversation
Avoid a source of ARC for hashValue, which is perf-sensitive especially for hashed collection growth. This improves the Dictionary benchmark by around 30%.
@swift-ci please test |
@swift-ci please smoke benchmark |
Build comment file:Optimized (O)Regression (13)
Improvement (19)
No Changes (326)
Unoptimized (Onone)Regression (12)
Improvement (9)
No Changes (337)
Hardware Overview
|
@@ -177,7 +191,9 @@ extension String : Hashable { | |||
/// your program. Do not save hash values to use during a future execution. | |||
@_inlineable // FIXME(sil-serialize-all) | |||
public var hashValue: Int { | |||
return _guts._computeHashValue() | |||
defer { _fixLifetime(self) } |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Is the _fixLifetime
necessary here? If it is, we should audit for missing cases elsewhere; I started eliding it under the assumption that self
lifetime is guaranteed.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Self lifetime is not guaranteed, and technically these are always necessary. _LegacyStringCore violated this rule all over the place, and never blew up, but doing this is a good idea. @atrick was working on a dependent-lifetime improvement wherein we could say that some values/expressions/properties have lifetime dependent on self, and that would alleviate this.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think there's some confusion because self has a guaranteed calling convention, which is completely different from a fixed lifetime--it doesn't give you any lifetime guarantee. Currently, the best thing you can do is defer { _fixLifetime }
. That's terrible for multiple reasons, but I haven't had any time to introduce a reasonable alternative.
Avoid a source of ARC for hashValue, which is perf-sensitive
especially for hashed collection growth.
This improves the Dictionary benchmark by around 30%.