0Pricing
Swift Academy · Pelajaran

Mengoptimalkan Jalur Sibuk: COW, Inlining, dan Spesialisasi

Menerapkan @inline, @_specialize, dan optimasi tipe nilai berdasarkan data profiler.

Mengoptimalkan Jalur Sibuk: COW, Inlining, dan Spesialisasi adalah pelajaran Swift Academy gratis di CoddyKit. Ini adalah pelajaran 4 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Swift Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Swift Academy mencakup 4 pelajaran total.

Identifikasi Sebelum Mengoptimalkan

Selalu buat profil terlebih dahulu. Optimalkan hanya kode yang diidentifikasi Time Profiler sebagai jalur panas—optimasi prematur membuang waktu.

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

Salin saat Tulis (COW)

Tipe nilai Swift (Array, Dictionary) menggunakan COW: penyimpanan dibagi hingga terjadi mutasi, sehingga salinan yang tidak diperlukan dapat dihindari.

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

Memastikan COW pada Tipe Khusus

Implementasikan COW pada tipe nilai khusus dengan membungkus keadaan yang dapat diubah dalam tipe referensi dan menyalinnya sebelum mutasi.

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)

Paksa compiler untuk melakukan inline pada fungsi di setiap lokasi pemanggilan, sehingga biaya pemanggilan untuk fungsi kecil dalam perulangan ketat dapat dihilangkan.

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

@inline(never)

Cegah inline untuk mengurangi ukuran kode atau memaksa compiler memperlakukan suatu jalur sebagai jalur dingin (jarang digunakan).

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

@_specialize untuk Generik

Instruksikan compiler untuk menghasilkan salinan khusus dari fungsi generik bagi tipe tertentu, sehingga pengiriman statis dan optimasi SIMD dapat digunakan.

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

Optimasi Seluruh Modul

WMO (diaktifkan dalam Rilis) memungkinkan compiler melakukan inline dan spesialisasi melintasi batas berkas dalam sebuah 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

Menghindari Beban ARC

Pembuatan tipe referensi yang sering pada jalur panas menyebabkan beban retain/release dari ARC. Utamakan tipe nilai atau simpan referensi dalam cache.

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

Menggunakan ContiguousArray

ContiguousArray menjamin penyimpanan yang bersebelahan (tidak seperti Array untuk elemen class), sehingga kinerja cache dalam perulangan ketat meningkat.

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

Mengurangi Pencarian Tabel Saksi Protokol

Pengiriman dinamis protokol menggunakan tabel saksi. Generik + spesialisasi mengganti pencarian tabel saksi dengan pemanggilan langsung.

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

Membuat Tolok Ukur dengan XCTMeasure

Selalu validasi optimasi dengan tolok ukur XCTMeasure dalam rangkaian pengujian Anda untuk mencegah regresi.

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

Pemeriksaan Singkat

Apa yang diperiksa oleh isKnownUniquelyReferenced(_:) saat mengimplementasikan Salin saat Tulis?

Ringkasan Pelajaran

Buat profil terlebih dahulu dengan Instruments. Andalkan COW bawaan Swift untuk koleksi; implementasikan COW pada tipe nilai khusus dengan isKnownUniquelyReferenced. Gunakan @inline(__always) untuk fungsi kecil di jalur panas, @_specialize untuk bagian panas generik, dan aktifkan WMO dalam build Rilis. Validasi setiap optimasi dengan tolok ukur XCTMeasure.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Mengoptimalkan Jalur Sibuk: COW, Inlining, dan Spesialisasi” gratis?

Ya — teks lengkap “Mengoptimalkan Jalur Sibuk: COW, Inlining, dan Spesialisasi” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Swift Academy, upgrade ke CoddyKit PRO. Kursus Swift Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Mengoptimalkan Jalur Sibuk: COW, Inlining, dan Spesialisasi”?

Menerapkan @inline, @_specialize, dan optimasi tipe nilai berdasarkan data profiler. Kamu berlatih Swift Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai Swift Academy?

Tidak diperlukan pengalaman sebelumnya. Swift Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 4 dari 4.

Berapa lama pelajaran “Mengoptimalkan Jalur Sibuk: COW, Inlining, dan Spesialisasi” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran Swift Academy ini?

Ya. Setiap pelajaran Swift Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Dasar-Dasar Instruments: Time Profiler
  2. Instruments Allocations dan Leaks
  3. Pemeriksa Thread Utama dan Kemacetan
  4. Mengoptimalkan Jalur Sibuk: COW, Inlining, dan Spesialisasi
← Kembali ke Swift Academy