Bu sayfadaki yazılar
Sayfanın metni
Sayfa 24
Biliyorsunuz, COMMODORE 64 için program yazarken, NEXT komutunun arkasında yer alan değişken adı yazılmasa da oluyor. Bir de bunu deneyelim, bakalım ne olacak?
50 NEXT
Böylece elde ettiğimiz TEST12'nin zamanı, 41 saniye ile TEST11'e 49.09 ve TEST1'e de 490.43 fark atıyor. Eh artık iyice hızlandı. Acaba biraz daha?... Ama önce yeni kurallarımız:
!!! DİKKAT 5!!!
* Döngüleri kurarken, IF...THEN yerine FOR...NEXT komutunu kullanmak avantaj sağlayacaktır. * NEXT komutunun arkasından gelen değişken adı yazılmadığında, programın hızı artacaktır. Şimdiye kadar programı hep hızlandırdık, biraz da yavaşlatalım. TEST13'ü verildiği gibi yazın. Burada programı biraz süslemek, biraz da açıklayıcı hale getirmek için REM komutları kattık. Ölçüm sonucunda da göreceğiniz gibi, programımız 1.2 saniye ile 420 yavaşladı (TEST12'ye göre). Eğer bu REM komutlarını ve diğer komutlar arasında bulunan ve programın okunaklılığını artıran boşlukları ortadan kaldırırsak, dökümünü verdiğimiz TEST14'ü elde ederiz. Çalışma zamanı olarak ölçeceğimiz 1 saniye, sanki bize “Aferin, iyi ettiniz!” der gibi, di mi? Artık son adıma geldik. TEST1'in alabileceği son hızı şimdi göreceksiniz. Her şeyi tek satırda toparlayacağız. Ama bunun için COMMODORE 64 elkitabında belirtilen komut kısaltma yöntemlerine ihtiyacınız var. Biz gene de bir özetleyelim:
PRINT için ? işareti, CHR$ için C ve SHIFT-H, FOR için F ve SHIFT-O, NEXT için N ve SHIFT-E, POKE için P ve SHIFT-O. Artık TEST15'i yaratabiliriz:
10 TI$ — “000000“:PRİNT CHRS(4147)/:FORZ —- 41TO POKE214, 18:PRINT: PRINTTI/60 “SANİYE”: END
Elde ettiğimiz 0.96 saniye ile TEST14'ten 44 ve TEST1'den de 490.81 hızlı bir program elde ettik. Düşünün 10.45 saniyeden 0.96'ya inebildik. Hani COMMODORE 64 yavaştı?
!!! DİKKAT 6 !!!
*REM komutları ve komutlar arasında boşlukları olmayan programlar daha hızlı çalışır. * Satır sayısını azaltmak amacıyla, bir satıra sığdığı kadar emir koymak da hız sağlayacaktır. Ancak, bu son kuralların programın okunurluluğunu da tamamen ortadan kaldırdığını unutmayın lütfen! Başta, makina dili yok demiştik. Ama gene de, deminden beri uğraştığımız şeyi, yani 374 tane A yazma işini yapan bir makina dili programının da süresini ölçelim dedik. Hadi şimdi de TEST16'yı yazıp çalıştırın. Sonuç 0.083 saniye ile %499.20 fark!!! Fazla söze gerek yok... Bundan sonra, BASIC'in değişik yönlerini inceleyeceğiz. Örneğin, iki sayıyı 300 kere birbiriyle çarpalım. Bunun için önce TEST17'yi yazın. Çalıştırıp, zamanı ölçmeye kalkıştığınızda lütfen sabırlı olun: 13.083 saniye. Kaplumbağalar kıskanacak?
Ufak bir numara yapalım. İki sayının yerini değiştirelim. Şu ufak değişiklikle TEST18'i hazırlayın:
40
Zamanı ölçtüğümüzde, gerçekten de bir hızlanma görüyoruz. 12.683 saniye ile az ama gene de bir hızlanma. Tıpkı 15643 * 5'in hesaplanmasının 5 * 15643'ün hesaplanmasından daha kolay olması gibi. Haydi, minicik bir değişiklik daha yapalım. Ondalık noktasından önce gelen sıfır rakamını atalım (TEST 19):
40 A-.123456789*3
12.483 saniye ile TEST17'den %44.58 daha hızlı olduk.
!! DİKKAT
* Bir çarpma işlemi sırasında, daha uzun olan sayının ilk sayı olarak yazılması gerekir. * Sıfır sayısı yerine sadece ondalık nokta koymak daha fazla hız sağlayacaktır (A=0 yerine A=. ). Ayrıca, ondalıklı sayılarda -1 ile 1 arasındaki değerleri yazarken, ondalık noktasından önce gelen sıfır rakamı yazılmamalıdır. Bir de daha önceden öğrendiğimiz, değişken metodunu uygulayarak TEST20'yi elde edelim:
25 B-.123456789:C-3 40 AzB*C
Göreceğiniz gibi, aniden büyük bir hızlanma ile 1.5 saniyeye geleceğiz. Nasıl ama?! Şimdi de aynı programı, bilgisayarımızın üslü sayıları hesaplamaktaki hızını görmek için kullanalım. Verdiğimiz TEST21'i yazın ve çalıştırın. Göreceğiniz gibi, 4'ün kübünü 300 kere almak bize 10.53 saniyeye patlıyor.
Klavyeyle gezinmek için ← ve → tuşları.
Sayfa 25
Eh, biz de sayıları değişkenlere yerleştiririz. Hemen bir TEST22 yazalım:
25 Bz4:Cz3 40 A-BAC
Ölçüyoruz... Olamaz, sadece %41.7'lik bir hızlanma ile 10.35 saniye. Hayır, hiçbir şeyi yanlış yapmadık. Sorun, COMMODORE 64'ün üs almada kullandığı metodun kötülüğünde yatmakta. Öyleyse ne yapalım?. Bir-iki ufak değişiklik ile elde edeceğimiz TEST23, bize cevabı verecek:
40 A-—B*'B*B
Yaptığımız, üs alma yerine çarpma kullanmak oldu. Sonuç şaşırtıcı: 2.05 saniye ile TEST21'e göre %480.53'lük bir hızlanma !! DİKKAT 8 !!!
* Üs alma işlemi, mümkün olduğu kadar çarpma haline dönüştürülmelidir. Artık, altprogramları incelemeye geçebiliriz. Önce TEST24'ü yazın. Gördüğünüz gibi, burada altprogramı GOTO komutu ile çağırıp, altprogramdan da gene GOTO komutu ile geri dönüyoruz. Süreyi ölçtüğümüzde, 3.25 saniye elde edeceğiz. Peki, GOTO yerine GOSUB... RETURN kullanırsak ne olacak? TEST25 için şu değişiklikleri yapalım:
40 GOSUB40000 60000 RETURN
TEST1
10 20 PRINT CHRS$C147) 30 2-0 490 POKE 10244*2,1:POKE 5529642,14 60 IF 2-374 THEN 1800 78 GÜT0 48
1080 POKE 214,18:PRINT:PRINT
READY.
TEST4
10 20 PRINT CHR$C(147)
30
40 POKE RE4Z,BA SO 60 IF Z-BIİ THEN 1888 78 GOTO 48
1008 POKE 214,18:PRINT:PRINT
READY.
TEST6
10 206 PRINT CHR$<147) 30 Z2-0:B-374 40 SO 2-211 68 IF Z-B THEN 1088 78 GOT0O 48 *
1008 POKE 214,18:PRINT:PRINT TI/68
READY.
"SANIYE"
Ölçtüğümüzde elde ettiğimiz 3.15 saniye, TEST24'den %43.07 daha fazla. Bir başka önemli nokta, altprogram ile programın başlangıcı arasındaki uzaklıktır. Şimdi, deminki programlarımızı biraz değiştirelim ve altprogramlarımızı program başına alalım. Önce TEST26'yı yazın. Süremiz, 3.06 saniye ile TEST25'den bile az olacaktır (%42.85). TEST27 için şu değişiklikleri yapın:
6 RETURN 33 GOSUB4A
GOTO yerine GOSUB koyduğumuzda, 2.93 saniye ile daha hızlı bir program elde ediyoruz, gördüğünüz gibi. Bu TEST24'den %49.84 daha hızlı bir değerdir. Yeni kurallarımızı toparlayacak olursak:
!! DİKKAT 9
* Altprogramları GOSUB ile çağırıp, ana programa RETURN ile dönmek, aynı işlemleri GOTO ile yapmaktan daha hızlıdır. * Sık sık kullanılan altprogramların, anaprogramın başlarında olması, hız sağlayacaktır. Artık birkaç ufak-tefek nokta daha kaldı. Önce TEST28'i yazın. Zaman olarak 2.883 saniye olacaktır. Şimdi, DİKKAT7'de belirttiğimiz kurallardan birini deneyelim. 30 numaralı satırdaki A=0 yerine A=. koyarak TEST29'u elde edelim ve zamanı ölçelim. Gerçekten de 2.283 saniye ile bir artış oldu.
TEST13
REM&
m
40 SO NEXT
kalk oka
Şimdi de aynı satırdaki A1 değişkeninin yerine AA değişkenini koyalım ve böylece oluşturduğumuz TEST30'u ölçelim. Elde ettiğimiz 2.3 saniye bize açıkça bir yavaşlamanın varlığını göstermektedir. TEST31'de ise, AA yerine sadece A harfini kullanalım. 2.23 saniye ile TEST28'den %422.65 daha hızlı program elde ettik. Son olarak da, karakter değişkenlerine değer konmasını inceleyeceğiz. Şimdi TEST32'yi yazın. Süresi, 2.45 saniye olacaktır. TEST33'ü elde etmek için 25 numaralı satırı silin ve şu değişikliği yapın:
30 AS —-
Elde edeceğimiz 2.316 saniye, TEST 32'den 45.46 daha hızlı olacaktır.
İl! DİKKAT 410!!!
* Eğer iki karakterden oluşan değişken isimleri kullanılıyorsa, ikinci karakterin bir rakam olmasına dikkat edilmelidir. Ancak en iyisi tek karakterli değişken adlarıdır. * Karakter dizileri, bir karakter değişkenine yüklenirken tırnak içinde verilmişlerse, daha önce bir başka değişkene yüklenmiş olmalarına oranla daha hızlı işlerler. Artık bitti! Herhalde birçok önyargı bu yazıyı okurken yıkılıp gitmiştir. Şimdi daha hızlı programlar yazacağınız günler sizi bekliyor!!
*
& *
*
kok ak ak ak akk kak ok ak ak
PRINT TO 3 EKRANI SILMEK 308 FOR Zzi TO 374:REM 57
4 KARAKTER
999 REM ZAMANI GÖSTERME 1000 POKE 214,18:PRINT:PRINT “SANIYE":END
READY.
TEST14
10 20
38 FORZ-1T0374 40 PRINT"A"; NEXT
1080 END
READY.
TESTİ6 5
10 20 PRIİINTCHRS$<147)
38 SYS7168
1000 20080
29028 READB
2010