Swift Academy · Ders

Yoğun Yolları İyileştirme: COW, Satır İçi Kullanım ve Özelleştirme

Profiler verilerine dayanarak @inline, @_specialize ve değer türü iyileştirmelerini uygulayın.

4. ders / 413 adım

Yoğun Yolları İyileştirme: COW, Satır İçi Kullanım ve Özelleştirme, CoddyKit'te ücretsiz bir Swift Academy dersidir. Bu, 4 dersinin 4. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Swift Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Swift Academy kursu toplamda 4 dersten oluşur.

İyileştirmeden Önce Belirleyin

Her zaman önce profil oluşturun. Yalnızca Time Profiler'ın yoğun yol olarak belirlediği kodu iyileştirin; erken iyileştirme zaman kaybettirir.

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

Yazma Sırasında Kopyalama (COW)

Swift değer türleri (dizi, sözlük) COW kullanır: depolama, bir değişiklik gerçekleşene kadar paylaşılır ve böylece gereksiz kopyalar önlenir.

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

Özel Türlerde COW Sağlama

Değiştirilebilir durumu bir başvuru türüyle sarıp değişiklikten önce kopyalayarak özel değer türlerinde COW uygulayın.

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)

Derleyiciyi, bir işlevi her çağrı noktasında satır içine almaya zorlayarak sıkı döngülerde çağrılan küçük işlevlerin çağrı ek yükünü ortadan kaldırın.

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

@inline(never)

Kod boyutunu azaltmak veya derleyiciyi bir yolu soğuk (nadiren kullanılan) olarak ele almaya zorlamak için satır içine almayı engelleyin.

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

Genel Türler İçin @_specialize

Derleyiciye, belirli bir tür için genel bir işlevin özelleştirilmiş bir kopyasını üretmesini bildirin; bu, statik gönderimi ve SIMD iyileştirmelerini mümkün kılar.

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

Tüm Modül İyileştirmesi

WMO (Sürüm derlemesinde etkinleştirilir), derleyicinin bir modül içindeki dosya sınırları boyunca satır içine alma ve özelleştirme yapmasına olanak tanır.

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

ARC Ek Yükünden Kaçınma

Yoğun yollarda sık sık başvuru türü oluşturmak, ARC'nin tutma/bırakma ek yüküne neden olur. Değer türlerini tercih edin veya başvuruları önbelleğe alın.

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

ContiguousArray, bitişik depolamayı garanti eder (Array'in sınıf öğeleri için davranışının aksine) ve sıkı döngülerde önbellek performansını iyileştirir.

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

Protokol Tanık Tablosu Aramalarını Azaltma

Protokol dinamik gönderimi tanık tablolarını kullanır. Genel türler ve özelleştirme, tanık tablosu aramalarının yerine doğrudan çağrıları koyar.

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

XCTMeasure ile Karşılaştırmalı Ölçüm

Gerilemeleri önlemek için iyileştirmeleri test paketinizdeki XCTMeasure karşılaştırmalı ölçümleriyle her zaman doğrulayın.

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

Kısa Kontrol

Copy-on-Write uygularken isKnownUniquelyReferenced(_:) neyi denetler?

Ders Özeti

Önce Instruments ile profil oluşturun. Koleksiyonlar için Swift'in yerleşik COW özelliğine güvenin; isKnownUniquelyReferenced ile özel değer türlerinde de uygulayın. Küçük ve yoğun yol işlevleri için @inline(__always), genel türlerdeki yoğun noktalar için @_specialize kullanın ve Sürüm derlemelerinde WMO'yu etkinleştirin. Her iyileştirmeyi XCTMeasure karşılaştırmalı ölçümleriyle doğrulayın.

Başlamak ücretsiz

Yapay zeka eğitmeniyle Swift öğren — ücretsiz

Tarayıcında gerçek kod yaz ve çalıştır, 7/24 yapay zeka eğitmeninden anında yardım al; web'de ya da uygulamada kaldığın yerden devam et.

Kurslar
122
Dersler
409

Sıkça Sorulan Sorular

“Yoğun Yolları İyileştirme: COW, Satır İçi Kullanım ve Özelleştirme” dersi ücretsiz mi?

Evet — “Yoğun Yolları İyileştirme: COW, Satır İçi Kullanım ve Özelleştirme” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Swift Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Swift Academy kursu toplamda 4 dersten oluşur.

“Yoğun Yolları İyileştirme: COW, Satır İçi Kullanım ve Özelleştirme” dersinde ne öğreneceğim?

Profiler verilerine dayanarak @inline, @_specialize ve değer türü iyileştirmelerini uygulayın. Swift Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

Swift Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te Swift Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 4. dersidir.

“Yoğun Yolları İyileştirme: COW, Satır İçi Kullanım ve Özelleştirme” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu Swift Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her Swift Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. Instruments Temelleri: Zaman Profilleyicisi
  2. Allocations ve Leaks Instruments
  3. Ana İş Parçacığı Denetleyicisi ve Donmalar
  4. Yoğun Yolları İyileştirme: COW, Satır İçi Kullanım ve Özelleştirme
← Swift Academy Sayfasına Dön