Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Функция, вырезающая строку между двумя разделителями


Страницы:   1 2 3

Piter ©   (2005-08-19 21:28:00) 

Ищу функцию, в которую передается 3 параметра: исходная строка и два разделителя.
Результатом является строка, находящяяся между этими двумя разделителями в исходной строке.

Ну хотелось бы как можно быстрее :)

прототип:

function CutString(Src, BeginSeparator, EndSeparatpr: string): string

Примеры работы:

CutString('abcdefg', 'ab', 'ef') = 'cd'

CutString('bbvatzq', 'a', 'b') = ''


Sha   (2005-08-23 17:47:00) [1]

> Leonid Troyanovsky ©
> Старого, это какого?

Того, что осталься от предыдущего вызова.

> Неее. Оно нам негоже, бо недокументировано.

Документировано в исходниках.
Память под строку-результат выделяет вызывающая функция.
Если делается несколько вызовов, старый результат
замещается новым.

> Да, и, вообще, если строка-результат всегда уникальна,

Уникальность строки означает, что ее счетчик ссылок равен 1.

> то как может случиться, что она содержит результат
> предыдущего вызова.

Как описано выше :)

--
Best regards,
Aleksandr


Leonid Troyanovsky   (2005-08-23 17:34:00) [2]


> Jeer ©   (23.08.05 17:18) [48]
> Leonid Troyanovsky ©   (23.08.05 17:04) [47]
>
> Надо понимать, предыдущего:)


Да, и, вообще, если строка-результат всегда уникальна,
то как может случиться, что она содержит результат
предыдущего вызова.

--
Regards, LVT.


Leonid Troyanovsky   (2005-08-23 17:27:00) [3]


> Jeer ©   (23.08.05 17:18) [48]

> Надо понимать, предыдущего:)


Неее. Оно нам негоже, бо недокументировано.

--
Regards, LVT.


Jeer   (2005-08-23 17:18:00) [4]

Leonid Troyanovsky ©   (23.08.05 17:04) [47]

Надо понимать, предыдущего:)


Leonid Troyanovsky   (2005-08-23 17:04:00) [5]


> Sha ©   (23.08.05 16:54) [46]

> то обычно более чем в половине случаев комбинация
> SetLength + Move приводит к обрезанию старого результата,


Старого, это какого?

--
Regards, LVT.


Sha   (2005-08-23 16:54:00) [6]

> Leonid Troyanovsky ©   (23.08.05 15:24) [45]
> Ну, Piter тоже пользовал не асм.

У него как раз все циклы на асме во внешней PosEx.

> И если процедуры были внутренние, оно б сильно не изменилось.

Естественно, это позволило только не передавать параметры.
Речь о том, чтобы свести количество вызовов любых процедур
к минимуму. У Piter'а их всего 3, а у тебя ~Length(Src)*2

> > Вместо SetString часто эффективнее использовать
> > комбинацию SetLength + Move.
> Трудно согласиться, бо противоречит первому утверждению.

Если не ошибаюсь, SetString всегда приводит к выделению новой
строки. А так как строка-результат функции всегда уникальна,
то обычно более чем в половине случаев комбинация
SetLength + Move приводит к обрезанию старого результата,
что увеличивает эффективность при коротких результатах.


Leonid Troyanovsky   (2005-08-23 15:24:00) [7]


> Sha ©   (23.08.05 08:43) [44]

> > 20 это серьезно :)
> > Правда, пока непонятно, за счет, собс-но, чего.

> Эа счет использования Паскаля и основного цикла,
> в котором многократно вызываются внешние процедуры
> Length и StrLComp.


Ну, Piter тоже пользовал не асм.
И если процедуры были внутренние, оно б сильно не изменилось.

Значит, вывод сделаем следующий:
за счет вызова процедур (сам вызов и операции с регистрами).
Т.е., ускориться можно, например, вписав вместо StrLComp
пару собс-ных циклов.

> Вместо SetString часто эффективнее использовать
> комбинацию SetLength + Move.

Трудно согласиться, бо противоречит первому утверждению.

--
Regards, LVT.


Sha   (2005-08-23 08:43:00) [8]

> Leonid Troyanovsky ©   (22.08.05 16:36) [36]

> 20 это серьезно :)
> Правда, пока непонятно, за счет, собс-но, чего.

Эа счет использования Паскаля и основного цикла,
в котором многократно вызываются внешние процедуры
Length и StrLComp.

Вместо SetString часто эффективнее использовать
комбинацию SetLength + Move.


ev   (2005-08-22 22:03:00) [9]

можно еще так :)

str:=TStringList.Create;
str.Delimiter:='|';
str.DelimitedText:='asd|ddd|s|dd';


Anatoly Podgoretsky   (2005-08-22 21:36:00) [10]

Piter ©   (22.08.05 21:27) [41]
Занятой или нет не важно, я могу заняться и посторонней проблемой если она представит для меня интерес, ну например новихной. Данная проблема мне не интересна. Максимус что могу, так это пару замечаний или предложений, если сочту нужным.

А в форумах участвую по многим причинам, главная из которых развлечение, но и отлов интересных сообщений, которые могут пригодится, не могу же я все проверять самостоятельно, вот и использую совместный опыт. Хоть КПД и низок, но всегда что то есть очень полезное. Ну а время, не секрет, начиная с 6:30 до 24:00. Интернет постоянный, не лимитированый, быстрый. Компьютеры постоянно включены. Сервер вообще никогда не выключается.

Вот пишу в последнее время очень мало.


Piter   (2005-08-22 21:27:00) [11]

Ок, ок, не хотите - как хотите.

Одна мысля только - если вы, Анатолий, такой занятой, то не понимаю, чего вы участвуете в десятке форумов, в ФИДО и еще черт знаем в чем :)))

Уверен, это отнимает много часов КАЖДЫЙ день :)


Anatoly Podgoretsky   (2005-08-22 20:47:00) [12]

Piter ©   (22.08.05 16:03) [31]
Anatoly Podgoretsky ©   (22.08.05 15:23) [27]
Найти начало и записать его в переменную K
Если K>0 (здесь постановка отсутствует

Вероятно, имелось в виду K<1.

Да именно так.

напишите

Еще чего, нет такого желания просто так делать, будет конкретная задача, то естественно напишу, а просто так тратить время не могу, есть более насущные задачи. Тем более при отсутствии точной постановки задачи.


Piter   (2005-08-22 17:00:00) [13]

Игорь Шевченко ©   (22.08.05 16:29) [35]
в несильно критичных местах я бы предпочел ясность и удобочитаемость кода в ущерб быстродействию


ну не знаю. Это ведь функция сама в себе, оттестированная, черный ящик. Какая разница что там внутри? Известен алгоритм работы - а что еще надо?

Leonid Troyanovsky ©   (22.08.05 16:36) [36]
т.е., на самом деле,  на месте оптимизатора я
удалил бы оба цикла, бо ничего полезного они делают


понятное дело, но причем же здесь это :)
Оптимизатор не вдается в подробности - что там делает функция CuteString и нужен ли возвращаемый результат. Главное, что функции исполняются.

А насчет из корректности - вроде обе функции верные значения возвращают, поэтому это я не тестировал.

Leonid Troyanovsky ©   (22.08.05 16:36) [36]
С другой стороны, такие вещи следует делать
примерно так: делаем цикл n раз, 2*n раз, 3*n раз
и строим зависимость T - n


ломало :)

Замечу, что еще одним подводным камнем может быть
порядок, т.е. после работы одного блока может
произойти, скажем, сброс страниц в своп


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


Leonid Troyanovsky   (2005-08-22 16:40:00) [14]


> Leonid Troyanovsky ©   (22.08.05 16:36) [36]

> примерно так: делаем цикл n раз, 2*n раз, 3*n раз
> и строим зависимость T - n. Обычно это прямая


Фу-ты. Зависимость T от раз (1, 2, 3, ..)
Sorry.

--
Regards, LVT.


Defunct   (2005-08-22 16:38:00) [15]

Piter ©   (22.08.05 16:09) [34]

можно, но не на IA-32


Leonid Troyanovsky   (2005-08-22 16:36:00) [16]


> Piter ©   (22.08.05 15:53) [29]
> Leonid Troyanovsky ©   (22.08.05 14:10) [18]
>
> сравнил :(
> Твой вариант в 20 раз медленнее.


20 это серьезно :)
Правда, пока непонятно, за счет, собс-но, чего.

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

С другой стороны, такие вещи следует делать
примерно так: делаем цикл n раз, 2*n раз, 3*n раз
и строим зависимость T - n. Обычно это прямая
(не из нуля). Сравниваем только скорость (угол наклона).

Замечу, что еще одним подводным камнем может быть
порядок, т.е. после работы одного блока может
произойти, скажем, сброс страниц в своп.

Т.е., надо давать поработать и одной и другой функции,
возможно, в случайном порядке.

--
Regards, LVT.


Игорь Шевченко   (2005-08-22 16:29:00) [17]

Piter ©   (22.08.05 16:09) [34]

Я к чему спрашиваю - в несильно критичных местах я бы предпочел ясность и удобочитаемость кода в ущерб быстродействию.


Piter   (2005-08-22 16:09:00) [18]

Игорь Шевченко ©   (22.08.05 16:04) [32]
А можно вопрос? Где и когда эта функция будет вызываться ?


Текущее время уже абсолютно приемлимо.
Теперь просто интересно - можно ли быстрее :)

То есть, можно то точно, но вот интересно посмотреть на реализацию.

А вообще - такая функция уже использовалась в двух проектах, теперь просто хочется выбрать один раз и навсегда самую быструю :)


Piter   (2005-08-22 16:07:00) [19]

Piter ©   (22.08.05 15:53) [29]
Пробовал тестировать на 1 миллионе строк - не хватило вирт. памяти :)


при этом обе функции демонстрирует, в общем, хорошее время.

На 300 тысяч строках все происходит не более 10-ти секунд


Игорь Шевченко   (2005-08-22 16:04:00) [20]

А можно вопрос? Где и когда эта функция будет вызываться ?
А то получится, как у Конецкого, что смысла ускорять ее будет ровно столько же, сколько в определении длины шага у старого мерина, которого ведут на живодерню.


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо