![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Функция, вырезающая строку между двумя разделителями
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]А можно вопрос? Где и когда эта функция будет вызываться ?
А то получится, как у Конецкого, что смысла ускорять ее будет ровно столько же, сколько в определении длины шага у старого мерина, которого ведут на живодерню.