.NET Framework / Smart Client Uygulamaları İçin Performans İyileştirme - I
Yazar: Ümit AKBAŞ
Uygulamalarımızın geliştirme işlemlerini gerçekleştirirken bir takım kurallara uymaya çalışırız.Kendimize kütüphaneler geliştiririz.Belki bu kütüphaneleri tüm projelerinizde kullanılacak şekilde dizayn etmişinizdir ve gerçekten çokda yararlı bir hale gelmiştir. Programlarda geliştirme işlemlerini gerçekleştiren kişiler kendilerine bu tarz sistemleri zaman içerisinde geliştirirler ve daha sonraki zorlu işlemlerini kendilerine daha kısa zamanda çözülebilen ve geliştirilebilen yapılar haline getirirler.
Smart Client Uygulamaları İçin Performans İyileştirme Önerileri
Smart Client Uygulamaları İçin Performans İyileştirme - I
Smart Client uygulamaları geliştirirkende yukarıda değindiğimiz sistemleri geliştirmek olasıdır. Fakat bu yapıları oluştururken bir takım can alıcı noktalara da dikkat etmek yararlı olur. Bunlar sistemlerin performanslarını minimum harcayıp programlarımızı sisteme yük getirmeyen,hızlı ve sağlam yapılar haline getirebilecek kurallardır.
Şimdi bu makalede Smart Client uygulamaları için sistem performansını iyileştirmek adına yapabileceğimiz işlemleri sıralamaya çalışalım. Bunların sayısı çok arttırılabilir.Biz aşağıdaki anabaşlıklarda yapabileceğimiz başlıca işlemlerden bahsedeceğiz:
· Data Cache Önerileri
· Network Kaynaklarını Kullanım Önerileri
· Uygulama Başlangıcını Hızlandırmak için Öneriler
· Smart Client uygulamasında kullanılan Windows Formlarını Hızlandırmak için öneriler
Data Cache Önerileri
Data Cache uygulama performansı için çok önemli bir konudur.Bu yüzden Cache metodlarımızı çok iyi tasarlamalı uygulamalarımızda en iyi cache tekniklerini kullanmalıyız.Şimdi Cache ile ilgili uygulamalarımızda karşımıza gelebilecek senaryolardan bir kaçını örneklerle incelemeye çalışalım:
Sık Kullanılan Veriler için Cache kullanmak:
Eğer uygulamamız sürekli aynı bilgileri network servislerinden çekmek zorunda kalıyorsa bu bilgileri client üzerinde cacheleyerek network kaynaklarını ekonomik olarak kullanabiliriz. Bu şekilde Client tarafındaki uygulamada cachelediğimiz verilere çok hızlı bir şekilde erişebilecek ve network deki bekleme sorunlarından da kurtularak daha kolay kullanılabilir bir uygulama olacaktır.
Clientın Değiştiremediği ve Formda Gerekli Olan Bilgileri Cacheleyin:
Uygulamada kullanıcının değiştiremeyeği,uygulama tarafında tanımlanıp Client ta sadece gösterilen verileri saklamak için cache sistemini kullanmakta mantıklı olabilir.Örneğin bir alışveriş sisteminde ürünlere ait açıklamaları,Ürünlere ait (varsa) Id bilgilerini ,Ürün Kategori Bilgilerini Client tarafında saklayabiliriz. Mesela neden ürün açıklamalarını saklayalım ki dersek şöyle bir senaryoda işe yarayabileceğini söyleyebiliriz: Bir mağazada Smart Client uygulaması kullanılıyor ve mağazadaki ilgili kişi merkezdeki ürünlerden sipariş verirken ürünlerin özelliklerini program açıkken sürekli inceliyor deyelim.Burada eğer biz ürün özelliklerini saklamaz isek yetkilinin her seçtiği ürün için açıklamayı Id bilgisine göre merkezden çekmesini isteyecek ve programda gereksiz bir beklemeye ve aynı zamanda gereksiz bir network trafiğine sebebiyet vereceğiz.
Client Tarafından Aynı Yapıya sahip Birden Fazla İstek Gönderiliyorsa Bunları Cacheleyin:
Smart Client uygulamasından istek olarak aynı yapıda birden fazla istek verisi gönderiliyorsa bunları Cacheleyip bir kerede göndermek daha mantıklıdır.Örneğin:Bir kaç tane sipariş silinecek diyelim bunları teker teker sildirip network kaynaklarını zorlamak yerine önce silinecek Siparişlerin Id lerini Client tarafında Cache leyip tek istekle bunları iletmek daha mantıklıdır.Bu şekilde network servisleri zorlanmayacak aynı şekilde uygulamamızın çalışmasıda daha hızlı ve sorunsuz olacaktır.
Önemli Bilgilerinizi Cachlemekten Sakının
Client tarafında güvelik sistemine tam olarak güvenemediğiniz için önemli bilgilerin Client tarafında saklanması sakıncalı olabilir.Eğer zorunlu olarak kullanmak zorunda kalırsanız bu bilgileri şifreleyerek kullanmak daha sağlıklıdır.
Network Kaynaklarını Verimli Kullanmak
Uygulamanızın network kaynaklarını verimli kullanabilmesi için, kodlarımızda network servislerini kullanırken dikkatli davranmamız gerekir.Uygulamamız network yolu ile bir servisten istekte bulunup cevap alacaktır.Buna örnek olarak bir Web Service uygulamasını verebiliriz. Burada performansı iyileştirici bir öneri olarak; eğer uygulamamız kullanıcıya bir çok veriyi sunucuya gönderme imkanı sağlıyorsa bu istekleri teker teker değilde toplu olarak yapmamız daha doğru olur.Çünkü network üzerinde her yaptığımız istek uygulamanın performansına etki edecektir. Örneğin uygulamanız bir sipariş içerisinde çok sayıda ürün ekliyor diyelim.Burada her ürün eklemede sunucuya erişmek yerine ürünleri client tarafında tutup bir kerede sunucuya iletmek en mantıklı yol olacaktır. Böylelikle sunucu tarafında fazla erişime gerek olmadan tek adımda işlemlerimizi halletmiş oluruz.
Ayrıca dikkat edeceğimiz bir hususta sunucudan gelen cevapları programımızın beklemsi konusundadır.Eğer programımızı asenkron (asynchronous) mantığı ile yazmamışsak sunucuya yaptığımız her istekte uygulamamız cevap gelene kadar bekleyecektir. Buda uygulamamızı kullanan kişileri kötü etkileyebilir ve çalışmalarını engelleyebilir.Bunun yerine asenkron programlamayı yani yaptığımız çağrılarda BeginInvoke ve EndInvoke metodlarını kullanabiliriz.Böylelikle kullanıcı hem işine devam eder hemde uygulama sunucu ile gerekli işlemlerini yerine getirmiş olur.
Uygulama Başlangıcını İyileştirmek
Uygulamalarımızın başlangıç anındaki performanslarıda çok önemlidir.Yani kullanıcı açtığı anda uygulamayı karşısında görürse tabiki çok mutlu olur J. Tabi uygulamamızın başlangıcınıda en iyi duruma getirmek için dikkat edebileceğimiz durumlarda var.Bunların birkaçını sıralayalım:
1.Uygulamamızda ilk sırada yer alan yordamda veya form kodunda formun yüklenmesini güçleştirecek çok sayıda değişken kullanmaktan kaçınmalıyız.Özellikler tip değişkenlerin çok olmamasını sağlamalıyız.
2.Uygulamamızı tasarlarken minimum assebmly kullanacak şekilde tasarlamalıyız.Uygulamanın çok sayıda assembly kullanması uygulamayı yavaşlatabilir.
3.Büyük class türlerindeki değişkenleri uygulamanızın başlangıcında kullanmanızda uygulamanızın açılmasını yavaşlatabilir.ADO.NET tarzında base library lerin ana türlerinde objeleri hemen uygulama başlangıcında oluşturmamalı gerektikleri yerlerde kullanmalıyız.Uygulama başlangıç hızı bizim için önem arzediyorsa buna mutlaka dikkat etmeliyiz.
4.Uygulamanızın başlangıcında network servisleri kullanılıyorsa bunu initialization ile paralel çalışacak biçimde dizayn etmelisiniz.bu şekilde network servislerinden gelecek cevapları uygulama bekelmeyecek ve hemen açılacaktır.Aksi takdirde uygulama belli bir süre donacak ve servisten gereken cevaplar geldikten sonra açılacaktır.Burada da yukarıda bahsettiğimiz asenkron programlama mantığı kullanılabilir.
5.Çok yaratılan assemby lerimiz varsa.Bunları NGEN.exe yi kullanarak derleyebiliriz.Bu şekilde Global Assembly Cache de bu assembly özel olarak barındırılacak ve program tarafından ihtiyaç duyulduğunda yeniden yaratılmak yerine buradaki örnekten kullanılacağı için daha performanslı bir işlem sağlanmış olacaktır.
Window Formlarını Hızlandırmak
Buraya kadar verilen iyieştirme seçeneklerine bir kaç tanede windows formları için öneriler serpiştirelim.Ve tüm anlattıklarımızın reel olarak program örnekleri ile ve sırasıyla anlatacağımız bir sonraki makaleye kadar size veda edelim.Windows formlarınında çalışma anında hızlarını yani direk kullanıcıların morallerini iyi tutmak için dikkat edebileceğimiz noktalar mevcut.Birkaç örnek:
1.Eğer ağır kontroller kullanıyorsanız örneğin bir treeview gibi...ve TreeView a birçok nesneyi bir döngü içinde ekliyorsanız, burada treeview a her elemanı eklediğinizde treeview kendini yenileyecek buda bir performans kaybı doğuracaktır.Bunu önlemek için verileri doldurmaya başlamadan önce treeview.BeginUpdate() metodu ile objenin kendini yenilemesini engelleyin.Verilerinizi doldurun ve en sonundada treeview.EndUpdate() ile objenizin bütün elemanları eklenmiş şekilde kendisini yenilemesini sağlayın.Bu işlem az sayıdaki veriler için önemsiz olabilir fakat yüksek miktardaki veriler için çok önem kazanabilir.
2.Uygulamanızda içerisinde birden çok iç kontrol barındıran (child control mesela form gibi...) nesneler kullanıyorsak ve burada dinamik olarak kontroller ekleyip kaldırıyorsak bu durumda ilgili kontrolün SuspendLayout ve ResumeLayout metodlarını kullanabiliriz.Bu metodlar tüm nesneler tarafından desteklenmez.Form,Treeview,Listview gibi içerisinde child control barındıran objeler tarafından desteklenirler... Eğer bunların içerisinde çok fazla obje oluşturuyorsak her bir obje üzerinde işlem yaptığımızda (oluşturduğumuzda,yerini değiştirdiğimizde,yeniden boyutlandırdığımızda vs...) ana obje kendini yenileyecektir.Buda bir performans kaybına sebep olacaktır. Bunu önlemek için Formun önce SuspenLayout() metodu çağrışır ve bir süre kendini yenilemesi engellenir ve gerekli dinamik kontroller oluşturulduktan sonra ResumeLayout() metodu çağrılarak tekrar formun kendisinin tüm kontroller oluşmuş halde yenilemesi sağlanabilir.Bunu birçok kontrolün yerini veya boyutunun değiştirirkende kullanabiliriz.
3.Eğer uygulamanızın üzerinde çok fazla veri göstermek zorunda kalıyorsanız bunları sayfalamayı deneyin.Örneğin çok uzun bir telefon defteri verilerin gösteriyorsanız bunları alfabetik olarak gruplayıp kullanıcıyı baş harflerinden yönlendirin.Böylece kullanıcı direk ilgili verilere gidecek böylece hem formda çok fazla veri görüntülenip hantallaşması engellenecek hemde kullanıcı çok fazla scroll yapmaktan kurtulmuş olacaktır.
Evet.Buraya kadar size Smart Client uygulamanızda (veya bazı konularda diğer uygulamalarda da diyebiliriz...) kullanabileceğimiz performans iyileştirici tekbiklerden bahsetmeye çalıştık.Bir sonraki makalede burada anlattıklarımızın teker teker birer projede uygulanmış olarak örneklerini bulacaksınız.Eminim diğer makalede çok hızlı gelecektir :).