pos tan daha hızlı

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
sr1111
Üye
Mesajlar: 220
Kayıt: 06 Mar 2008 01:59

pos tan daha hızlı

Mesaj gönderen sr1111 »

s.a
bir cok pos fonksiyonu kullaniliyor. bundan dahah hızlı olmasi ayni işi yapan yerine nasil bir sey kullanilabilir.

bir de bu asagidaki functonu daha hizli olmasi için yerine veya buna benzer nasil bir sey yazabilirim.(copy. move v.s.)
//array : array[0..40] of char

function git (Chr: Char): Boolean;
begin
git := (pos (Chr, array) > 0) ;
end ;
Hakan Can
Üye
Mesajlar: 634
Kayıt: 04 Mar 2005 04:27
Konum: Ankara

Re: pos tan daha hızlı

Mesaj gönderen Hakan Can »

Şu fonksiyon daha hızlı çalışabilir:

Kod: Tümünü seç

function Git2(Ch: Char): Boolean;
var
  I: Integer;
begin
  Result := TRUE;
  for I := 0 to Length(TheArray) - 1 do
    if TheArray[I] = Ch then Exit;
  Result := FALSE;
end;
sr1111
Üye
Mesajlar: 220
Kayıt: 06 Mar 2008 01:59

Re: pos tan daha hızlı

Mesaj gönderen sr1111 »

tesekkur ederim az once buyuk bir stringde test ettim pek fazla bir sey fark etmedi.

onceki 21 saniye 3 salise

sizinki ile 21 saniye 1 salise
Hakan Can
Üye
Mesajlar: 634
Kayıt: 04 Mar 2005 04:27
Konum: Ankara

Re: pos tan daha hızlı

Mesaj gönderen Hakan Can »

Verdiğin örnekte string yoktu. Kodu (ihtiyacını) tam verseydin belki daha farklı bir yöntem düşünebilirdik.

Bir de Pos fonksiyonu ASM olarak yazılmış. Yani daha hızlısı biraz zor gibi.

Kolay gelsin.
emin_as
Üye
Mesajlar: 559
Kayıt: 01 Eki 2008 10:05
Konum: izmir
İletişim:

Re: pos tan daha hızlı

Mesaj gönderen emin_as »

Aşagıaki kod delphi 2007 nin kullandığı pos fonksiyonu, daha hızlısının olacagını sanmıyorum. 21 saniye çok büyük bir rakam, iki ihtimal var ya algoritma kötü veya çok ağır bir işlem yapıyorsun.

Eğer algoritman kötüyse, algoritmanı iyileştirmeyi dene.
Eğer ağır bir işlem yapıyorsan, thread ler kullanmayı dene. Performansı çok artırmaz, ama program tepkisiz kalmamış olur.

Kod: Tümünü seç

procedure       _Pos{ substr : ShortString; s : ShortString ) : Integer};
asm
{     ->EAX     Pointer to substr               }
{       EDX     Pointer to string               }
{     <-EAX     Position of substr in s or 0    }
        PUSH    EBX
        PUSH    ESI
        PUSH    EDI
        MOV     ESI,EAX { Point ESI to substr           }
        MOV     EDI,EDX { Point EDI to s                }
        XOR     ECX,ECX { ECX = Length(s)               }
        MOV     CL,[EDI]
        INC     EDI             { Point EDI to first char of s  }
.....
......
        MOV     ECX,EBX { restore outer loop counter    }
        JMP     @@loop
@@fail:
        POP     EDX             { get rid of saved s pointer    }
        XOR     EAX,EAX
        JMP     @@exit
@@found:
        POP     EDX             { restore pointer to first char of s    }
        MOV     EAX,EDI { EDI points of char after match        }
        SUB     EAX,EDX { the difference is the correct index   }
@@exit:
        POP     EDI
        POP     ESI
        POP     EBX
end;

sr1111
Üye
Mesajlar: 220
Kayıt: 06 Mar 2008 01:59

Re: pos tan daha hızlı

Mesaj gönderen sr1111 »

PrevChar, NextChar: Char;
kullandigim yer soyle;

if (not git(PrevChar)) or (not git(NextChar)) then
begin
sr1111
Üye
Mesajlar: 220
Kayıt: 06 Mar 2008 01:59

Re: pos tan daha hızlı

Mesaj gönderen sr1111 »

tesekkurler...
bu pos calismadi.
[DCC Error] Unit3.pas(818): E2105 Inline assembler syntax error

.....
......

bu satirlari kaldirinca da
[DCC Error] Unit3.pas(820): E2003 Undeclared identifier: '@@loop' hatasi verdi.

delphi2009 kullaniyorum. onun pos u dahah hızlı gibi.

agir islem olarak buyuk bir dosyada normal stringreplace yapiyorum.
thread kullanmayi bilmiyorum. stringreplace islemini thread nasil kullanabilirim ki.


emin_as yazdı:Aşagıaki kod delphi 2007 nin kullandığı pos fonksiyonu, daha hızlısının olacagını sanmıyorum. 21 saniye çok büyük bir rakam, iki ihtimal var ya algoritma kötü veya çok ağır bir işlem yapıyorsun.

Eğer algoritman kötüyse, algoritmanı iyileştirmeyi dene.
Eğer ağır bir işlem yapıyorsan, thread ler kullanmayı dene. Performansı çok artırmaz, ama program tepkisiz kalmamış olur.

Kod: Tümünü seç

procedure       _Pos{ substr : ShortString; s : ShortString ) : Integer};
asm
{     ->EAX     Pointer to substr               }
{       EDX     Pointer to string               }
{     <-EAX     Position of substr in s or 0    }
        PUSH    EBX
        PUSH    ESI
        PUSH    EDI
        MOV     ESI,EAX { Point ESI to substr           }
        MOV     EDI,EDX { Point EDI to s                }
        XOR     ECX,ECX { ECX = Length(s)               }
        MOV     CL,[EDI]
        INC     EDI             { Point EDI to first char of s  }
.....
......
        MOV     ECX,EBX { restore outer loop counter    }
        JMP     @@loop
@@fail:
        POP     EDX             { get rid of saved s pointer    }
        XOR     EAX,EAX
        JMP     @@exit
@@found:
        POP     EDX             { restore pointer to first char of s    }
        MOV     EAX,EDI { EDI points of char after match        }
        SUB     EAX,EDX { the difference is the correct index   }
@@exit:
        POP     EDI
        POP     ESI
        POP     EBX
end;

emin_as
Üye
Mesajlar: 559
Kayıt: 01 Eki 2008 10:05
Konum: izmir
İletişim:

Re: pos tan daha hızlı

Mesaj gönderen emin_as »

Çalışmaz çünkü tamamını yazmadım, zaten bu fonksiyon pos fonksiyonu. Delphi2009 daki de benzerdir.
Kullanıcı avatarı
Lost Soul
Üye
Mesajlar: 1064
Kayıt: 01 Nis 2007 02:55
Konum: mekan ANKARA toprak ELAZIĞ
İletişim:

Re: pos tan daha hızlı

Mesaj gönderen Lost Soul »

Postan daha hızlı bir komut olabileceğini sanmıyorum.

istediğiniz stringdeki aranan kelimelerden sadece ilkini değil sırasıyla hepsini bulmak ise aşağıdaki linki inceleyin.

pos deyiminin değişmiş hali. (NextPos);
viewtopic.php?p=147138#p147138
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: pos tan daha hızlı

Mesaj gönderen mrmarman »

Hız sorunu pos'dan kaynaklandığına emin misiniz ? Arama yapılacak ana metin nerede tutuluyor ? sorgulanan karakter veya metin sayısı kaç tane ? Kısaca sormak gerekirse 21 saniyelik süre gerçekten çok uzun, sadece tek sorgu mu bu kadar sürüyor yoksa sorguların birden fazla da tüm işlem süresi mi.. ?
Resim
Resim ....Resim
sr1111
Üye
Mesajlar: 220
Kayıt: 06 Mar 2008 01:59

Re: pos tan daha hızlı

Mesaj gönderen sr1111 »

pos komutunu stringreplace functionunun içindeki pos'u degistererek kullaniyorum, farkli poslar biraz daha hizli calisabilir diye.

50.000 - 150.000 kelimelik texti stringliste atiyorum oradan memodaki (20 sayfada) buldugu kelimeleri stringreplace yaparak degistiriyorum.
daha hizli bir yontem olabilir mi. thread kullanibilir mi bu islem icin nasil kullanilir.


s1:=sl.Strings1; //50.000-150.000 kelime
s2:=sl.Strings2; //50.000-150.000 kelime

s0:= StringReplace(s0, s1, s2, [rfReplaceAll] );
Kullanıcı avatarı
Murat DİCLE
Kıdemli Üye
Mesajlar: 702
Kayıt: 19 Nis 2006 04:12
Konum: İstanbul
İletişim:

Re: pos tan daha hızlı

Mesaj gönderen Murat DİCLE »

Merhabalar,

3 sene önce yazmış olduğum PROXY tabanlı bir web filtresi var. Musonya JustFilter NETWORK adında.

Filtre proxy yolu ile sayfayı hafızaya alıyorum (100 KB'lik bir sayfa örneğinde) , LoweCase ile küçültüyorum, sayfa içindeki HTML taglarını temizliyorum ve kalanların içinde 10.000 'e yakın kelimeyi tek tek kontrol ettiriyorum. Yani sayfa 10.000 kere POS işlemine maruz kalıyor. Her bulunan kelime ve puanına göre toplam puan hesaplatıyorum. Çıkan puan 200 ve üstü olunca sayfayı yasaklatıyorum. Tüm bu işlemler ortalama 100 KB'lik bir web sayfası için 0.5 saniye (500 milisaniye) sürüyordu.

Burada LowerCase, Replace, Pos ve Memorry Table işlemleri yapılıyor.

LowerCase, Replace ve Pos işi için aşağıdaki adresten faydalanmıştım :
http://www.fastcode.dk/fastcodeproject/index.htm

Ama şimdi kodları kaldırdılar ve bu kodlar Delhi 2007 ile beraber standard geliyorlar. Yani Delphi 2007 ve sonrasında FastCode daki elemanların yazdığı;
LowerCase
UpperCase
Pos
AnsiReplaceString
vb.

kodlar kullanılıyorlar. Çok da hızlılar. Sende Delphi 2007 ve sonrasını kullanıyorsan çok hızlı şekilde bu işlemleri yapabilmen lazım. Bunun dışında eğer bir yavaşlık varsa, bunu başka yerde aramak lazım.

Tabi burada aradığın şey veya değiştirilecek metnin büyüklüğü sonuca varma süresine yansıyacaktır.

Thread bu işlerde kullanılabilir elbette, ama bu işi daha hızlı yapmak için değil, sistemin ve uygulamanın donmaması için kullanılabilir. Thread içinde bu işlemleri yaparsan normalden biraz daha geç sonuç alırsın. Neden peki? çünkü, thread içindeki işlemler sistem ile paylaşımlı yapılacağından kendi işi bitmeden diğer sistem işlevleri de aynı döngü içinde yapılacaktır.
sr1111
Üye
Mesajlar: 220
Kayıt: 06 Mar 2008 01:59

Re: pos tan daha hızlı

Mesaj gönderen sr1111 »

s1:=sl.Strings,1);
s2:=sl.Strings,2);
memo1.lines.text:= StringReplace(memo1.lines.text, s1, s2, [rfReplaceAll] );

bunun stringreplace yerine soyle nasil yazarim daha hizli olur zannediyorum. memo1 de sadece s1 gordugun satirlar s2 olsun
memo1.lines[s1]:=s2;

fakat beceremedim integer yuzunden.
//s1: integer olmasi lazim, integer olursada sl.Strings[1] kabul etmiyor
Cevapla