Swift Academy · leksjon

Optimalisering av varme kodebaner: COW, inlining og spesialisering

Bruk @inline, @_specialize og optimaliseringer av verdityper basert på profilerdata.

Leksjon 4 av 413 trinn

Optimalisering av varme kodebaner: COW, inlining og spesialisering er en gratis leksjon i Swift Academy på CoddyKit. Dette er leksjon 4 av 4. Du kan lese valgfritt 3 leksjoner fra denne læringsstien gratis i sin helhet – deretter låser CoddyKit PRO opp alle leksjoner, samt praktisk øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i Swift Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Swift Academy inneholder totalt 4 leksjoner.

Identifiser før optimalisering

Profiler alltid først. Optimaliser bare kode som Time Profiler identifiserer som en kritisk kallsti – for tidlig optimalisering er bortkastet tid.

// 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-verdityper (Array, Dictionary) bruker COW: Lagringen deles frem til en mutasjon skjer, slik at unødvendige kopier unngås.

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

Sikre COW i egendefinerte typer

Implementer COW i egendefinerte verdityper ved å pakke inn muterbar tilstand i en referansetype og kopiere før mutasjon.

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)

Tving kompilatoren til å inline en funksjon ved hvert kallsted, slik at kalloverhead fjernes for små funksjoner som kalles i tette løkker.

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

@inline(never)

Forhindre inlining for å redusere kodestørrelsen eller tvinge kompilatoren til å behandle en kallsti som kald (sjeldent brukt).

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

@_specialize for generiske typer

Be kompilatoren generere en spesialisert kopi av en generisk funksjon for en bestemt type, slik at statisk dispatch og SIMD-optimaliseringer blir mulig.

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

Optimalisering av hele modulen

WMO (aktivert i Release) lar kompilatoren inline og spesialisere på tvers av filgrenser innenfor en modul.

// 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

Unngå ARC-overhead

Hyppig opprettelse av referansetyper i kritiske kallstier fører til ARC-overhead ved retain/release. Foretrekk verdityper eller mellomlagre referanser.

// 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() }

Bruke ContiguousArray

ContiguousArray garanterer sammenhengende lagring (i motsetning til Array for klasseelementer), noe som forbedrer hurtigbufferens ytelse i tette løkker.

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

Redusere oppslag i protokollens witness-tabell

Dynamisk dispatch for protokoller bruker witness-tabeller. Generiske typer og spesialisering erstatter oppslag i witness-tabeller med direkte kall.

// 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

Gjøre ytelsesmålinger med XCTMeasure

Valider alltid optimaliseringer med XCTMeasure-ytelsesmålinger i testpakken for å hindre regresjoner.

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

Kort kontroll

Hva kontrollerer isKnownUniquelyReferenced(_:) ved implementering av Copy-on-Write?

Leksjonsoppsummering

Profiler først med Instruments. Stol på Swifts innebygde COW for samlinger, og implementer COW i egendefinerte verdityper med isKnownUniquelyReferenced. Bruk @inline(__always) for små funksjoner i kritiske kallstier, @_specialize for generiske flaskehalser, og aktiver WMO i Release-bygg. Valider hver optimalisering med XCTMeasure-ytelsesmålinger.

Gratis å komme i gang

Lær deg Swift med en AI-veileder – gratis

Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.

Kurs
122
Leksjoner
409

Ofte stilte spørsmål

Er leksjonen «Optimalisering av varme kodebaner: COW, inlining og spesialisering» gratis?

Ja – du kan lese valgfritt 3 av leksjonene i læringsstien Swift Academy, inkludert «Optimalisering av varme kodebaner: COW, inlining og spesialisering», gratis i sin helhet her på nettet. Deretter låser CoddyKit PRO opp alle leksjoner, samt interaktiv øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Kurset i Swift Academy inneholder totalt 4 leksjoner.

Hva lærer jeg i «Optimalisering av varme kodebaner: COW, inlining og spesialisering»?

Bruk @inline, @_specialize og optimaliseringer av verdityper basert på profilerdata. Du øver på Swift Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.

Trenger jeg erfaring for å begynne med Swift Academy?

Ingen tidligere erfaring er nødvendig. Swift Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 4 av 4.

Hvor lang tid tar leksjonen «Optimalisering av varme kodebaner: COW, inlining og spesialisering»?

De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.

Kan jeg skrive og kjøre kode i denne Swift Academy-leksjonen?

Ja. Alle Swift Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.

Alle leksjonene i dette kurset

  1. Grunnleggende om Instruments: Time Profiler
  2. Allocations- og Leaks-instrumenter
  3. Main Thread Checker og heng
  4. Optimalisering av varme kodebaner: COW, inlining og spesialisering
← Tilbake til Swift Academy