![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() Добрый день. Есть функция удаления подстроки типа <gg hhh>jjjj</gg> из строки
(на самом деле посимвольное копирование когда это не запрещено условием) Код:
функция работает достаточно быстро (файл 3 мб за 30 мС обрабатывает) но есть подозрение, что использование COPY (DefineTeg:=Copy(Data, I,10) ![]() Внимание!! Вопрос: 1. действительно ли COPY не самое лучшее решение по быстродействию 2. чем можно заменить COPY? может вставка на ASM? |
#2
|
|||
|
|||
![]() а разве Copy уже не написана на асме?
не заморачивайся) 30мсек |
#3
|
||||
|
||||
![]() Вообще не понимаю использования PosEx для сравнения строк.
jmp $ ; Happy End! The Cake Is A Lie. |
#4
|
||||
|
||||
![]() тут проблема не в Copy, а в алгоритме.
Пишу программы за еду. __________________ |
#5
|
|||
|
|||
![]() Цитата:
если можно поподробнее. ведь в букваре сказано: функция для поиска в строке, именуемая PosEx. |
#6
|
||||
|
||||
![]() Зачем искать в строке, когда можно просто сравнить строки на равенство? Копировать не 10 символов, а 7 (длина строки "<script"), а затем сравнить копированную строку со "<script" обычным "равно".
Вообще NumLock прав. Не понимаю этих плясок с бубном вокруг цикла for, когда гораздо быстрее было бы сделать while, на котором лишние итерации можно просто пропустить. jmp $ ; Happy End! The Cake Is A Lie. |
#7
|
|||
|
|||
![]() тут все немножко сложнее, сейчас функция уже имеет вид
Код:
вот как тут ускорить обработку? может кто подскажет? |
#8
|
||||
|
||||
![]() Сделать цикл while, убрать этот никому не нужный differ и просто устанавливать i на символ после конца закрывающего тега.
Вообще скорее всего быстрее искать очередной тег, копировать всё до него, искать следующий после конца найденного. Посимвольно дописывать в конец строки - это не гуд. jmp $ ; Happy End! The Cake Is A Lie. |
#9
|
|||
|
|||
![]() то есть вначале сделать быструю функцию типа
function Del(const Str,StartTeg,EndTeg:string):string; а потом эту функцию кинуть в цикл, в котором поочередно подставлять в параметры пары тегов и по новой прогонять Str, поочередно удаляя все ненужное? и так будет быстрее чем просто посимвольно скопировать Str в Result, запрещая копирование там где нужно? |
#10
|
||||
|
||||
![]() Я бы сделал так.
A = 1. Ищу первое вхождение < после A. Копирую 10 символов с этой позиции во временную строку. Смотрю на нужный тег. Если не нужный - ищу следующую < с этой позиции. Если нужный - копирую от A до текущей позиции, ищу к нему закрывающий и A = концу закрывающего. Вернуться в начало. Каждое прибавление символа к строке - это перевыделение памяти под строку. jmp $ ; Happy End! The Cake Is A Lie. |
#11
|
|||
|
|||
![]() то есть использовать CASE для определения нужный тег, или не нужный?
и использовать Repeat для одного гарантированного прохода по строке а копировать чем? COPY или MOVE. или через указатели? типа: Код:
|
#12
|
||||
|
||||
![]() Да, получать первый тег можно тем же кейсом, использовать repeat, копировать copy (ее скорость нормальная). Через указатели - проблем не оберешься.
И причем тут потоки? Если они будут обрабатывать разные строки, то вообще никакой связи. А если одну... лучше так не делать. jmp $ ; Happy End! The Cake Is A Lie. |
#13
|
|||
|
|||
![]() Цитата:
Ну вот: Код:
Если возможно, укажите на узкие участки и как их заменить, но без использования указателей. это пока не совсем понятно и еще косячок: почемуто пропадают два последние символа в строке, было </html> стало </htm, непонятно куда Последний раз редактировалось Pcrepair, 19.02.2013 в 22:40. |
#14
|
||||
|
||||
![]() Зачем Insert? Можно просто дописать в конец. Что-то вроде
Код:
Хотя вообще странно, что твой вариант медленнее. В таком случае может быть медленнее и тут. По идеи PosEx = rep scasb, одна команда; в то время как прибавление по одному символу - постоянные релоки строки. jmp $ ; Happy End! The Cake Is A Lie. Последний раз редактировалось Bargest, 19.02.2013 в 23:16. |