Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Заменя пробелов [D6, Win2k]


Страницы:   1 2 3 4 5 6

Adam ©   (2003-01-27 18:13:00) 

Сдраствуйте мастера!

У меня следующяя проблема:

Имеется строка, в которой слова разделяются проделами. Количество пробелов между двумя словами неизвестно, оно может быть разным. Требуется это количество пробелов заменить всего одним пробелом.. Как это сделать? Помогите, пожалуйста..


danilka   (2003-01-30 08:10:00) [21]

ловите вариант на асме.
всера дома накатал.

function Danilka(const s:string):string;
begin
result:=s;
asm
push ebx
push ecx
mov ebx,result
mov edx,[ebx]
mov eax,edx
mov ecx,[edx-4]
push edx
@@loop:
mov bx,[edx]
cmp bx,$2020
je @@space
mov [eax],bl
inc eax
@@space:
inc edx
loop @@loop
sub eax,edx
pop edx
add eax,[edx-4]
dec eax
mov [edx-4],eax
pop ecx
pop ebx
end;
end;


Anatoly Podgoretsky   (2003-01-30 08:04:00) [22]

Что бы проводить тестирование, надо сначала договориться о методах и согласовать код тестирования, исходные данные, что бы уменьшить погрешности тестирования.
К тому же нельзя проводить тестирование, только на одной какой то выьранной строке, некоторые алгоритмы, которые покажут плохие результаты на коротких строках вполне могут сильно обогнать на длинный, или при одинаковой длине результаты могут зависить от содержимого. Нужно как минимум не менее трех последовательностей. Кроме того тестирование должно проводиться отдельно для функций и отдельно для замены по месту.

Немаловажное значение имеет выравнивание переменных
и будет давать разные результаты на разных процессорах.
Для теста надо что бы данные были выровнены на границу параграфа.
В группе borland.basm знаимались аналогичным тестированием, но только для Move и там потом пришлось потратить около недели на выработку достоверного теста, в основном для выравнивания на границу параграфа и частично других вещей.

Неправильно или специально подогнанный тест может отдавать предпочтение тому или другому методу.


Sha   (2003-01-30 07:15:00) [23]

> Secety (30.01.03 02:45)
> Ну согласись сравнивать программы написанную на асме и на делфях скажем не совсе чесно.

Важнее даже другое: все программы (или их обертка в цикле тестирования) должны брать const string и возвращать string - иначе вообще невозможно говорить ни о каком сравнении результатов.

А насчет asm - мне даже интересно на сколько процентов будет эффективнее. Думаю, что для моей Sha2 - не больше чем на 10. (Правда она пока еще работает неправильно, зато уже быстро :)
А это как раз и докажет, что не так важно, на чем писать.


Sha   (2003-01-30 07:00:00) [24]

Sha © (29.01.03 23:26)
2 Mystic © (29.01.03 21:24)

Sorry. Проверь только скорость, правильность работы можно не проверять :)
Видно, вчера перед сном голова глючила. И продолжает до сих пор - никак не соображу как переставить строчки.
Если кто-нибудь подскажет, поделюсь авторством :) Требования к кандидату:
1. количество inc(q); в цикле = 2,
2. только один оператор if ch=#0 then ...
Все, еду на работу. Там посмотрим.


Secety   (2003-01-30 02:45:00) [25]

>Mystic ©
Ну согласись сравнивать программы написанную на асме и на делфях скажем не совсе чесно, так чтобы уровнять их шансы вот второй вариант.

Тестю на другой машине, поэтому цифры могут немного не совпадать с предыдущимы.
Sectey (test) Mystic (test)
SecteyAsm 531 ~26000
Mystic 771 ~28500

И наконец сама программа:

procedure SecteyAsm(p : PChar);
asm
PUSH ESI
PUSH EAX
PUSH EBX
MOV BL, 32
MOV ESI, EAX
MOV EDX, EAX
CLD
XOR EAX, EAX
@@LOOP:
LODSB
MOV [EDX], AL
CMP AH, AL
JNE @@THENCMP
CMP AL, BL
JE @@ENDCMP
@@THENCMP:
INC EDX
@@ENDCMP:
MOV AH, AL
TEST AL, AL
JNZ @@LOOP
@@EXIT:
POP EBX
POP EAX
POP ESI
end;


gsu   (2003-01-29 23:50:00) [26]

вот мастеров то набежало ...


MAN-In-RED   (2003-01-29 23:43:00) [27]

Итак, ваш окончательный выбор?
Предлагаю сделать три первых места…


gsu   (2003-01-29 23:39:00) [28]

>> Дурдом, хе-хе...
угу

>> Top - лист по скорости:
>> Я там второй вариант предлагал - его глянь пожалуйста
>> Проверь вот это:
красавцы (-:|~


Sha   (2003-01-29 23:26:00) [29]

2 Mystic © (29.01.03 21:24)
Проверь вот это:

function Sha2(const s: string): string;
var
p, q: pchar;
ch: char;
label
ret;
begin;
p:=pointer(s);
SetLength(Result,Length(s));
q:=pchar(pointer(Result))-1;
while true do begin;
repeat;
ch:=p^;
inc(p);
until ch<>" ";
repeat;
if ch=#0 then goto ret;
inc(q);
q^:=ch;
ch:=p^;
inc(p);
until ch=" ";
inc(q);
q^:=ch;
end;
ret:
SetLength(Result,(q-pointer(Result)));
end;


Mystic   (2003-01-29 21:24:00) [30]

Зачем совершенствовать алгоритм, когда можно придумать новый тест, который бы вывел мою процедуру на первое место?! ;)

Поскольку я оптимизил свой код главным образом на длинные входные последовательности (а не на многократный запуск коротких), то решил придумать свой тест - дать на вход каждой функции весь source-код Delphi. Вот результаты (пять испытаний, *10^3):

Mystic 183, 183, 228, 199, 181
Sectey 212, 195, 193, 191, 193
Q_Strings 211, 206, 206, 205, 231
Digitman 273, 290, 294, 319, 272
Sha 305, 296, 270, 286, 269
Romkin 452, 453, 487, 489, 449

Вариант от ManInRed тестировался лишь однократно 21 079
Остальные варианты поумирали (есть там файлик Internet\MSHTML.pas размером 1.5 Мб, вот его не сумели одолеть многие алгоритмы).

Код, использовавшийся для тестирования:

function ProcessFile(const FileName: string): Int64;
var
S: TStream;
St: string;
Tick1, Tick2: Int64;
begin
S := TFileStream.Create(FileName, fmOpenRead);
try
SetLength(St, S.Size);
S.Read(St[1], S.Size);
QueryPerformanceCounter(Tick1);
//Mystic(St);
//Senchenko(St);
//Sectey(PChar(St));
//Q_SpaceCompress(St);
//ReduceSpaces(PChar(St));
//Sha(St);
//Romkin(St);
QueryPerformanceCounter(Tick2);
Result := Tick2 - Tick1;
finally
S.Free;
end;
end;

function ProcessDir(const DirName: string): Int64;
var
sr: TSearchRec;

begin
Result := 0;
if FindFirst(DirName + "\*.pas", faAnyFile and (not faDirectory), sr) = 0 then
begin
repeat
Result := Result + ProcessFile(DirName + "\" + sr.Name);
until FindNext(sr) <> 0;
FindClose(sr);
end;

if FindFirst(DirName + "\*.*", faDirectory, sr) = 0 then
begin
repeat
if (sr.Name <> ".") and (sr.Name <> "..") then
Result := Result + ProcessDir(DirName + "\" + sr.Name);
until FindNext(sr) <> 0;
FindClose(sr);
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage(IntToStr(ProcessDir("C:\Program Files\Borland\Delphi6\Source")));
end;


MAN-In-RED   (2003-01-29 20:04:00) [31]

Дурдом, хе-хе...


Novice   (2003-01-29 18:54:00) [32]

2 Sectey © (29.01.03 18:18)
Инплэйс инплэйсом, а кто будет возвращать результат в виде строки в цикле тестирования? Хитроват, батенька :)


Андрей Сенченко   (2003-01-29 18:52:00) [33]

>> Sectey © (29.01.03 18:39)

Я там второй вариант предлагал - его глянь пожалуйста


Novice   (2003-01-29 18:45:00) [34]

Inplace - это нечестно.

2 Юрий Зотов ©
Нельзя ли привести текст программы тестирования с результатами?
Интересно, как вы совмещаете тестирование двух разных видов алгоритмов и оцениваете результаты их работы?


Sectey   (2003-01-29 18:39:00) [35]

На 29.01.09 18:26

Top - лист по скорости:
-----------------------

Sectey - 578;
Q_SpaceCompress - 688
sha - 797
Mystic - 1078
Romkin - 1468
Андрей Сенченко - 4265
Separator - 13219
Antosya - 20250
mate - 23002
OneSpace - 29845
Song - 389937
StrDelSpace - умер

Не в одном(кроме своего) алгоритме не разбирался брал как есть и тестировал.

Тестировал для себя. Если кто не согласен с моей оценкой прошу провести собственный тест.


Sectey   (2003-01-29 18:24:00) [36]

> Mystic

Да протестил - 1078


Mystic   (2003-01-29 18:20:00) [37]

> Sectey © (29.01.03 18:04)

Странно, у меня все нормально.

Можешь заменить на
DB 00h, 46h, 58h, 71h

или на
XOR EAX, EAX
MOV AL, [ESI]


Sectey   (2003-01-29 18:18:00) [38]

>Digitman

ну коль перешли на inplace тогда вот немного подумов я кое что нашкрябал.

procedure Sectey(p:PChar);
var
i : integer;
j : integer;
c : char;
begin
i := 0;
j := 0;
c := #0;
while p[i] <> #0 do
begin
p[j] := p[i];
if (c <> #32) or (p[i] <> #32) then
inc(j);
c := p[i];
inc(i);
end;
p[j] := #0;
end;


Процедура тестирования:


procedure TForm1.Button1Click(Sender: TObject);
const
s = "ssd sd sd s s sds d s d sd sd s sd s ";
var
p : PChar;
t : DWORD;
i : integer;
begin
t := GetTickCount;
GetMem(p,StrLen(s));
for i:= 0 to 1000000 do
begin
StrCopy(p, s);
ReduceSpaces(p);
end;
ShowMessage(StrPas(p) + #13#10 + IntToStr(GetTickCount - t));
FreeMem(p);
end;


Не знаю как по поводу варианта Mystic на этот вариант быстрее даже Q_SpaceCompress по моим тестам - 578, а твой - 875, вот так.


Sectey   (2003-01-29 18:04:00) [39]

>Mystic ©
ругается на MOVZX EAX, [ESI]


uw   (2003-01-29 17:58:00) [40]

Почему никто не использует goto?


Страницы:   1 2 3 4 5 6

Наверх

Титульная страница Поиск, карта сайта Написать письмо