Skip to content

Commit b2a26b5

Browse files
authored
Merge pull request #734 from CodaFi/sysopt
Improve Deserialization Performance
2 parents eeda545 + 11a7264 commit b2a26b5

File tree

3 files changed

+25
-53
lines changed

3 files changed

+25
-53
lines changed

Sources/SwiftDriver/IncrementalCompilation/DependencyKey.swift

Lines changed: 6 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -308,16 +308,12 @@ public struct DependencyKey: CustomStringConvertible {
308308
/*@_spi(Testing)*/ public let aspect: DeclAspect
309309
/*@_spi(Testing)*/ public let designator: Designator
310310

311-
private let cachedHash: Int
312-
313-
314311
/*@_spi(Testing)*/ public init(
315312
aspect: DeclAspect,
316313
designator: Designator)
317314
{
318315
self.aspect = aspect
319316
self.designator = designator
320-
self.cachedHash = Self.computeHash(aspect, designator)
321317
}
322318

323319
/*@_spi(Testing)*/ public var correspondingImplementation: Self? {
@@ -338,35 +334,16 @@ public struct DependencyKey: CustomStringConvertible {
338334
}
339335
}
340336

341-
extension DependencyKey: Equatable, Hashable {
342-
343-
private static func computeHash(_ aspect: DeclAspect, _ designator: Designator) -> Int {
344-
var h = Hasher()
345-
h.combine(aspect)
346-
h.combine(designator)
347-
return h.finalize()
348-
}
349-
350-
public func hash(into hasher: inout Hasher) {
351-
hasher.combine(cachedHash)
352-
}
353-
354-
public static func ==(lhs: Self, rhs: Self) -> Bool {
355-
lhs.aspect == rhs.aspect && lhs.designator == rhs.designator
356-
}
357-
}
358-
359-
// MARK: - Comparing
360-
/// Needed to sort nodes to make tracing deterministic to test against emitted diagnostics
361-
extension DependencyKey: Comparable {
337+
extension DependencyKey: Equatable, Hashable, Comparable {
362338
public static func < (lhs: Self, rhs: Self) -> Bool {
363-
lhs.aspect != rhs.aspect ? lhs.aspect < rhs.aspect :
364-
lhs.designator < rhs.designator
339+
guard lhs.aspect == rhs.aspect else {
340+
return lhs.aspect < rhs.aspect
341+
}
342+
return lhs.designator < rhs.designator
365343
}
366344
}
367345

368-
extension DependencyKey.Designator: Comparable {
369-
}
346+
extension DependencyKey.Designator: Comparable {}
370347

371348
// MARK: - InvalidationReason
372349
extension ExternalDependency {

Sources/SwiftDriver/IncrementalCompilation/ModuleDependencyGraph.swift

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -583,21 +583,19 @@ extension ModuleDependencyGraph {
583583
throw ReadError.unexpectedMetadataRecord
584584
}
585585
guard record.fields.count == 2,
586-
case .blob(let compilerVersionBlob) = record.payload,
587-
let compilerVersionString = String(data: compilerVersionBlob, encoding: .utf8)
586+
case .blob(let compilerVersionBlob) = record.payload
588587
else { throw ReadError.malformedMetadataRecord }
589588

590589
self.majorVersion = record.fields[0]
591590
self.minorVersion = record.fields[1]
592-
self.compilerVersionString = compilerVersionString
591+
self.compilerVersionString = String(decoding: compilerVersionBlob, as: UTF8.self)
593592
case .moduleDepGraphNode:
594593
let kindCode = record.fields[0]
595594
guard record.fields.count == 7,
596595
let declAspect = DependencyKey.DeclAspect(record.fields[1]),
597596
record.fields[2] < identifiers.count,
598597
record.fields[3] < identifiers.count,
599-
case .blob(let fingerprintBlob) = record.payload,
600-
let fingerprintStr = String(data: fingerprintBlob, encoding: .utf8)
598+
case .blob(let fingerprintBlob) = record.payload
601599
else {
602600
throw ReadError.malformedModuleDepGraphNodeRecord
603601
}
@@ -609,7 +607,7 @@ extension ModuleDependencyGraph {
609607
let hasDepSource = Int(record.fields[4]) != 0
610608
let depSourceStr = hasDepSource ? identifiers[Int(record.fields[5])] : nil
611609
let hasFingerprint = Int(record.fields[6]) != 0
612-
let fingerprint = hasFingerprint ? fingerprintStr : nil
610+
let fingerprint = hasFingerprint ? String(decoding: fingerprintBlob, as: UTF8.self) : nil
613611
guard let dependencySource = try depSourceStr
614612
.map({ try VirtualPath.intern(path: $0) })
615613
.map(DependencySource.init)
@@ -641,24 +639,22 @@ extension ModuleDependencyGraph {
641639
case .externalDepNode:
642640
guard record.fields.count == 2,
643641
record.fields[0] < identifiers.count,
644-
case .blob(let fingerprintBlob) = record.payload,
645-
let fingerprintStr = String(data: fingerprintBlob, encoding: .utf8)
642+
case .blob(let fingerprintBlob) = record.payload
646643
else {
647644
throw ReadError.malformedExternalDepNodeRecord
648645
}
649646
let path = identifiers[Int(record.fields[0])]
650647
let hasFingerprint = Int(record.fields[1]) != 0
651-
let fingerprint = hasFingerprint ? fingerprintStr : nil
648+
let fingerprint = hasFingerprint ? String(decoding: fingerprintBlob, as: UTF8.self) : nil
652649
self.graph.fingerprintedExternalDependencies.insert(
653650
FingerprintedExternalDependency(ExternalDependency(fileName: path), fingerprint))
654651
case .identifierNode:
655652
guard record.fields.count == 0,
656-
case .blob(let identifierBlob) = record.payload,
657-
let identifier = String(data: identifierBlob, encoding: .utf8)
653+
case .blob(let identifierBlob) = record.payload
658654
else {
659655
throw ReadError.malformedIdentifierRecord
660656
}
661-
identifiers.append(identifier)
657+
identifiers.append(String(decoding: identifierBlob, as: UTF8.self))
662658
}
663659
}
664660
}

Sources/SwiftDriver/IncrementalCompilation/SourceFileDependencyGraph.swift

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -213,8 +213,8 @@ extension SourceFileDependencyGraph {
213213
defsIDependUpon: defsNodeDependUpon,
214214
isProvides: isProvides)
215215
self.key = nil
216-
defsNodeDependUpon = []
217-
nodes.append(node)
216+
self.defsNodeDependUpon.removeAll(keepingCapacity: true)
217+
self.nodes.append(node)
218218
}
219219
mutating func visit(record: BitcodeElement.Record) throws {
220220
guard let kind = RecordKind(rawValue: record.id) else { throw ReadError.unknownRecord }
@@ -225,13 +225,12 @@ extension SourceFileDependencyGraph {
225225
throw ReadError.unexpectedMetadataRecord
226226
}
227227
guard record.fields.count == 2,
228-
case .blob(let compilerVersionBlob) = record.payload,
229-
let compilerVersionString = String(data: compilerVersionBlob, encoding: .utf8)
228+
case .blob(let compilerVersionBlob) = record.payload
230229
else { throw ReadError.malformedMetadataRecord }
231230

232231
self.majorVersion = record.fields[0]
233232
self.minorVersion = record.fields[1]
234-
self.compilerVersionString = compilerVersionString
233+
self.compilerVersionString = String(decoding: compilerVersionBlob, as: UTF8.self)
235234
case .sourceFileDepGraphNode:
236235
try finalizeNode()
237236
let kindCode = record.fields[0]
@@ -249,28 +248,28 @@ extension SourceFileDependencyGraph {
249248
self.key = DependencyKey(aspect: declAspect, designator: designator)
250249
self.fingerprint = nil
251250
self.nodeSequenceNumber = nextSequenceNumber
252-
self.defsNodeDependUpon = []
251+
self.defsNodeDependUpon.removeAll(keepingCapacity: true)
253252

254253
nextSequenceNumber += 1
255254
case .fingerprintNode:
256255
guard key != nil,
257256
record.fields.count == 0,
258-
case .blob(let fingerprintBlob) = record.payload,
259-
let fingerprint = String(data: fingerprintBlob, encoding: .utf8) else {
257+
case .blob(let fingerprintBlob) = record.payload
258+
else {
260259
throw ReadError.malformedFingerprintRecord
261260
}
262-
self.fingerprint = fingerprint
261+
self.fingerprint = String(decoding: fingerprintBlob, as: UTF8.self)
263262
case .dependsOnDefinitionNode:
264263
guard key != nil,
265264
record.fields.count == 1 else { throw ReadError.malformedDependsOnDefinitionRecord }
266265
self.defsNodeDependUpon.append(Int(record.fields[0]))
267266
case .identifierNode:
268267
guard record.fields.count == 0,
269-
case .blob(let identifierBlob) = record.payload,
270-
let identifier = String(data: identifierBlob, encoding: .utf8) else {
268+
case .blob(let identifierBlob) = record.payload
269+
else {
271270
throw ReadError.malformedIdentifierRecord
272271
}
273-
identifiers.append(identifier)
272+
identifiers.append(String(decoding: identifierBlob, as: UTF8.self))
274273
}
275274
}
276275
}

0 commit comments

Comments
 (0)