|
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.
|