Skip to content

Commit 84235d0

Browse files
committed
small perfromance fixes
motivation: better performance changes: * cache manifest dependencies and target computations * change several functions that return static data to computed properties
1 parent a2bdb72 commit 84235d0

29 files changed

+210
-184
lines changed

Sources/Basics/FileSystem/AbsolutePath.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -268,7 +268,7 @@ extension AbsolutePath {
268268
}
269269

270270
/// Returns the basename dropping any possible extension.
271-
public func basenameWithoutAnyExtension() -> String {
271+
public var basenameWithoutAnyExtension: String {
272272
var basename = self.basename
273273
if let index = basename.firstIndex(of: ".") {
274274
basename.removeSubrange(index ..< basename.endIndex)
@@ -320,7 +320,7 @@ extension AbsolutePath {
320320
}
321321

322322
extension AbsolutePath {
323-
public func escapedPathString() -> String {
323+
public var escapedPathString: String {
324324
self.pathString.replacingOccurrences(of: "\\", with: "\\\\")
325325
}
326326
}

Sources/Build/BuildDescription/ProductBuildDescription.swift

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -295,7 +295,7 @@ public final class ProductBuildDescription: SPMBuildCore.ProductBuildDescription
295295
args += try self.buildParameters.targetTripleArgs(for: self.product.targets[0])
296296

297297
// Add arguments from declared build settings.
298-
args += self.buildSettingsFlags()
298+
args += self.buildSettingsFlags
299299

300300
// Add AST paths to make the product debuggable. This array is only populated when we're
301301
// building for Darwin in debug configuration.
@@ -325,19 +325,19 @@ public final class ProductBuildDescription: SPMBuildCore.ProductBuildDescription
325325
}
326326

327327
/// Returns the build flags from the declared build settings.
328-
private func buildSettingsFlags() -> [String] {
328+
private var buildSettingsFlags: [String] {
329329
var flags: [String] = []
330330

331331
// Linked libraries.
332-
let libraries = OrderedSet(staticTargets.reduce([]) {
333-
$0 + buildParameters.createScope(for: $1).evaluate(.LINK_LIBRARIES)
332+
let libraries = OrderedSet(self.staticTargets.reduce([]) {
333+
$0 + self.buildParameters.createScope(for: $1).evaluate(.LINK_LIBRARIES)
334334
})
335335
flags += libraries.map { "-l" + $0 }
336336

337337
// Linked frameworks.
338338
if self.buildParameters.targetTriple.supportsFrameworks {
339-
let frameworks = OrderedSet(staticTargets.reduce([]) {
340-
$0 + buildParameters.createScope(for: $1).evaluate(.LINK_FRAMEWORKS)
339+
let frameworks = OrderedSet(self.staticTargets.reduce([]) {
340+
$0 + self.buildParameters.createScope(for: $1).evaluate(.LINK_FRAMEWORKS)
341341
})
342342
flags += frameworks.flatMap { ["-framework", $0] }
343343
}

Sources/Build/BuildOperation.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -669,7 +669,7 @@ public final class BuildOperation: PackageStructureDelegate, SPMBuildCore.BuildS
669669

670670
public func packageStructureChanged() -> Bool {
671671
do {
672-
_ = try plan()
672+
_ = try self.plan()
673673
}
674674
catch Diagnostics.fatalError {
675675
return false

Sources/PackageFingerprint/FilePackageFingerprintStorage.swift

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,7 @@ public struct FilePackageFingerprintStorage: PackageFingerprintStorage {
165165
}
166166

167167
private func loadFromDisk(reference: FingerprintReference) throws -> PackageFingerprints {
168-
let path = try self.directoryPath.appending(component: reference.fingerprintsFilename())
168+
let path = try self.directoryPath.appending(component: reference.fingerprintsFilename)
169169

170170
guard self.fileSystem.exists(path) else {
171171
return .init()
@@ -185,7 +185,7 @@ public struct FilePackageFingerprintStorage: PackageFingerprintStorage {
185185
}
186186

187187
let buffer = try StorageModel.encode(packageFingerprints: fingerprints, encoder: self.encoder)
188-
let path = try self.directoryPath.appending(component: reference.fingerprintsFilename())
188+
let path = try self.directoryPath.appending(component: reference.fingerprintsFilename)
189189
try self.fileSystem.writeFileContents(path, data: buffer)
190190
}
191191

@@ -382,25 +382,27 @@ extension Fingerprint.ContentType {
382382
}
383383

384384
protocol FingerprintReference {
385-
func fingerprintsFilename() throws -> String
385+
var fingerprintsFilename: String { get throws }
386386
}
387387

388388
extension PackageIdentity: FingerprintReference {
389-
func fingerprintsFilename() -> String {
389+
var fingerprintsFilename: String {
390390
"\(self.description).json"
391391
}
392392
}
393393

394394
extension PackageReference: FingerprintReference {
395-
func fingerprintsFilename() throws -> String {
396-
guard case .remoteSourceControl(let sourceControlURL) = self.kind else {
397-
throw StringError("Package kind [\(self.kind)] does not support fingerprints")
395+
var fingerprintsFilename: String {
396+
get throws {
397+
guard case .remoteSourceControl(let sourceControlURL) = self.kind else {
398+
throw StringError("Package kind [\(self.kind)] does not support fingerprints")
399+
}
400+
401+
let canonicalLocation = CanonicalPackageLocation(sourceControlURL.absoluteString)
402+
// Cannot use hashValue because it is not consistent across executions
403+
let locationHash = canonicalLocation.description.sha256Checksum.prefix(8)
404+
return "\(self.identity.description)-\(locationHash).json"
398405
}
399-
400-
let canonicalLocation = CanonicalPackageLocation(sourceControlURL.absoluteString)
401-
// Cannot use hashValue because it is not consistent across executions
402-
let locationHash = canonicalLocation.description.sha256Checksum.prefix(8)
403-
return "\(self.identity.description)-\(locationHash).json"
404406
}
405407
}
406408

Sources/PackageGraph/GraphLoadingNode.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,8 @@ public struct GraphLoadingNode: Equatable, Hashable {
4141
}
4242

4343
/// Returns the dependencies required by this node.
44-
internal func requiredDependencies() -> [PackageDependency] {
45-
return manifest.dependenciesRequired(for: productFilter)
44+
internal var requiredDependencies: [PackageDependency] {
45+
return self.manifest.dependenciesRequired(for: self.productFilter)
4646
}
4747

4848
public func hash(into hasher: inout Hasher) {

Sources/PackageGraph/ModuleAliasTracker.swift

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ class ModuleAliasTracker {
8484
func trackTargetsPerProduct(product: Product,
8585
package: PackageIdentity) {
8686
let targetDeps = product.targets.map{$0.dependencies}.flatMap{$0}
87-
var allTargetDeps = product.targets.map{$0.recursiveDependentTargets().map{$0.dependencies}}.flatMap{$0}.flatMap{$0}
87+
var allTargetDeps = product.targets.map{$0.recursiveDependentTargets.map{$0.dependencies}}.flatMap{$0}.flatMap{$0}
8888
allTargetDeps.append(contentsOf: targetDeps)
8989
for dep in allTargetDeps {
9090
if case let .product(depRef, _) = dep {
@@ -158,7 +158,7 @@ class ModuleAliasTracker {
158158
}
159159

160160
if let curDirectTargets = productToDirectTargets[productID] {
161-
var relevantTargets = curDirectTargets.map{$0.recursiveDependentTargets()}.flatMap{$0}
161+
var relevantTargets = curDirectTargets.map{$0.recursiveDependentTargets}.flatMap{$0}
162162
relevantTargets.append(contentsOf: curDirectTargets)
163163

164164
for relTarget in relevantTargets {
@@ -198,7 +198,7 @@ class ModuleAliasTracker {
198198
}
199199

200200
if let curDirectTargets = productToDirectTargets[productID] {
201-
let depTargets = curDirectTargets.map{$0.recursiveDependentTargets()}.flatMap{$0}
201+
let depTargets = curDirectTargets.map{$0.recursiveDependentTargets}.flatMap{$0}
202202
let depTargetAliases = toDictionary(depTargets.compactMap{$0.moduleAliases})
203203
let depChildTargets = dependencyProductTargets(of: depTargets)
204204
let depChildAliases = toDictionary(depChildTargets.compactMap{$0.moduleAliases})
@@ -255,7 +255,7 @@ class ModuleAliasTracker {
255255
let unAliased = productTargets.contains{$0.moduleAliases == nil}
256256
if unAliased {
257257
for target in productTargets {
258-
let depAliases = target.recursiveDependentTargets().compactMap{$0.moduleAliases}.flatMap{$0}
258+
let depAliases = target.recursiveDependentTargets.compactMap{$0.moduleAliases}.flatMap{$0}
259259
for (key, alias) in depAliases {
260260
target.addModuleAlias(for: key, as: alias)
261261
}
@@ -412,17 +412,17 @@ class ModuleAliasModel {
412412

413413
extension Target {
414414
func dependsOn(productID: String) -> Bool {
415-
return dependencies.contains { dep in
415+
return self.dependencies.contains { dep in
416416
if case let .product(prodRef, _) = dep {
417417
return prodRef.identity == productID
418418
}
419419
return false
420420
}
421421
}
422422

423-
func recursiveDependentTargets() -> [Target] {
423+
var recursiveDependentTargets: [Target] {
424424
var list = [Target]()
425-
var nextDeps = dependencies
425+
var nextDeps = self.dependencies
426426
while !nextDeps.isEmpty {
427427
let nextTargets = nextDeps.compactMap{$0.target}
428428
list.append(contentsOf: nextTargets)

Sources/PackageGraph/PackageGraph+Loading.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ extension PackageGraph {
4646
manifestMap[$0.key] = ($0.value, fileSystem)
4747
}
4848
let successors: (GraphLoadingNode) -> [GraphLoadingNode] = { node in
49-
node.requiredDependencies().compactMap{ dependency in
49+
node.requiredDependencies.compactMap{ dependency in
5050
return manifestMap[dependency.identity].map { (manifest, fileSystem) in
5151
GraphLoadingNode(identity: dependency.identity, manifest: manifest, productFilter: dependency.productFilter, fileSystem: fileSystem)
5252
}
@@ -272,7 +272,7 @@ private func createResolvedPackages(
272272

273273
// Establish the manifest-declared package dependencies.
274274
package.manifest.dependenciesRequired(for: packageBuilder.productFilter).forEach { dependency in
275-
let dependencyPackageRef = dependency.createPackageRef()
275+
let dependencyPackageRef = dependency.packageRef
276276

277277
// Otherwise, look it up by its identity.
278278
if let resolvedPackage = packagesByIdentity[dependency.identity] {

Sources/PackageGraph/PackageGraphRoot.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ public struct PackageGraphRoot {
8888

8989
let depend = try dependencies.map{
9090
PackageContainerConstraint(
91-
package: $0.createPackageRef(),
91+
package: $0.packageRef,
9292
requirement: try $0.toConstraintRequirement(),
9393
products: $0.productFilter
9494
)

Sources/PackageGraph/PackageModel+Extensions.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import PackageModel
1414

1515
extension PackageDependency {
1616
/// Create the package reference object for the dependency.
17-
public func createPackageRef() -> PackageReference {
17+
public var packageRef: PackageReference {
1818
let packageKind: PackageReference.Kind
1919
switch self {
2020
case .fileSystem(let settings):
@@ -38,7 +38,7 @@ extension Manifest {
3838
public func dependencyConstraints(productFilter: ProductFilter) throws -> [PackageContainerConstraint] {
3939
return try self.dependenciesRequired(for: productFilter).map({
4040
return PackageContainerConstraint(
41-
package: $0.createPackageRef(),
41+
package: $0.packageRef,
4242
requirement: try $0.toConstraintRequirement(),
4343
products: $0.productFilter)
4444
})

0 commit comments

Comments
 (0)