CPU, Bellek ve Cache: Performans Nerede Kaybolur?
İşlemci, RAM, cache, register ve locality kavramlarını yavaş bir veri işleme örneği üzerinden anlayın.
İki algoritma aynı sayıda toplama yaptığı hâlde neden biri daha hızlı olabilir? Çünkü modern bilgisayarda maliyet yalnızca hesaplama değildir; veriyi işlemciye getirmek de zaman alır.
Bellek hiyerarşisi
Hızlı depolama küçük ve pahalı, büyük depolama ise görece yavaştır. Bu yüzden sistem katmanlıdır:
- Register: CPU çekirdeğinin doğrudan kullandığı çok küçük alan.
- L1/L2/L3 cache: Sık kullanılan veri ve talimatların hızlı kopyaları.
- RAM: Çalışan programların ana belleği.
- SSD/disk: Kalıcı fakat RAM’den yavaş depolama.
CPU ihtiyaç duyduğu veriyi cache’te bulursa cache hit, bulamazsa cache miss oluşur ve daha yavaş katmana gider.
Locality nedir?
Temporal locality, yakın zamanda kullanılan verinin tekrar kullanılma ihtimalidir. Spatial locality, bir verinin yakınındaki verilerin yakında kullanılma ihtimalidir. Cache’ler bu iki gözleme dayanır.
Bir diziyi baştan sona dolaşmak spatial locality’den yararlanır; elemanlar bellekte ardışık tutulur. Bağlı listedeki düğümler belleğin farklı yerlerine dağılabilir ve daha çok cache miss üretebilir. Bu nedenle Big-O’su aynı iki çözüm pratikte farklı hızlara sahip olabilir.
let total = 0;
for (const value of values) {
total += value;
}
total sık kullanıldığı için register’da tutulabilir. Döngü values elemanlarını sırayla okur; işlemci henüz istenmeden sıradaki bellek bloklarını cache’e getirebilir. Buna prefetching (önceden getirme) denir. Tahmin doğruysa CPU daha az bekler; yanlışsa boşuna veri taşınmış olur.
Ölçmeden optimize etmeyin
Yavaşlığın CPU, disk, ağ, kilit bekleme veya gereksiz bellek tahsisinden kaynaklandığını profiler, yani programın zamanı ve belleği nerede harcadığını ölçen araç ile belirlemek gerekir. Mikro benchmark, tek bir küçük işlemi tekrar tekrar ölçen deneydir; çalışma zamanı ısınması, JIT derlemesi ve işletim sistemi cache’i yüzünden yanıltabilir. Gerçek veri boyutunu ve üretime benzer yükü kullanın.
Alternatifler ve seçim
Daha iyi algoritma çoğu zaman cache optimizasyonundan büyük kazanç sağlar. Önce gereksiz işi azaltın, sonra veri yapısını değerlendirin, en son düşük seviyeli optimizasyona geçin. Okunabilirliği birkaç nanosaniye için bozmak yalnızca ölçüm bu maliyetin önemli olduğunu gösteriyorsa anlamlıdır.
Kendin dene
Büyük bir matrisi önce satır satır, sonra sütun sütun toplayın. Aynı elemanlar işlendiği hâlde bellek yerleşiminin süreyi nasıl etkileyebildiğini ölçün.