Performans İpuçları

Web uygulamasında algılanan ve gerçek hızı artıran, en yüksek getirili pratikler. Önce ölçüm — sonra optimizasyon.
Kritik

Önce ölç, sonra optimize et

Neden önemli

Tahmine dayalı optimizasyon zaman israfıdır ve genellikle yanlış yeri hızlandırır. Veri olmadan etki ölçülemez.

Nasıl uygula

Lighthouse / WebPageTest ile lab ölçümü; gerçek kullanıcılar için RUM (Real User Monitoring) — Web Vitals JS, Sentry Performance, New Relic Browser, Application Insights. p75 ve p95 metriklerine bak.

Örnek
p50 hızlı görünür ama p95 yavaşsa kullanıcıların %5'i kötü deneyim yaşıyor demektir.
Yüksek

Core Web Vitals hedeflerini tut: LCP < 2.5s, INP < 200ms, CLS < 0.1

Neden önemli

Google CWV'yi sıralama sinyali olarak kullanır ve kullanıcı algısı doğrudan bunlarla ölçülür. Eşiği geçemezsen hem SEO hem dönüşüm düşer.

Nasıl uygula

LCP için kritik görseli preload + uygun boyut/format. INP için ana iş parçacığını uzun bloklardan koru (web worker, code split). CLS için görsel/iframe için boyut zorunlu, font swap stratejisi.

Örnek
<img width="1200" height="630" loading="eager" fetchpriority="high"> ile hero LCP'sini 500ms düşürmek mümkün.
Yüksek

Görselleri modern formatta ve doğru boyutta sun

Neden önemli

Görseller toplam payload'ın genelde %50+ ini oluşturur. PNG/JPG yerine AVIF/WebP %30–80 küçülme verir. Yanlış boyut indirip CSS ile küçültmek bandwidth israfıdır.

Nasıl uygula

<picture> ile AVIF→WebP→JPEG fallback. srcset/sizes ile responsive. Foldun altındaki görsellere loading="lazy". CDN üzerinden on-the-fly resize (Cloudflare Images, ImageKit, Cloudinary).

Örnek
Next.js: <Image>; .NET: ImageSharp.Web ile URL parametreleriyle (?width=800&format=avif) on-demand resize.
Yüksek

JavaScript bundle boyutunu kontrol altında tut

Neden önemli

JS hem indirilir hem parse edilir hem çalıştırılır — üç maliyet. 3G mobil cihazda 200KB JS, 4–6 saniye CPU zamanı demektir.

Nasıl uygula

Code splitting (route bazlı, dynamic import). Tree-shaking. Gereksiz polyfill'lerden kaçın (modern target). Bundle analyzer ile büyük modülleri tespit et. Üçüncü taraf script'leri performans bütçesine dahil et.

Örnek
Hedef: kritik JS < 100KB gzip. moment.js → date-fns/Day.js (~70KB tasarruf). lodash → modüler import.
Kritik

Cache header'ları ve CDN doğru kur

Neden önemli

Statik varlıkların kullanıcıya en yakın noktadan ve cache'ten gelmesi RTT'leri kaldırır. Yanlış header → her seferinde yeniden indirme.

Nasıl uygula

Hash'li dosyalar (app.abc123.js) için Cache-Control: public, max-age=31536000, immutable. HTML için no-cache veya kısa max-age + ETag. CDN katmanını her statik kaynak için aç.

Örnek
Cloudflare/Bunny CDN: cache-everything kuralı + Cache-Control respected. ASP.NET Core: app.UseStaticFiles + ResponseCachingMiddleware.
Kritik

Veritabanında doğru indeksleri oluştur

Neden önemli

Indexsiz sorgular table scan demektir; veri büyüdükçe latency lineer artar ve ürün belli bir noktada 'duvara çarpar'.

Nasıl uygula

EXPLAIN/EXPLAIN ANALYZE ile sorgu planını oku. WHERE/JOIN/ORDER BY kolonları için indeks. Composite indeksleri sıralama önemli; cardinality yüksek kolon önde. Yazım yoğun tablolarda fazla indeks yazma maliyetini artırır — dengele.

Örnek
PostgreSQL: CREATE INDEX CONCURRENTLY ON orders(user_id, created_at DESC); — kullanıcının siparişlerini tarihe göre listeleyen sayfa için.
Yüksek

N+1 sorgu problemini tespit et ve elimine et

Neden önemli

ORM'ler bazen 1 sorgu yerine N+1 sorgu üretir. Sayfa açılışında 100 kullanıcı için 101 sorgu — hem DB hem latency için yıkıcı.

Nasıl uygula

EF Core: .Include / .ThenInclude / projeksyon. Prisma: include / select. Dapper: çoklu sorgu birleştir. Geliştirme ortamında query log'u aç ve kritik sayfaları ölç.

Örnek
EF Core: db.Orders.Include(o => o.Items).ThenInclude(i => i.Product) — tek SQL'de fetch.
Yüksek

Sıkıştırma (Brotli/gzip) ve HTTP/2-3 etkin olsun

Neden önemli

Brotli HTML/JS/CSS'i %15–25 daha küçük tutar. HTTP/2 multiplexing ile head-of-line blocking'i çözer; HTTP/3 (QUIC) mobil ağlarda kayıp toleransı sağlar.

Nasıl uygula

Sunucu/CDN seviyesinde Brotli aç. Görseller zaten sıkıştırılmış olduğu için tekrar sıkıştırma. ASP.NET Core: app.UseResponseCompression + Brotli/Gzip provider'lar.

Örnek
Cloudflare otomatik Brotli sunar. Kestrel/IIS arkasında Response Compression Middleware tipik kullanım.
Orta

Yazı tipi (font) yüklemesini optimize et

Neden önemli

Web fontları render bloklayabilir, CLS'e neden olabilir. Yanlış yüklenirse FOIT (görünmez metin) ya da geç ortaya çıkma yaşanır.

Nasıl uygula

WOFF2 kullan. Sadece kullanılan ağırlık/karakter setlerini al (subsetting). font-display: swap. Kritik fontu <link rel="preload"> ile preload. Variable font'lar tek dosyada birden çok ağırlık.

Örnek
Inter Variable Latin subset (~30KB) tüm ağırlıkları kapsar; Google Fonts yerine self-host hızı artırır + GDPR dostu.
Yüksek

Kritik CSS'i inline et, geri kalanını lazy-load

Neden önemli

Render-blocking CSS LCP'yi geciktirir. Above-the-fold için gerekli minimum CSS inline edilirse ilk paint anında olur.

Nasıl uygula

Critical/critters/penthouse araçlarıyla kritik CSS çıkar. Geri kalan CSS'i media trick ile async yükle: <link rel="preload" as="style" onload="this.rel='stylesheet'">.

Örnek
Tailwind: JIT modunda zaten kullanılan sınıfları üretir; sayfa-bazlı CSS bölmek faydalıdır.
Orta

Üçüncü taraf script'leri bütçe ile yönet

Neden önemli

Analytics, chat widget, A/B testing — her biri ek 50–300KB ve onlarca uzun task. Yönetilmezse ana sayfa hızını yarıya düşürür.

Nasıl uygula

Sadece gerçekten gereken script'leri yükle. Async/defer kullan. Mümkünse Partytown ile ana iş parçacığından çıkar. Üçüncü taraf script'leri Lighthouse 'third-party-summary' ile ölç.

Örnek
Hotjar/FullStory benzeri session replay araçları INP'yi ciddi kötüleştirir; sample rate %5–10'a düşürmek genelde yeterli sinyal verir.
Yüksek

Connection pooling ve eşzamanlı bağlantı limitlerine dikkat

Neden önemli

Her HTTP isteğinde yeni DB bağlantısı açmak çok pahalı; havuz dolarsa istekler kuyruğa girer ve cascading yavaşlama olur.

Nasıl uygula

ORM/driver'da connection pool boyutunu CPU/RAM'a göre ayarla. Dış API çağrılarında HttpClient'i singleton tut (IHttpClientFactory). Async/await zincirini kesintisiz tut.

Örnek
.NET: services.AddHttpClient<ApiClient>(); — handler havuzu otomatik. EF Core: Pooling=true (default), Max Pool Size connection string'de.
Orta

Büyük yanıtları stream et, belleğe alma

Neden önemli

Büyük JSON/dosya'yı tüm belleğe alıp dönmek GC baskısı + bellek tüketimi yaratır; yüksek concurrency'de OOM riski.

Nasıl uygula

ASP.NET Core: IAsyncEnumerable döndür, FileStreamResult kullan. Node: response.pipe(stream). Büyük import/export işlerini queue'ya at.

Örnek
10K satırlık CSV export → arka plan job + signed URL ile sonuç dosyasını sun; sync HTTP'de yapma.
Yüksek

Hot path'lerde cache kullan, geçersiz kılmayı planla

Neden önemli

Aynı sorguyu saniyede 1000 kez çalıştırmak savurganlık. Cache 10–100x kazanç verir ama 'cache invalidation' yazılım mühendisliğinin en zor 2 problemden biridir.

Nasıl uygula

Read-heavy ve nadiren değişen veri: Redis/Memcached cache. Cache key tasarımına dikkat (versiyon ekle). TTL + event-based invalidation kombine. Stale-while-revalidate stratejisi.

Örnek
.NET 9+: HybridCache (memory + distributed) tek API ile. CacheKey: "user:{id}:profile:v2".
Orta

Bellek sızıntılarını uzun-ömürlü uygulamalarda izle

Neden önemli

Server uygulaması haftalarca çalışır. Yavaş büyüyen bir leak (event listener, statik koleksiyon, IDisposable) sonunda restart zorlar veya OOM eder.

Nasıl uygula

Heap snapshot karşılaştırması (dotnet-counters, Visual Studio Diagnostic Tools, Chrome DevTools). IDisposable'ları using ile saraj. Statik koleksiyonlara ekleme yapan kod yolu varsa boundedConcurrentDictionary kullan.

Örnek
ASP.NET: ConfigureAwait gerekmez (sync context yok), ama iptal token'larını her async path'e geçir.