Optimizasyon Seviyeleri
BERK derleyicisi, LLVM optimizer kullanarak kodunuzu maksimum performans için optimize eder.
Optimizasyon Seviyeleri
| Seviye | Bayrak | Kullanım | Derleme | Performans | Binary Boyutu |
|---|---|---|---|---|---|
| O0 | -O0 | Debug | 🚀 Çok Hızlı | 🐌 Yavaş | 📦 Büyük |
| O1 | -O1 | Temel | ⚡ Hızlı | ⚡ Orta | 📦 Orta |
| O2 | -O2 | Varsayılan | 🐌 Yavaş | 🚀 Hızlı | 📦 Küçük |
| O3 | -O3 | Maksimum | 🐌 En Yavaş | 🚀 En Hızlı | 📦 Değişken |
-O0 (Optimizasyon Yok)
berk-lang build --opt=0 program.berk
# veya
berk-lang build -O0 program.berk
Özellikler:
- ✅ En hızlı derleme süresi
- ✅ Debug sembolleri korunur
- ✅ Stack trace doğru
- ❌ Çok yavaş çalışma
- ❌ Büyük binary boyutu
Kullanım Alanı: Geliştirme ve debugging
-O1 (Temel Optimizasyonlar)
berk-lang build --opt=1 program.berk
Uygulanan Optimizasyonlar:
- Constant folding:
5 + 10→15 - Dead code elimination: Kullanılmayan kod silinir
- Basic inlining: Çok küçük fonksiyonlar inline edilir
- Register allocation: Değişkenler register'lara atanır
Performans: ~2-5x hızlanma (O0'a göre)
-O2 (Tam Optimizasyon - Varsayılan)
berk-lang build --opt=2 program.berk
# veya sadece
berk-lang build --release program.berk
Uygulanan Optimizasyonlar:
- Tüm O1 optimizasyonları
- Loop optimization: Döngü hızlandırma
- Function inlining: Orta boyutlu fonksiyonlar
- Vectorization: SIMD instruction'ları
- Tail call optimization: Recursive call'ları optimize et
- Common subexpression elimination
Performans: ~10-20x hızlanma (O0'a göre)
-O3 (Agresif Optimizasyon)
berk-lang build --opt=3 program.berk
Uygulanan Optimizasyonlar:
- Tüm O2 optimizasyonları
- Aggressive inlining: Büyük fonksiyonlar bile inline
- Loop unrolling: Döngüleri açar
- Speculative execution
- Interprocedural optimization
Performans: ~15-30x hızlanma (O0'a göre)
⚠️ Dikkat: Derleme süresi çok uzun, binary boyutu artabilir
Özel Optimizasyonlar
LTO (Link-Time Optimization)
Tüm modüller birlikte optimize edilir:
berk-lang build --lto program.berk
Avantajlar:
- Cross-module inlining
- Dead code elimination (tüm program)
- %10-30 performans artışı
Dezavantaj: Çok uzun derleme süresi
PGO (Profile-Guided Optimization)
Programı çalıştırarak profil toplar, sonra optimize eder:
# 1. Profiling için derle
berk-lang build --profile-generate program.berk -o program.exe
# 2. Programı çalıştır (profil topla)
./program.exe
# 3. Profil kullanarak optimize et
berk-lang build --profile-use=default.profdata program.berk -o program_optimized.exe
Performans: %15-40 ek hızlanma
Size Optimization
Binary boyutunu küçültmek için:
# Boyut optimizasyonu
berk-lang build --opt-size program.berk
# Aggressive size optimization
berk-lang build --opt-size-aggressive program.berk
# Strip sembolleri
berk-lang build --strip program.berk
Sonuç: %30-70 daha küçük binary
Optimizasyon Teknikleri
Constant Folding
// Kaynak kod
değişken x = 5 + 10 * 2
// Optimize sonrası
değişken x = 25
Dead Code Elimination
// Kaynak kod
fonksiyon hesapla() -> sayı yap
değişken x = 10
değişken y = 20 // Kullanılmıyor
dön x
son
// Optimize sonrası
fonksiyon hesapla() -> sayı yap
dön 10
son
Function Inlining
// Kaynak kod
fonksiyon topla(a: sayı, b: sayı) -> sayı yap
dön a + b
son
değişken sonuç = topla(5, 10)
// Optimize sonrası (O2+)
değişken sonuç = 15 // Fonksiyon çağrısı yok!
Loop Unrolling
// Kaynak kod
için i 0'dan 4'e yap
yazdir(i)
son
// Optimize sonrası (O3)
yazdir(0)
yazdir(1)
yazdir(2)
yazdir(3)
Vectorization (SIMD)
// Kaynak kod
değişken a: [sayı; 4] = [1, 2, 3, 4]
değişken b: [sayı; 4] = [5, 6, 7, 8]
değişken c: [sayı; 4]
için i 0'dan 4'e yap
c[i] = a[i] + b[i]
son
// Optimize sonrası (O2+ SIMD)
// Tek SIMD instruction ile 4 toplama birden!
// paddq xmm0, xmm1
Optimizasyon Kontrolü
Belirli Optimizasyonları Aktif/Deaktif Et
# Inlining'i kapat
berk-lang build -O2 --no-inline program.berk
# Vectorization'ı kapat
berk-lang build -O2 --no-vectorize program.berk
# Loop unrolling'i kapat
berk-lang build -O3 --no-unroll-loops program.berk
Fonksiyon Bazlı Optimizasyon
// Bu fonksiyonu inline etme
#[no_inline]
fonksiyon debug_fonksiyon() yap
// debug kodu
son
// Bu fonksiyonu her zaman inline et
#[always_inline]
fonksiyon hızlı_işlem() yap
// kritik kod
son
Performans Karşılaştırması
Test: Fibonacci(40) hesaplama
| Seviye | Süre | Hızlanma | Derleme Süresi | Binary Boyutu |
|---|---|---|---|---|
| -O0 | 2.5s | 1x | 0.1s | 250 KB |
| -O1 | 0.8s | 3x | 0.2s | 180 KB |
| -O2 | 0.12s | 21x | 0.5s | 120 KB |
| -O3 | 0.09s | 28x | 1.2s | 140 KB |
| -O3 --lto | 0.07s | 36x | 3.5s | 110 KB |
Hangi Seviyeyi Kullanmalı?
| Durum | Öneri | Neden |
|---|---|---|
| 🔧 Geliştirme | -O0 | Hızlı derleme, kolay debug |
| 🧪 Test | -O1 | Orta performans, hızlı derleme |
| 🚀 Production | -O2 | İyi performans, makul derleme |
| 🏆 Maksimum Hız | -O3 --lto | En iyi performans |
| 📦 Küçük Binary | --opt-size | Embedded sistemler |
berk.toml Yapılandırması
[build]
optimization = 2 # Varsayılan: O2
lto = true # Link-Time Optimization
strip = false # Debug sembolleri koru
[profile.dev]
optimization = 0
debug = true
[profile.release]
optimization = 3
lto = true
strip = true
[profile.bench]
optimization = 3
lto = true
pgo = true
Profil Kullanımı
# Dev profili
berk-lang build --profile=dev program.berk
# Release profili
berk-lang build --profile=release program.berk
# Bench profili
berk-lang build --profile=bench program.berk
Optimizasyon İpuçları
-
✅ Release build kullanın:
berk-lang build --release program.berk -
✅ LTO ekleyin (production için):
berk-lang build --release --lto program.berk -
✅ PGO kullanın (kritik uygulamalar):
berk-lang build --profile-generate program.berk ./program.exe # Profil topla berk-lang build --profile-use=default.profdata program.berk -
⚠️ O3 dikkatli: Bazen O2'den daha yavaş olabilir
-
⚠️ Binary boyutu önemliyse:
--opt-sizekullanın
Özet
- ✅ -O0: Debug, hızlı derleme
- ✅ -O1: Temel optimizasyon
- ✅ -O2: Production (varsayılan)
- ✅ -O3: Maksimum hız
- ✅ --lto: +%10-30 performans
- ✅ --pgo: +%15-40 performans
- ✅ --opt-size: Küçük binary