Section 3/181 menit
3. Build Time Optimization
3. Build Time Optimization
Build time adalah salah satu hambatan terbesar produktivitas iOS developer. Project besar bisa memakan 5–15 menit untuk clean build.
Diagnosa Build Time
swift
# Aktifkan build timing di Xcode
defaults write com.apple.dt.Xcode ShowBuildOperationDuration YES
# Setelah build, waktu muncul di activity bar Xcode
# Cek function compilation time (Swift)
# Di Build Settings → Swift Compiler - Custom Flags → Other Swift Flags:
# -Xfrontend -warn-long-function-bodies=100
# -Xfrontend -warn-long-expression-type-checking=100
# (angka = milliseconds threshold)
swift
# Analisis build time dengan XCLogParser
brew install xclogparser
xclogparser parse --project MyApp --reporter html
# Build time analyzer
# https://github.com/RocketSimApp/RocketSim (berbayar tapi powerful)
Optimasi 1: Explicit Type Annotations
swift
// ❌ TANPA explicit type: compiler harus infer — bisa lambat pada ekspresi kompleks
let config = [
"timeout": 30,
"retries": 3,
"baseURL": "https://api.example.com",
"headers": ["Content-Type": "application/json", "Accept": "application/json"]
]
// ✓ DENGAN explicit type: compiler langsung tahu, tidak perlu infer
let config: [String: Any] = [
"timeout": 30,
"retries": 3,
"baseURL": "https://api.example.com",
"headers": ["Content-Type": "application/json", "Accept": "application/json"]
]
Optimasi 2: Modularisasi dengan SPM
swift
// ❌ Monorepo: semua kode dalam satu target → rebuild seluruh app setiap perubahan kecil
// ✓ Modular: perubahan di NetworkKit hanya rebuild NetworkKit + dependent modules
// Package.swift
let package = Package(
name: "MyAppModules",
products: [
.library(name: "NetworkKit", targets: ["NetworkKit"]),
.library(name: "DesignSystem", targets: ["DesignSystem"]),
.library(name: "Analytics", targets: ["Analytics"]),
],
targets: [
.target(name: "NetworkKit", dependencies: []),
.target(name: "DesignSystem", dependencies: []),
.target(name: "Analytics", dependencies: ["NetworkKit"]),
]
)
Optimasi 3: Preview Macro Stub
swift
// SwiftUI Preview lambat karena compile seluruh module
// Buat stub data terpisah untuk preview
// ❌ Lambat: Preview menggunakan real dependencies
#Preview {
ContentView(viewModel: ContentViewModel(
repository: TaskRepository(database: AppDatabase.shared),
analytics: AnalyticsService.shared
))
}
// ✓ Cepat: Preview menggunakan mock/stub
#Preview {
ContentView(viewModel: ContentViewModel(
repository: MockTaskRepository(),
analytics: MockAnalyticsService()
))
}
Optimasi 4: Derived Data di SSD/RAM Disk
swift
# Pindah Derived Data ke RAM disk (hilang saat restart, tapi build ultra-cepat)
# Hanya untuk development aktif, bukan CI
# Buat RAM disk 8GB
diskutil erasevolume HFS+ "DerivedData" `hdiutil attach -nomount ram://16777216`
# Set Derived Data ke RAM disk
# Xcode → Settings → Locations → Derived Data: /Volumes/DerivedData
# Atau via command line
defaults write com.apple.dt.Xcode IDECustomDerivedDataLocation /Volumes/DerivedData
Optimasi 5: Build System Flags
swift
# Di .xcode/xcshareddata/xcschemes/MyApp.xcscheme
# Atau via Build Settings → Other Swift Flags
# Aktifkan Whole Module Optimization hanya untuk Archive (bukan Debug)
# Debug: -Onone (cepat compile, lambat run)
# Release: -O (lambat compile, cepat run)
# Whole Module: -whole-module-optimization (paling lambat compile, paling cepat run)
# Aktifkan incremental compilation (default di Xcode modern)
-incremental
# Parallel compilation
OTHER_SWIFT_FLAGS = $(inherited) -num-threads 8