Merhabalar. Üzerinde çalıştığımız projede performans iyileştirmesi ihtiyacı doğdu. Bu vesileyle birçok performans iyileştirmesi yöntemini kullanma fırsatı bulduk. Bu yazımda bu yöntemlerden bahsedeceğim.
Yazılım Performans Yöntemleri
Performansını arttırmak istediğiniz yazılımın niteliği, uygulayabileceğiniz yöntemleri de etkileyebilmektedir. Öneğin, bir web uygulamasını, çalışan sunucu sayısını arttırıp yük dengelemesi (load balance) yöntemiyle optimize edebilirsiniz. Fakat, bir masaüstü uygulamasında tek bir makineyle sınırlısınızdır. Aynı şekilde, masaüstü uygulamalarında tüm hafızayı tek bir kullanıcıya tahsis edilmiş gibi geliştirme yapabilirken, web uygulamarında aynı anda birden fazla kullanıcının isteklerine cevap bekleyeceğini göz önüne alarak hafızayı tutumlu kullanmanız gerekmektedir. İşler mobil uygulamaya geldiğinde ise, uygulamanın yiyeceği internet miktarı, kısıtlı fiziksel hafıza, güvenlik gibi bambaşka parametreleri göz önüne almalısınız.
Burada listelenecek ipuçlarının, bu parametrelerin akılda tutularak değerlendirilmesini tavsiye ederim.
Doğru Thread Yönetimi
Yeni thread başlattığınız noktaları mercek altına alın. Bu alanlar O(n) bir algoritma içinde mi başlatılıyor? Yani başlatılan yeni thread sayısı n ile doğru orantılıysa, küçük sayılarda mesele olmaz iken, n sayısı arttıkça, thread içinde yapılan iş çok küçük bir iş olmasına rağmen, aşırı thread başlatılmasından dolayı işlemcinin kitlenmesine sebep olabilmektedir. 100 bin threadin bir anda başlatıldığını bir hayal edin... Böyle bir durum söz konusuysa algoritmayı her n için 1 adet thread oluşturacak şekilde güncellemeye çalışın.
Veritabanı Katmanı İyileştirmesi
İşlemci, veri kendisine ne kadar yakınsa bir işi o kadar hızlı bitirecektir. Sırasıyla önbellek, RAM, ve harici disk olmak üzere veri gittikçe işlemciden uzaklaşmaktadır. Bu nedenle performans iyileştirmesi istiyorsak verileri olabildiğince işlemciye yaklaştırmalıyız. Veritabanı işlemleri de bu bakımdan mercek altına alınması gereken yerlerin başında geliyor. Hibernate dünyasında second level cache (örn Ehcache) , daha genelde ise in memory database cache ürünleri (örn. Redis) kullanarak veriler işlemciye bir katman daha yaklaştırılabilir. Hatta uygulamanıza biraz uzaktan bakıp bir veritabanına ihtiyaç duyup duymadığını da sorgulayabilirsiniz. Aynı işlevi in-memory veri yapıları kullanarak gerçekleştirebilecekseniz komple veritabanı katmanını aradan çıkarmak büyük avantaj sağlayacaktır.
Masraflı Hesaplama İşlerini Tekrarlamaktan Sakınma
Kodunuzun zaman yiyen hesaplama kod parçacıklarını belirleyin. Örneğin, ağır grafiksel işlemler, dosyadan veri okuma, ağır matematiksel hesaplamalar vb. Bu hesaplamaların sonucunu in-memory şekilde bir yerlerde örneğin sınıfın global bir alan değişkeninde, singleton bir cache sınıfında vb tutun. Hesaplamaların sonucu değişmediği sürece bu hesaplanmış bulunan sonucu hesaplama koduna hiç bulaşmadan dönün. Hesaplamaların sonucunun değişeceğini bildiren bir olay gerçekleştiğinde bu cache'deki değeri geçersiz kılın ve bu değer bir sonraki istendiği vakit tekrar hesaplama kodlarının çalışmasını sağlayın.
Doğru Veri Yapılarını Kullanma
Kullandığınız dilin veri yapılarını arka planda nasıl çalıştığını akılda tutarak kullanın. Örneğin bir LinkedList üzerinde for ile gezerken her seferinde get(index) metoduyla veriyi çağırırsanız, her item getirme O(n) maliyetinde olacaktır. Çünkü LinkedList üzerinde n. item'a kadar tek tek gezmesi gerekecektir. Başka bir örnek de, bir hesaplama sonucu itemlerı bir koleksiyonda toplayıp sonra bu koleksiyon üzerinde dolaşılacaksa, koleksiyonda itemların tekrarlanmasını engellemek, en fazla bir kez yer almasını sağlamak için Set türünden bir koleksiyon kullanılması faydalı olacaktır.
Masraflı İşleri Başka Thread'lere Atama
Buna tembel hesaplama yöntemi diyebiliriz. Program akışımızda bizi yavaşlatan bir işlem var ise, bu işlem olabildiğince akış threadinden kaldırılıp başka threadlerin sorunu haline getirilmelidir. Örneğin, bir veri yapısından bir itemın silinmesi işlemi pahalı ise, item'ı "silindi" şeklinde işaretleyip yola devam etmeli, başka bir threadin de asenkron olarak "silindi" işaretli itemları gerçekten veri yapısından silmesi sağlanmalıdır.
Sizlerin de performans iyileştirmesi için kullandığınız yöntemler var ise yorum olarak eklerseniz çok sevinirim.