Commits

Arnold Schwaighofer committed 7fb2cceec07
Add a method to _NSContiguousString to facilitate stack promotion Use it for hashing and comparison. During String's hashValue and comparison function we create a _NSContiguousString instance to call Foundation's hash/compare function. This is expensive because we have allocate and deallocate a short lived object on the heap (and deallocation for Swift objects is expensive). Instead help the optimizer to allocate this object on the stack. Introduces two functions on the internal _NSContiguousString: _unsafeWithNotEscapedSelfPointer and _unsafeWithNotEscapedSelfPointerPair that pass the _NSContiguousString instance as an opaque pointer to their closure argument. Usage of these functions asserts that the closure will not escape objects transitively reachable from the opaque pointer. We then use those functions to call into the runtime to call foundation functions on the passed strings. The optimizer can promote the strings to the stack because of the assertion this API makes. let lhsStr = _NSContiguousString(self._core) // will be promoted to the stack. let rhsStr = _NSContiguousString(rhs._core) // will be promoted to the stack. let res = lhsStr._unsafeWithNotEscapedSelfPointerPair(rhsStr) { return _stdlib_compareNSStringDeterministicUnicodeCollationPointer($0, $1) } Tested by existing String tests. We should see some nice performance improvements for string comparison and dictionary benchmarks. Here is what I measured at -O on my machine Name Speedup Dictionary 2.00x Dictionary2 1.45x Dictionary2OfObjects 1.20x Dictionary3 1.50x Dictionary3OfObjects 1.45x DictionaryOfObjects 1.40x SuperChars 1.60x rdar://22173647