Delphi de şimsek hızında işlemler

Başlatan bunalmis, 31 Aralık 2009, 00:24:53

z

Hızın birinici dereceden önemli olduğu bir yazılımla uğraşıyorum. Programda fazladan tek bir NOP bile beni rahatsız ediyor. Hızı artırmak icin kafa yorarken aşağıdaki gibi kodlamaya ihtiyaç duydum.

function F1(var):boolean
begin
           .....
           .....
           F2();
           .....
           .....

function F2():boolean
begin
           .....
           .....
end;
end;


Fakat, Boyle bir kodlamaya Delphi izin vermez. Buna ne gerek var diyorsanız bu yazıyı okumayı burda bırakınız ve bu başlıktan çıkınız.

Fakat assembly sınır tanımaz. Şimdi bu işlem nasıl yapılıyora bakalım.
function F1(var):boolean
label F2;
begin

           // F1 fonksiyonuna ait Delphi kodlama alanı

           .....
           .....
          // F1 içindeki F2 fonksiyonunu çağıralım
          asm
                 Call F2
          end;

           // F1 fonksiyonuna ait Delphi kodlama alanı devamı

           .....
           .....

F2:       // F2 fonksiyonuna ait Delphi kodlama alanı
            .......
            .......
            .......
           asm
              ret
           end;
            
end;


Evet çözüm bu şekilde.

F1 fonksiyonunu nerde nasıl terkedeceginizi siz bilirsiniz.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

wsxwsx

Dolambaçlı  yöntemler seçmişsiniz. delphinin hızına yetişebileceğinize, ve bu hızın yetersiz kaldığına inanmıyorum. asm ile uğraşmanıza gerek olduğunu hiç sanmıyorum.

Alıntı YapBoyle bir kodlamaya Delphi izin vermez
NEden vermez? çünkü f2 yi f1 den sonra yazmışsınız. Fakat buna rağmen yine de izin verebilir. f1 ve f2 yi Tform1 un fonksiyonu olarak tanımlarsanız, önce veya sonra tanımlayabilirsiniz. Aşağıdaki gibi olur.

type
  TForm1 = class(TForm)
  private
    function f1(sayi: integer): integer;
    function f2(otekisayi: integer): integer;

    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function TForm1.f1(sayi: integer): integer;
begin
  result := f2(sayi); // f1 fonk. kendisine
                      // verilen sayıyı f2 ile işletiyor
                      // kendi sonucunu buluyor
end;

function TForm1.f2(otekisayi: integer): integer;
begin
  result := otekisayi * 2
end;

Bunu bir kenera bırakalım. f1 içinde ayrıca f2 diye bir fonksiyon tanımlayabilirsiniz.  aşağıdaki şekilde çalışır. bu f2 fonksiyonu sadece f1 içindeki begin ve end arasından çağırılabilir.
function f1(sayi: integer): integer;
  function f2(otekisayi: integer): integer;
  begin
    result := otekisayi * 2
  end;

begin
  result := f2(sayi);   // f1 fonk. kendisine
                        // verilen sayıyı f2 ile işletiyor
                        // Kendi sonucunu elde ediyor
end;

//Örnrek:     
yenisayi := f1(3);   // sonuç 6


Ayrıca label f2 yazmışsınız. delphide labelle ne işiniz olur? basic değil bu. onu derhal silin.  evet bunu kullanımınıza delphi izin verebilir. fakat mutlaka kullanmanız gerekmez. Label yazdıysanız "goto" da yazacaksınız demektir. buda vahim bir durum. modern delphi programcılığına yakışmaz.

ASM diye tutturmuşsunuz hayret bişey yav. Hız yetersiz geliyorsa aynı anda çalışacak thread ler oluşturursunuz, kodunuz başından başlayıp sırayla çalışmaz. aynı anda 5-10 adet thread çalışır. bu sırada cpu kullanımı az yükselir ama 3-5 saniyede işlem biter. Tabi bu hesaplamalar sırayla yapılması gerekiyorsa biri, diğerini beklemesi gerekir.

Hız gerekiyor dediğiniz uygulamanın cpu kullanımı nedir? CPU Kaç Ghz ?

z

Yazinin en basinda bak ne demisim.

Alıntı YapProgramda fazladan tek bir NOP bile beni rahatsız ediyor.

Asm konusunun gereksizligine karar vermeden once derleme sonucu olusan asm li ve asm siz hex kodlara bakmanizi oneririm.

Alıntı YapASM diye tutturmuşsunuz hayret bişey yav. Hız yetersiz geliyorsa aynı anda çalışacak thread ler oluşturursunuz,

Siradan bir PC paralel islemlere de mi basladi. :D
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

wsxwsx

Anladım roket işi bu. çok kritik uygulama  :D

sıradan pc paralel işlem yapar. yobazlığın lüzumu yok. windows kullanıyorsanız multithread program yaparsınız çalışır. pentium 3, 400Mhz makinanız bile yapar bu işi. Yoksa zaten içinde windows çalışmaz .

z

Paralel islem tanimini birimizden birimiz yanlis biliyor.

Bence de yobazligin anlami yok.

Alıntı YapHız yetersiz geliyorsa aynı anda çalışacak thread ler oluşturursunuz,
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

wsxwsx

senin bildiğin nedir hocam? anlat bakalım.

Benim bildiğim şu.
diyelim 2 tane iş yapılacak.

1.iş   3 den 600 bine kadar sayılar toplanacak
2. iş  8 den 982000 e kadar sayılar çarpılacak.


bu işleri aynı anda yapabilirsin. fakat. ayrı ayrtı thread kullanmak gerekir. mesela tümünü form1 içinde yapmaya çalışırsan işler aynı anda olmaz . hepsi ana thread e senkron olur. işlerin biri bitmeden diğeri yapılmaz.

BUnun yerine form1 içinde threadler suspend halde oluşturulur. Sonra
th1.resume;  //
th2.resume;  // başlat

dersin 2 si aynı anda çalışmaya başlar. her bir thread global bir değişkeni hesaplar ve bulur. bu değişken form1 tarafından çağırılabilir.

Dikkat edilecek konu threadler içinde .synchronize  kullanılmamasıdır. yoksa threadler birbirlerini beklemeye çalışır.  threadler kullanımının anlamı kalmaz.

Gerçekte işlemler aynı anda mı olur? Hayır. XP vb. realtime işletim sistemi olmadığı için aynı anda olmaz.

Windows, diğer aynı anda yürüttüğü tüm işleri gibi , bu sizin threadler için de bazı zamanlar ayırır. bunları birlikte döndürür. Bu sayede işlemler sırayla yapılmadığı için birbirini beklemiş olmaz. Neticede toplam işlem süreniz kısalır.  özetle "Hız yetmiyor" demeden önce programınızın CPU kullanımı % kaçtır? ona bakmak gerekir.



Alıntı yapılan: "bunalmis"Buna ne gerek var diyorsanız bu yazıyı okumayı burda bırakınız ve bu başlıktan çıkınız.
buna ne gerek var ,buna ne gerek var ,buna ne gerek var ,buna ne gerek var ,

z

Hizi artirmak icin ayni anda islem yapmak demek paralel islem yapmak demektir. Bu da ozel donanim gerektirir.

a=a+1: b=b+1:

islemi yapildiginda a sonucu bulundugunda bu esnada b sonucu da bulunmus demektir.

Bu islemleri paralel yapmaz da

a=a+1;
b=b+1;

yaptigimizda b=b+1 a islemi yapildiktan sonra ele alinir.

Bu da bildigimiz klasik islemci mantigidir.

Gordugun gibi ayni anda islem yapma mantiklarimiz bile farkli iken hiz konusunda ahkam kesiyorsun.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

wsxwsx

Özel donanıma ihtiyaç duymadan önce, elimzideki normal donanımı tamolarak kullanabilmek gerek.

Yavaş dediğiniz şekilde, programınızın CPU kullanımı % kaçtır?
Görev yöneticisinde ne görünüyor? Ona göre kesin ahkam kesecem

Bu yaptığınız işlerin benzeriyle uğraşıyorum. Yukarıda bahsettiğim şekilde çalışıyor.  Saniyede binlerce hesap yapılıyor.  CPU bazen çok yavaş makinelerde %50 yi geçiyor. ama yine program çalışıyor. iyi makinede %2-%3

İster inanın ister inanmayın. bu uygulamayı multithread yaparsanız hızınız artar. işlemler birbirini beklemez.

z

Ozel donanima falan ihtiyacim yok. Bunu nerden cikardin. asm ile istedigim yerde hizlaniyorum.

Alıntı YapLabel yazdıysanız "goto" da yazacaksınız demektir. buda vahim bir durum. modern delphi programcılığına yakışmaz.

Ben modern Delphici değilim.

//           Diskten okumak uzere text dosya ac  

             If F1() then goto Error
             ......
             If F2() then goto Error
             ......
             If F3() then goto Error
             ......
             If F4() then goto Error
             ......
             If F5() then goto Error
             ......
             ......
             ......
             ......
             A=A+1;
             if A=10 then goto Error;
             if F1() then
               begin
                  A=0;
                  Goto Error;
               end;

Error:     // acilmis dosyalari kapat vs



Bana bu kodun aynisi Gotosuz yazarmisin?
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

wsxwsx

procedure error;
begin 
  dosyakapat(dosya1);
  dosyakapat(dosya2);
  dosyakapat(dosya3);
  ...
  showmessage('vahim durum');
end;


procedure has_procedure;
begin
             A=A+1; 
             if A=10 then error;

             if F1() then 
               begin 
                  A=0; 
                  Error;  // gotoyla işiniz yok. 
                         // prosedür ismini yazın oraya gider
                         // gerekeni yapıp buraya geri döner.
                   Close;  // dosyaları kapadı hata  bildirdi sonra prog. kapadı
               end; 

end;

controller

Sayın bunalmis;

"bu hız bana yetmiyor" demeden önce wsxwsx'in de dediği gibi öncelikle uygulamanızın görev yöneticisinde ki cpu kullanımını %100 olarak görmeniz gerekir.
Hesabım OG tarafından haksız bir şekilde pasif yapılmıştır.

z

Alıntı yapılan: "wsxwsx"
procedure error;
begin 
  dosyakapat(dosya1);
  dosyakapat(dosya2);
  dosyakapat(dosya3);
  ...
  showmessage('vahim durum');
end;


procedure has_procedure;
begin
             A=A+1; 
             if A=10 then error;

             if F1() then 
               begin 
                  A=0; 
                  Error;  // gotoyla işiniz yok. 
                         // prosedür ismini yazın oraya gider
                         // gerekeni yapıp buraya geri döner.

               end; 

end;

Bak iste burda fikir ayriliklarimiz var.

Dosyalarin kapatilmasi icin gerekli bilgileri procedure tasimaniz gerekiyor. Bu tasimalarin  her biri bir islem fakat yuksek seviye komutlarla calisirken bunlari siz hic gormuyorsunuz.

Procedure'e giris cikislarinda ilave asm kodlar var bunlari da gormuyorsunuz.

Bunlarin beni rahatsiz etmedigi durumlarda zaten kullaniyorum. Fakat rahatsiz oldugum durumlarda dizginleri ele aliyorum. Bu noktadan sonra artik el kodunu değil saf kendi kodlarimi kullaniyorum.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Klein

@Bunalm1s hocam
Herkes istedigi program1 istedigi sekilde yazar. buna kimsenin itiraz1 olamaz.  Ama konu windows ve OOP bir dil ise ,  ve siz  de  piyasaya sat1lacak ve herkesin bilgisayar1nda çal1smas1 gereken bir kod yaz1yorsan1z , kurallar1n da pek disina cikmamak gerektigi kanaatindeyim.
Eger kurallar1n disina cikiyorsaniz da , programi isletim sisteminin farkli versiyonlarinda  farkl1 CPU secenekleri ile test etmenizi oneririm.

Ayrica konu Mesaj tabanli bir isletim sistemi olunca , hiz konusunda bu isletim sistemine pek guvenmeyin derim.

wsxwsx

Asm kullanımını  geçici bir süre askıya alın.
İşlemleri usulüne uygun şekilde  delphi ile  yapın.
Hız yeterli gelir.

Hatta durumun öyle olmadığını göstermek için bir örnek  verirseniz onu güzelleştirip buraya gönderebilrim.

z

Alıntı yapılan: "controller"Sayın bunalmis;

"bu hız bana yetmiyor" demeden önce wsxwsx'in de dediği gibi öncelikle uygulamanızın görev yöneticisinde ki cpu kullanımını %100 olarak görmeniz gerekir.

DOS ortaminda 32 bit moda gecip yazdigim cogu kod Win ortaminda yazdigim koddan daha hizli calisiyor.

CPU frekansi CPU kullanim gucu vs hikaye. Ben CPU nun benim uygulama ne kadar zaman ayirdigina bakarim.

Eger windows da kosmasi icin yazdigim program kendine cpu zamanindan buyuk bir pay koparabilecekse o zaman bunun nasil yapildigini bilmek isterim.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com