mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
* [Foundation] Refactor the backing of IndexPath to favor stack allocations The previous implementation of IndexPath would cause a malloc of the underlying array buffer upon bridging from ObjectiveC. This impacts graphical APIs (such as UICollectionView or AppKit equivalents) when calling delegation patterns. Since IndexPath itself can be a tagged pointer and most often just a pair of elements it can be represented as an enum of common cases. Those common cases of empty, single, or pair can be represented respectively as no associated value, a single Int, and a tuple of Ints. These cases will be exclusively stack allocations, which is markably faster than the allocating code-path. IndexPaths that have a count greater than 2 will still fall into the array storage case. As an added performance benefit, accessing count and subscripting is now faster by aproximately 30% due to more tightly coupled inlining potential under whole module optimizations. Accessing count is also faster since it has better cache-line effeciency (lesson learned: the branch predictor is more optimized than pointer indirection chasing). Benchmarks performed on x86_64, arm and arm64 still pending results but should be applicable across the board. Resolves the following issues: https://bugs.swift.org/browse/SR-3655 https://bugs.swift.org/browse/SR-2769 Resolves the following radars: rdar://problem/28207534 rdar://problem/28209456 * [Foundation] remove temp IndexPath hashing that required bridging to ref types * [Foundation] IndexPath does not guarentee hashing to be the same as objc
31 lines
999 B
C++
31 lines
999 B
C++
//===------------------------------------------------------------*- C++ -*-===//
|
|
//
|
|
// This source file is part of the Swift.org open source project
|
|
//
|
|
// Copyright (c) 2014 - 2017 Apple Inc. and the Swift project authors
|
|
// Licensed under Apache License v2.0 with Runtime Library Exception
|
|
//
|
|
// See https://swift.org/LICENSE.txt for license information
|
|
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#import <Foundation/Foundation.h>
|
|
#import <objc/runtime.h>
|
|
#import <objc/message.h>
|
|
#import <sys/fcntl.h>
|
|
|
|
#import "FoundationShimSupport.h"
|
|
#import "NSCalendarShims.h"
|
|
#import "NSCoderShims.h"
|
|
#import "NSDataShims.h"
|
|
#import "NSDictionaryShims.h"
|
|
#import "NSErrorShims.h"
|
|
#import "NSFileManagerShims.h"
|
|
#import "NSIndexPathShims.h"
|
|
#import "NSIndexSetShims.h"
|
|
#import "NSKeyedArchiverShims.h"
|
|
#import "NSLocaleShims.h"
|
|
#import "NSTimeZoneShims.h"
|
|
#import "NSUndoManagerShims.h"
|