powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Быстрая замена символа
25 сообщений из 259, страница 8 из 11
Быстрая замена символа
    #39679325
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SaperskyAleksandr Sharahov,

По-моему на коротких строках начинает упираться в дельфийскую обвязку, все эти UniqueString и т.д.
Т.е. если делать в цикле так:
ReplaceChr(@s[1], c, ',', '.');
то быстро, а если так:
s1 := s;
ReplaceChr(@s1[1], c, ',', '.');
то медленнее в 10 раз (UniqueString создаёт новую строку, а в первом случае нет).
Возможно это более жизненный сценарий, но получается, что тестируем в основном оптимальность перераспределения памяти.

На строках длиной 89..99 разница менее заметна, но есть

1485 ShaCharReplace1
1453 ShaCharReplace2
3718 ReplaceCommaToDot
1844 gccReplaceCommaToDot
...
Рейтинг: 0 / 0
Быстрая замена символа
    #39679326
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
обвязка необходима, чтобы не портить исходную строку
...
Рейтинг: 0 / 0
Быстрая замена символа
    #39679329
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
defecatorэто чудовищно.
замена символа превратилась в монстраЯ вот думаю, почему еще никто как обычно не предложил использовать для этого БД?
...
Рейтинг: 0 / 0
Быстрая замена символа
    #39679342
Sapersky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Aleksandr Sharahovобвязка необходима, чтобы не портить исходную строку
Но тогда пусть обвязка будет одинаковой. Добавил в DLL функцию:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
procedure ReplaceChr2(Src, Dst : PAnsiChar; Cnt : Integer; FromChar, ToChar : AnsiChar); cdecl; external 'gcc_sse32.dll';
// Использование
function gccReplaceCommaToDot(const s: AnsiString): AnsiString;
Var len : Integer;
begin
  len := Length(s);
  Result := '';
  SetLength(Result, len);
  ReplaceChr2(pointer(s), pointer(Result), len, ',', '.');
end;


Впрочем, махинации с памятью всё равно скрывают преимущество сишного варианта до длины строк в 100+ символов.

Можно убрать перевыделение в ShaCharReplace и сравнивать с ReplaceChr2, тогда разница заметнее.

Код: 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.
procedure ShaCharReplacePtr(Src, Dst: PAnsiChar; len : Integer; chFrom, chTo: AnsiChar);
var
  ch1, ch2, chf, cht: integer;
  p, q: pInteger;
  ch: AnsiChar;
begin;
  p:=pointer(Src);
  q:=pointer(Dst);
  chf:=ord(chFrom) * $01010101;
  cht:=ord(chTo)   * $01010101 xor chf;
  chf:=chf xor integer($FFFFFFFF);
  while len>3 do begin;
    ch1:=p^;
    ch2:=ch1 xor chf;
    ch2:=(ch2 and $7F7F7F7F + $01010101) and $80808080 and ch2;
    q^:=(ch2 - ch2 shr 7 or ch2) and cht xor ch1;
    inc(p);
    inc(q);
    dec(len,4);
  end;
  while len>0 do begin;
    dec(len);
    ch:=pAnsiChar(p)[len];
    if ch=chFrom then ch:=chTo;
    pAnsiChar(q)[len]:=ch;
  end;
end;


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

function
Код: 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.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
type
  ApChar = AnsiChar;
  ApString = AnsiString;
  ApPChar = PAnsiChar;

function RepSSE22(const Str: ApPChar; FromChar, SetChar: AnsiChar; len: Integer)
  : ApPChar; assembler;
asm
  mov     edi, len
  push    ebp
  push    ebx
  push    edi
  push    esi
  sub     esp, 12
  mov     esi, eax
  mov     dword ptr [esp + 8], ecx
  mov     ebp, edx
  call    SysGetMem
  test    edi, edi
  jle     @@toto1_8
  xor     ecx, ecx
  cmp     edi, 31
  jbe     @@toto1_5
  mov     edx, ebp
  mov     ecx, edi
  movzx   edx, dl
  and     ecx, -32
  movd    xmm0, edx
  movzx   edx, byte ptr [esp + 8]
  punpcklbw       xmm0, xmm0
  pshuflw xmm0, xmm0, 224
  pshufd  xmm0, xmm0, 0
  movd    xmm1, edx
  xor     edx, edx
  punpcklbw       xmm1, xmm1
  pshuflw xmm1, xmm1, 224
  pshufd  xmm1, xmm1, 0
@@toto1_3:
  movdqu  xmm2, [esi + edx]
  movdqu  xmm3, [esi + edx + 16]
  movdqa  xmm6, xmm1
  movdqa  xmm4, xmm2
  movdqa  xmm5, xmm3
  pcmpeqb xmm4, xmm0
  pcmpeqb xmm5, xmm0
  pand    xmm6, xmm4
  pandn   xmm4, xmm2
  por     xmm4, xmm6
  movdqa  xmm6, xmm1
  pand    xmm6, xmm5
  pandn   xmm5, xmm3
  movdqu  [eax + edx], xmm4
  por     xmm5, xmm6
  movdqu  [eax + edx + 16], xmm5
  add     edx, 32
  cmp     ecx, edx
  jne     @@toto1_3
@@toto1_4:
  cmp     edi, ecx
  je      @@toto1_8
@@toto1_5:
  mov     dl, byte ptr [esi + ecx]
  mov     ebx, ebp
  cmp     dl, bl
  mov     ebx, dword ptr [esp + 8] // 4-byte Reload
  mov     dh, bl
  je      @@toto1_7
  mov     dh, dl
@@toto1_7:
  mov     byte ptr [eax + ecx], dh
  inc     ecx
  jmp     @@toto1_4
@@toto1_8:
  add     esp, 12
  pop     esi
  pop     edi
  pop     ebx
  pop     ebp
end;



Test
Код: pascal
1.
2.
3.
4.
  Str := ' TestString - rehrthrth - - - - - - - - - -Yes - ';
  NewStr := RepSSE22(Str, '-', '!', Length(Str));

  Writeln(NewStr);  //  TestString ! rehrthrth ! ! ! ! ! ! ! ! ! !Yes !




Код: 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.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
program Project1;

uses
  System.SysUtils;

type
  ApChar = AnsiChar;
  ApString = AnsiString;
  ApPChar = PAnsiChar;

function RepSSE22(const Str: ApPChar; FromChar, SetChar: AnsiChar; len: Integer)
  : ApPChar; assembler;
asm
  mov     edi, len
  push    ebp
  push    ebx
  push    edi
  push    esi
  sub     esp, 12
  mov     esi, eax
  mov     dword ptr [esp + 8], ecx
  mov     ebp, edx
  call    SysGetMem
  test    edi, edi
  jle     @@toto1_8
  xor     ecx, ecx
  cmp     edi, 31
  jbe     @@toto1_5
  mov     edx, ebp
  mov     ecx, edi
  movzx   edx, dl
  and     ecx, -32
  movd    xmm0, edx
  movzx   edx, byte ptr [esp + 8]
  punpcklbw       xmm0, xmm0
  pshuflw xmm0, xmm0, 224
  pshufd  xmm0, xmm0, 0
  movd    xmm1, edx
  xor     edx, edx
  punpcklbw       xmm1, xmm1
  pshuflw xmm1, xmm1, 224
  pshufd  xmm1, xmm1, 0
@@toto1_3:
  movdqu  xmm2, [esi + edx]
  movdqu  xmm3, [esi + edx + 16]
  movdqa  xmm6, xmm1
  movdqa  xmm4, xmm2
  movdqa  xmm5, xmm3
  pcmpeqb xmm4, xmm0
  pcmpeqb xmm5, xmm0
  pand    xmm6, xmm4
  pandn   xmm4, xmm2
  por     xmm4, xmm6
  movdqa  xmm6, xmm1
  pand    xmm6, xmm5
  pandn   xmm5, xmm3
  movdqu  [eax + edx], xmm4
  por     xmm5, xmm6
  movdqu  [eax + edx + 16], xmm5
  add     edx, 32
  cmp     ecx, edx
  jne     @@toto1_3
@@toto1_4:
  cmp     edi, ecx
  je      @@toto1_8
@@toto1_5:
  mov     dl, byte ptr [esi + ecx]
  mov     ebx, ebp
  cmp     dl, bl
  mov     ebx, dword ptr [esp + 8] // 4-byte Reload
  mov     dh, bl
  je      @@toto1_7
  mov     dh, dl
@@toto1_7:
  mov     byte ptr [eax + ecx], dh
  inc     ecx
  jmp     @@toto1_4
@@toto1_8:
  add     esp, 12
  pop     esi
  pop     edi
  pop     ebx
  pop     ebp
end;

var
  NewStr, Str: ApPChar;

begin
  Str := ' TestString - rehrthrth - - - - - - - - - -Yes - ';
  NewStr := RepSSE22(Str, '-', '!', Length(Str));
  Writeln(NewStr);

  Readln;

end.

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

Убрал всю работу с памятью, в процедуре оставил правку на месте.
Преимущество sse на коротких строках в 2 раза, на длинных - в 3 раза:

Код: pascal
1.
2.
3.
4.
1516  ShaCharReplace1
1421  ShaCharReplace2
1141  ShaCharReplaceЗProc - на месте
344  ReplaceChr                  - на месте



Теперь дело за табличным вариантом на sse )
...
Рейтинг: 0 / 0
Быстрая замена символа
    #39679347
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гирлионайльдо,

AV на
movdqu [eax + edx], xmm4
...
Рейтинг: 0 / 0
Быстрая замена символа
    #39679348
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sapersky,

Результат твоей новой sse-функции с учетом выделения памяти
на коротких строках примерно совпадает с моим,
а на длинных в 2 раза лучше:

Код: pascal
1.
2.
3.
4.
1500  ShaCharReplace1
1422  ShaCharReplace2
3734  ReplaceCommaToDot
797  gccReplaceCommaToDot
...
Рейтинг: 0 / 0
Быстрая замена символа
    #39679350
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а на очень длинных в 6 раз!
...
Рейтинг: 0 / 0
Быстрая замена символа
    #39679358
Гирлионайльдо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr Sharahov,

Это потому что надо ручками освобождать память.

Вот автоматическое. Проверь эту. Снизу есть TestSSE

Код: 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.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
type
  ApChar = AnsiChar;
  ApString = AnsiString;
  ApPChar = PAnsiChar;


procedure RepSSE2(len: Integer; NewStr: ApPChar; const Str: ApPChar;
  FromChar, SetChar: AnsiChar); assembler;
asm
  push    ebx
  push    edi
  push    esi
  test    eax, eax
  jle     @@toto0_10
  xor     esi, esi
  cmp     eax, 31
  jbe     @@toto0_7
  lea     edi, [ecx + eax]
  cmp     edi, edx
  jbe     @@toto0_4
  lea     edi, [edx + eax]
  cmp     edi, ecx
  ja      @@toto0_7
@@toto0_4:
  movzx   edi,  FromChar
  mov     esi, eax
  and     esi, -32
  movd    xmm0, edi
  movzx   edi,  SetChar
  punpcklbw       xmm0, xmm0     
  pshuflw xmm0, xmm0, 224       
  pshufd  xmm0, xmm0, 0         
  movd    xmm1, edi
  xor     edi, edi
  punpcklbw       xmm1, xmm1     
  pshuflw xmm1, xmm1, 224        
  pshufd  xmm1, xmm1, 0         
@@toto0_5:                            
  movdqu  xmm2, [ecx + edi]
  movdqu  xmm3, [ecx + edi + 16]
  movdqa  xmm6, xmm1
  movdqa  xmm4, xmm2
  movdqa  xmm5, xmm3
  pcmpeqb xmm4, xmm0
  pcmpeqb xmm5, xmm0
  pand    xmm6, xmm4
  pandn   xmm4, xmm2
  por     xmm4, xmm6
  movdqa  xmm6, xmm1
  pand    xmm6, xmm5
  pandn   xmm5, xmm3
  movdqu  [edx + edi], xmm4
  por     xmm5, xmm6
  movdqu  [edx + edi + 16], xmm5
  add     edi, 32
  cmp     esi, edi
  jne     @@toto0_5
  cmp     esi, eax
  je      @@toto0_10
@@toto0_7:                            
  mov     bh, byte ptr [ecx + esi]
  mov     bl, SetChar
  cmp     bh,  FromChar
  je      @@toto0_9
  mov     bl, bh
@@toto0_9:                               
  mov     byte ptr [edx + esi], bl
  inc     esi
  cmp     eax, esi
  jne     @@toto0_7
@@toto0_10:
  pop     esi
  pop     edi
  pop     ebx
end;

function TestSSE(const Str: ApPChar): ApString;
var
  tmp: ApPChar;
  len: Integer;
begin
  len := length(Str);
  SetLength(Result, len);
  RepSSE2(len, ApPChar(Result), Str, ',', '!');
end;
...
Рейтинг: 0 / 0
Быстрая замена символа
    #39679408
Valery_B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Посмотрел на код
Код: pascal
1.
2.
procedure ReplaceChr2(Src, Dst : PAnsiChar; Cnt : Integer; FromChar, ToChar : AnsiChar); cdecl; external 'gcc_sse32.dll';
procedure RepSSE2(len: Integer; NewStr: ApPChar; const Str: ApPChar;  FromChar, SetChar: AnsiChar); assembler;



Первая мысль:
YouTube Video
...
Рейтинг: 0 / 0
Быстрая замена символа
    #39679410
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я, впрочем, сразу говорил, что в SIMD уходить нужно )
...
Рейтинг: 0 / 0
Быстрая замена символа
    #39679435
Гирлионайльдо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Valery_B,

И что ? То что аргументы похожи ? А как иначе сделать выделение строки - освобождаемой автоматически ? Если у Delphi нет такой возможности через обычные выделялки.

Это работает так. Ты выделяешь строку. Но она никуда не девается. Ей надо сделать Resize .. Больше или меньше в любом случае.
...
Рейтинг: 0 / 0
Быстрая замена символа
    #39679437
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гирлионайльдо,

скорее он говорит о том, что всё уже сделано до нас )
...
Рейтинг: 0 / 0
Быстрая замена символа
    #39679443
Гирлионайльдо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Быстрая замена символа
    #39679451
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я всегда верил в мощь ума наших программистов. Жалко только, что он на всякую ерунду растрачивается
...
Рейтинг: 0 / 0
Быстрая замена символа
    #39679476
zinpub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Про SSE сам читаю как раз... да это здорово выходит!

Осталось придумать, как в D5 запилить :-)
...
Рейтинг: 0 / 0
Быстрая замена символа
    #39679483
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гирлионайльдо,

второе место, немного отстает на всех длинах:
Код: pascal
1.
2.
3.
4.
9875  ShaCharReplace1
9172  ShaCharReplace2
1609  TestSSE2
1563  gccReplaceCommaToDot




не понял, это нафига? строки не могут перекрываться:
Код: pascal
1.
2.
3.
4.
5.
6.
  lea     edi, [ecx + eax]
  cmp     edi, edx
  jbe     @@toto0_4
  lea     edi, [edx + eax]
  cmp     edi, ecx
  ja      @@toto0_7
...
Рейтинг: 0 / 0
Быстрая замена символа
    #39679551
Гирлионайльдо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr Sharahov,

А можешь приложить свой тестер ? Хочу оптимизировать его на твоём

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

А можешь приложить свой тестер ? Хочу оптимизировать его на твоём

-- Это его так Clang сделал. И действительно. Это не нужный код


Специального тестера у меня нет. Но там примитивно все: генерируется массив случайных строк и потом в цикле крутим вызовы, время по GetTickCount.

Просто у меня там много лишнего наворочено (валидации разные + другие функции), выбрасывать долго + боюсь запутаться в этом хламе.

Оптимизировать там ничего не надо, надо просто преломить паскальную версию к SSE,
предварительно pxor xmm1, xmm0 и далее в цикле:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
  
  movdqu  xmm2, [ecx + edi]
  movdqu  xmm3, [ecx + edi + 16]
  movdqa  xmm4, xmm2
  movdqa  xmm5, xmm3
  pcmpeqb xmm2, xmm0
  pcmpeqb xmm3, xmm0
  pand    xmm2, xmm1
  pand    xmm3, xmm1
  pxor    xmm2, xmm4
  pxor    xmm3, xmm5



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

Это 32 символа если что.

Насчёт GetTickCount я вообще не уверен, у неё погрешность есть от "of 10 milliseconds to 16 milliseconds." до 30 как показывает практика
...
Рейтинг: 0 / 0
Быстрая замена символа
    #39679627
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ГирлионайльдоAleksandr Sharahov,

Это 32 символа если что.

Насчёт GetTickCount я вообще не уверен, у неё погрешность есть от "of 10 milliseconds to 16 milliseconds." до 30 как показывает практика

я знаю, если что )
...
Рейтинг: 0 / 0
Быстрая замена символа
    #39679740
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
проверил на строках длиной 899..999

Код: pascal
1.
2.
3.
4.
5.
10532  ShaCharReplace1
9734  ShaCharReplace2
1797  TestSSE2
1625  gccReplaceCommaToDot
1515  ShaCharReplaceSSE



исходник
Код: 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.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
procedure InternalReplaceSSE(p, q: pointer; chf, cht: integer);
asm
  movd    xmm0, ecx
  movd    xmm1, cht
  mov     ecx, [eax-4]
  and     ecx, -32
  pshufd  xmm0, xmm0, 0
  pshufd  xmm1, xmm1, 0
@@loop:
  movdqu  xmm2, [eax]
  movdqu  xmm3, [eax + 16]
  movdqa  xmm4, xmm2
  movdqa  xmm5, xmm3
  pcmpeqb xmm2, xmm0
  pcmpeqb xmm3, xmm0
  pand    xmm2, xmm1
  pand    xmm3, xmm1
  pxor    xmm2, xmm4
  pxor    xmm3, xmm5
  movdqu  [edx], xmm2
  movdqu  [edx + 16], xmm3
  add     eax, 32
  add     edx, 32
  sub     ecx, 32
  jg      @@loop
  end;

function ShaCharReplaceSSE(const s: AnsiString; chFrom, chTo: AnsiChar): AnsiString;
var
  ch1, ch2, chf, cht, len: integer;
  p, q: pInteger;
  ch: AnsiChar;
label
  loop, last;
begin;
  len:=Length(s);
  Result:='';
  SetLength(Result, len);
  p:=pointer(s);
  q:=pointer(Result);
  chf:=ord(chFrom) * $01010101;
  cht:=ord(chTo)   * $01010101 xor chf;
  if len>31 then begin;
    InternalReplaceSSE(p, q, chf, cht);
    inc(pChar(p), len and -32);
    inc(pChar(q), len and -32);
    len:=len and 31;
    end;
  chf:=chf xor integer($FFFFFFFF);
  while len>3 do begin;
    ch1:=p^;
    ch2:=ch1 xor chf;
    ch2:=(ch2 and $7F7F7F7F + $01010101) and $80808080 and ch2;
    q^:=(ch2 - ch2 shr 7 or ch2) and cht xor ch1;
    inc(p);
    inc(q);
    dec(len,4);
    end;
  while len>0 do begin;
    dec(len);
    ch:=pAnsiChar(p)[len];
    if ch=chFrom then ch:=chTo;
    pAnsiChar(q)[len]:=ch;
    end;
  end;

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

Молодец Очень быстро!
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
UseLodsD             -> 00:04:425
TestSSE2             -> 00:02:319
ShaCharReplaceSSE2   -> 00:00:887
Самый быстрый: 3     -> 00:00:887
------------------------------------------------------
UseLodsD             -> 00:04:454
TestSSE2             -> 00:02:214
ShaCharReplaceSSE2   -> 00:00:806
Самый быстрый: 3     -> 00:00:806
------------------------------------------------------
UseLodsD             -> 00:04:123
TestSSE2             -> 00:02:122
ShaCharReplaceSSE2   -> 00:00:802
Самый быстрый: 3     -> 00:00:802
...
Рейтинг: 0 / 0
Быстрая замена символа
    #39679865
Toxic Phantom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
idHTTP отправляет POST запрос на локальный сервер в base64 кодировке, обратно ответ прямо в StringList пишется. При всех кажущихся недостатках, таким образом удается подключить php в котором обработка строк делается изящно и на раз-два. Так нельзя делать а то вдруг проект за день заработает вместо двух недель
...
Рейтинг: 0 / 0
25 сообщений из 259, страница 8 из 11
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Быстрая замена символа
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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