ホットパスの最適化:COW、インライン化、特殊化
プロファイラーデータに基づき、@inline、 @_specialize、値型の最適化を適用します。
「ホットパスの最適化:COW、インライン化、特殊化」はCoddyKit上の無料Swift Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSwift Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Swift Academyコースには全4レッスンが含まれています。
最適化の前に原因を特定する
必ず最初にプロファイリングします。Time Profilerがホットパスとして特定したコードだけを最適化します。早すぎる最適化は時間を無駄にします。
// Measure → Identify → Optimise → Re-measure
// A 10ms function called once is less important than
// a 0.1ms function called 10,000 times per frameCopy-on-Write(COW)
Swiftの値型(Array、Dictionary)はCOWを使用します。変更が行われるまでストレージを共有するため、不要なコピーを避けられます。
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カスタム型でCOWを確実にする
可変状態を参照型でラップし、変更前にコピーすることで、カスタム値型にCOWを実装します。
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)
コンパイラにすべての呼び出し箇所で関数をインライン化させます。これにより、タイトなループ内で呼び出される小さな関数の呼び出しオーバーヘッドをなくせます。
@inline(__always)
func clamp(_ value: Float, _ min: Float, _ max: Float) -> Float {
return Swift.max(min, Swift.min(max, value))
}@inline(never)
インライン化を防ぎ、コードサイズを削減したり、コンパイラにその処理経路をコールド(まれにしか実行されない経路)として扱わせたりします。
@inline(never)
func handleUnexpectedError(_ error: Error) {
// Large error-handling block — never inline to keep hot path small
}ジェネリックに対する@_specialize
特定の型に対してジェネリック関数の特化版を生成するようコンパイラに指示し、静的ディスパッチと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 }
}モジュール全体の最適化
WMO(Releaseで有効)を使うと、コンパイラはモジュール内のファイル境界を越えてインライン化と特殊化を行えます。
// Xcode: Build Settings → Swift Compiler → Code Generation
// Optimization Level: Optimize for Speed (-O)
// Compilation Mode: Whole Module
// Enables cross-file inlining and dead code eliminationARCオーバーヘッドの回避
ホットパスで参照型を頻繁に生成すると、ARCのretain/releaseオーバーヘッドが発生します。値型を優先するか、参照をキャッシュします。
// 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の使用
ContiguousArrayは連続したストレージを保証します(クラス要素に対するArrayとは異なります)。これにより、タイトなループでのキャッシュ性能が向上します。
var nums = ContiguousArray<Float>(repeating: 0, count: 10_000)
// Faster iteration than Array<Float> for bridged-to-ObjC typesプロトコル・ウィットネステーブル検索の削減
プロトコルの動的ディスパッチではウィットネステーブルが使用されます。ジェネリックと特殊化を組み合わせると、ウィットネステーブルの検索を直接呼び出しに置き換えられます。
// 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 inlineXCTMeasureによるベンチマーク
リグレッションを防ぐため、テストスイートのXCTMeasureベンチマークで最適化の効果を必ず検証します。
func testNormalizePerformance() {
let data = Array(0..<100_000).map { Float($0) }
measure {
_ = normalize(data)
}
}理解度チェック
Copy-on-Writeを実装するとき、isKnownUniquelyReferenced(_:)は何を確認しますか。
レッスンのまとめ
まずInstrumentsでプロファイリングします。コレクションにはSwift組み込みのCOWを使用し、カスタム値型にはisKnownUniquelyReferencedを使ってCOWを実装します。小さなホットパス関数には@inline(__always)を、ジェネリックのホットスポットには@_specializeを使用し、ReleaseビルドではWMOを有効にします。すべての最適化をXCTMeasureベンチマークで検証します。
よくある質問
「ホットパスの最適化:COW、インライン化、特殊化」レッスンは無料ですか?
はい。「ホットパスの最適化:COW、インライン化、特殊化」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Swift Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Swift Academyコースには全4レッスンが含まれています。
「ホットパスの最適化:COW、インライン化、特殊化」で何を学びますか?
プロファイラーデータに基づき、@inline、 @_specialize、値型の最適化を適用します。 ブラウザで直接実行するハンズオンコードでSwift Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Swift Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのSwift Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。
「ホットパスの最適化:COW、インライン化、特殊化」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このSwift Academyレッスンでコードを書いて実行できますか?
はい。すべてのSwift Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- Instrumentsの基礎:Time Profiler
- AllocationsとLeaks Instruments
- Main Thread Checkerとハング
- ホットパスの最適化:COW、インライン化、特殊化