Сейчас на форуме: tyns777 (+4 невидимых) |
![]() |
eXeL@B —› Программирование —› Хочу перевести функцию работы со строками на асм вставки под delphi и максимально оптимизировать. |
Посл.ответ | Сообщение |
|
Создано: 12 октября 2009 15:44 · Личное сообщение · #1 Хочу написать на асме вставки в процедуру для Дельфи которая приведённа ниже. Желательно конечно переписать полностью на асме. Работать должна с длинными строками более 255 символов. Смысл думаю понятен, выделяет строку по номеру через разделитель. Например GetSubStr('aaa:bb:c:ddd:e',':',2) вернёт строку bb, если разделителя не найдено возвращаем передаваемую строку в случае индекса 1, или пустую строку в случае другого. Если в строке нет элемента с таким номером, то пустую возвращаем. Так же хотелось бы сделать что бы разделитель был не обязательно однобайтовый... В общем спрашиваю по тому, что возможно кто посоветует готовое решение или может даже подобная функция есть в дельфи, либо кто-то за пять минут черкнёт. Я в свою очередь тоже попытаюсь изобразить на асме это, но хотелось бы максимально оптимизировано, а я в этом не силён... Приведённая функция работает сейчас хуже, чем описано как должна работать, но и этого в принципе достаточно, лишь бы шустро было... Code:
![]() |
|
Создано: 12 октября 2009 16:15 · Личное сообщение · #2 Вроде эта функция , но на асм полностью ... Code:
----- RE In Progress [!] Coding Hazard [!] Stay Clear of this Cube ![]() |
|
Создано: 12 октября 2009 18:12 · Личное сообщение · #3 |
|
Создано: 12 октября 2009 18:42 · Личное сообщение · #4 mak пишет: Вроде эта функция , но на асм полностью ... Насколько я понял функция ищет позицию подстроки в основной строке с позиции указанной в startpos. Это лишь часть алгоритма, но и его можно использовать дописав остальное. Мне одно не ясно, похоже этот код древний очень, почему не используются инструкции типа SCAS? Не похож он на вершину оптимизации... fakit пишет: есть готовые модули, faststring, qstring И т.д. Ищу сейчас. Если под рукой есть ссылки - буду признателен. ![]() |
|
Создано: 12 октября 2009 19:48 · Личное сообщение · #5 Вот нашёл интересный код на базе которого можно всё сделать: Code:
Отсюда выкинуть UpCases, добавить смещение с которого начинать поиск, добавить индекс нужного элемента, если результат найден, инкрементировать счётчик найденных вхождений и сравнивать с индексом, как только равны - отрезаем от позиции подстроки+длина подстроки до следующей если есть или до конца. Так примерно? p.s. Нашёл AcedStrings, как я понял дальнейшее развитие QStrings. Интересно, но нужно функции нет, есть из чего слепить, но хотелось бы всё в одной asm вставке... ![]() |
|
Создано: 12 октября 2009 19:55 · Личное сообщение · #6 |
|
Создано: 12 октября 2009 21:36 · Личное сообщение · #7 Ну да , там можно задавать разные патерны , как ты и хотел , длинее , на выходе в есх длина слова , на еах расположение патерна. Пару строчек и код копируется откуда надо , длина кода известна , размер известен , начало тоже задается в начале кода. Копию делаешь как те угодно. Код не старый , команды типа lods, scas, movs медленее обычно , этот код был проверен и оттестирован тамерными макросами , и расчитан на скоростную оптимизацию но не размерную. Хочешь чтобы было быстрее задействуй сопроцессор. Результаты старых тестов данной процедуры Code:
----- RE In Progress [!] Coding Hazard [!] Stay Clear of this Cube ![]() |
|
Создано: 12 октября 2009 21:51 · Личное сообщение · #8 |
|
Создано: 12 октября 2009 22:18 · Личное сообщение · #9 |
![]() |
eXeL@B —› Программирование —› Хочу перевести функцию работы со строками на асм вставки под delphi и максимально оптимизировать. |