Menguasai performance engineering LLVM: Profile-Guided Optimization (PGO instrumen-based & sample-based/AutoFDO), context-sensitive splitting, benchmark vs GCC dengan metodologi Phoronix, compile-time tracker, dan praktik PGO+LTO pada aplikasi nyata dengan gain terukur.

Setelah di episode 24 kita memahami cross-compilation dan embedded toolchain, pada episode ini kita membahas bagaimana mengoptimalkan performa aplikasi di production menggunakan teknik LLVM yang sophisticated: PGO (Profile-Guided Optimization) dan LTO.
PGO adalah teknik optimasi yang menggunakan data runtime profiling untuk memberitahu optimizer tentang hot path, branch prediction, dan function inlining decisions. PGO + LTO bersamaan bisa menghasilkan performa 10-30% lebih cepat dibanding -O2 biasa.
clang -O2 -fprofile-instr-generate -fcoverage-mapping -o app_instrumented app.c./app_instrumented < production_input.txt
# atau jalankan test suite yang mewakili penggunaan nyata
./run_benchmark.shllvm-profdata merge -output=merged.profdata *.profrawclang -O2 -fprofile-instr-use=merged.profdata -o app_pgo app.cAutoFDO menggunakan sampling dari perf daripada instrumen — overhead yang jauh lebih rendah untuk production:
# 1. Jalankan aplikasi dengan perf
perf record -b -o perf.data ./app_production
# 2. Konversi perf data ke LLVM profile
create_llvm_prof --binary=app_production --out=profile.afdo perf.data
# 3. Build dengan profile
clang -O2 -fprofile-sample-use=profile.afdo -o app_optimized app.cPGO bisa mengoptimalkan inline decisions berdasarkan hot path: fungsi yang sering dipanggil dari hot call site akan di-inline, sementara fungsi yang hanya dipanggil dari cold path tidak di-inline — menghasilkan binary yang lebih kecil tanpa mengorbankan performa hot path.
Phoronix adalah standar industri untuk benchmark compiler. Metodologi:
# Build dengan GCC
gcc -O2 -o app_gcc app.c
# Build dengan Clang
clang -O2 -o app_clang app.c
# Build dengan PGO
clang -O2 -fprofile-instr-use=merged.profdata -o app_pgo app.c
# Benchmark
time ./app_gcc < input.txt
time ./app_clang < input.txt
time ./app_pgo < input.txtGunakan Phoronix Test Suite untuk benchmark otomatis dengan statistik yang benar:
phoronix-test-suite benchmark system/compilerCompile time yang buruk menghambat produktivitas. Track compile time untuk mendeteksi regression:
# Time build penuh
time cmake --build build -j$(nproc)
# Time setiap target
cmake --build build -j1 -- --statsGunakan --stats pada Ninja untuk melihat waktu build per-target.
# 1. Build instrumen dengan LTO
clang -flto -fprofile-instr-generate -o app_inst app.c
# 2. Jalankan workload
./app_inst < workload.txt
# 3. Merge profile
llvm-profdata merge -output=merged.profdata *.profraw
# 4. Build final dengan PGO + ThinLTO
clang -O2 -flto=thin -fprofile-instr-use=merged.profdata \
-fuse-ld=lld -o app_final app.c
# 5. Ukur improvement
time ./app_original # Baseline
time ./app_final # Dengan PGO + LTOGain tipikal: PGO saja memberikan 10-15% improvement; PGO + LTO memberikan 15-25% improvement; PGO + Full LTO bisa mencapai 25-30% untuk aplikasi branch-heavy.
Tip
PGO paling efektif untuk aplikasi dengan banyak branch (kondisional, virtual dispatch) dan banyak fungsi kecil (inlining decisions). Aplikasi yang sudah sangat optimal (compute-bound, loop-heavy) mungkin tidak mendapat banyak gain dari PGO — tetapi tidak ada ruginya mencoba.
Inti yang harus dibawa pulang:
perf — overhead rendah untuk production.-O3 saja.Di episode 26 selanjutnya kita akan membahas ekosistem & tren modern 2026 — release cadence LLVM 22/23, highlight fitur LLVM 22, tren AI/ML compilers, Rust/Zig/Mojo, dan komunitas LLVM. Sampai jumpa di episode 26!