![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
заранее задать размер строки Setlength ?
Den © (2012-04-08 00:21:00)задача: ускорить выполнение кода.
есть 2 переменные s, s1:string; заранее известно что length(s1) не будет больше length(s)*2.
ну и собственно код:
while length(s)>0 do begin
s1:=s1+copy(s, 1,1)+'a';
delete(s,1,1);
end;
если заранее задать размер s1 вот так
setlength(s1, length(s)*2);
а потом присвоить значение
s1:='';
это обнулит ее length или нет? То есть будет ли s1 перезаписываться в другое место в памяти если ей начать присваивать какие-то значения?
Den (2012-04-08 02:03:00) [21]
> Задачу озвучь, а не вопрос.
Да какая задача постоянно то там то там приходиться обрабатывать кучу строк мысли по поводу того как это ускорить навеяны вот этой статьей, http://www.delphimaster.ru/articles/dyntable/index.html
var
s: string; //ansistring
ch: char;
i, N: integer;
begin
1. S:= '';
2. for i := 1 to N do
3. s := s + ch;
...
Первая строка - на самом деле S := nil, довольно просто. А вот третья раскладывается на выделение памяти для новой строки длины (Length(S) + 1) и копирование прежней строки в новую область памяти, после этого S указывает на эту область. И так N раз! На самом деле, в цикле еще идет вызов UniqueString, что тоже не добавляет скорости. И если выделение области памяти сравнительно быстрая операция, то время копирования прежней строки на новое место напрямую зависит от ее длины. Можно показать, что время выполнения строк 2 и 3 пропорционально N^2.
Вот и думаю как ускорить обработку строк, чтоб посмотреть хотябы насколько оно быстрее работать будет.
Германн (2012-04-08 01:22:00) [22]P.S.
Вот тут давеча на королевстве обсуждали:
http://www.delphikingdom.com/asp/answer.asp?IDAnswer=80799
Германн (2012-04-08 01:18:00) [23]
> это обнулит ее length или нет? То есть будет ли s1 перезаписываться
> в другое место в памяти если ей начать присваивать какие-
> то значения?
>
1. Обнулит.
2. Считай что будет. Исключения возможны, но не обязательны.
Задачу озвучь, а не вопрос.