0Pricing
Swift Academy · Lezione

Ottimizzare gli hot path: COW, inlining e specializzazione

Applicare @inline, @_specialize e ottimizzazioni dei tipi valore sulla base dei dati del profiler.

Ottimizzare gli hot path: COW, inlining e specializzazione è una lezione Swift Academy gratuita su CoddyKit. Questa è la lezione 4 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Swift Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Swift Academy include 4 lezioni in totale.

Identificare prima di ottimizzare

Esegua sempre prima la profilazione. Ottimizzi solo il codice che Time Profiler identifica come percorso critico: l'ottimizzazione prematura fa perdere tempo.

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

I tipi valore di Swift (Array, Dictionary) utilizzano COW: la memoria viene condivisa fino a quando non si verifica una mutazione, evitando copie non necessarie.

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

Garantire il COW nei tipi personalizzati

Implementi il COW nei tipi valore personalizzati racchiudendo lo stato mutabile in un tipo riferimento e copiandolo prima della mutazione.

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)

Forza il compilatore a incorporare una funzione in ogni punto di chiamata, eliminando il costo della chiamata per le funzioni piccole invocate in cicli intensivi.

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

@inline(never)

Impedisce l'incorporamento per ridurre le dimensioni del codice o forzare il compilatore a trattare un percorso come poco frequente.

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

@_specialize per i generics

Indica al compilatore di generare una copia specializzata di una funzione generica per un tipo specifico, abilitando il dispatch statico e le ottimizzazioni SIMD.

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

Ottimizzazione dell'intero modulo

WMO (abilitata in Release) consente al compilatore di incorporare e specializzare il codice oltre i limiti dei file all'interno di un modulo.

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

Evitare l'overhead di ARC

La creazione frequente di tipi riferimento nei percorsi critici causa l'overhead di retain/release di ARC. Preferisca i tipi valore oppure memorizzi nella cache i riferimenti.

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

Utilizzo di ContiguousArray

ContiguousArray garantisce una memoria contigua (a differenza di Array per gli elementi di tipo classe), migliorando le prestazioni della cache nei cicli intensivi.

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

Riduzione delle ricerche nelle tabelle dei witness dei protocolli

Il dispatch dinamico dei protocolli utilizza le tabelle dei witness. Generics e specializzazione sostituiscono le ricerche nelle tabelle dei witness con chiamate dirette.

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

Benchmark con XCTMeasure

Convalidi sempre le ottimizzazioni con benchmark XCTMeasure nella suite di test, per evitare regressioni.

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

Verifica rapida

Che cosa verifica isKnownUniquelyReferenced(_:) quando si implementa il Copy-on-Write?

Riepilogo della lezione

Esegua prima la profilazione con Instruments. Si affidi al COW integrato di Swift per le collection; lo implementi nei tipi valore personalizzati con isKnownUniquelyReferenced. Utilizzi @inline(__always) per le funzioni piccole nei percorsi critici, @_specialize per i punti critici generici e abiliti WMO nelle build Release. Convalidi ogni ottimizzazione con benchmark XCTMeasure.

Domande Frequenti

La lezione «Ottimizzare gli hot path: COW, inlining e specializzazione» è gratuita?

Sì — il testo completo di «Ottimizzare gli hot path: COW, inlining e specializzazione» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Swift Academy, passa a CoddyKit PRO. Il corso Swift Academy include 4 lezioni in totale.

Cosa imparerò in «Ottimizzare gli hot path: COW, inlining e specializzazione»?

Applicare @inline, @_specialize e ottimizzazioni dei tipi valore sulla base dei dati del profiler. Eserciti Swift Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare Swift Academy?

Non è richiesta alcuna esperienza precedente. Swift Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 4 di 4.

Quanto tempo richiede la lezione «Ottimizzare gli hot path: COW, inlining e specializzazione»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione Swift Academy?

Sì. Ogni lezione Swift Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Fondamenti di Instruments: Time Profiler
  2. Strumenti Allocations e Leaks
  3. Main Thread Checker e blocchi
  4. Ottimizzare gli hot path: COW, inlining e specializzazione
← Torna a Swift Academy