Bilgisayar Dünyası

 Genel Bilgiler :

Konu                       :  Programlarınıza İnce Ayar
 İçerik :

Visual Basic'in 5. versiyonuna kadar, VB uygulamalarının olağandışı hız elde etmek için de kullanılabileceği bilinmiyordu. Yeni "native code compiler" ve geliştirilmiş "form engine" ile bu durum uzun sürmedi. Normal koşullarda bir VB uygulamasından hızlı performans beklemenin bir nedeni yoktur. Ancak, VB uygulamalarınız ve bilgisayarınız çalışırken, bu hızın bir kısmına sahip olabilmek için bazı genel tekniklerin uygulanmasına gereksinim duyulmaktadır. Herkesin yaptığı şeyleri yapmaya ve her kod satırını akort etmeye başlamadan önce, daha iyi bir performans için akılda tutulması gereken şey, iyi bir kod ayarından çok, iyi bir tasarım ve mimaridir. Eğer hala bu aşamada değilseniz, temel tasarım prensipleri ile kodlama uygulamalarını öğrenmenizi tavsiye ediyorum. Eğer uygulamalarınızın çoğu database client'ler üzerine ise, ayrıca Veritabanı programlama köşesinde Veritabanı Uygulamalarına İnce Ayar sayfalarını da ziyaret etmeyi unutmamanızı öneriyorum. Uygulamalarınızın performansı açısından, doğru düzgün bir veritabanı tasarımı ve veri giriş stratejisi hazırlamak, bir sürü kod ayarlamalarından çok daha fazla işe yarayacaktır.

Programlarınıza İnce Ayar Teknikleri

Genel olarak programlarınızın performanlarını üç alana ayırabiliriz:

1. Başlangıç performansı:
Uygulamanızın başlama zamanındaki en kritik öğe olup, aynı zamanda herhangi bir formun yüklenmesini de sağlar. Eğer uygulamanız görülebilir / izlenebilir bir uygulamaysa ve kullanıcının veri girişi yapması için hazırsa, bu en azından iyi bir performansa sahip olduğu görüntüsü verecektir.

2. Gerçek performans:
Yalın hız önemlidir, ancak hız, sık sık esnekliğe kurban edilebilir.

3. Fark edilen performans:
Bu kategoride, yalın hızdan daha önemli olabilen şey, kullanıcı açısından karşılıklı etkileşim duygusudur. Örneğin, çoğu kelime işlemci programları yazdırma işini, bir artalan görevine verir. Gerçek yazdırma işlemi artalanda çalışıyorsa, uzun süre alabilir. Ancak, uygulamalar, hemen diğer bir görevle devam edebilmeleri nedeniyle kullanıcı açısından daha duyarlıdırlar.

1. Başlangıç Performansını Artırma

Uygulamanın bütünü ve ayrı ayrı formlar için başlangıç performansını etkileyen bir kaç önemli faktör şöyle sıralanabilir;

- "Sub-main" içinde ve formların başlatma ve yükleme olaylarında yapılan işleri azaltın.
İlk formunuzun görülmesinden önce çalışan herhangi bir kod, kullanıcının uygulamanızla ilgili herhangi bir respons görmeden önce bekleyeceği bir zaman periyodunun olduğu anlamına gelir. Eğer başlangıç kodunu elimine edemeseniz bile, en azından kullanıcıya bazı şeylerin mümkün olduğu kadar çabuk görünmesini sağlamaya çalışın. Başlangıç kodu çalıştırılmadan önce, formun kendini göstermesini sağlamak için "Load event" içindeki "Show" metodunu kullanabilirsiniz (ancak, formu taşıyan, kontrolleri ayarlayan veya görülebilir bir titreme efektine neden olan daha sonraki kodlara sahip olmadığınıza emin olmanız gerekmektedir).

- Formlarınızın üzerindeki kontrollerin sayısını azaltın.

Kontroller hafızayı ve diğer kaynakları tüketirler, ve genellikle sizin yarattığınız kontroller, standart Windows kontrollerinden daha çok kaynak tüketirler. Potansiyel olarak düzinelerce kontrollerle oluşturulabilen "tabbed dialog" kutuları yada kontrollerle dolu formlar yaratmak kolay ve bir o kadar da çekici olmalarına karşın, bunlar birer performans katilidirler.

- Kontrol dizileri kullanın.

Kontrol dizileri (Control arrays), nispeten hafıza ve kaynak tüketiminin azaltılmasına yardım ederler ve ayrıca, dizinin bütünü için gerekli tekil prosedürler içinde yer alan olay yordamlarını bütünleştirerek sarf edilen kodlama çabalarını en aza indirirler.

- Grafikleri minimumda tutun.
Arayüzünüzdeki zengin grafik ve şekiller, çekici olsalar da, çok fazla hafıza tüketirler ve çizim yapmak için çok sayıda hesaplama döngülerine sahiptirler. Grafiklerin miktarında yapılan azaltma, formların yüklenme zamanı üzerinde önemli bir etkiye sahip olabilmektedir.

- Splash screen kullanın.

Çoğu geniş kapsamlı uygulamalar, başlama zamanında bazı kurma işlemlerine gereksinim duyarlar. Eğer program çalışmaya devam ediyorsa, kullanıcıyı programın çalışıp çalışmadığını anlamak için orada merakta bırakmaktansa, başlangıç kodunun çalışması bitinceye kadar onlara bakacakları bir şeyler vermek için basitte olsa bir splash screen gösterin. Bir splash form uygulamanın başlamasını hızlandırmak için hiçbir şey yapmamasına karşın, başlangıca parlak bir görünüm verir ve kullanıcının uygulamanın bir şeyler yaptığını anlamasına olanak tanır.
Uygulamanızın çalıştığı hardware platforma bakmaksızın splash formun düzgün çalışır olarak dizayn ettiğinizden emin olun. Eğer formunuzu 486/33 makinalar için tasarlamışsanız ve de gayet iyi çalışıyorsa, yüksek RAM kapasiteli bir 200 MHz Pentium makine de belki bir titremeden başka sorun olmayacaktır. Kullanıcıdan gerektiğinden fazla zaman çalmayın, ancak splash formun kullanıcının onu görmesine yetecek kadar bir süre görünür olduğundan da emin olun.

- Yalnızca ihtiyacınız olan veriyi yükleyin.

Günümüzün yüksek performansa sahip disk subsistemleriyle bile, geniş hacimli dosya sistemi (file i/o) direkt hafıza girişinden daha yavaştır. Diskten veri alma (initialization files, text files, random access files, custom binary files, local/remote database gibi dosyalardan) zaman gerektiren bir işlemdir. Yalnızca ihtiyaç duyduğunuz verileri yükleyerek, yukarıda sözü edilen dosyaların miktarlarını azaltabilirsiniz.
Unutmayın, anahtar konu, uygulamanızın bazı öğelerini mümkün olduğu kadar çabuk kullanıcının önüne getirmenizdir. Ancak, bir formun ortaya çıkıp kaybolması bir yada iki saniye alıyorsa, kullanıcı henüz çalışmaya hazır olamayacağı için zaman kaybı olabilir.

2.Gerçek Performansı Artırma

Kullanıcının hızlı bir şekilde uygulama ile karşılıklı etkileşime gireceği bir noktaya sahip olması önemli bir husustur. Bunun için de bu noktayı mümkün olduğunca hızlı bir biçimde çalıştıracak uygulama kodlarına gereksiniminiz vardır. Performansınızı hızlandırmak için kodunuza aşağıda söz edilen ince ayar tekniklerinin bir kısmını uygulayabilirsiniz.

-Variant'ların kullanımından kaçının.

Variant değişkenleri, esnek olmalarına karşın, son derecede yavaştırlar. Tasarım aşamasında, bilinmeyen veri tipleri ve Null'lar için Variantların kullanımını gerektiren bir durum olmadığı sürece, temel veri tipleri ile yapıştırın.

-Mümkün olduğunca Integer'leri kullanın.

32-bit uzunluğundaki Integer(tamsayı), 386'dan beri her intel işlemcinin doğal veri tipi olmuştur. Buna göre, hardware (işlemci)integer operasyonlarını, "floating point" yada "Variant" operasyonlarından daha hızlı çalıştıracaktır.
Matematikte "floating point"in kullanımını gerektirecek gibi görünen bazı işlemlerde "integer"ler kullanılabilir. Örneğin, formları veya kontrolleri hareket ettirdiğiniz zaman yalnızca "twip" yada "pixel"leri kullanıyorsanız, bunların yerine integerleri güvenle kullanabilirsiniz. Yalnız, floating point (düzeltme noktası) bölme operatörü (/) yerine, integer bölme operatörünü (\) kullanmayı unutmayın.

-Mümkün olduğunca With.........End With kullanın.

Her "object reference" (nesne referansı)çözümleme için hesaplama döngüleri alır. With......End With deyimi kullanılması ile, VB yalnızca bir kez nesne referans çözümlemesine gereksinim duyar, kullanılmadığı durumda ise her aşama (statement) için ayrı ayrı çözümleme gerektirir.

-Property değerlerini Local değişkenler içinde saklayın.

Property (Özellik) okumaları ve yazmaları pahalı işlemlerdir. Bir procedur içinde bir property değerini birden fazla girecekseniz, onun değerini bir local değişken içinde tutun ve property değerini doğrudan okuma yerine bu değişkeni kullanın.

- Loop'lardan çok mümkün olduğunca kodları uzaklaştırın.

Mümkün olduğunca çok kod taşınarak veya uzaklaştırılarak Loop yapıları önemli ölçüde hızlandırılabilir. Eğer Loop'lar birbirinin içine girmişse, kodları bu yuvalanmanın en uç tarafına doğru taşımaya çalışın. Eğer mümkünse, object reference'ları veya property okumalarını bir Loop'un bünyesinde oluşturmaktan kaçının.

-Dosyaları hafızada tutun.

Disk üzerinde depolanmış ve sıkça kullanılan veriler hafızada (memory) tutulmalıdır. Bununla birlikte, bunu yapmakta aşırıya kaçmayın. Aksi takdirde RAM'den sayfalaşma dosyasına (virtual memory)doğru daha çok veri değiş-tokuşu yapmak için Windows'u zorlayacak ve depolanan verilere sahip olmanın avantajını kaçıracaksınız.

-Uzaktan erişimli verileri yerel olarak saklayın.

Eğer bir ağ sürücüsüne yada remote database server'a gitmek zorundaysanız, mümkünse sıkça kullanılan verileri local olarak depolayın. Son zamanlardaki hızlı Ethernet ağlarının varlığında bile, hard diskten (local)veya hafızadan veri girmek, ağ üzerinden gitmekten daha hızlıdır. Özellikle remote data için yavaş bir WAN hattından gitmek zorundaysanız, local depolama stratejisi yeterli performans için kritik öneme sahip olabilmektedir. Performansı tekrar kazanmaya ek olarak, ağ yöneticisi, ağ üzerindeki trafiği azalttığınız için size teşekkür edecektir.

-İhtiyacınız olmayan verileri gidip almayın.

Yalnızca gerçekten tembel olan programcılar, uygulama tarafından gerek duyulmayan verileri alırlar. Örneğin, veritabanı sorgulamalarında SELECT*'i rutin olarak kullanıyorsanız, hemen hemen kesin olarak ihtiyacınız olmayan verilere dönüyorsunuz demektir. Diskten sizin uygulamanıza taşınan verinin her byte'ı zaman ve hafıza tüketir.

-Ham performansın profilini çıkarın.

Eğer performans kriterlerini ölçmüyorsanız, yalnızca tahmin ediyorsunuz demektir. Tahmin etmeyin. Uygulamanızın performansını ölçmek için bir profil çıkarma aracı yada kendi kodunuzun bir kısmını kullanın ve sonra da kodunuzun ince ayarını yapın.

3.Algılanan Performansı Artırma

Yalın hız önemlidir ve bu hız programı çalıştıracak bir kod parçası için gerekli zamanı en aza indirme duygumuzu tatmin eder. Ancak kullanıcı yalın hıza çok dikkat etmez. Kullanıcılar daha çok, uygulamanın girdilerine mümkün olduğunca çabuk yanıt vermesini ve verilen görevi bitirmesini isterler. Bazı durumlar için, bu yalın hız anlamına gelebilir, fakat çoğu durumda, bunun anlamı uygulamanın daha hızlı olmasından ziyade daha akıllı olmasıdır. Ek olarak, kullanıcının, bir işlemin sona ermesi için beklemesi gerektiği bu gibi durumlarda, uygulama, görevi gerçekleştirdiğine dair kullanıcıya bir bildirim sağlamak zorundadır.

Kullanıcıya daha iyi bir duyarlılık (programın kullanıcıya verdiği karşılık) duygusu sağlayabilecek iki temel teknik vardır:

- İşleri havale etmek/görevlendirmek:
Windows'un çok görevli bir işletim sistemi olması nedeniyle, görevlerin diğer bir uygulamaya dağıtımı, performansa büyük bir katkı sağlayabilmektedir. VB4 ile başlayan bu özellik, gittikçe daha da basitleştirildi. Uzun süre çalışan bazı görevleri diğer bir işleme göndermek için OLE Automation ve Active X server components'leri kullanabilirsiniz. Bazı durumlarda bu, birleştirme ve kuyruk yapılarının kurulumunu gerektirebilir, eğer kullanıcı zamanının makul bir kısmını ayırırsa, bu işlem için harcanan çabalar karşılığını verecektir. Havale edilen işin (delegating work) son günlerdeki anlamı, işin diğer bir bilgisayara geçirilmesidir. Bu, VB Enterprise Edition'daki Remote Automation yoluyla ve şimdilerde de DCOM ile mümkün olabilmektedir. Visual Basic 5 ile, bazı durumlarda çoklu-bağlantılı uygulamalar bile yaratabilirsiniz. Visual Basic Programmer's Journal'in 1997 Mayıs sayısında, bir VB uygulamasında bağlantılar yaratmak için VB5'in AddressOfOperator'ünü kullanmayı gösteren bir makale bulunmaktadır. Eğer, 16-bit platform üzerinde çalışan VB3 gibi eski versiyonları bile kullanıyorsanız, Shell function, DDE, OLE Automation veya NetDDE gibi yapılar kullanarak çalışmayı dağıtabilirsiniz. Eğer uygun API'leri değiştirmeye (modifiye etmeye) razıysanız, çevredeki bilgisayarlara yada işleri başarabilecek döngüleri içeren işlemlere veri ve görev aktarma amacıyla, bir ağ üzerinden veya lokal olarak iletişim kuran standart Windows IPC (Intreprocess communication) rutinlerini çağırabilirsiniz.

- Kullanıcıya geribildirim sağlama:
Bazen uzun akış gösteren işlemlerde kullanıcıya yol göstermek kaçınılmaz olmaktadır. Bu gibi durumlarda, kullanıcıya bazı geribesleme mekanizmaları sağlamak hayati öneme sahiptir. Eğer gecikme birkaç saniye gibi kısa bir süre ise, basit bir kum saati imleci yeterli olacaktır. Ancak gecikmeler daha uzun süre aldığında, işlem/süreç-metre gibi daha açık-seçik bir şeylere ihtiyacınız olacaktır. Bununla birlikte, bazı durumlarda işlem-metre kullanamayacağınızı da aklınızda bulundurunuz. Örneğin, eğer uzun süreçli bir veritabanı başlatmışsanız, sorgu kontrolü, sorgu tamamlanana kadar uygulamanıza dönmeyecektir. Bu durumda, kontrol sizin uygulamanıza tekrar dönene ve kullanıcıya geçene kadar ("program çalışıyor, lütfen bekleyiniz.....") gibi basit bir mesajdan başka alternatifiniz olmayabilir.
Mümkün olduğunca, geribesleme mekanizmaları yerine görevlendirme (havale)teknikleri kullanılmalıdır. Çoğu durumda, uygulamanın tasarımını yeniden düşünmek (veya oluşturmak), uzun akışlı bir process'in işini tamamlama sürecinde kullanıcının çalışmasına devam etmesine izin veren alternatif bir yaklaşım ortaya çıkaracaktır.

Kullanışlılığı kanıtlanmış bir ilave teknik ise, zamanında veri dağıtımıdır. Verilerin küçük dilimler halinde alınması, verinin büyük bir kısmını yada bütününü alma ile karşılaştırıldığında, uygulamanızda toplam olarak daha fazla hesaplama döngüleri gerektirebilir. Ancak, yalnızca ihtiyaç duyulduğunda gerekli veriler yüklenirse, kullanıcının çalışabildiği kadar hızlı veri dağıtabilmektedir. Yukarıdaki durum söz konusu ise, performansın bütününe ilişkin kayıp, uygulamanın duyarlılığı da eklenerek daha da artmaktadır.

Hatırlanması gereken anahtar faktör, bir görevi tamamlamak için kodunuzun görevle ilgisiz olarak geçirdiği sürenin uzunluğudur. Bir uygulamanın amacı, uygulamayı kullananlara bir hizmet sağlamaktır. Buna göre, önemli olan, kullanıcılara onların işlerini çabucak bitirmelerine izin veren araçlar temin etmektir. Eğer bir uygulama bir görevin yerine getirilmesi için 5 dakika harcıyorsa (ki, programcılık açısından bu korkunç uzun bir süredir), uygulama olmadan gerçekleştirilen 10 dakikadan hala daha azdır. Eğer siz kullanıcıya diğer bir görevle devam etmesine olanak sağlarsanız, kullanıcının verimliliği gerçekten artar ve böyle bir olanakla başlatmak uygulamanın amacıdır.

Özet:

Performansın geliştirilebildiği üç genel alan mevcuttur:
Başlangıç ve yükleme zamanı (Startup and Load Time)
Uygulamanızın ve ilgili formların ekrana daha hızlı gelmesi, kullanıcının daha hızlı çalışabilmesi anlamına gelmektedir. Formlarınızın ve başlangıç kodlarının karmaşıklığını azaltın ve onların mümkün olduğunca çabuk ekrana gelmesine çalışın.
Gerçek Performans (Real performance)
Etkin Kod yazma pratikleri yapmak, daima uygulamanıza fayda sağlar. CPU döngülerini boşa harcamaktan kaçınmak için standart code optimization tekniklerini kullanın.
Algılanan Performans (Perceived performance)
Kullanıcıların uygulamanızı değerlendirmesi, yalın hızdan daha çok duyarlılıkla ilgilidir. Kullanıcının yeniden mümkün olduğunca daha hızlı çalışabilmesi için görevleri, diğer bağlantılara, uygulamalara veya diğer bilgisayarlara dağıtmalısınız. Eğer uzun bir işlem kullanıcıyı kaçınılmaz bir şekilde beklemeye zorlarsa, bir geri besleme sağlayın ve böylece kullanıcı, uygulamanızın çalışmayı bıraktığınızı düşünmesin.
Bu temel teknikler, yalnızca uygulamanızı hızlandırmayacak, aynı zamanda size iyi bir başlangıç verecektir. Son olarak, uygulamanızın performansını ölçmeyi unutmamanızı öneriyorum. Eğer zamanınızı nadiren başvurulan ince ayar prosedürleriyle bir bakıma boşa harcarsanız, zamanınızı daha önemli kodları yada kullanıcılar için diğer verimlilik araçları geliştirmek için kullanamazsınız.