Swift Academy · Les

Hot paths optimaliseren: COW, inlining en specialisatie

@inline, @_specialize en valuetype-optimalisaties toepassen op basis van profilergegevens.

Les 4 van 413 stappen

Hot paths optimaliseren: COW, inlining en specialisatie is een gratis Swift Academy-les op CoddyKit. Dit is les 4 van 4. Je kunt 3 lessen uit dit leerpad gratis volledig lezen — daarna ontgrendelt CoddyKit PRO alle lessen, plus praktische oefeningen met een ingebouwde code-editor en een AI-tutor die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject Swift Academy. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus Swift Academy bevat in totaal 4 lessen.

Eerst identificeren, dan optimaliseren

Profileer altijd eerst. Optimaliseer alleen code die Time Profiler als een veelgebruikt pad identificeert — voortijdig optimaliseren kost tijd.

// Measure → Identify → Optimise → Re-measure
// A 10ms function called once is less important than
// a 0.1ms function called 10,000 times per frame

Copy-on-write (COW)

Swift-waardetypen (Array, Dictionary) gebruiken COW: de opslag wordt gedeeld totdat er een mutatie plaatsvindt, waardoor onnodige kopieën worden voorkomen.

var a = [1, 2, 3, 4, 5]
var b = a         // no copy yet, shared buffer
b.append(6)       // copy happens here (b mutates)
print(a.count)    // 5 — a unchanged

COW in aangepaste typen garanderen

Implementeer COW in aangepaste waardetypen door veranderlijke toestand in een referentietype te verpakken en vóór een mutatie te kopiëren.

struct Matrix {
  private class Storage { var data: [[Double]] }
  private var storage = Storage()
  private mutating func ensureUnique() {
    if !isKnownUniquelyReferenced(&storage) {
      storage = Storage(data: storage.data)  // copy on write
    }
  }
  mutating func set(row: Int, col: Int, value: Double) {
    ensureUnique()
    storage.data[row][col] = value
  }
}

@inline(__always)

Dwing de compiler om een functie op elke aanroeplocatie inline te plaatsen. Zo verdwijnen de aanroe kosten voor kleine functies die in krappe lussen worden aangeroepen.

@inline(__always)
func clamp(_ value: Float, _ min: Float, _ max: Float) -> Float {
  return Swift.max(min, Swift.min(max, value))
}

@inline(never)

Voorkom inline plaatsen om de codegrootte te verkleinen of de compiler te dwingen een pad als zelden gebruikt te behandelen.

@inline(never)
func handleUnexpectedError(_ error: Error) {
  // Large error-handling block — never inline to keep hot path small
}

@_specialize voor generieke typen

Geef de compiler opdracht om voor een specifiek type een gespecialiseerde kopie van een generieke functie te genereren, zodat statische dispatch en SIMD-optimalisaties mogelijk worden.

@_specialize(where T == Float)
@_specialize(where T == Double)
func normalize<T: FloatingPoint>(_ values: [T]) -> [T] {
  let max = values.max()!
  return values.map { $0 / max }
}

Optimalisatie van de hele module

WMO (ingeschakeld in Release) staat de compiler toe om inline te plaatsen en te specialiseren over bestandsgrenzen heen binnen een module.

// Xcode: Build Settings → Swift Compiler → Code Generation
// Optimization Level: Optimize for Speed (-O)
// Compilation Mode: Whole Module
// Enables cross-file inlining and dead code elimination

Overhead van ARC vermijden

Het vaak aanmaken van referentietypen in veelgebruikte paden veroorzaakt ARC-overhead door retain en release. Geef de voorkeur aan waardetypen of cache referenties.

// HOT PATH:
for _ in 0..<1_000_000 {
  let obj = HeavyClass()  // alloc + dealloc + ARC overhead
}
// BETTER: allocate once outside the loop
let obj = HeavyClass()
for _ in 0..<1_000_000 { obj.process() }

ContiguousArray gebruiken

ContiguousArray garandeert aaneengesloten opslag (in tegenstelling tot Array voor klasse-elementen), waardoor de cacheprestaties in krappe lussen verbeteren.

var nums = ContiguousArray<Float>(repeating: 0, count: 10_000)
// Faster iteration than Array<Float> for bridged-to-ObjC types

Opzoekingen in protocolgetuigentabellen verminderen

Dynamische dispatch van protocollen gebruikt getuigentabellen. Generieke typen en specialisatie vervangen opzoekingen in getuigentabellen door rechtstreekse aanroepen.

// Dynamic dispatch (slower for hot path):
func process(_ drawable: any Drawable) { drawable.draw() }
// Static dispatch after specialization:
func process<T: Drawable>(_ drawable: T) { drawable.draw() }
// Compiler may devirtualize and inline

Benchmarken met XCTMeasure

Valideer optimalisaties altijd met XCTMeasure-benchmarks in je testsuite om regressies te voorkomen.

func testNormalizePerformance() {
  let data = Array(0..<100_000).map { Float($0) }
  measure {
    _ = normalize(data)
  }
}

Korte controle

Wat controleert isKnownUniquelyReferenced(_:) bij het implementeren van Copy-on-Write?

Samenvatting van de les

Profileer eerst met Instruments. Vertrouw op Swift's ingebouwde COW voor verzamelingen; implementeer COW in aangepaste waardetypen met isKnownUniquelyReferenced. Gebruik @inline(__always) voor kleine functies in veelgebruikte paden, @_specialize voor generieke knelpunten en schakel WMO in voor Release-builds. Valideer elke optimalisatie met XCTMeasure-benchmarks.

Gratis beginnen

Leer Swift met een AI-tutor — gratis

Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.

Cursussen
122
Lessen
409

Veelgestelde vragen

Is de les “Hot paths optimaliseren: COW, inlining en specialisatie” gratis?

Ja — je kunt hier op het web alle 3 lessen van het leerpad Swift Academy, waaronder “Hot paths optimaliseren: COW, inlining en specialisatie”, gratis volledig lezen. Daarna ontgrendelt CoddyKit PRO alle lessen, plus interactieve oefeningen met een ingebouwde code-editor en een AI-tutor die 24/7 beschikbaar is. De cursus Swift Academy bevat in totaal 4 lessen.

Wat leer ik in “Hot paths optimaliseren: COW, inlining en specialisatie”?

@inline, @_specialize en valuetype-optimalisaties toepassen op basis van profilergegevens. Je oefent met Swift Academy door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.

Heb ik ervaring nodig om met Swift Academy te beginnen?

Ervaring vooraf is niet nodig. Swift Academy op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 4 van 4.

Hoe lang duurt de les “Hot paths optimaliseren: COW, inlining en specialisatie”?

De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.

Kan ik code schrijven en uitvoeren in deze les over Swift Academy?

Ja. Elke les over Swift Academy bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.

Alle lessen in deze cursus

  1. De basis van Instruments: Time Profiler
  2. Instruments voor allocations en leaks
  3. Main Thread Checker en vastlopers
  4. Hot paths optimaliseren: COW, inlining en specialisatie
← Terug naar Swift Academy