powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Быстрая замена символа
25 сообщений из 259, страница 10 из 11
Быстрая замена символа
    #39679966
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Kazantsev AlexeyГирлионайльдоОшибся немного. https://vk.com/jj_jj95
Это ещё один твой виртуал?

Вот эта твоя наработка удивительным образом, как две капли воды, похожа вот на это .
няшик спалился
...
Рейтинг: 0 / 0
Быстрая замена символа
    #39680032
vavan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ГирлионайльдоМолодец Очень быстро!сперва пободались а потом традиционно пришел лесникшарахов и всех разогнал
...
Рейтинг: 0 / 0
Быстрая замена символа
    #39680064
Sapersky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да ладно. Шарахов позаимствовал главную ускорялку у компилятора Си и соединил её со своим криптокодом (который видимо и даёт ускорение на длинах меньше 32).

В результате:
На Дельфи 65 строк кода и на 10% быстрее.
На Си 5 строк (простых как мычание), или даже 3, если скобки не считать. При этом больше гибкость - перекомпилируется под любой набор инструкций, Unicode и т.д.

Мне второй вариант больше нравится. Хотя дело вкуса.
...
Рейтинг: 0 / 0
Быстрая замена символа
    #39680076
Sapersky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А изначальный посыл был в том, что сишный компилятор где-то уже может заменить Шарахова :)

Как его использовать - другое дело, но копипастить ассемблер по-моему сомнительное занятие. Я пробовал и намучился, пришлось прилично править т.к. в X86 нет полностью эквивалентного соглашания о вызовах, работу со стеком переделывал и т.д. Лучше линковка или DLL.
...
Рейтинг: 0 / 0
Быстрая замена символа
    #39680078
vavan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SaperskyНа Си 5 строк (простых как мычание), или даже 3, если скобки не считать. При этом больше гибкость - перекомпилируется под любой набор инструкций, Unicode и т.д.

Мне второй вариант больше нравится. Хотя дело вкусада я так-то сишник и сам неоднократно тут говорил что борландячий компайлер из прошлого тысячелетия, не все просто в курсе. когда на vs пишу тоже в голову не приходит асм юзать и особо заморачиваться
...
Рейтинг: 0 / 0
Быстрая замена символа
    #39680082
vavan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SaperskyЛучше линковка или DLLага, чуть ли не в том еще веке порой математику и прочую критичную числогрызню цепляли к борландовому фронту в виде длл собранной скажем интелячьим компайлером
...
Рейтинг: 0 / 0
Быстрая замена символа
    #39680112
Sapersky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сейчас и бесплатные GCC/Clang вроде ничего.

Но заметный эффект получается, только если алгоритм в принципе векторизуется. Или его можно переписать так, чтобы векторизовался.
За исключением может быть плавающей точки на x86 компиляторе Дельфи, которая такая медленная, что и переписывание "в лоб" на Си может помочь.
...
Рейтинг: 0 / 0
Быстрая замена символа
    #39680126
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SaperskyДа ладно. Шарахов позаимствовал главную ускорялку у компилятора Си и соединил её со своим криптокодом (который видимо и даёт ускорение на длинах меньше 32).

В результате:
На Дельфи 65 строк кода и на 10% быстрее.
На Си 5 строк (простых как мычание), или даже 3, если скобки не считать. При этом больше гибкость - перекомпилируется под любой набор инструкций, Unicode и т.д.

Мне второй вариант больше нравится. Хотя дело вкуса.

Си заставил посмотреть в сторону SSE.
Потому как не может бездушная железяка все такое )

Но если без эмоций вникнуть в код, то увидишь,
что мой SSE-код скорее "позаимствован"
из моего же криптокода на паскале.
...
Рейтинг: 0 / 0
Быстрая замена символа
    #39680145
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vavanSaperskyЛучше линковка или DLLага, чуть ли не в том еще веке порой математику и прочую критичную числогрызню цепляли к борландовому фронту в виде длл собранной скажем интелячьим компайлером
... фотртана
...
Рейтинг: 0 / 0
Быстрая замена символа
    #39680149
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SaperskyНо заметный эффект получается, только если алгоритм в принципе векторизуется. Или его можно переписать так, чтобы векторизовался.
Я сейчас сижу на core2duo и вообще таких машин ещё - дофига и больше. Так что чистый AVX ещё лет десять минимум (ИМХО) придётся дублировать SSE2+.
...
Рейтинг: 0 / 0
Быстрая замена символа
    #39680233
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Иногда SSE2 не так уж плох,
тест AnsiUpperCase на строках длины 888..999, SSE42 в пролете:
Код: pascal
1.
2.
3.
4.
5.
16438  AnsiUpperCase - RTL
2609  ShaCharReplace - замена по таблице (параметр)
2625  ShaAnsiUpperCase - замена по таблице (без параметра)
641  ShaAnsiUpperCaseSSE - SSE2, таблица 1251 жестко запаяна
812  ShaAnsiUpperCaseSSE42 - новая инструкция для диапазонов 1251 
...
Рейтинг: 0 / 0
Быстрая замена символа
    #39680543
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
топик на время, нетленка навечно:

Как быстро заменить символы в строке http://www.guildalfa.ru/alsha/node/36
...
Рейтинг: 0 / 0
Быстрая замена символа
    #39680545
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Aleksandr Sharahovтопик на время, нетленка навечно:

Как быстро заменить символы в строке http://www.guildalfa.ru/alsha/node/36
хорошо, но представляет лишь академический интерес
лично я в свои проекты не потащу индусский лапшекод, какой бы он ни был быстрый
...
Рейтинг: 0 / 0
Быстрая замена символа
    #39680551
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
defecator,

ладно, считай что отмазался, разрешаю не тащить )
...
Рейтинг: 0 / 0
Быстрая замена символа
    #39680578
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr Sharahov Как быстро заменить символы в строке http://www.guildalfa.ru/alsha/node/36
Мы тут это уже проходили. Если у вас в приложении узкое место - это поиск (и замена) чего-либо в строках, то необходимо включать выравнивание на 16 байт в FastMM и вместо movedq u xmmX, [mem] использовать movedq a , тогда и производительность вырастает в разы, а в случае поиска можно вообще pcmpeqd сразу к памяти применять, без предварительной загрузки в регистр.
...
Рейтинг: 0 / 0
Быстрая замена символа
    #39680604
Гирлионайльдо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp,

А такое выравнивание будет работать для строк ? Так как такое не работает
Код: pascal
1.
System.SetMinimumBlockAlignment(mba16Byte);



Я в своё время, делал свои строки, где выделялась ровно 16 через SysGetMem. Структура была такая
Код: pascal
1.
2.
3.
4.
5.
6.
7.
  TMyStr = record 
    WideByte : Boolean; // 2 байта ? Или 1
	StrByte : TArray<Byte>; // Массив байт
	LengthStr : NativeUInt; // Текущая длина
	MaxLengthStr : NativeUInt; // Максимальная длина, с учётом 16 или 8 
	Ref : Cardinal;
   end;



Работа с такой структурой была реализована через record helper for
...
Рейтинг: 0 / 0
Быстрая замена символа
    #39680634
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvpЕсли у вас в приложении узкое место - это поиск (и замена) чего-либо в строках, то необходимо

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

А такое выравнивание будет работать для строк ? Так как такое не работает
Код: pascal
1.
System.SetMinimumBlockAlignment(mba16Byte);



Прекрасно работает, просто надо учитывать что строка на самом деле - это StrRec (12 байт) + данные, т.е. в начале каждой строки есть 2 невыровненых символа (4 байта), которые надо обработать отдельно, а потом уже можно нормально обрабатывать.

Причём в 64-х битном режиме размер StrRec, внезапно, увеличивается до 16 байт и там все строки автоматически получаются выравненными:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
  StrRec = packed record
  {$IF defined(CPUX64)}
    _Padding: LongInt; // Make 16 byte align for payload..
  {$IFEND}
    codePage: Word;
    elemSize: Word;
    refCnt: Longint;
    length: Longint;
  end;
...
Рейтинг: 0 / 0
Быстрая замена символа
    #39680641
Гирлионайльдо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp,

Даже при mba16Byte SSE откажется работать, из за того что NativeInt(@str[1]) and 15 = 12.


Нет там никаких 4 не выровненных байта на 32 битной платформе.
Код: pascal
1.
GetMem(P, SizeOf(StrRec) + (CharLength + 1) * SizeOf(WideChar));



Что значит, что в структуре StrRec последним перед строкой идёт length. А это значит, что мы можем сделать
Код: pascal
1.
PInteger(PByte(str) - SizeOf(Integer))^



И получить длину. А сделав так.
Код: pascal
1.
2.
3.
4.
5.
6.
    Writeln(PWord(PByte(str)
      - SizeOf(Integer)  {length}
      - SizeOf(Integer)  {refCnt}
      - SizeOf(Word)     {elemSize}
      - SizeOf(Word)     {codePage}
    )^);



Можно уже получить codePage 1200

И того, строка длиной в 4 : (12 + (4 + 1) * 2 = 22) and 15 = 6 И того 10 не выровненных байт. SSE откажется работать в таком случае 100%

... А на 64 битной платформе всё понятно, у них там стаб для SSE 64 битного.
...
Рейтинг: 0 / 0
Быстрая замена символа
    #39680692
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ГирлионайльдоИ того, строка длиной в 4 : (12 + (4 + 1) * 2 = 22) and 15 = 6 И того 10 не выровненных байт. SSE откажется работать в таком случае 100%
Я не знаю что и как ты считаешь, но если PStrRec выравнивается на 16 байт, а её размер - 12 байт, то (PStrRec + 4) тоже будет выравнена на 16 байт, это очевидно.

Вот кусок рабочего кода (сравнение строк, а не поиск)
Код: 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.
  ...
  { сначала сравниваем отдельно два первых символа }
  mov     ebx, [eax]
  xor     ebx, [eax + edx]
  jnz     @@exit
  lea     eax, [eax + 4]
  sub     ecx, 2
  jbe     @@exit
  xor     ebx, ebx
  lea     ebx, [ebx - 8]
  test    ecx, ebx
  jz      @@l2c
  { потом в цикле сравниваем по 8 символов (16 байт) }
@@l8c:
  movdqa  xmm0, dqword ptr [eax]
  pcmpeqd xmm0, dqword ptr [eax + edx]
  pmovmskb ebp, xmm0
  sub     ebp, $FFFF
  jnz     @@exit
  lea     eax, [eax + $10]
  lea     ecx, [ecx - $08]
  test    ecx, ebx
  jnz     @@l8c
  ...

...
Рейтинг: 0 / 0
Быстрая замена символа
    #39680693
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
P.S: Так же очевидно, что строки длиной меньше 6 символов обрабатывать через 8-байтные регистры бесcмысленно.
...
Рейтинг: 0 / 0
Быстрая замена символа
    #39680713
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvpAleksandr Sharahov Как быстро заменить символы в строке http://www.guildalfa.ru/alsha/node/36
Мы тут это уже проходили. Если у вас в приложении узкое место - это поиск (и замена) чего-либо в строках, то необходимо включать выравнивание на 16 байт в FastMM и вместо movedq u xmmX, [mem] использовать movedq a , тогда и производительность вырастает в разы, а в случае поиска можно вообще pcmpeqd сразу к памяти применять, без предварительной загрузки в регистр.

Результаты эксперимента на i7-7770 для процедуры SSEReplace из статьи на сайте:

1. одинаковая скорость movdqu и movdqa на выровненных данных
2. падение скорости на 10% у movdqu на невыровненных данных
...
Рейтинг: 0 / 0
Быстрая замена символа
    #39680717
Гирлионайльдо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да. Строку можно и ручками выровнять. Но тогда какой смысл ? Лучше сразу работать с выравненными данными. Давая полноценную 16 летную строку с #0 заполнением, умножая на 2 её, когда нет места в ней.

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

я не собираюсь что-то ручками выравнивать, мысль в другом

1. обе команды равноценны или почти равноценны на выровненных данных
2а. важна скорость не самой команды, а процедуры, в которой она работает
2б. на современном процессоре скорость процедуры отличается на 10% в лучшем случае
...
Рейтинг: 0 / 0
Быстрая замена символа
    #39680728
Гирлионайльдо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я самое логичное вижу, это пересобрать модуль System и сделать в нём

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
  PStrRec = ^StrRec;
  StrRec = packed record
    _Padding: Integer; // Make 16 byte align for payload..
    codePage: Word;
    elemSize: Word;
    refCnt: Integer;
    length: Integer;
  end;



Убрав {$IF defined(CPU64BITS)}
...
Рейтинг: 0 / 0
25 сообщений из 259, страница 10 из 11
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Быстрая замена символа
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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