AppendStringToBufferedString

From SunFlurry wiki
Revision as of 19:03, 20 November 2021 by Admin (talk | contribs) (1 revision imported)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search
  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 не имеет особой выгоды.