pos tan daha hızlı
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
pos tan daha hızlı
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 ;
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 ;
Re: pos tan daha hızlı
Ş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;
Re: pos tan daha hızlı
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
onceki 21 saniye 3 salise
sizinki ile 21 saniye 1 salise
Re: pos tan daha hızlı
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.
Bir de Pos fonksiyonu ASM olarak yazılmış. Yani daha hızlısı biraz zor gibi.
Kolay gelsin.
Re: pos tan daha hızlı
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.
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;
Re: pos tan daha hızlı
PrevChar, NextChar: Char;
kullandigim yer soyle;
if (not git(PrevChar)) or (not git(NextChar)) then
begin
kullandigim yer soyle;
if (not git(PrevChar)) or (not git(NextChar)) then
begin
Re: pos tan daha hızlı
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.
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;
Re: pos tan daha hızlı
Çalışmaz çünkü tamamını yazmadım, zaten bu fonksiyon pos fonksiyonu. Delphi2009 daki de benzerdir.
Re: pos tan daha hızlı
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
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
Re: pos tan daha hızlı
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.. ?
Re: pos tan daha hızlı
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] );
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] );
- 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ı
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.
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.
Re: pos tan daha hızlı
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
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