Difference between revisions of "AppendStringToBufferedString"
m (1 revision imported) |
1>Admin |
||
| Line 11: | Line 11: | ||
* [[Общее_описание_языка|Общее описание]] | * [[Общее_описание_языка|Общее описание]] | ||
* [[Строковые функции]]}} | * [[Строковые функции]]}} | ||
| − | Функция добавляет к строке в указанной в переменной, следующей первым аргументом, строку, заданную вторым аргументом. Используется для оптимизации скорости выполнения для длинных строк с большим количеством приращений. Функция аллоцирует в исходной строке больше места, чем необходимо, чтобы добавить к ней второй аргумент. Шаг аллокации зависит от третьего аргумента (или внутренних установок функции, если третий аргумент не указан). Последующие вызовы функции с этой же строкой не вызовут дорогой по скорости операции аллокации памяти пока в строке будет достаточно свободного места для того, чтобы вместить добавляемые строки, как только места станет недостаточно, произойдет новая аллокация на больший объем, чем это необходимо. Количество аллокаций и освобождений памяти при работе такого алгоритма сильно уменьшается. Функцию имеет смысл использовать с большими строками. | + | Функция добавляет к строке в указанной в переменной, следующей первым аргументом, строку, заданную вторым аргументом. Используется для оптимизации скорости выполнения для длинных строк с большим количеством приращений. Функция аллоцирует в исходной строке больше места, чем необходимо, чтобы добавить к ней второй аргумент. Шаг аллокации зависит от третьего аргумента (или внутренних установок функции, если третий аргумент не указан). Последующие вызовы функции с этой же строкой не вызовут дорогой по скорости операции аллокации памяти пока в строке будет достаточно свободного места для того, чтобы вместить добавляемые строки, как только места станет недостаточно, произойдет новая аллокация на больший объем, чем это необходимо. Количество аллокаций и освобождений памяти при работе такого алгоритма сильно уменьшается. Функцию имеет смысл использовать с большими строками. Если исходная строка имеет внутренний формат ANSI, а добавляемая строка представлена в UTF-16, исходная строка будет преобразована в UTF-16 (см. [[Строки]]). |
== Синтаксис == | == Синтаксис == | ||
Revision as of 18:13, 30 July 2021
| AppendStringToBufferedString (Функции работы со строками) | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| |||||||||||
Функция добавляет к строке в указанной в переменной, следующей первым аргументом, строку, заданную вторым аргументом. Используется для оптимизации скорости выполнения для длинных строк с большим количеством приращений. Функция аллоцирует в исходной строке больше места, чем необходимо, чтобы добавить к ней второй аргумент. Шаг аллокации зависит от третьего аргумента (или внутренних установок функции, если третий аргумент не указан). Последующие вызовы функции с этой же строкой не вызовут дорогой по скорости операции аллокации памяти пока в строке будет достаточно свободного места для того, чтобы вместить добавляемые строки, как только места станет недостаточно, произойдет новая аллокация на больший объем, чем это необходимо. Количество аллокаций и освобождений памяти при работе такого алгоритма сильно уменьшается. Функцию имеет смысл использовать с большими строками. Если исходная строка имеет внутренний формат ANSI, а добавляемая строка представлена в UTF-16, исходная строка будет преобразована в UTF-16 (см. Строки).
Синтаксис
AppendStringToBufferedString(<Строка>,<Добавляемая строка>,<Шаг увеличения буфера (INT)>)
Аргументы
<Строка>- (возможен аргумент-переменная (ByRef)) Значение, над строковым представлением которого необходимо провести операцию конкатенации. Обычно аргумент представляет собой переменную со строковым значением.<Добавляемая строка>- Значение, строковое представление которого необходимо добавить к исходной строке.<Шаг увеличения буфера (INT)>- (необязательный аргумент) Шаг аллокации буфера. Если этот аргумент опущен, система подбирает шаг, руководствуясь внутренним алгоритмом. Обычно этот аргумент оставляют пустым, так как изменение шага не ведет к большому приращению скорости выполнения, однако, наличие третьего аргумента при вызове функции замедляет ее выполнение.
Возвращаемое значение
Возвращаемое значение отсутствует. Функция рассчитана на изменение первого аргумента.
Примеры
ProfilerClear();
ProfilerStart();
Randomize(1);
//Создание длинной строки, разделенной строками _NEWLINE
аСтр:="";
For i:=1 To 100000 Do
AppendStringToBufferedString(аСтр,Str(Random(1000000))+_NEWLINE);
EndDo;
Randomize(1);
//Создание длинной строки, разделенной строками _NEWLINE медленным способом
аСтр:="";
For i:=1 To 100000 Do
аСтр:=аСтр+Str(Random(1000000))+_NEWLINE;
EndDo;
ProfilerStop();
DebugBreak;
Message("Done!");
//Для процессора i5, в первом цикле функция AppendStringToBufferedString выполнялась 338.174 мсек, сложение во втором цикле -- 19.657 сек.
//Для данного примера AppendStringToBufferedString выполняется быстрее обычного сложения строк в 58 раз.
//При увеличении количества сложений и, соответственно, увеличении размера строки, эта пропорция увеличивается нелинейно.
//Поэтому, функция AppendStringToBufferedString незаменима в случае наращивания очень больших строк.
ProfilerClear();
ProfilerStart();
Randomize(1);
//Создание длинной строки, разделенной строками _NEWLINE
аСтр:="";
For i:=1 To 1000000 Do
AppendStringToBufferedString(аСтр,Str(Random(1000000))+_NEWLINE);
EndDo;
Randomize(1);
//Создание длинной строки, разделенной строками _NEWLINE, предварительно аллоцировав всю строку
аСтр:="";
AppendStringToBufferedString(аСтр,Str(Random(1000000))+_NEWLINE,10000000);
For i:=2 To 1000000 Do
AppendStringToBufferedString(аСтр,Str(Random(1000000))+_NEWLINE);
EndDo;
ProfilerStop();
DebugBreak;
Message("Done!");
//Для процессора i5, в первом цикле функция AppendStringToBufferedString выполнялась 3.4 сек, во втором цикле 3.383 сек. Т.е., разница по скорости около 0.5% -- в пределах погрешности измерения.
//Пример показывает, что использование заранее аллоцированной строки по сравнению с внутренним алгоритмом аллокации AppendStringToBufferedString не имеет особой выгоды.