|
|
|
Быстрая замена символа
|
|||
|---|---|---|---|
|
#18+
Kazantsev AlexeyГирлионайльдоОшибся немного. https://vk.com/jj_jj95 Это ещё один твой виртуал? Вот эта твоя наработка удивительным образом, как две капли воды, похожа вот на это . няшик спалился ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2018, 06:56 |
|
||
|
Быстрая замена символа
|
|||
|---|---|---|---|
|
#18+
ГирлионайльдоМолодец Очень быстро!сперва пободались а потом традиционно пришел лесникшарахов и всех разогнал ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2018, 10:13 |
|
||
|
Быстрая замена символа
|
|||
|---|---|---|---|
|
#18+
Да ладно. Шарахов позаимствовал главную ускорялку у компилятора Си и соединил её со своим криптокодом (который видимо и даёт ускорение на длинах меньше 32). В результате: На Дельфи 65 строк кода и на 10% быстрее. На Си 5 строк (простых как мычание), или даже 3, если скобки не считать. При этом больше гибкость - перекомпилируется под любой набор инструкций, Unicode и т.д. Мне второй вариант больше нравится. Хотя дело вкуса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2018, 11:13 |
|
||
|
Быстрая замена символа
|
|||
|---|---|---|---|
|
#18+
А изначальный посыл был в том, что сишный компилятор где-то уже может заменить Шарахова :) Как его использовать - другое дело, но копипастить ассемблер по-моему сомнительное занятие. Я пробовал и намучился, пришлось прилично править т.к. в X86 нет полностью эквивалентного соглашания о вызовах, работу со стеком переделывал и т.д. Лучше линковка или DLL. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2018, 11:37 |
|
||
|
Быстрая замена символа
|
|||
|---|---|---|---|
|
#18+
SaperskyНа Си 5 строк (простых как мычание), или даже 3, если скобки не считать. При этом больше гибкость - перекомпилируется под любой набор инструкций, Unicode и т.д. Мне второй вариант больше нравится. Хотя дело вкусада я так-то сишник и сам неоднократно тут говорил что борландячий компайлер из прошлого тысячелетия, не все просто в курсе. когда на vs пишу тоже в голову не приходит асм юзать и особо заморачиваться ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2018, 11:38 |
|
||
|
Быстрая замена символа
|
|||
|---|---|---|---|
|
#18+
SaperskyЛучше линковка или DLLага, чуть ли не в том еще веке порой математику и прочую критичную числогрызню цепляли к борландовому фронту в виде длл собранной скажем интелячьим компайлером ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2018, 11:41 |
|
||
|
Быстрая замена символа
|
|||
|---|---|---|---|
|
#18+
Сейчас и бесплатные GCC/Clang вроде ничего. Но заметный эффект получается, только если алгоритм в принципе векторизуется. Или его можно переписать так, чтобы векторизовался. За исключением может быть плавающей точки на x86 компиляторе Дельфи, которая такая медленная, что и переписывание "в лоб" на Си может помочь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2018, 12:16 |
|
||
|
Быстрая замена символа
|
|||
|---|---|---|---|
|
#18+
SaperskyДа ладно. Шарахов позаимствовал главную ускорялку у компилятора Си и соединил её со своим криптокодом (который видимо и даёт ускорение на длинах меньше 32). В результате: На Дельфи 65 строк кода и на 10% быстрее. На Си 5 строк (простых как мычание), или даже 3, если скобки не считать. При этом больше гибкость - перекомпилируется под любой набор инструкций, Unicode и т.д. Мне второй вариант больше нравится. Хотя дело вкуса. Си заставил посмотреть в сторону SSE. Потому как не может бездушная железяка все такое ) Но если без эмоций вникнуть в код, то увидишь, что мой SSE-код скорее "позаимствован" из моего же криптокода на паскале. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2018, 12:32 |
|
||
|
Быстрая замена символа
|
|||
|---|---|---|---|
|
#18+
vavanSaperskyЛучше линковка или DLLага, чуть ли не в том еще веке порой математику и прочую критичную числогрызню цепляли к борландовому фронту в виде длл собранной скажем интелячьим компайлером ... фотртана ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2018, 12:47 |
|
||
|
Быстрая замена символа
|
|||
|---|---|---|---|
|
#18+
SaperskyНо заметный эффект получается, только если алгоритм в принципе векторизуется. Или его можно переписать так, чтобы векторизовался. Я сейчас сижу на core2duo и вообще таких машин ещё - дофига и больше. Так что чистый AVX ещё лет десять минимум (ИМХО) придётся дублировать SSE2+. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2018, 12:48 |
|
||
|
Быстрая замена символа
|
|||
|---|---|---|---|
|
#18+
Иногда SSE2 не так уж плох, тест AnsiUpperCase на строках длины 888..999, SSE42 в пролете: Код: pascal 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2018, 14:42 |
|
||
|
Быстрая замена символа
|
|||
|---|---|---|---|
|
#18+
топик на время, нетленка навечно: Как быстро заменить символы в строке http://www.guildalfa.ru/alsha/node/36 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.07.2018, 15:47 |
|
||
|
Быстрая замена символа
|
|||
|---|---|---|---|
|
#18+
Aleksandr Sharahovтопик на время, нетленка навечно: Как быстро заменить символы в строке http://www.guildalfa.ru/alsha/node/36 хорошо, но представляет лишь академический интерес лично я в свои проекты не потащу индусский лапшекод, какой бы он ни был быстрый ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.07.2018, 15:50 |
|
||
|
Быстрая замена символа
|
|||
|---|---|---|---|
|
#18+
defecator, ладно, считай что отмазался, разрешаю не тащить ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.07.2018, 16:03 |
|
||
|
Быстрая замена символа
|
|||
|---|---|---|---|
|
#18+
Aleksandr Sharahov Как быстро заменить символы в строке http://www.guildalfa.ru/alsha/node/36 Мы тут это уже проходили. Если у вас в приложении узкое место - это поиск (и замена) чего-либо в строках, то необходимо включать выравнивание на 16 байт в FastMM и вместо movedq u xmmX, [mem] использовать movedq a , тогда и производительность вырастает в разы, а в случае поиска можно вообще pcmpeqd сразу к памяти применять, без предварительной загрузки в регистр. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.07.2018, 19:15 |
|
||
|
Быстрая замена символа
|
|||
|---|---|---|---|
|
#18+
alekcvp, А такое выравнивание будет работать для строк ? Так как такое не работает Код: pascal 1. Я в своё время, делал свои строки, где выделялась ровно 16 через SysGetMem. Структура была такая Код: pascal 1. 2. 3. 4. 5. 6. 7. Работа с такой структурой была реализована через record helper for ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.07.2018, 21:00 |
|
||
|
Быстрая замена символа
|
|||
|---|---|---|---|
|
#18+
alekcvpЕсли у вас в приложении узкое место - это поиск (и замена) чего-либо в строках, то необходимо Выбросить это приложение и начать жить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.07.2018, 23:13 |
|
||
|
Быстрая замена символа
|
|||
|---|---|---|---|
|
#18+
Гирлионайльдоalekcvp, А такое выравнивание будет работать для строк ? Так как такое не работает Код: pascal 1. Прекрасно работает, просто надо учитывать что строка на самом деле - это StrRec (12 байт) + данные, т.е. в начале каждой строки есть 2 невыровненых символа (4 байта), которые надо обработать отдельно, а потом уже можно нормально обрабатывать. Причём в 64-х битном режиме размер StrRec, внезапно, увеличивается до 16 байт и там все строки автоматически получаются выравненными: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.07.2018, 00:06 |
|
||
|
Быстрая замена символа
|
|||
|---|---|---|---|
|
#18+
alekcvp, Даже при mba16Byte SSE откажется работать, из за того что NativeInt(@str[1]) and 15 = 12. Нет там никаких 4 не выровненных байта на 32 битной платформе. Код: pascal 1. Что значит, что в структуре StrRec последним перед строкой идёт length. А это значит, что мы можем сделать Код: pascal 1. И получить длину. А сделав так. Код: pascal 1. 2. 3. 4. 5. 6. Можно уже получить codePage 1200 И того, строка длиной в 4 : (12 + (4 + 1) * 2 = 22) and 15 = 6 И того 10 не выровненных байт. SSE откажется работать в таком случае 100% ... А на 64 битной платформе всё понятно, у них там стаб для SSE 64 битного. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.07.2018, 01:22 |
|
||
|
Быстрая замена символа
|
|||
|---|---|---|---|
|
#18+
ГирлионайльдоИ того, строка длиной в 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.07.2018, 15:36 |
|
||
|
Быстрая замена символа
|
|||
|---|---|---|---|
|
#18+
P.S: Так же очевидно, что строки длиной меньше 6 символов обрабатывать через 8-байтные регистры бесcмысленно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.07.2018, 15:39 |
|
||
|
Быстрая замена символа
|
|||
|---|---|---|---|
|
#18+
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 на невыровненных данных ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.07.2018, 19:05 |
|
||
|
Быстрая замена символа
|
|||
|---|---|---|---|
|
#18+
Да. Строку можно и ручками выровнять. Но тогда какой смысл ? Лучше сразу работать с выравненными данными. Давая полноценную 16 летную строку с #0 заполнением, умножая на 2 её, когда нет места в ней. Тогда мы просто будем использовать чистый SSE без всяких выравниваний в SSE ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.07.2018, 19:14 |
|
||
|
Быстрая замена символа
|
|||
|---|---|---|---|
|
#18+
Гирлионайльдо, я не собираюсь что-то ручками выравнивать, мысль в другом 1. обе команды равноценны или почти равноценны на выровненных данных 2а. важна скорость не самой команды, а процедуры, в которой она работает 2б. на современном процессоре скорость процедуры отличается на 10% в лучшем случае ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.07.2018, 19:21 |
|
||
|
Быстрая замена символа
|
|||
|---|---|---|---|
|
#18+
Я самое логичное вижу, это пересобрать модуль System и сделать в нём Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. Убрав {$IF defined(CPU64BITS)} ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.07.2018, 19:51 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=39680126&tid=2040575]: |
0ms |
get settings: |
8ms |
get forum list: |
9ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
174ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
43ms |
get tp. blocked users: |
1ms |
| others: | 244ms |
| total: | 493ms |

| 0 / 0 |
