Uygulamayı yükle
How to install the app on iOS

Follow along with the video below to see how to install our site as a web app on your home screen.

Not: This feature may not be available in some browsers.

Sık Tetiklenen Olaylarda Performans Optimizasyonu: Debounce ve Throttle Çözümleri

batuhanunalir

Aktif üye
Yazar
Katılım
27 Tem 2025
Konular
567
Mesajlar
576
Tepkime puanı
144
Puanları
43
🌟Puan
226
💵Bakiye
0TL

Sık Tetiklenen Olaylarda Performans Optimizasyonu: Debounce ve Throttle Çözümleri​

Web uygulamalarının kullanıcı arayüzlerinde akıcılığı sağlamak, tarayıcı takılmalarının önüne geçmek ve sistem kaynaklarını en verimli şekilde kullanmak, modern ön yüz mimarisinin en temel sorumluluklarından biridir. Kullanıcıların web sayfalarında gerçekleştirdiği bazı eylemler, JavaScript tarafında çok kısa sürede yüzlerce kez tetiklenebilen olaylar üretir. Sayfayı aşağı kaydırma, tarayıcı penceresini yeniden boyutlandırma, bir girdi alanına yazı yazma veya fareyi ekran üzerinde hareket ettirme gibi durumlar bu kontrolsüz tetiklenmelere en net örneklerdir. Eğer bu olayların arkasına ağır sayfa değişimleri, karmaşık veri hesaplamaları veya sunucuya giden ağ istekleri bağlanırsa, tarayıcı iş yükünü kaldıramaz hale gelir ve arayüzde donmalar oluşur. Yazılım mimarisinde bu performans darboğazını aşmak ve kullanıcı deneyimini en üst seviyede tutmak için kullanılan en popüler iki strateji Debounce ve Throttle teknikleridir. Bu yazıda, her iki optimizasyon tekniğinin çalışma mekanizmalarını, aralarındaki yapısal farkları, tarayıcı motoru üzerindeki etkilerini ve hangi senaryoda hangisinin tercih edilmesi gerektiğini derinlemesine inceleyeceğiz.

Kontrolsüz Olay Tetiklenmelerinin Getirdiği Mimari Riskler​

Tarayıcılar, kullanıcının kaydırma veya farenin yer değiştirmesi gibi hareketlerini milisaniyeler seviyesinde takip edecek şekilde tasarlanmıştır. Standart bir kaydırma hareketinde bile ilgili olay fonksiyonu saniyede 60 ile 100 kez arasında tetiklenebilir. Modern ve yüksek yenileme hızına sahip ekranlarda bu sayı çok daha yukarılara çıkmaktadır. Bu kadar yüksek bir frekansla çalışan bir fonksiyona doğrudan mimari bir sınırlama getirilmediğinde, web uygulamasının kararlılığını tehdit eden iki büyük sorun baş gösterir.

İlk sorun, arayüz çizim darboğazı olarak bilinen sayfa düzeninin yeniden hesaplanması ve ekrana çizilmesi sürecidir. Fonksiyon her çalıştığında sayfa üzerindeki bir elementin boyutunu, rengini veya konumunu değiştiriyorsa, tarayıcı motoru sürekli olarak tüm sayfanın geometrisini baştan hesaplamak ve pikselleri yeniden boyamak zorunda kalır. Bu durum işlemciyi tamamen kilitler ve kullanıcının sayfayı kaydırırken takılmalar hissetmesine, hatta tarayıcı sekmesinin tamamen yanıt vermez hale gelmesine neden olur.

İkinci büyük risk ise sunucu kaynaklarının ve ağ bant genişliğinin hoyratça tüketilmesidir. Bir canlı arama çubuğuna yazı yazıldığında, kullanıcının bastığı her harf için sunucuya anında bir API isteği gönderildiğini düşünün. Kullanıcı hızlıca on harfli bir kelime yazdığında, daha kelime tamamlanmadan sunucuya arka arkaya on adet maliyetli veritabanı sorgusu yüklenmiş olur. Bu durum hem istemci tarafında gereksiz bir veri trafiği ve pil tüketimi yaratır hem de sunucu tarafında binlerce kullanıcının aynı anda işlem yaptığını düşündüğümüzde sistemi çökertebilecek bir yoğunluğa yol açar. İşte Debounce ve Throttle mekanizmaları, bu yüksek frekanslı sinyalleri yakalayarak onları mantıklı ve sınırlı sayılarda çalıştırma talimatına dönüştüren birer filtre görevi görerek sistemi koruma altına alır.

Debounce Mekanizması: Hareketsizlik Güvencesi ve Çalışma Prensibi​

Debounce tekniği, çok sık tetiklenen bir olay akışında, fonksiyonun çalıştırılmasını olayların tamamen durduğu ve belirli bir sessizlik süresinin geçildiği ana kadar erteleme prensibine dayanır. Yani kullanıcı eyleme aralıksız olarak devam ettiği sürece fonksiyon asla çalıştırılmaz. Ne zaman ki kullanıcı hareketini sonlandırır ve geliştirici tarafından belirlenen bekleme süresi kadar tamamen hareketsiz kalır, işte o zaman fonksiyon sadece bir kez, nihai sonuçla tetiklenir. Arka plandaki çalışma mantığı tamamen bir zamanlayıcının sürekli iptal edilip yeniden başlatılması üzerine kuruludur. Kullanıcı her yeni hamle yaptığında, bir önceki hamleden kalan geri sayım iptal edilir ve sessizlik süresi sıfırdan saymaya başlar.

Arama Çubuğu Senaryolarında Ağ Trafiği Optimizasyonu​

Debounce tekniğinin kurumsal projelerde en yaygın kullanım alanı canlı arama kutuları ve otomatik tamamlama sistemleridir. Kullanıcı bir arama kutusuna uzun bir cümle yazarken, her harfte veritabanına sorgu atmak yerine kullanıcının kelimeyi veya cümleyi tamamlamasını beklemek en mantıklı mimari yaklaşımdır.

Debounce filtresi devreye girdiğinde, kullanıcı hızlıca klavyede tuşlara basarken arka plandaki tüm asenkron beklemeler birbirini iptal eder. Kullanıcı yazmayı bitirip arkasına yaslandığında ve belirlenen süre boyunca yeni bir harfe basmadığında, sistem kullanıcının girdiyi tamamladığını anlar ve sunucuya tek bir temiz istek gönderir. Bu sayede sunucu gereksiz yüklerden kurtulurken, kullanıcıya da sadece aradığı kelimenin tam sonucu gösterilmiş olur.

Pencere Boyutlandırma Sınırlarında Sayfa Düzeni Koruması​

Kullanıcılar bazen tarayıcı penceresini köşesinden tutup ekranı kaplayacak şekilde genişletirler. Bu boyutlandırma işlemi milisaniyeler içinde yüzlerce kez pencere değişim olayı tetikler. Her değişim anında sayfa içerisindeki kartların, metinlerin ve görsellerin konumunu yeniden hesaplamaya çalışmak, tarayıcının render motorunu felç eder.

Bu senaryoda Debounce kullanılarak, kullanıcının pencereyi sürüklemeyi bıraktığı ve farenin tuşunu serbest bıraktığı nihai an beklenir. Sayfa düzeni sadece bir kez, en son ulaşılan ekran ölçülerine göre milisaniyeler içinde yeniden şekillendirilir. Bu sayede süreç boyunca arayüzde hiçbir donma veya titreme yaşanmaz.

Throttle Mekanizması: Kontrollü Akış ve Periyodik Zaman Aralıkları​

Throttle tekniği ise Debounce'tan tamamen farklı bir felsefeyle çalışır ve eylemin durmasını ya da bitmesini beklemez. Kullanıcı eyleme aralıksız, ne kadar hızlı ve yoğun bir şekilde devam ederse etsin, fonksiyonun belirli periyotlarla düzenli olarak çalıştırılmasını garanti altına alır. Throttle mekanizması, akan bir musluğun vanasını kısarak suyun kontrolsüzce fışkırmasını engellemeye ve onun damla damla, belirli bir ritimle akmasını sağlamaya benzer. Geliştirici sisteme bir zaman aralığı sınırı koyar ve bu süre zarfında gelen tüm diğer tetiklemeleri görmezden gelerek sadece ilk veya son görevin infaz edilmesine izin verir.

Sonsuz Kaydırma ve Sayfa Sonu Kontrollerinde Deneyim Akıcılığı​

Bir sosyal medya platformunda veya e-ticaret sitesinde kullanıcının sayfayı aşağı kaydırdıkça yeni ürünlerin veya gönderilerin yüklendiği bir sonsuz kaydırma sistemi tasarladığımızı varsayalım. Bu sistemin çalışabilmesi için kullanıcının ekranın alt sınırına yaklaşıp yaklaşmadığının sürekli kontrol edilmesi gerekir.

Eğer bu senaryoda Debounce tekniğini kullanırsak, kullanıcı sayfayı çok hızlı ve durmaksızın aşağı kaydırdığı sürece konum kontrol fonksiyonu hiç çalışmaz. Kullanıcı kaydırmayı tamamen durdurduğunda ancak yeni içerikler yüklenmeye başlar. Bu durum son derece kötü bir kullanıcı deneyimi doğurur çünkü kullanıcı yeni içerik görmek için sürekli durup beklemek zorunda kalır. Throttle kullanıldığında ise, kullanıcı kaydırmaya aralıksız devam ederken her yüz milisaniyede bir konum kontrolü düzenli olarak yapılır. Kullanıcı daha sayfa sonuna gelmeden, akış esnasında yeni içerikler arka planda yüklenir ve kesintisiz, akıcı bir deneyim elde edilir.

Fare Takibi ve Animasyon Tetiklemelerinde İşlemci Koruması​

Ekran üzerindeki bir nesneyi fare ile sürükleyip başka bir alana bırakırken veya web tabanlı bir harita uygulamasında haritayı sağa sola kaydırırken Throttle vazgeçilmez bir roldedir. Fare hareketini her milisaniyede bir işleyip ekrandaki koordinatları güncellemeye çalışmak işlemciye devasa bir yük bindirir. Throttle yardımıyla, farenin ürettiği yüzlerce konum verisi ekranın yenileme hızına uygun zaman aralıklarına bölünerek filtrelenir. Görsel akıcılık bozulmadan, işlemci üzerindeki gereksiz yük bütünüyle kaldırılmış olur.

Debounce ve Throttle Arasındaki Mekansal ve Mantıksal Ayrım​

Her iki teknik de temelde benzer bir amaca, yani aşırı tetiklenmeleri dizginlemeye hizmet etse de, iç mantıkları ve operasyonel çıktıları birbirine tamamen zıttır. Doğru optimizasyon stratejisini seçebilmek için kullanıcının gerçekleştirdiği eylemenin doğasını ve sistemin bu eyleme nasıl bir yanıt vermesi gerektiğini iyi analiz etmek gerekir.

Tetiklenme zamanı açısından bakıldığında, Debounce eylemin tamamen bittiği ve sistemin sessizliğe gömüldüğü anı hedeflerken; Throttle eylemin bitmesini beklemeden, süreç devam ettiği esnada periyodik duraklar oluşturur. Odak noktaları da bu doğrultuda şekillenir. Debounce kullanıcının kararlılık, duraklama veya bitiş anına odaklanırken; Throttle sürecin kontrollü bir hız sınırında, canlı olarak akmaya devam etmesini önemser.

Çalışma sayısı bağlamında, çok yoğun ve aralıksız devam eden bir eylem serisinin sonunda Debounce sadece tek bir nihai fonksiyon çalıştırılması ile süreci tamamlar. Throttle ise aynı yoğun eylem süreci boyunca belirlenen zaman aralıklarına bölünerek, eylem ne kadar uzun sürerse o kadar çok sayıda ama kontrollü aralıklarla fonksiyonun tetiklenmesini sağlar.

Eğer geliştirdiğiniz yazılım modülü için kritik olan unsur kullanıcının eylemini tamamen sonlandırmış olması ise, yani kullanıcının girdiyi tamamlaması, formu göndermeyi bitirmesi veya pencere boyutlandırmayı durdurması gibi durumlar söz konusuysa seçmeniz gereken teknik Debounce olmalıdır. Ancak sisteminiz için kritik olan şey eylemin bitmesi değil, eylemin devam ettiği süre boyunca düzenli ve güncel veri takibi yapmaksa, yani kaydırma konumu, animasyon ilerlemesi veya canlı koordinat takibi gibi akışlar yönetiliyorsa tercihiniz kesinlikle Throttle olmalıdır.

Sonuç ve Gelişmiş Ön Yüz Mimari Prensipleri​

Sık tetiklenen kullanıcı olaylarının yönetimi, web uygulamalarının performans optimizasyonu süreçlerinde en kritik kalelerden biridir. Debounce ve Throttle teknikleri, kontrolsüz kullanıcı hareketlerinin tarayıcı ekranını kilitlemesini engelleyen ve uygulamaya kurumsal standartta bir dayanıklılık kazandıran mimari zırhlardır. Geliştirme süreçlerinde bu çözümleri uygularken şu temel prensiplere sadık kalınmalıdır:

İlk olarak, geliştirdiğiniz özelliğin iş mantığını doğru analiz edin. Kullanıcı eyleminin bitişine mi yoksa akışın kendisine mi odaklandığınızı netleştirerek doğru filtreleme tekniğini seçin. Yanlış teknik seçimi, performansı düzeltmeye çalışırken kullanıcı deneyimini tamamen bozabilir.

İkinci olarak, zaman aralıklarını dengede tutun. Belirleyeceğiniz gecikme veya periyot sürelerini ne çok yüksek ne çok düşük tutun. Çok yüksek süreler uygulamada tepkisizlik ve gecikme hissiyatı yaratırken, çok düşük süreler optimizasyonun etkisini azaltarak tarayıcının yine yük altında kalmasına neden olur. Genellikle endüstri standartlarında 150 ile 300 milisaniye arası bekleme süreleri en ideal sonuçları vermektedir.

Son olarak, tekerleği yeniden icat etmek yerine kurumsal ve test edilmiş yapılardan faydalanın. Bu filtreleme algoritmalarını her projede sıfırdan yazmak yerine, endüstri standardı haline gelmiş, bellek yönetim testlerinden başarıyla geçmiş ve kenar durumları (edge cases) çözülmüş güvenilir yardımcı yazılım kütüphanelerindeki hazır yapıları mimarinize entegre etmeyi tercih edin. Olay tetiklenme frekanslarını bu disiplinle kontrol altına almak, web uygulamanızın kaynak tüketimini minimuma indirirken, son kullanıcıya en zayıf mobil cihazlarda bile yağ gibi akan, yüksek performanslı ve modern bir arayüz deneyimi sunmanızı sağlar.
 
Harika bir teknik yazı olmuş, elinize sağlık! Modern web geliştirme süreçlerinde performansı doğrudan etkileyen bu iki kavramı (Debounce ve Throttle) hem mimari riskleri hem de kullanım senaryolarıyla çok net bir şekilde açıklamışsınız.

Özellikle Sonsuz Kaydırma (Infinite Scroll) örneği, Throttle ve Debounce arasındaki farkın neden sadece performans değil, aynı zamanda bir "deneyim tasarımı" tercihi olduğunu çok iyi özetliyor. Yanlış teknik seçildiğinde, uygulama performanslı çalışsa bile kullanıcı için sinir bozucu bir hal alabiliyor.

Konuya katkı sağlaması açısından küçük bir ekleme yapabilirim: Modern JavaScript ekosisteminde React, Vue veya Angular gibi framework'ler kullanırken bu teknikleri uygularken "bileşen yaşam döngüsünü" (component lifecycle) de göz önünde bulundurmak gerekiyor. Örneğin; bir bileşen imha edildiğinde (unmount), hala havada olan bir setTimeout veya bir API isteği bellek sızıntılarına (memory leak) yol açabilir. Bu yüzden Debounce/Throttle işlemlerini temizlemek (cancel/clear) de bu mimarinin ayrılmaz bir parçasıdır.

Bu rehber, hem yeni başlayanlar hem de bilgilerini tazelemek isteyen deneyimli geliştiriciler için çok değerli bir kaynak. Paylaşımınız için teşekkürler!
 

Modüler JavaScript Mimarisinde CommonJS ve ES Modules Çakışmaları

Konuyu izleyenler

Benzer konular

Günün trendleri

Geri