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

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

wsxwsx

Hikaye değil. işin özü.
cpu zamanından zaman almak kolay.
örnek
procedure TForm1.Button1Click(Sender: TObject);
begin
  while 1 = 1 do
  begin
  end;
end;
Tek çekirdekli makinenizde CPU kullanımı %100 olur. program kilitlenir :) çift çekirdekli ise %50 civarı oluyor.

controller

Alıntı yapılan: "bunalmis"
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.


Bu çok normal, çünkü DOS multitasking bir işletim sistemi değil.
Hesabım OG tarafından haksız bir şekilde pasif yapılmıştır.

controller

Alıntı yapılan: "bunalmis"

Eger windows da kosmasi icin yazdigim program kendine cpu zamanindan buyuk bir pay koparabilecekse o zaman bunun nasil yapildigini bilmek isterim.

http://msdn.microsoft.com/en-us/library/ms685100(VS.85).aspx
Hesabım OG tarafından haksız bir şekilde pasif yapılmıştır.

z

Alıntı yapılan: "wsxwsx"Hikaye değil. işin özü.
cpu zamanından zaman almak kolay.
örnek
procedure TForm1.Button1Click(Sender: TObject);
begin
  while 1 = 1 do
  begin
  end;
end;
Tek çekirdekli makinenizde CPU kullanımı %100 olur. program kilitlenir :) çift çekirdekli ise %50 civarı oluyor.

Bu bahsettigin programin exesini 3 4 kez calistir. Islemci kullanimini %100 e cikart.

Ne hikmetse hala command penceresinde yeni yeni uygulamalar acabiliyorum cmd calistirabiliyorum.

Bunu nasil acikliyorsun?
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

controller

Alıntı yapılan: "bunalmis"

Ne hikmetse hala command penceresinde yeni yeni uygulamalar acabiliyorum cmd calistirabiliyorum.

Bunu nasil acikliyorsun?

Çünkü kullandığınız işletim sistemi DOS değil.
Hesabım OG tarafından haksız bir şekilde pasif yapılmıştır.

z

Alıntı yapılan: "controller"
Alıntı yapılan: "bunalmis"
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.


Bu çok normal, çünkü DOS multitasking bir işletim sistemi değil.

Iste benim asm ile yaptigim olay da bununla alakali.

Benim kodlarimin isleyisi sik sik kesintiye ugruyor. O halde kodumu asm ile hizlandirirsam kodum daha kisa surede daha cok isler yapacaktir.

Processsor hizlari 3GHz i gecti. Ama hala programlar yavas, hatta eski zamanlarda cogu program simdikinden daha hizli kosuyordu.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

z

Alıntı yapılan: "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.

Hocam cok haklisin ancak,

Dos zamaninda elimizde bios listing ve dos int kodlari aciklamalari vardi PC yi kendi tasarladigimiz donaninmiscasina kullanabiliyorduk.

Windowsa gecince ogrenilmesi gereken bilgi miktari inanilmaz artti.
Boyle olunca eski kivrak oyunlarin hic birini yapamaz oldum.
Mecburen mevcut bilgilerimle hiz arttirimina gitmek durumundayim.

Su siralar yaptigim asm oyunlar isletim sistemini ilgilendiren seyler değil.
Kullanimima acik kod alani ve stack da veri alanim var. Burada privileged komutlar kullanmadigim surece kodum isletim sisteminden  bagimsiz calisir. Kodlarimi da 80386 kodlarinin ustune cikartmadigim icin islemciden kaynaklanacak sorunum da yok.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

z

Alıntı yapılan: "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.

Hay hay,

Örnek kısa bir fonksiyon yazmanı isteyeceğim.

Şayet yazdığın kod, benim asm takviyeli Delphi kodlarimdan daha hizli koşarsa söz bu forum sitesinde asm nin adını bile ağzıma almayacağım.

Fakat, benim kodlarım seninkinden daha hızlı çalisırsa bu forum sitesinde bir daha asm konusunda atıp tutmanı istemiyorum.

Kabul ediyormusun?

Kabul ediyorsan soruyu soracağım. Dil konusunda ASM hariç dilediğini seçmekte serbestsin.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

wsxwsx

Tamam bildir. demo yapalım görelim. ancak ASM konusunda yine atıp tutmaya devam edebilirim.  Yapılan işin süresini somut şekilde görebilmemiz lazım.  Ama akıl var mantık var. asm daha hızlı olur ona şüphe yok.

Burada ben asm yavaş olur demiyorum. DElphide bu yapacağınız iş her ne ise, doğru dürüst ve yeterli hızda yapılabilir diyorum. ASM kullanmanıza kendinizi sıkıntıya sokmanıza gerek yok . okadar yüksek hız gerektirecek iş nedir? zavallı windows karşılayamıyor

Şimdi de muhtemelen "yeterli" den kasıt nedir diyeceksiniz.

Bana göre programım celeron 1000Mhz makinede çalışıyor ve %10 CPU kullanıyorsa, yapması gereken işi yapıyor ve aksatmıyorsa gayet yeterlidir.

z

Benim için hız nedir?

Farzı misal;

Yazdığım programda bir dosyayı seçip başla dediğimde,  dosyada daha önceden belli kurala göre oluşturulmuş veriler okunup hesaplanıp bu verilerin tarif ettiği grafik ekrana çizilirken, başla dediğim an ile çizimin ekranda bitmiş hali arasında geçen zamanın kısalığıdır.

Bu süre ASM eklentisiz programda 30 sn iken asm eklentisi ile bu süreyi 25 sn ye ye indirebiliyorsam başarılı bir iş yaptım derim.

Heleki 10 sn olmuşsa çok başarılı bir iş yapmışım demektir.

Bir PC yi çalıştırdığımda, desktop karşıma ne kadar kısa sürede geliyor ona bakarım.

Şimdi karşılıklı yazacağımız bahse konu program için bazı ön açıklamalarda bulunacağım.

Programa konu olan soruyu özellikle seçtim. Böylece string yada array üzerindeki verilerle uğraşmanı sağlayacağım. Bu konuda Delphi komutları ile ne kadar başarılı olacaksın çok merak ediyorum.

Ben Delphiye herhangi bir kursa katılarak yada kitap okuyarak başlamadım. Kendi kendime bir şeyler karalıyorum.

Eğer ki Delphi de profesyonel kodlama yapabiliyorsan, soracağım soruya cevap olacak programın çok hızlı koşacak demektir.

Bu da benim asm kodlamayı terk etmek için fazlasıyla yeterli sebeptir.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

z

Test amaçlı oluşturulmuş her biri 100Kbyte olan 10 ayrı text dosya içinde ASCII karakterlerden oluşan metinlerimiz var.  Yazacağımız program, bu dosyaları sırayla okuyacak ve yeni dosyalar oluşturacak.

Önce bazı tanımlamalar yapalım.

Açıklamalarda, [] olsada olur olmasada olur anlamına geliyor.

Komut:K harfinin hemen ardında en az 1 en fazla 2 basamak içeren pozitif tam sayıdan olusan kelime. (K01 ve K1 aynı anlama gelir)

Değişken: A,B,C,D den biriyle başlayıp [boşluk] devamında sayısal değer içeren kelime.

Sayısal değer: Nümerik değer olup;

0....9 aralığında sayıları içerir.
nokta veya virgul içerebilir.
eksi işareti içerebilir.

Tam ve kesirli kısımlar birbirinden nokta yada virgülle ayrılir. (12.34) yada (12,34) aynı anlama gelir.
Tam kısım 4 basamağı, kesirli kısım 3 basamağı aşamaz. (1234.567)
Tam kısım önünde - işareti bulunabilir. (-12.34)
Sayısal değer, tam kısım içermeden doğrudan nokta yada virgülle başlayabilir.(.12) yada (,12)
Sayısal değer, tam kısmı takip eden nokta yada virgülle ile sonlanabilir. (12.) yada (12,)


Örnek Komutlar:

K1
K02

Örnek değişkenler ve sayısal değerleri

A12.78
B 12.78
C1234.789
D1234,789
D-1234.789
A-.789
A-0.789
A                -00.789
A -000.789
A-0000.789

Hatalı komut örnekleri

KH
K 01
K      90
K789
k12
K)1

Hatalı değişken ve hatalı sayısal değer örnekleri

A.Z
a12.78
B 1-2.78
C12-34.789
D12.34,789
A.-789
B-0.7-89
A12345
B. 1234
Z12.345

Text dosyalarımızın formatını ve programın yapacağı işleri de tanımladıktan sonra kodlamaya geçebilirsin.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

z

Gelelim text dosyalarımızın formatına.

Yukarıda tanımlanmıs büyük harfler geçerlidir.

Satırlar CRLF karakteri ile sonlandırılmıştır.

Boş satır olabilir.

Komut, değişken ve sayısal değerlerin başlarına yada sonlarına boşluk karakteri konabilir.

Satırdaki veriler, [Komut][Boşluk]Değişken[Boşluk]Sayısaldeğer[boşluk]Değişken[Boşluk]Sayısaldeğer[boşluk]..... şeklinde sıralanır.

Dosyada karşılaşılan ilk boş olmayan satır, muhakkak Komut içermelidir.

Aynı satırda birden fazla komut olamaz.

Aynı satırda aynı isimde iki Değişken olamaz


Pekiştirmek için satırdaki // ın soluna bakın. Yorumu // işaretinin sağına ekledim.

Boş SATIR                // olabilir
K01                      // olamaz değişken adı yok
K01A                     // olamaz sayısal değer yok
K1A.12                   // olur. Komutumuz K01,  Değişken adımız A, sayısal değeri 0001.120      
K1A.12B34.56             // olabilir iki değişken tanımlı
K1A.12 B34.56C-5.4       // olabilir üç değişken tanımlı
K1A.12 B  34.56   C-5.4  // olabilir üç değişken tanımlı
K1A.12 B  34.56   A 9.1  // olamaz aynı isimde iki değişken var
K1A.12 B34.56C-5.4 K23   // olamaz 2 komut var
A23.56 B45.              // olabilir komut yazılmamış ama daha önce satırlarda komut var

Bir başka dosya içeriği de şöyle olsun

Boş satır
A23.56 B45.              // olamaz komut yazılmamış daha önceki satırlarda komut yok
K1A.12 B34.56C-5.4 K23   // olamaz 2 komut var
K1A.12 B  34.56   C-5.4  // olabilir üç değişken tanımlı
A23.56 B45.              // olabilir komut yazılmamış ama daha önce satırlarda komut var
K1A.12 B  34.5 6  C-5.4  // olamaz 6 adıyla başlayan değişkenle karşılaşıldı

Programimiz 10 dosyayı sırayla okuyup satırlarının tek tek yukarıdaki formata uygun olup olmadığını kontrol edecek.

1. dosyanın adı 1.txt ise
1_.txt dosyası içine hatalı satıra kadar

Komut ve Değişken adını ASCI olarak sayısal değeri ise 1000 ile çarpıp 32 bit integer olarak kaydedecek

ve sonraki dosyaya geçecek.

10 dosyadan 10 yeni dosya üretip işi bitirecek.

Sonuc olarak cıktı dosyalarımızdaki veriler satır satır

Komut: 3byte yer kaplayacak K1 K01 olarak yazılacak
Değişken adı için 1 byte
Sayısal değer için 4 byte
Satır sonu için #0

şeklinde kaydedilecek.

Program son derece basit. Amaç hızlı koşturmak.

Kodlamaya başlayabilirsin. Ne zaman fırsat bulursan o zaman yaz.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

wsxwsx

ben de delhpiyi bir kurstan öğrenmedim. tam bilmiyorum.  kendi işimi görecek kadar kullanıyorum

durumu anlayabilmek için daha kestirme bir örnek yapsak nasıl olur?

Diğer türlü bana hayata hiç lazım olmayacak birşeyleri hesaplayan programı  yapmaya çalışacam hem de bedavadan. Fakat  önereceğiniz daha basit bir programı yapabilirim. Örneğin şöyle derseniz uğraşırım.

5 bin tane dosya açılsın. bunların her birine birşeyyazılsın.   yada okunsun diyelim. Aynı şeyi siz asm ile yapın. ben delphi ile yapayım. Yani sizin yavaş  olur asm gerekli dediğiniz böyle basit ve genel bir olay üzerinde durumu anlayabilir miyiz?

mcan

Faktöriyel hesaplatsanız olmazmı? 3000! mesela ,bunu 1000! ve 3000!/1000!   ve 3000!/2000! olarak 3 kısımdan oluşturup her bir kısmı ayrı ayrı paralel işleyip sonrasında 3 sonucu birbirleriyle çarpıp tek sonuc çıkartılabilinir.Delphi,asm birde paralel olmayacak şekilde hazırlayıp ne gibi farklar var bakılabilirmi? Bilgim yok sadece sesli düşünüyorum.Hic paralel işlem vs ile uğraşmadım.

z

Olmaz. File I/O işlemlerini sıfırdan yazmayacağım hazır fonksiyonları kullanacağım.

String uzerine işlem yapacağız.

Anlaşılsın diye yukarıda örnek uygulamayı uzun uzun açıklamak zorunda kaldım. Dikkat ederseniz satır oku ve üstünde basit string işlemleri yapılıyor ve son derece basit bir program.

Eğer  yan çizmesi gereken biri varsa o da ben olmalıyım zira ASM ile oya işleyemek durumundayım.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com