Difference between revisions of "AppendStringToBufferedString"
m (1 revision imported) |
|||
(2 intermediate revisions by 2 users not shown) | |||
Line 11: | Line 11: | ||
* [[Общее_описание_языка|Общее описание]] | * [[Общее_описание_языка|Общее описание]] | ||
* [[Строковые функции]]}} | * [[Строковые функции]]}} | ||
− | Функция добавляет к строке в указанной в переменной, следующей первым аргументом, строку, заданную вторым аргументом. Используется для оптимизации скорости выполнения для длинных строк с большим количеством приращений. Функция аллоцирует в исходной строке больше места, чем необходимо, чтобы добавить к ней второй аргумент. Шаг аллокации зависит от третьего аргумента (или внутренних установок функции, если третий аргумент не указан). Последующие вызовы функции с этой же строкой не вызовут дорогой по скорости операции аллокации памяти пока в строке будет достаточно свободного места для того, чтобы вместить добавляемые строки, как только места станет недостаточно, произойдет новая аллокация на больший объем, чем это необходимо. Количество аллокаций и освобождений памяти при работе такого алгоритма сильно уменьшается. Функцию имеет смысл использовать с большими строками. | + | Функция добавляет к строке в указанной в переменной, следующей первым аргументом, строку, заданную вторым аргументом. Используется для оптимизации скорости выполнения для длинных строк с большим количеством приращений. Функция аллоцирует в исходной строке больше места, чем необходимо, чтобы добавить к ней второй аргумент. Шаг аллокации зависит от третьего аргумента (или внутренних установок функции, если третий аргумент не указан). Последующие вызовы функции с этой же строкой не вызовут дорогой по скорости операции аллокации памяти пока в строке будет достаточно свободного места для того, чтобы вместить добавляемые строки, как только места станет недостаточно, произойдет новая аллокация на больший объем, чем это необходимо. Количество аллокаций и освобождений памяти при работе такого алгоритма сильно уменьшается. Функцию имеет смысл использовать с большими строками. Если исходная строка имеет внутренний формат ANSI, а добавляемая строка представлена в UTF-16, исходная строка будет преобразована в UTF-16 (см. [[Строки]]). |
== Синтаксис == | == Синтаксис == |
Latest revision as of 18:03, 20 November 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 не имеет особой выгоды.