Makale Özeti

ASP.NET teknolojisinin ortaya çıkmasının üzerinden uzun bir zaman geçmesine rağmen,özellikle bu alanda kendini geliştirmiş bir çok kod geliştirici dahi performans konusunda sorun yaşayabiliyor. Peki bu sorunlar nereden kaynaklanıyor ? ASP.NET web sayfalarının performansını nasıl arttırabiliriz ? İşte bu makalede ASP.NET performasını arttıracak 10 yöntemden bahsedip yukarıdaki sorulara cevap arıyor olacağız...

Makale

ASP.NET teknolojisinin ortaya çıkmasının üzerinden uzun bir zaman geçmesine rağmen,özellikle bu alanda kendini geliştirmiş bir çok kod geliştirici dahi performans konusunda sorun yaşayabiliyor. Peki bu sorunlar nereden kaynaklanıyor ? ASP.NET web sayfalarının performansını nasıl arttırabiliriz ? İşte bu makalede ASP.NET performasını arttıracak 9 yöntemden bahsedip yukarıdaki sorulara cevap arıyor olacağız.

Bahsedeceğimiz yöntemlere geçmeden önce performans konusunda kodlama,görsel, algoritma, tasarım vb kısımlarda dikkatli olduğunuzu varsayıyorum.

1) Page.IsPostBack Kullanımı

Web sayfalarımızda sayfamız ilk kez yükleneceği zaman sayfa düzenini oluşturmak veya modüllerimizin başlangıç durumlarını ayarlamak(initialization) üzere belirli adımlar izleriz.Bununla birlikte bu adımları her defasında baştan yapmak zorunda değiliz.Örneğin bir web servisinden statik haber başlıklarını çektiğimizi düşünelim.

if( !Page.IsPostBack )
{
    …
    DataSet ds = NewsDS();
    …
}

Veriler statik olduğu için sayfamız ilk kez yüklendiğinde haber başlıklarını almamız yeterlidir.Sayfa yüklendikten sonra aynı sayfaya PostBack yapıldığında aynı verileri yeniden yüklemeye gerek kalmayacaktır.

2) Saklı Yordamları Kullanmak (Stored Procedures)

SQL Server saklı yordamları hem windows uygulamalarında hem de web uygulamarında uygulama hızını gözle görülür bir biçimde arttırmaktadır. Saklı yordamlar sql ifadelerimizi derlenmiş bir biçimde tutmaktadır.Diğer taraftan uygulama içerisinde oluşturduğumuz sql sorguları SQL server tarafından bir derlenme aşamasından geçmektedir.Dolayısıyla sorgularımızı saklı yordamlar şeklinde tuttuğumuz taktirde derleme aşamasını by-pass etmiş oluyoruz.Bu da yaptığımız işlemin hızını önemli ölçüde arttırıyor.

3) ASP.NET Ön Bellekleme Yöntemi (Cache)

Ön bellek server’ın sıkça kullanılan ve değişmeyen verileri tuttuğu bir bölümdür.Böylece istemcilere daha hızlı veri dönüşü sağlanmaktadır.Bununla beraber kod geliştiriciler olarak hangi dataların ne zaman ve ne uzunlukla ön bellekte tutulacağına karar vermek zorundayız. Diğer taraftan dataları ön belleklerken dikkat etmemiz gereken bir kaç altın kural var.

  • Ön belleklenen dataların türü birbirinden çok değişken olmamalıdır
  • Ömrü kısa olan veriler ön belleklenmemelidir.Eğer ASP.NET ön belleklenmiş verileri sıkça güncellerse bu durumda bu yöntem faydadan çok zarar getirecektir.

Ön bellekleme implementasyonu ASP.NET Page yönergesi veya Response nesnesi ile kolayca yapılabilir.Bunun için aşağıdaki yöntemleri kullanabiliriz

<%@ OutputCache Duration="90" VaryByParam="None" %>

Bu yönerge ile ASP.NET sayfayı belirlenen zaman içersinde yeniden yapılandıracaktır

Aynı yöntemi şu şekilde de çağırabiliriz.

Response.Cache.SetExpires(DateTime.Now.AddSeconds(90))

Örneğin bir çok ürün,ürün resimleri, kategorilerin bulunduğu bir sanal mağazayı düşünün.Çok değişik türden kategoriler ve bu kategorilerin altında yüzlerce ürün olduğunu varsayalım.Bu durumda kullanıcıların en çok ziyaret ettiği kategoriyi tespit edip bu kategoriyi ön belleğe almak mümkündür.

<%@ OutputCache Duration="90" VaryByParam="kategori"%>

VaryByParam kısmına ön belleklemek istediğimiz Request i yerleştirip sayfamızı aşağıdaki şekilde çağırıyoruz.

http://www.siteniz.com/products.aspx?kategori=usbbellek

4) Session State’in Sınırlandırılması

Session kullanıcıların web sayfanızda interaktivitede bulunduğu süreçtir.Session State ise bu süreç boyunca içinde veri saklayabiliceğimiz bir konteyner görevi görmektedir. ASP.NET sayfalarında Session State default olarak açıktır.Fakat gereksiz bölümlerde bu modülü yetkisiz kılmak önemli bir performans artışı sağlayacaktır.Aksi halde büyük bir yükü sırtlanmış olacağız.

ASP.NET te aşağıdaki yöntemlerle sayfamızda Session State i yetkisiz (disable ) veya sadece okunabilir ( readonly ) bir hale getirebiliriz

<%@ page enablesessionstate="false" %>

<%@ page enablesessionstate="readonly"%>

Diğer taraftan konfigurasyon dosyamızdan sessionstate mode="off" / bölümünü modifiye ederek Session State i tüm sitemizde yetkisiz kılabiliriz.

Session state i uygulama dışında bir yerlerde saklamak işi biraz daha komplex bir hale getirsede performans açısından önemli artış sağlayabilir.Aşağıdaki örnekte Session State veritabanı üzerinde saklanmaktadır.

<sessionstate mode="InProc" stateconnectionstring="tcpip=127.0.0.1:42424" sqlconnectionstring="data source=127.0.0.1;Trusted_Connection=yes" cookieless="false" timeout="20" />

5) View State Kullanımı

Viewstate basit anlamda, herhangi bir ASP.NET sayfanızda postback'ler arasında kaybetmek istemediğiniz verileri saklamanıza yarayan bir araçtır.Server tabanlı kontroller default olarak view state i tutmaktadır.Sayfanızı görüntüleyip kaynak kodunu inceledeğinizde bu konunun üzerinde neden durduğumuz açıkça görebilirsiniz.Textbox lar veya diğer basit kontroller çok fazla yük getirmezken çok sayıda veriyi barındıran bir datagrid kontrolü 20K lık kodlanmış datanın Server dan Client a aktarılmasına sebebiyet verebilir.Yüksek hızlı networklerde bu veriler sıkıntı oluşturmazken 56K lık bir modemle bağlanan kullanıcı için siteniz önemli bir zaman kaybı oluşturabilir.

<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwULLTEwMzI1MTUwMTUPZBYCZg9kFgICAQ9kFgYCAQ 8PFgIeBFRleHQFEEhvxZ9nZWxkaW4gaGFzYW5kZAIFD2Q WCAILDw9kFgIeB09uY2xpY2sFNUphdmFzY3JpcHQ6cGlj a0RhdGUoJ2N0bDAwJENwaENlbnRlciRUYkNhbFN0YX........ />

6) HttpServerUtility.Transfer Metodu

.Net Framework’un uçsuz buçaksız genişlikteki özelliklerinden birisi de HttpServerUtility.Transfer metodudur.Yine diğerleri gibi bu metod da doğru yerlerde kullanıldığı taktirde performans artışını beraberinde getirecektir.Şöyleki, bir çok kod geliştirici sayfa yönlendirmelerini Response.Redirect yöntemini kullanarak gerçekleştirmektedir.Oysa ki HttpServerUtility.Transfer metodu aynı görevi yerine getirmekle beraber server ve client arasındaki bir çok gereksiz veriyi elemine etmektedir.

7) ASP.NET Server Kontrollerinin Sınırlandırılması

View State ve Session State in sistem yükü getirebiliceğinden bahsettik.Server taraflı kontrollerin de bir performans yükü getireceğini söylemek sanırım sürpriz olmaz.Server taraflı kontroller server ve client arasında yapılacak tüm data transferini doğrudan etkilemekte ve server tarafının extra desteğini almaktadır.Server taraflı kontrollerin getirdiği olumlu özellikler saymakla bitmeyecektir fakat bu kontrollerin ne zaman kullanılacağını bilmek önemli bir performans artışı sağlayacaktır.

8) Custom Paging

Büyük veritabanlarına ait verileri listelemek özellikle web uygulamalarında çoğu zaman karşımıza bir problem olarak ortaya çıkar. Kısacası sorgu sonucu dönen verilen hepsini birden tek bir sayfada listelemek istemeyiz.Bunun yerine belirli şekilde sıralanmış verilerimizi sayfalara bölmek daha uygundur.Klasik ASP de sayfalama işlemi çok basit değildi.Buna karşın ASP.NET te bir iki satırlık kod parçası ile sayfalama işlemini gerçekleştirmek mümkündür.

ASP.NET ile sayfalama işlemi işlemi kolay olmasına rağmen, sorgular esnasında dönen veriler Datagrid in default özelliği olarak SQL Server tarafından ASP.NET uygulamasına taşınır. Sorgumuzun sonucu milyonlarca veri döndürdüğü zaman ciddi bir performans problemi ile karşı karşıyayız demektir.İşlemin canlı testini yapmak için veriler DataGrid e yüklendiği zaman aspnet_wp.exe nin bellek kullanımına ait bilgileri Task Manager’dan görebilirsiniz.

Yukarıda bahsettiğimiz nedenlerden dolayı Custom Paging kullanmak SQL sorgusu sonucu sadece mevcut sayfaya ait istenilen satırları uygulamaya yükleyerek uygulamayı aşırı yükten kurtarmış olacaktır. (Custom Paging’e ait detaylı bilgilere http://support.microsoft.com/kb/318131  adresinde ulaşabilirsiniz)

9) CSS Kullanımı (Cascading Style Sheets)

CSS web tarayıcısına yazılan verilerin nasıl görüneceğini belirlememize yarayan konfigurasyon dizelerinden ibarettir. CSS kullanımının performans ile nasıl bir ilişkisi olabilir ki?

Bir çok kod geliştirici sayfa stillerini HTML içerisine gömmekte veya sayfa içerisine dağıtmaktadır. Bu yöntem kod karmaşası, kod fazlalığı, tek kaynaktan yönetim vb. bir çok olumsuz zafiyete yol açmakla beraber sayfayı ziyaret eden kullanıcılar bu bilgileri sayfa ile birlikte lokaline yüklemektedir. Stiller sayfa ile birlikte tarayıcı tarafından yorumlanmaktadır. Bunun yerine stiller harici bir dosyada oluşturulup linklenmiş bir şekilde uygulamaya eklendiği zaman kullanıcılar sayfayı ziyaret ettiğinde bu dosya kullanıcı bilgisayarının ön belleğine yüklenmekte ve lokal kaynaklardan çalışmaktadır. Böylece aynı web uygulamasına ait sayfaları ziyaret eden kullanıcıya ait web tarayıcısı sayfa stilleri için ön belleğine yüklenmiş stil dosyasını kullanmakta ve performans kazancı elde etmektedir.

10) Projenin Derlenmesi

Web sitemiz üzerinde çalışırken her bir sayfa değişiminde uygulamayı yeniden debug eder ve test ederiz.Debug işlemi uygulamayı bir takım testlerden(syntax vb.) geçirdiğinden extra bir zaman ve performans gerektirir.Fakat uygulamamız son halini aldığı zaman uygulamanın yayımlanması(publish) ve debug modunun yetkisiz(disable) yapılması az önce bahsettiğimiz extra işlemlerden muaf olmamızı sağlayacaktır.Bunun için web.config dosyamızda aşağıdaki değişikliği yapmamız yeterlidir.

<compilation debug="False"/>

Sonuç olarak performans kavramının çok geniş bir yelpazeyi kapsamasına rağmen yukarıda bahsettiğimiz yöntemlerin ASP.NET uygulamalarında performans açısından kritik bir yere sahip olduğunu söylebiliriz. Söz konusu yöntemlerin ASP.NET sayfalarınızın performansını arttırması dileğiyle...

Ömer Faruk Irmak