Swift Academy · Pelajaran

Mengoptimumkan Laluan Panas: COW, Inlining dan Pengkhususan

Gunakan @inline, @_specialize dan pengoptimuman jenis nilai berdasarkan data profiler.

Pelajaran 4 daripada 413 langkah

Mengoptimumkan Laluan Panas: COW, Inlining dan Pengkhususan ialah pelajaran Swift Academy percuma di CoddyKit. Ini ialah pelajaran 4 daripada 4. Sebanyak 3 pelajaran dalam laluan pembelajaran ini boleh dibaca sepenuhnya secara percuma — selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan praktikal dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Swift Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Swift Academy merangkumi sejumlah 4 pelajaran.

Kenal Pasti Sebelum Mengoptimumkan

Sentiasa lakukan pemprofilan terlebih dahulu. Optimumkan hanya kod yang dikenal pasti oleh Time Profiler sebagai laluan panas — pengoptimuman pramatang membazirkan masa.

// 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 ketika Tulis (COW)

Jenis nilai Swift (tatasusunan, kamus) menggunakan COW: storan dikongsi sehingga pengubahan berlaku, sekali gus mengelakkan salinan yang tidak diperlukan.

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 dalam Jenis Tersuai

Laksanakan COW dalam jenis nilai tersuai dengan membalut keadaan boleh ubah dalam jenis rujukan dan menyalinnya sebelum pengubahan.

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 pengkompil untuk menyisipkan fungsi pada setiap tapak panggilan, sekali gus menghapuskan overhed panggilan bagi fungsi kecil yang dipanggil dalam gelung ketat.

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

@inline(never)

Halang penyisipan untuk mengurangkan saiz kod atau memaksa pengkompil menganggap satu laluan sebagai laluan sejuk (jarang digunakan).

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

@_specialize untuk Generik

Arahkan pengkompil untuk menghasilkan salinan khusus fungsi generik bagi jenis tertentu, sekali gus membolehkan penghantaran statik dan pengoptimuman 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 }
}

Pengoptimuman Seluruh Modul

WMO (diaktifkan dalam Keluaran) membolehkan pengkompil menyisipkan dan mengkhususkan kod merentasi sempadan fail dalam satu 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

Mengelakkan Overhed ARC

Penciptaan jenis rujukan yang kerap dalam laluan panas menyebabkan overhed pengekalan dan pelepasan ARC. Utamakan jenis nilai atau simpan rujukan 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 storan bersebelahan (tidak seperti Array untuk elemen kelas), sekali gus meningkatkan prestasi cache dalam gelung ketat.

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

Mengurangkan Carian Jadual Saksi Protokol

Penghantaran dinamik protokol menggunakan jadual saksi. Generik + pengkhususan menggantikan carian jadual saksi dengan panggilan terus.

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

Penanda Aras dengan XCTMeasure

Sentiasa sahkan pengoptimuman dengan penanda aras XCTMeasure dalam himpunan ujian Anda untuk mengelakkan kemerosotan.

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

Semakan Pantas

Apakah yang diperiksa oleh isKnownUniquelyReferenced(_:) apabila melaksanakan Salin ketika Tulis?

Ringkasan Pelajaran

Lakukan pemprofilan terlebih dahulu dengan Instruments. Manfaatkan COW terbina dalam Swift untuk koleksi; laksanakannya dalam jenis nilai tersuai dengan isKnownUniquelyReferenced. Gunakan @inline(__always) untuk fungsi kecil dalam laluan panas, @_specialize untuk laluan panas generik dan aktifkan WMO dalam binaan Keluaran. Sahkan setiap pengoptimuman dengan penanda aras XCTMeasure.

Percuma untuk bermula

Pelajari Swift dengan tutor kecerdasan buatan — percuma

Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.

Kursus
122
Pelajaran
409

Soalan Lazim

Adakah pelajaran “Mengoptimumkan Laluan Panas: COW, Inlining dan Pengkhususan” percuma?

Ya — sebanyak 3 pelajaran dalam laluan pembelajaran Swift Academy, termasuk “Mengoptimumkan Laluan Panas: COW, Inlining dan Pengkhususan”, boleh dibaca sepenuhnya secara percuma di web ini. Selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan interaktif dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Kursus Swift Academy merangkumi sejumlah 4 pelajaran.

Apakah yang akan saya pelajari dalam “Mengoptimumkan Laluan Panas: COW, Inlining dan Pengkhususan”?

Gunakan @inline, @_specialize dan pengoptimuman jenis nilai berdasarkan data profiler. Anda berlatih Swift Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.

Adakah saya memerlukan pengalaman untuk memulakan Swift Academy?

Tiada pengalaman terdahulu diperlukan. Pembelajaran Swift Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 4 daripada 4.

Berapa lamakah pelajaran “Mengoptimumkan Laluan Panas: COW, Inlining dan Pengkhususan” diambil?

Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.

Bolehkah saya menulis dan menjalankan kod dalam pelajaran Swift Academy ini?

Ya. Setiap pelajaran Swift Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.

Semua pelajaran dalam kursus ini

  1. Asas Instruments: Time Profiler
  2. Instruments Peruntukan dan Kebocoran
  3. Pemeriksa Thread Utama dan Kebekuan
  4. Mengoptimumkan Laluan Panas: COW, Inlining dan Pengkhususan
← Kembali ke Swift Academy