Brotli'nin 1-11 arasındaki seviyeleri sıkıştırma oranı ve CPU maliyeti açısından farklı davranır. Statik sıkıştırmada seviye 11 mantıklı bir varsayılandır; dinamik sıkıştırmada ise seviye 4-6 aralığı genellikle daha dengeli bir tercih sunar.

Brotli Sıkıştırma Seviyeleri Arasında Gerçek Fark Var mı?

Brotli'nin 11. seviyesi gzip'e kıyasla anlamlı biçimde daha küçük dosyalar üretir; bu yüzden pek çok geliştirici kurulumda doğrudan en yüksek seviyeyi tercih eder. Ancak seviye 11 ile seviye 6 arasındaki boyut farkı çoğu metin dosyasında yalnızca birkaç yüzde noktası aralığında kalır, CPU maliyeti ise katlanarak artar. Asıl karar tek bir seviye numarası seçmek değil, hangi dosyanın ne zaman sıkıştırıldığını bilmek üzerine kurulur.

Sıkıştırma seviyesi tartışmaları genellikle iki uç etrafında döner: "en yüksek seviyeyi kullan, bandwidth sınırsız değil" ile "sunucu CPU'su daha önemli, düşük seviye yeterlidir." İkisi de kısmen doğru; ama hangi senaryoda hangisinin ağır bastığını anlamak için seviyelere somut olarak bakmak gerekir.

Brotli'nin statik ve dinamik kullanımı bu tartışmayı ikiye böler. Statik sıkıştırmada CPU maliyeti yalnızca bir kez ödenir; dinamik sıkıştırmada her istek farklı bir maliyet taşır. Seviye seçimi bu iki senaryoda farklı mantıkla yapılır ve aynı numaranın her ortamda geçerli olmadığı kolayca gözden kaçar.

1'den 11'e: Brotli seviyeleri arasında ne değişir?

Brotli, temel olarak üç bileşeni bir arada kullanır: LZ77 türevi bir geri referans penceresi, Huffman kodlaması ve ikinci dereceden bağlam modellemesi. Seviye arttıkça algoritma bu bileşenlerin her birinde daha uzun pencereler tarar, daha karmaşık referans tabloları tutar ve bağlam modelini genişletir.

Seviye 1-3 arası hızlı mod olarak da anılır; bu aralıkta pencere boyutu küçük tutulur, geri referans araması sınırlı kalır. Seviye 4-6 orta aralıktır: gzip ile kıyaslanabilir CPU maliyetiyle daha iyi sıkıştırma oranı sağlar. Seviye 7-9, özellikle tekrarlı içerikte belirgin küçülmeler üretir ancak CPU kullanımı doğrusal değil, kademeli artar. Seviye 10 ve 11 referans algoritmasının tam kapasitesini kullanır; sıkıştırma süresi seviye 6'ya kıyasla birçok dosya türünde 5-15 kat uzayabilir.

Seviye 11 her dosya türünde seviye 6'dan belirgin biçimde küçük çıkmaz. HTML, CSS ve JSON gibi yüksek tekrar barındıran formatlarda fark görünür; ama küçük dosyalarda veya düşük tekrarlılığa sahip içeriklerde ek kazanım marjinal kalır. 50 KB altındaki dosyalarda seviye 6 ile 11 arasındaki boyut farkı birkaç kilobaytı nadiren aşar.

Sıkıştırma penceresini de hesaba katmak gerekir. Brotli'nin en yüksek seviyelerinde kullandığı, 16 MB'a kadar çıkabilen pencere boyutu, büyük dosyalarda veya benzer örüntülerin uzak mesafelerde tekrarlandığı içeriklerde seviye atlayışını daha değerli kılar. Küçük dosyalar bu büyük pencereden faydalanamaz; referans alınacak veri yoktur.

Sıkıştırma oranı ve CPU dengesi: rakamlara bakarken ne görülür?

Brotli referans implementasyonunun açık kaynaklı kıyaslamalarına göre seviye 1 ile 11 arasında tipik bir HTML dosyasında sıkıştırılmış boyut farkı yaklaşık %10-18 aralığında seyreder. Seviye 6'dan 11'e geçişte bu fark genellikle %3-7 bandına düşer; küçük ve orta boyutlu dosyalarda daha da daralır.

CPU süresine bakıldığında tablo tersine döner. Seviye 1, seviye 6'ya göre yaklaşık 10-20 kat daha hızlı çalışır. Seviye 11, seviye 6'ya göre 5-15 kat daha yavaş olabilir; bu oran dosya boyutuna, içerik türüne ve donanıma göre değişir. En yüksek seviyeye çıktığınızda elde ettiğiniz boyut kazancı marjinal kalırken CPU süresi önemli ölçüde artar.

Şöyle bir denklem kurulabilir: 100 KB'lik bir CSS dosyasını seviye 6 yerine seviye 11 ile sıkıştırırsanız transfer süresi birkaç milisaniye kazanır; sıkıştırma için harcanan CPU süresi ise çok daha uzundur. Dinamik sıkıştırmada bu maliyet her istek için yeniden ödenir. Statik sıkıştırmada bir kez ödenir ve servis sürecine yansımaz.

Gzip ile karşılaştırma konusu ayrı bir katman ekler. Brotli seviye 6, gzip seviye 9'a yakın boyutlar üretirken genellikle benzer ya da biraz daha kısa CPU süresine sahiptir; bu nedenle "gzip zaten yeterliydi" argümanı seviye tartışmasından bağımsız ele alınmalıdır. İki algoritma arasındaki fark, seviyeler arasındaki farktan çoğunlukla daha büyüktür.

Dinamik sıkıştırma: seviye seçiminin TTFB üzerindeki izi

Dinamik sıkıştırma, her HTTP isteğinde sunucunun yanıtı anlık olarak sıkıştırdığı senaryodur. Sıkıştırma maliyeti bu durumda doğrudan TTFB'ye yansır; yüksek trafik altında bu maliyet birikir ve ölçülebilir hale gelir.

Nginx'te brotli_comp_level direktifiyle seviye ayarlanır. Yaygın öneri seviye 4-6 aralığıdır; bu aralık gzip seviye 6'ya göre daha iyi sıkıştırma sunarken CPU süresi ciddi biçimde artmaz. Yüksek trafikli ve küçük yanıtlara sahip API'lerde seviye 1-3 tercih edilebilir; sıkıştırma kazancı düşük olsa bile gzip'e kıyasla dosya boyutunu azaltır.

Önbellek davranışı da hesaba katılmalıdır. Yanıt önbelleğe alınıyorsa sıkıştırma maliyeti yalnızca ilk istekte ödenir; sonraki istekler hazır sıkıştırılmış yanıtı alır. Cache hit oranı yüksek sayfalarda seviye 6 veya üstü kullanmak mantıklıdır. Önbellekten geçmeyen dinamik sayfalar ve sık değişen API endpoint'leri için daha düşük seviyeler tercih edilebilir.

Sıkıştırma seviyesinin TTFB'ye gerçekten ne kadar etki ettiğini ölçmek isterseniz, sunucuda bir süre farklı seviyelerle çalışarak yanıt süresi ve transfer boyutu verilerini karşılaştırabilirsiniz. Çoğu durumda seviye 4 ile seviye 6 arasındaki boyut farkı yüzde birkaçı geçmez; yüksek trafikli ortamlarda bu oran anlamlı bir bandwidth tasarrufu anlamına gelebilir.

Statik sıkıştırma: build zamanında seviye 11 kullanmak ne kazandırır?

Statik sıkıştırma, dosyaların dağıtım öncesinde hazırlandığı ve sunucunun bu dosyaları doğrudan servis ettiği yöntemdir. Nginx'teki brotli_static on direktifi, .br uzantılı dosya varsa onu otomatik olarak gönderir; dinamik sıkıştırma devreye girmez.

CPU maliyeti yalnızca bir kez ödenir. Build pipeline'ına eklenen bir adım tüm JS, CSS ve HTML dosyalarını seviye 11 ile sıkıştırır; bu işlem birkaç saniye ile birkaç dakika arasında tamamlanır ve servis sırasında sunucuya ek yük getirmez. Statik sıkıştırmada seviye 11 bu nedenle makul varsayılandır.

Seviye 11 ile üretilen statik dosyalar genellikle seviye 6'ya kıyasla yaklaşık %3-8 daha küçük çıkar. Büyük bundle'lar için bu fark daha anlamlıdır: 400-500 KB'lik bir JavaScript dosyasında yüzde 5'lik küçülme 20-25 KB demektir. Mobil bağlantıda bu farkın transfer süresine yansıması ölçülebilir olabilir, özellikle yavaş ağ koşullarında.

Araç seçeneği geniştir. brotli komut satırı aracı, Webpack'in compression-webpack-plugin'i veya Vite eklentileri kullanılabilir. Çıktı dosyaları .br uzantısıyla oluşturulur; hem orijinal hem de sıkıştırılmış sürümü saklarsanız sunucu, tarayıcı desteğine göre hangisini göndereceğine kendisi karar verir.

CDN kullanıyorsanız edge sıkıştırması denklemi değiştirir

CDN kullanan yapılarda sıkıştırma kararını genellikle edge düğümü verir. Kaynak sunucudan gelen yanıt sıkıştırılmamışsa CDN kendi iç seviyesiyle sıkıştırır; sıkıştırılmışsa büyük olasılıkla olduğu gibi iletir. Her CDN sağlayıcısının bu davranışı farklıdır ve bazı sağlayıcılar geliştiriciye bu kararı bırakmaz.

Statik dosyalarınızı önceden .br olarak CDN'e push ediyorsanız CDN'nin yeniden sıkıştırması söz konusu olmaz; edge sunucular hazır dosyayı doğrudan servis eder. Seviye 11 ile üretilmiş dosyalar bu durumda tam olarak tarayıcıya ulaşır, edge'de ek CPU kullanılmaz.

CDN'nin dinamik sıkıştırma yaptığı durumlarda hangi seviyeyi kullandığını dışarıdan belirleyemezsiniz; bu genellikle sağlayıcının iç tercihine bırakılır. Bazı sağlayıcılar ayarlanabilir sıkıştırma seviyesi sunar, bir kısmı sunmaz. Kaynak sunucu ile CDN arasındaki bağlantıda brotli desteklenmiyorsa gzip devreye girebilir; bu da tarayıcıya gzip ile veri gönderilmesi anlamına gelir.

Gerçek sıkıştırma türünü doğrulamak için yanıt başlıklarına bakmak yeterlidir. Content-Encoding: br brotli kullanıldığını gösterir; Content-Encoding: gzip ise gzip devreye girdiğini. curl ile veya tarayıcı geliştirici araçlarının Network sekmesinde bu başlığı kolayca görebilirsiniz. Varsaymak yerine ölçmek, seviye kararının önünde gelir.

Üretimde seviye kararı: koşula göre değişen bir tablo

Seviye seçimi tek bir kuralla özetlenemez. Dinamik sıkıştırma kullanıyorsanız ve önbelleğe alınan yanıtlar azsa, seviye 4-6 dengeli bir başlangıç noktasıdır. Sunucu CPU kullanımı kritik bir kısıt haline geliyorsa seviye 1-3'e inmek mantıklıdır; elde edilen boyut kazancı küçük olsa bile gzip'in yerini alır. Büyük ve yavaş değişen dinamik sayfalar için seviye 6'ya kadar çıkmak, anlamlı sıkıştırma sağlar.

Statik sıkıştırmada kural daha basittir. Build adımına maliyet yoktur; dolayısıyla seviye 11 varsayılan olarak kullanılabilir. Büyük dosyalarda ek kazanım kesin değildir ama bedava gelir. Küçük dosyalarda fark görülmeyebilir; ancak zarar da vermez.

Farklı içerik türleri de farklı davranır. Metin tabanlı içerikler, yani HTML, CSS, JS, JSON ve SVG, sıkıştırmadan en çok yararlanan formatlardır. Görseller, fontlar ve video kendi sıkıştırılmış formatlarını taşır; bu dosya türlerine brotli uygulamak boyutu anlamlı biçimde düşürmez ve bu tür varlıkları sıkıştırma kapsamı dışında bırakmak işlemci süresini gereksiz yere tüketmez.

Seviye kararını verirken üç soruyu sormak yeterlidir: Sıkıştırma her istekte mi, yoksa bir kez mi yapılıyor? Dosyalar büyük ve yüksek tekrarlı mı? CPU kullanımı dar boğaz mı? Yanıtlara göre tablo kendiliğinden şekillenir ve tek bir seviye numarasına körce bağlanmak gerekmez.

Brotli seviyelerinin gerçek etkisi büyük ölçüde sıkıştırmanın nerede ve ne zaman gerçekleştiğine bağlıdır. Statik pipeline'da seviye 11 ile hazırlanmış dosyalar ek CPU maliyeti olmaksızın daha küçük transfer boyutu sağlar; dinamik sunucularda ise yük dengesi seviye tercihini doğrudan belirler.

Seviye 6 ile 11 arasındaki farkı gerçek ortamda ölçmek isteyenler için basit bir yöntem işe yarar: aynı dosyayı iki farklı seviyede sıkıştırın, boyutları karşılaştırın, beklediğiniz kazancın gerçekten orada olup olmadığını görün. Sayı küçükse üretimde yüksek seviyeyi zorunlu kılmak için bir neden yoktur.

Sıkıştırma tek başına bandwidth tasarrufu anlamına gelmez; önbellek ömrü, transfer boyutu ve TTFB birlikte değerlendirildiğinde tablo daha net görünür. Seviye kararını bu bağlama oturtursanız sayının sizi yönlendirmesi yerine siz sayıyı yönlendirebilirsiniz.