Bilmek istediğin her şeye ulaş

Yazdığım script çok yavaş çalışıyor. 1200 satırlık bir scriptte ilk olarak 125 satırda 5 tur atan bir FOR NEXT döngüsünü SUB'a gönderip orada da 20 satırlık 3 tur attırıyorum. Bu döngüleri IF ENDIF'lerle yazsam tahminen yüzde olarak ne kadar hız kazanırım?

Bir de bu script beraber çalışan 3 script'den bir tanesi toplamı 3250 satır.Düzenle
Günümüzün hızlı tüketen ve kaynaklarını çok da düşünmeyen yaşam anlayışının son yıllarda yazılım disiplinlerini de tehdit ettiğini gözlemlemekteyim. Gerçek bir yazılımcı olmak, bir belirsizliği ortadan kaldıracak mükemmellikte, sistemli, analitik ve algoritmik bir çözüm getirme iddiasında olmak demektir.

Diğer iş kolları bu cümlemden pek bir sonuç çıkaramayabilirler ancak meslektaşlarımın kafalarındaki kurgularını ve hayallerini mutlak bir sistemsel disiplin içinde gerçekleştirmeleri ve bunu asgari kaynak kullanımı ile gerçeklemeleridir, beklenen.

Bugünün yazılımlarına bakıldığında, pek çoğunun değişken tip ve uzunluklarının tanımından, program mimarisinin tasarımına, veritabanı yapılarının oluşturulmasına kadar pekçok konuda, yeterince hassas davranmadıklarını görüyorum. Oysa yazılım disiplinlerini bugüne ulaştıran klasik disiplinlerde bu çok önemli bir konudur. Hafıza miktarlarının bugün GigaByte'lar ile ölçülmesi, bu durumu değiştirmemelidir. Çünkü ihmal edilenler, süpürülmeyen atıklar, kapatılmayan bağlantılar, işlemci komut işleme süreleri gözetilmeden rastgele seçilen alternatifler, özellikle döngüsel yapılarda katlanarak daha büyük bir tıkanmaya neden olma potansiyeline sahiptirler ve oluşan hatanın bunlara dayalı olduğunu düşünmek, genellikle akla gelecek en son iştir.

Program sayacı (PC) değerini altüst edercesine sık ve gereksiz altyordamlara atıflar bile önemli bir sorun teşkil eder. Eskiler, bunun en düzensiz formu olan GOTO kullanımından men ederler öğrencileri ve haklıdırlar.

Bir yazılımcı ne yazdığı kadar neyin üzerinde yazdığına ve hangi ortamlarda çalışacağına da odaklanmalıdır aslında. Sistemin sahip olduğu işlemciden başlayarak disk erişim hızları bile bir sistemin performansını etkiler. Sözgelimi; bilgisayar sistemlerinin en utanılası bileşenlerinden olan sabit disk sürücüsü üzerindeki bir veritabanına optimize edilmemiş yöntemlerle, gelişigüzel her ulaşmanın, mekanik bir disk hareketine neden olacağından ötürü, zamansal maliyeti çok yüksek olacaktır.

Bazı derleyiciler, yazılımcının yaptığı muhtemel atıl kodları ve fonksiyonları optimize etmeye çalışırlar gibi görünse de, derleme ve yorumlama sürati açısından genellikle semantik tarzdaki bu özellik ihmal edilerek yazımsal (syntax) hatalar kontrol edilir.

Bunlar da genellikle üniversitelerde pek sıra gelmeyen ya da alfabedeki ilk harf kadar çıtlatılan, çalıştığınız işletmelerde ise sonuca, bir an evvel ürün teslimine odaklı olunmasında ötürü ihmal edilen ama çok önemli ve gerçek bir yazılımcı olarak yetişmenize katkı verecek konulardır. İmkanlar nispetinde paylaşmaya, eğitimlere dahil etmeye çalışıyorum.
  • Paylaş
1

Brutal Code, Adeta bir blog yazısı olmuş. Çok beğendim.

For next döngüsünü if endif'e nasıl çevirebiliyorsun onu bu kadar bilgiyle anlayamıyorum, ama döngüler her zaman diğerlerine göre yavaş olur. Net bir cevap yazmam için kodunu görmem lazım.Ama bi kaç bişey söyleyebilirim: satır sayısı programın hızını etkiler, ama daha çok o satır içinde geçen işlemler programı yavaşlatır. Uzun bir aritmetik işlem varsa bu biraz daha yavaş olur. Yada bir I/O işlemi varsa daha da yavaş olur. Kısaca döngünün içeriği önemli. Bir döngüyü hızlandırmak içinde gereksiz dönüşlerini ortadan kaldıracak condition yazmak gerekir.
  • Paylaş
7

Şaman, FOR değişken=1 TO hedef
işlemler
NEXT

yerine IF değişken=1 THEN
işlemler
IF değişken >1 THEN
işlemler
IF değişken >2 THEN
işlemler
IF değişken = hedef THEN
işlemler
ENDIF
ENDIF
ENDIF
ENDIF

gibi yazılabiliyor.

Şaman, Her döngüde zaten üç kere Subroutin'e gönderiyorum bundan beş adet oluyor, SUB'da da gelen 3 kere dönüyor. Hangi şekil daha hızlı olur? İlkinde satır sayısı azalıyor ama döngü var, ikincisinde satır sayısı katlanatak artıyor ama döngü yok.

Şaman, Tabii ki öncelikle ilginize teşekkür etmem gerekirdi. Onu da şimdi yapıyorum, teşekkürler.

Celikkan, Bu konuyu biliyosunuzdur belkide yine bahsedeyim dedim.şimdi söyle bir durum var. For ile satır sayısını azaltmıyorsunuz.. Sadece yazarken az satır yazıyosunuz, ama program döngüye girdiği için for döngüsünün döngü sayısı kadar satırları tekrar çalıştırıyor. Yani satır sayısı azalmıyor. Sizin durumunuz için anladığım kadarıyla iki kodun da birbirinden hızlı olduğu söylenemez. Ama programlama kurallarına göre peşpeşe çok sayıda if kullanmak kötü bir programlamadır. Bu işlemi döngüyle yapabiliyorsanız öle yapılası daha uygundur.
Özetle:
-hızlı olma konusunda ikiside aynı diyorum(sorunuzu anlayabildğm kadarıyla)
-tercih konusunda da döngü diyorum. İyi programlamanın kuralı böyle olduğu için.

Kolay gelsin

Şaman, Bilmiyordum, ben bir iki aydır kodluyorum, zaten bilmediğimden soruyorum. Yardımlarınız için teşekkürler. Döngülü halini bırakıyorum o zaman. Program zaten daha okunaklı oluyor, benim için de.

Celikkan, Her zaman daha okunaklı ve anlaşılır hali makuldür.
Kısa olması her zaman daha önemlidir.
Unutmayın programlada en önemli şeylerden biri, yazan dışında biri baktığında o kodu anlamalıdır. Yoksa bi manası olmaz, sadece yazan kişinin işini görür. Hatta 1 ay sonra yazan kişi bile dönüp baksa kötü programlamadan bişey anlamaz.
O yüzden programlamada belli standartlar belirlenmiştir, bu standartlar sayesinde insanlar anlaşabilirler. O standarda uyulmadan yazılan programlarda havada kalır.
Şöyle düşünebiliriz, bir profesör düşünün ki çok bilgili, derse giriyor ve anlatmaya başlıyor. Ama öğrenciler hocadan faydalanamıyorlar, çünkü hoca çince anlatıyor dersi. Cocuklar çince bilmediği için anlayamıyorlar. O yüzden standartlar var, kodu standartlara göre yazarsanız ona bakan insanlarla aynı dili konuşmuş olursunuz. Ayrıca o standartlar okunurluğuda kolaylaştırmak için belirlenmiştir. Zaten sizinde dediğiniz gibi, döngülü program daha okunaklı oluyor.

Kolay gelsin.

Şaman, Teşekkürler, her türlü bilgiden yararlanıyorum.

Döngüler yavaş olur ama burada toplam 15 tur'dan bahsediliyor. For döngüsünün yavaşlatma miktarı for döngüsünün içeriğinden bağımsız tura bağlıdır. Sonuçta if'lerde de içerik ayn sayıda çağırılıyor. 15 turun yavaşlatmasını insan beyni algılayamaz. (Milyondan sonra anlaşılır bir yavaşlama yapıyor) . Buradaki açıklamaya göre sorun for döngüsünün çağırdığı kısımda olmalı. Profiler kullanılabilir ama çok uzun zamandır kullanmadım, en iyisi hangisi ve nasıl kullanıldığı hakkında bilgi veremem ama eclipse plugin olarak vardı.
  • Paylaş
2

Şaman, Teşekkürler Ceyhun. Şimdi yapı şöyle görünüyor:
FOR değişken=1 TO hedef
işlemler
GOSUB "a"
işlemler
GOSUB "a"
işlemler
GOSUB "a"
NEXT

Bunun yerine şu şekilde de yazabilirim
IF değişken>0 THEN
işlemler
GOSUB "a"
işlemler
GOSUB "a"
işlemler
GOSUB "a"
IF değişken >1 THEN
işlemler
GOSUB "a"
işlemler
GOSUB "a"
işlemler
GOSUB "a"
IF değişken >2 THEN
işlemler
GOSUB "a"
işlemler
GOSUB "a"
işlemler
GOSUB "a"
IF değişken = hedef THEN
işlemler
GOSUB "a"
işlemler
GOSUB "a"
işlemler
GOSUB "a"
ENDIF
ENDIF
ENDIF
ENDIF


SUB da şöyle:

"a":
FOR değişken1=1 TO hedef1
işlemler
NEXT
RETURN

Bu da şöyle IF'lenebilir:

"a":
IF değişken1>0
işlemler
IF değişken1>1
işlemler
IF değişken1>2
işlemler
ENDIF
ENDIF
ENDIF
RETURN

Aslında çağırdığı subroutine ilk döngüden çok daha kısa. Problem var mı onu da bilmiyorum, sadece beklediğimden çok yavaş çalışıyor. Yani bu kadar az bir döngü işlemi yavaşlatmaz diyorsun. IF'lediğim zaman da zaten satır sayısı katlanıyor. Programın bir kısmını zaten IF'leyerek bir kısmında da sıkıldım döngüleyerek yazdım...

Ceyhun Çakar, bence işlemler'in içinde olan bir şey sistemi yavaşlatıyor olmalı. for nedeniyle eklenen fazladan dallanma çok az. PIC'te (1MHz gibi hızlarda çalışır) 1 saniye elde etmek için 1 milyon kez for'da boş döndürülüyor. Garip bir durum

Sonraki Soru
HESAP OLUŞTUR

İstatistikler

229 Görüntülenme7 Takipçi3 Yanıt

Eş Anlamlı Soru Ekle

  • Döngüler scriptleri ne kadar yavaşlatabilir?