İçeriğe geç
Muhammet Şafak
en

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.

Yüksek güven Tekrarlı ölçüm, denetimli ortam, ham veri paylaşıldı.
Ölçüm tarihi

dün ölçüldü

Yayın

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

PHP opcache Laravel Composer Docker nginx

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
bench/preload-curate.sh, üç tekrarın medyanı
Seri 01.5922.6862.8094.721
soğuk ilk istek 68,37 ms38,01 ms28,48 ms12,77 ms10,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
Marjinal sütunlar bir önceki satıra göre. “Bedava” = açılış farkı ölçüm gürültüsünün içinde.

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

Paylaş:

Diğer Kayıtlar

Tüm kayıtlar

opcache preload deploy faturasını on dört kata kadar siliyor — ama yedi framework'ün beşi onu size vermiyor

`opcache.preload` açıkken yedi PHP framework'ünün deploy sonrası ilk isteği ne kadar sürüyor, bu kazanç neye mal oluyor, ve kimler ona erişebiliyor?

Bulgu

Preload, soğuk ilk isteği 3,5 ile 14,2 kat arasında kısaltıyor: Symfony 35,58 ms'den 2,50 ms'ye, yani Phalcon'un çıplak seviyesine iniyor. Ama yedi adayın yalnız ikisi (Symfony, CodeIgniter) resmî bir preload dosyası yayınlıyor; kalan beşinde kazanç masada duruyor ve kullanıcının kendi yazmasını bekliyor. Yazmak da göründüğü kadar kolay değil: classmap'ten körlemesine üretilen preload Symfony'yi hiç ayağa kaldırmıyor, CodeIgniter'da ise elle seçilmiş resmî dosyadan (3,13 ms) daha kötü sonuç veriyor (5,29 ms). Ve bedel kaybolmuyor: Laravel'in classmap preload'ı ziyaretçiden aldığı 62 ms'yi php-fpm'in ayağa kalkışına 2.340 ms olarak yazıyor.

dün ölçüldü

Yüksek güven

PHP ekosistemi yeni sürümü beklemiyor — ama desteklediğini de söylemiyor

Bir PHP sürümü çıktıktan sonra en çok kurulan 500 Composer paketi onu desteklediğini ne zaman beyan ediyor, ve o beyan ne kadar bilgi taşıyor?

Bulgu

Kurulumların %43,5'i üst sınırı hiç yazmayan bir kısıtla geliyor — `symfony/console` bugün `>=8.4.1` diyor, yani PHP 12'yi de desteklediğini iddia ediyor. Üst sınır yazan 280 paketin 247'si taahhüdünü sürüm daha doğmadan vermiş: `guzzlehttp/guzzle` 8.4'ü Ekim 2020'de, dört yıl önceden kapsamış. Geriye gerçekten bekleyen 33 paket kalıyor, medyanları 325 gün. Ham sayılar sürümden sürüme düşüp 'ekosistem hızlanıyor' diye okunuyor; eşit gözlem penceresinde bakınca trend tersine dönüyor (238 → 215 → 325 gün).

dün doğrulandı

Yüksek güven

Bir PHP framework'ünü kurmanın sabit maliyeti: disk boyutu hiçbir şey söylemiyor

Yedi PHP framework'ü kurulduğunda diskte kaç megabayt, istek başına kaç dosya ve ilk istekte kaç milisaniye tutuyor — ve bu sayılardan hangisi gerçekten yük altındaki hızı öngörüyor?

Bulgu

Disk boyutu hiçbir şey öngörmüyor: Yii2 en büyük vendor'a sahip (34,1 MB) ama istek başına yalnız 62 dosya yüklüyor — sahanın en azlarından. İstek başına dosya sayısı da öngörmüyor: CodeIgniter 96 dosya yükleyip 6.431 istek/sn veriyor, Symfony 224 dosya yükleyip 13.067 veriyor. Gerçekten ayrışan tek şey opcache soğukken ödenen ilk istek: Phalcon 2,2 ms, Laravel 72,2 ms — otuz üç kat. Bu, her deploy'dan sonra ilk ziyaretçinin ödediği derleme faturasıdır ve framework başına birkaç kilobayt değil, onlarca milisaniye tutuyor.

3 gün önce ölçüldü

Yüksek güven

Sitede Ara

Yazı, proje ve sayfalarda arama yapmak için yazmaya başlayın.

Esc ile kapat Pagefind ile güçlendirildi