powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Быстрая замена символа
25 сообщений из 259, страница 3 из 11
Быстрая замена символа
    #39676547
zinpub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Kazantsev AlexeyГирлионайльдоне доглядел)
Ещё, если хочешь ускориться обрабатывай по несколько символов за итерацию.

Пробовал, тормозит сильнее... См. ЧегоТоrtosW
...
Рейтинг: 0 / 0
Быстрая замена символа
    #39676548
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zinpubПробовал, тормозит сильнее... См. ЧегоТоrtosW
Странно, у меня получилось лучше PEnd процентов на ~25. Проверял по 4 символа за итерацию.
...
Рейтинг: 0 / 0
Быстрая замена символа
    #39676549
zinpub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Извините Всё, что молчал - дожди, утонул вместе с телефоном :-)... Только высушил, пробовать буду завтра.... По данным : около 2-3 МБ на вход на каждые 10-15 символов ЗПТ
...
Рейтинг: 0 / 0
Быстрая замена символа
    #39676550
zinpub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Kazantsev AlexeyzinpubПробовал, тормозит сильнее... См. ЧегоТоrtosW
Странно, у меня получилось лучше PEnd процентов на ~25. Проверял по 4 символа за итерацию.
А как по 4? У меня только AH, AL...
...
Рейтинг: 0 / 0
Быстрая замена символа
    #39676551
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zinpubА как по 4? У меня только AH, AL...
Примерно так:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
if CPos[0] = ',' then
 CPos[0] := '.';
if CPos[1] = ',' then
 CPos[1] := '.';
if CPos[2] = ',' then
 CPos[2] := '.';
if CPos[3] = ',' then
 CPos[3] := '.';

inc(CPos, 4);


;)
...
Рейтинг: 0 / 0
Быстрая замена символа
    #39676552
zinpub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Kazantsev AlexeyzinpubА как по 4? У меня только AH, AL...
Примерно так:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
if CPos[0] = ',' then
 CPos[0] := '.';
if CPos[1] = ',' then
 CPos[1] := '.';
if CPos[2] = ',' then
 CPos[2] := '.';
if CPos[3] = ',' then
 CPos[3] := '.';

inc(CPos, 4);


;)

D5 не в курсе.

На асме сам написал на AH, AL. - не даёт прироста
...
Рейтинг: 0 / 0
Быстрая замена символа
    #39676553
zinpub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Оптимизатор не в курсе, всмысле
...
Рейтинг: 0 / 0
Быстрая замена символа
    #39676554
чччД__
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
zinpub,

а зачем тебе эта спешка?
...
Рейтинг: 0 / 0
Быстрая замена символа
    #39676555
zinpub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
чччД__zinpub,

а зачем тебе эта спешка?

Микросервисы - ля..

100-150файлов в минуту...

И у всех ЗПТ вместо ТЧК.
...
Рейтинг: 0 / 0
Быстрая замена символа
    #39676556
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zinpubОптимизатор не в курсе, всмысле
Тут от оптимизатора и не требуется ничего. Это, как раз, ручное разворачивание цикла.
...
Рейтинг: 0 / 0
Быстрая замена символа
    #39676557
чччД__
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
zinpubчччД__zinpub,

а зачем тебе эта спешка?

Микросервисы - ля..

100-150файлов в минуту...

И у всех ЗПТ вместо ТЧК.
Ты ответь: спешка тебе эта для чего?

Что - уже все страшно тормозит, и ты нашел бутылочное горлышко, и оно именно в этой запятой?
...
Рейтинг: 0 / 0
Быстрая замена символа
    #39676558
zinpub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
чччД__zinpubпропущено...


Микросервисы - ля..

100-150файлов в минуту...

И у всех ЗПТ вместо ТЧК.
Ты ответь: спешка тебе эта для чего?

Что - уже все страшно тормозит, и ты нашел бутылочное горлышко, и оно именно в этой запятой?

Горлышко, я нашёл, когда там Pos был... дальше - стало интересно...
...
Рейтинг: 0 / 0
Быстрая замена символа
    #39676559
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zinpubГорлышко, я нашёл, когда там Pos был... дальше - стало интересно..А нет возможности заставить файлы формироваться сразу с точками? Была бы самая крутая оптимизация :)
...
Рейтинг: 0 / 0
Быстрая замена символа
    #39676575
zinpub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
white_niggerzinpubГорлышко, я нашёл, когда там Pos был... дальше - стало интересно..А нет возможности заставить файлы формироваться сразу с точками? Была бы самая крутая оптимизация :)

Ээх, горячего компота прям на рану... 😭
...
Рейтинг: 0 / 0
Быстрая замена символа
    #39676606
afgm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробовал скопировать функцию в коде ForkReplaceC_lodsw под другим названием и добавил в тесты. Время выполнения у них разное. Если это воспроизводится у кого-либо, то вопрос к бенчмаркалке.
...
Рейтинг: 0 / 0
Быстрая замена символа
    #39676608
zinpub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
afgmПопробовал скопировать функцию в коде ForkReplaceC_lodsw под другим названием и добавил в тесты. Время выполнения у них разное. Если это воспроизводится у кого-либо, то вопрос к бенчмаркалке.

На каком кол-ве прогонов? На сколько разное?

Если +-(несколько миллисекунд) - то это норм, иначе магия :-)
...
Рейтинг: 0 / 0
Быстрая замена символа
    #39676613
afgm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zinpubНа каком кол-ве прогонов? На сколько разное?
Прогонов 50000
Код: plaintext
1.
2.
3.
4.
ForkReplaceC_lodsw   -> 00:00:273
ForkReplaceC_lodsw   -> 00:00:270
ForkReplaceC_lodsw_FIX -> 00:00:435
ForkReplaceC_lodsw_FIX -> 00:00:438

От порядка выполнения не зависит, а зависит от положения в исходном файле.
Если функции поменять в коде местами, то новая функция становится быстрее, а старая, соответственно, медленнее.
...
Рейтинг: 0 / 0
Быстрая замена символа
    #39676617
zinpub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
afgmzinpubНа каком кол-ве прогонов? На сколько разное?
Прогонов 50000
Код: plaintext
1.
2.
3.
4.
ForkReplaceC_lodsw   -> 00:00:273
ForkReplaceC_lodsw   -> 00:00:270
ForkReplaceC_lodsw_FIX -> 00:00:435
ForkReplaceC_lodsw_FIX -> 00:00:438

От порядка выполнения не зависит, а зависит от положения в исходном файле.
Если функции поменять в коде местами, то новая функция становится быстрее, а старая, соответственно, медленнее.

Погрешность, Now ...
...
Рейтинг: 0 / 0
Быстрая замена символа
    #39676619
zinpub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
поставь 10 000 000 раз...
...
Рейтинг: 0 / 0
Быстрая замена символа
    #39676620
zinpub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
afgmzinpubНа каком кол-ве прогонов? На сколько разное?
Прогонов 50000
Код: plaintext
1.
2.
3.
4.
ForkReplaceC_lodsw   -> 00:00:273
ForkReplaceC_lodsw   -> 00:00:270
ForkReplaceC_lodsw_FIX -> 00:00:435
ForkReplaceC_lodsw_FIX -> 00:00:438

От порядка выполнения не зависит, а зависит от положения в исходном файле.
Если функции поменять в коде местами, то новая функция становится быстрее, а старая, соответственно, медленнее.

Эээ и что за камень? поставил у себя 50 000...
...
Рейтинг: 0 / 0
Быстрая замена символа
    #39676631
Гирлионайльдо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev AlexeyzinpubПробовал, тормозит сильнее... См. ЧегоТоrtosW
Странно, у меня получилось лучше PEnd процентов на ~25. Проверял по 4 символа за итерацию.


Ещё можно по масске искать и сравнивать. Только я не мастак искать масски.


Вот пример, ищем в 4 байтах конец строки, если нет, то плюсуем + 4. Если встретили конец, то считает оставшейся по символам

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
type
  ApString = PAnsiChar;

function StrlenMy(s: ApString): NativeUInt;
begin
  Result := 0;
  while ((PNativeUInt(s)^ - $01010101) and $80808080) = 0 do  // Ищем в 4 байтах конец строки #0
  begin
    inc(Result, Sizeof(ApString));
    inc(s, Sizeof(ApString));
  end;

  while s^ <> #0 do
  begin
    inc(Result, 1);
    inc(s, 1);
  end;
end;
...
Рейтинг: 0 / 0
Быстрая замена символа
    #39676651
zinpub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ГирлионайльдоKazantsev Alexeyпропущено...

Странно, у меня получилось лучше PEnd процентов на ~25. Проверял по 4 символа за итерацию.


Ещё можно по масске искать и сравнивать. Только я не мастак искать масски.


Вот пример, ищем в 4 байтах конец строки, если нет, то плюсуем + 4. Если встретили конец, то считает оставшейся по символам

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
type
  ApString = PAnsiChar;

function StrlenMy(s: ApString): NativeUInt;
begin
  Result := 0;
  while ((PNativeUInt(s)^ - $01010101) and $80808080) = 0 do  // Ищем в 4 байтах конец строки #0
  begin
    inc(Result, Sizeof(ApString));
    inc(s, Sizeof(ApString));
  end;

  while s^ <> #0 do
  begin
    inc(Result, 1);
    inc(s, 1);
  end;
end;



Даже так пробовал...
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
    Cld
@Next:
    Lodsw
    Cmp   AH,BH
    Jne   @Skip1
    Mov   [ESI-1],BL
@Skip1:
    Cmp   AL,BH
    Jne   @Skip
    Mov   [ESI-2],BL
@Skip:
    Dec   ECX
    Jnz   @Next



хуже ...
...
Рейтинг: 0 / 0
Быстрая замена символа
    #39676664
Гирлионайльдо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zinpub,

Я не вижу так же

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
StrlenMy:
StrlenMy:
xor edx,edx
jmp $0041aff2
add edx,$04
add eax,$04
mov ecx,[eax]
sub ecx,$01010101
test ecx,$80808080
jz $0041afec
jmp $0041b006
inc edx
inc eax
cmp byte ptr [eax],$00
jnz $0041b004
mov eax,edx
ret 
mov eax,eax



С коментами
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
Project4.dpr.16: Result := 0;
0041AFE8 33D2             xor edx,edx
0041AFEA EB06             jmp $0041aff2
Project4.dpr.19: inc(Result, Sizeof(ApString));
0041AFEC 83C204           add edx,$04
Project4.dpr.20: inc(s, Sizeof(ApString));
0041AFEF 83C004           add eax,$04
Project4.dpr.17: while ((PNativeUInt(s)^ - $01010101) and $80808080) = 0 do  // Ищем в 4 байтах конец строки #0
0041AFF2 8B08             mov ecx,[eax]
0041AFF4 81E901010101     sub ecx,$01010101
0041AFFA F7C180808080     test ecx,$80808080
0041B000 74EA             jz $0041afec
0041B002 EB02             jmp $0041b006
Project4.dpr.25: inc(Result, 1);
0041B004 42               inc edx
Project4.dpr.26: inc(s, 1);
0041B005 40               inc eax
Project4.dpr.23: while s^ <> #0 do
0041B006 803800           cmp byte ptr [eax],$00
0041B009 75F9             jnz $0041b004
Project4.dpr.28: end;
0041B00B 8BC2             mov eax,edx
0041B00D C3               ret 
0041B00E 8BC0             mov eax,eax

...
Рейтинг: 0 / 0
Быстрая замена символа
    #39676675
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zinpub,

Вот с проверкой четвёрками:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
function _Replace(const s : AnsiString) : AnsiString;
var

 l    : Integer;
 i    : Integer;
 cpos : PAnsiChar;

begin

 Result := Copy(s, 1);

 l    := Length(Result);
 cpos := Pointer(Result);

 for i := 1 to l div 4 do
  begin

   if cpos[0] = ',' then
    cpos[0] := '.';

   if cpos[1] = ',' then
    cpos[1] := '.';

   if cpos[2] = ',' then
    cpos[2] := '.';

   if cpos[3] = ',' then
    cpos[3] := '.';

   inc(cpos, 4);

  end;

 for i := 1 to l mod 4 do
  begin

   if cpos[0] = ',' then
    cpos[0] := '.';

   inc(cpos);

  end;

end;


Работает на 30% быстрее PEnd. Правда не знаю, умеет ли Delphi 5 div и mod оптимизировать.
...
Рейтинг: 0 / 0
Быстрая замена символа
    #39676679
zinpub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ГирлионайльдоKazantsev Alexeyпропущено...

Странно, у меня получилось лучше PEnd процентов на ~25. Проверял по 4 символа за итерацию.


Ещё можно по масске искать и сравнивать. Только я не мастак искать масски.


Вот пример, ищем в 4 байтах конец строки, если нет, то плюсуем + 4. Если встретили конец, то считает оставшейся по символам

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
type
  ApString = PAnsiChar;

function StrlenMy(s: ApString): NativeUInt;
begin
  Result := 0;
  while ((PNativeUInt(s)^ - $01010101) and $80808080) = 0 do  // Ищем в 4 байтах конец строки #0
  begin
    inc(Result, Sizeof(ApString));
    inc(s, Sizeof(ApString));
  end;

  while s^ <> #0 do
  begin
    inc(Result, 1);
    inc(s, 1);
  end;
end;



Пардон, не разобрал на телефоне.
А, при чём здесь длина строки вообще? она и так в -4 байта лежит...
...
Рейтинг: 0 / 0
25 сообщений из 259, страница 3 из 11
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Быстрая замена символа
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]