Performans yoğun bir kritik yolu olan bir uygulamanız olduğunda, hafızayı nasıl ele aldığınızı düşünmelisiniz. Son kullanıcı istemci tarafı uygulamalarının çoğu bu olaya dahil değildir, çünkü bunlar birincil olay güdümlüdür ve çoğu olay kullanıcı ile etkileşimlerden gelir ve bu kadar çok (hiç varsa) performans kısıtlamasına sahip değildir.
Ancak, çok sayıda arka uç yazılım hafızanın nasıl ele alındığına biraz odaklanmalıdır, çünkü bu yazılımın birçoğu daha fazla sayıda istemci, çok sayıda işlem, daha fazla veri kaynağı işlemek için ölçeklenebilir. sınırları zorlayarak, yazılım kullanıcılarınızın nasıl bellek kullanabileceğini analiz etmeye başlayabilir ve akla gelebilecek herhangi bir kullanım durumunu işlemek için yazılmış tamamen genel bir bellek ayırıcısına güvenmek yerine yazılımınıza göre özel tahsis düzenleri yazabilirsiniz.
Size birkaç örnek vermek gerekirse ... ilk şirketimde, bir Historian paketinde, süreç kontrol verilerinin toplanmasından / depolanmasından / arşivlenmesinden sorumlu yazılım üzerinde çalıştım (10 milyonlarca sensörlü bir fabrika, nükleer santral veya petrol rafinerisi düşünün, bu verileri depolarız). Tarihçinin daha fazla veri işlemesini engelleyen herhangi bir performans darboğazını analiz ettiğimizde, çoğu zaman problem hafızanın nasıl işlendiği ile ilgiliydi. Kesinlikle gerekli olmadıkça malloc / free'in çağrılmadığından emin olmak için büyük çaba sarf ettik.
Şu anki işimde gözetim video dijital kaydedici ve analiz paketi üzerinde çalışıyorum. 30 fps'de her kanal, her 33 milisaniyede bir video karesi alır. Sattığımız donanımda 100 kanallı videoyu kolayca kaydedebiliriz. Bu, kritik yolda (ağ çağrısı => yakalama bileşenleri => kayıt cihazı yönetim yazılımı => depolama bileşenleri => disk) herhangi bir dinamik bellek ayırma olmadığından emin olmak için başka bir durumdur. Sabit boyutlu arabellek kovaları içeren ve daha önce ayrılmış arabellekleri yeniden kullanmak için LIFO kullanan özel bir çerçeve ayırıcıya sahibiz. 600Kb depolama alanına ihtiyacınız varsa, boşa harcanan 1024Kb tampon ile sonuçlanabilir, ancak her tahsisin çok kısa ömürlü olduğu yerlerde kullanımımız için özel olarak tasarlandığından, tampon kullanıldığı için çok iyi çalışır,
Tanımladığım uygulama türünde (çok fazla veriyi A'dan B'ye taşımak ve çok sayıda istemci isteğini işlemek) öbeğe ve arkaya gitmek CPU performansı darboğazlarının önemli bir kaynağıdır. Öbek parçalanmasını minimumda tutmak ikincil bir faydadır, ancak çoğu modern işletim sisteminin zaten düşük parçalanma yığınları uyguladığını söyleyebildiğim kadarıyla (en azından Windows'un yaptığını biliyorum ve diğerlerinin de yapmasını umuyorum). Şahsen, bu tür ortamlarda çalışan 12+ yılda, yığınla ilgili CPU kullanım sorunlarını oldukça sık gördüm, bir zamanlar aslında parçalanmış yığından muzdarip bir sistem görmedim.