Laravel'in preload eğrisi: 123 dosya, 1.912 dosyadan sekiz kat fazla kazandırıyor
Laravel için elle seçilmiş bir preload nereye kadar iner, ve her dilim ne kadar açılış bedeline mal olur?
Bulgu
Eğri hacimle orantılı değil. İlk 1.592 dosya (Laravel çekirdeği) 30 ms kazandırıyor ve açılışa 1,2 saniye ekliyor. Sonraki 1.094 Symfony dosyası 9,5 ms kazandırıyor, bedava. Ondan sonraki **123 dosya** (psr, carbon) 15,7 ms kazandırıyor — kendinden önceki 1.094 dosyadan fazla. Ve son 1.912 dosya yalnız 1,8 ms kazandırıp açılışa 1,2 saniye daha yazıyor. Yani önceki kaydın tavan olarak ölçtüğü "hepsini derle", eğrinin başlangıç noktası dışındaki en kötü fiyat/performans bölgesi: 2.809 dosyada durmak 12,77 ms ve 1.514 ms açılış verirken, 4.721 dosya 10,96 ms için 2.691 ms istiyor.
- Tatlı nokta: 2.809 dosya
- 12,77 ms −%81
- Aynı noktanın açılış bedeli
- +1.132 ms
- 123 dosyalık dilimin kazancı
- 15,7 ms
- Son 1.912 dosyanın kazancı
- 1,8 ms
Yöntem
opcache ölçümüyle aynı imajlar, aynı PHP 8.4 derlemesi, aynı ölçüm noktası — konteynerin sunduğu ilk istek. Küratörlük elle seçilmiş bir sınıf listesi değil, Composer classmap'i üzerinde bir **yol filtresi**: elle seçilmiş liste tekrar edilemez, filtre edilebilir. Beş varyant kasıtlı olarak iç içe (framework ⊂ +symfony ⊂ +psr/carbon ⊂ hepsi), böylece eğri "şunu da ekleyince" diye okunuyor, dört bağımsız nokta olarak değil. Her varyant için taze konteyner, üç tekrar, medyan. Preload php-fpm'in master sürecinde koştuğu için bedeli konteynerin ilk 200 yanıtı verene kadar geçen sürede ölçülüyor; bu pencere nginx'in açılışını da içeriyor ama beş varyantta da aynı sabit.
- Ölçüm tarihi
- Yayın
dün ölçüldü
Ortam
- PHP
- 8.4.24 NTS · opcache açık · JIT kapalı
- Uygulama
- Laravel, production kurulumu, classmap-authoritative
- Varyant
- classmap üzerinde yol filtresi · beş dilim, iç içe
- Tekrar
- 3 · medyan raporlanır
- Donanım
- Apple M4 Pro · 12 çekirdek · Docker Desktop 29.7.2 · aarch64
Teknolojiler
Tekrarlamak için
REPEATS=3 ./bench/preload-curate.sh opcache ölçümü Laravel’i iki nokta arasında bıraktı: resmî preload dosyası yok, soğuk ilk istek 76 ms, ve classmap’ten körlemesine üretilen preload 14 ms’ye indiriyor ama php-fpm’in açılışına 2,3 saniye ekliyor. O kayıt bunu “tavan” diye ölçtü. Bu kayıt aradaki eğriyi çıkarıyor — ve tavanın aslında kötü bir seçim olduğunu gösteriyor.
Eğri
Soğuk ilk istek, preload edilen dosya sayısına göre
Beş varyant iç içe: her nokta bir öncekine dilim ekliyor. Yatay eksen derlenen dosya sayısı.
ms düşük olan iyi Kaynak: bench/preload-curate.sh, üç tekrarın medyanı
Veri tablosu
| Seri | 0 | 1.592 | 2.686 | 2.809 | 4.721 |
|---|---|---|---|---|---|
| soğuk ilk istek | 68,37 ms | 38,01 ms | 28,48 ms | 12,77 ms | 10,96 ms |
Grafik tarayıcıda çizilir; aşağıdaki tablo aynı veriyi taşır.
| Dilim | Derlenen | Soğuk istek | fpm hazır | Marjinal kazanç | Marjinal bedel |
|---|---|---|---|---|---|
| preload yok | 0 | 68,37 ms | 382 ms | — | — |
| laravel/framework | 1.592 | 38,01 ms | 1.553 ms | −30,4 ms | +1.171 ms |
| + symfony | 2.686 | 28,48 ms | 1.538 ms | −9,5 ms | bedava |
| + psr, carbon tatlı nokta | 2.809 | 12,77 ms | 1.514 ms | −15,7 ms | bedava |
| hepsi | 4.721 | 10,96 ms | 2.691 ms | −1,8 ms | +1.177 ms |
Kaç değil, hangisi
Eğrinin şekli hacimle orantılı değil ve bu, kaydın asıl bulgusu.
123 dosya, 1.912 dosyadan sekiz kat fazla kazandırıyor. psr ve carbon
dilimi yalnız 123 dosya ekliyor ve soğuk isteği 28,48’den 12,77 ms’ye düşürüyor.
Ondan sonra gelen 1.912 dosya yalnız 1,8 ms alıyor.
Sebep tarih işlemede: Laravel’in ilk isteği Carbon’un yükleme zincirini tetikliyor ve o zincir derinden bağlantılı — preload edilmediğinde her istekte yeniden çözülüyor. Bir framework’ün “ağır” olması, çok dosyası olması değil; ilk istekte hangi ağacı yürüdüğü.
”Hepsini derle” en kötü seçim
Önceki kayıt classmap tavanını iyimser bir üst sınır gibi ölçmüştü. Eğri onu başka türlü gösteriyor: 4.721 dosya, 2.809 dosyaya göre 1,8 ms kazandırıp 1.177 ms açılış ekliyor. Yani son dilimin fiyatı, kazandırdığı milisaniye başına 654 milisaniye.
Günde on kez deploy eden bir servis için bu, günde on iki saniyelik bir açılış gecikmesi karşılığında ilk ziyaretçiye 1,8 ms. Sürekli trafiği olan bir serviste bile takas zayıf.
Symfony’ye yetişemiyor
Symfony kendi resmî dosyasıyla 2,50 ms’ye iniyor. Laravel’in en iyi noktası 10,96 ms — dört kat geride, ve hepsini preload etmesine rağmen.
Fark yapısal: Symfony’nin preload dosyası derlenmiş container’ından üretiliyor, yani servis tanımlarının çözümü zaten derleme anında yapılmış durumda. Laravel’in service container’ı çalışma anında çözüyor ve preload o işi ortadan kaldırmıyor, yalnız sınıf derlemesini kaldırıyor. Preload PHP kaynağını derlemekten kurtarır, uygulamanın kendi kurulum işinden kurtarmaz.
Laravel’in eksik dosyası
Bu ölçümün bıraktığı şey bir sayı değil, bir dosya: Laravel için ^/vendor/(laravel\/framework|symfony|psr|nesbot|carbon)/ filtresiyle üretilen preload, 12,77 ms ve 1,5 saniyelik açılışla, framework’ün kendisinin yayınlamadığı şeyi veriyor. Üretici script depoda duruyor ve herhangi bir Laravel uygulamasında koşuyor.
İlgili yazılar
Laravel'le on iki yıl: bir framework'le büyümek
2014'ten 2026'ya Laravel ile geçirilen on iki yıl: bir araçla birlikte olgunlaşmanın, onu aşmanın ve yeniden benimsemenin hikâyesi.
2026'da PHP ile uygulama geliştirmek: ekosistemin hali
PHP'nin 2026'daki gerçek durumu: dil olgunluğu, ekosistem sağlığı ve 'öldü' söyleminin neden hâlâ yanlış olduğu.