Template:TearStr vs GetSubStr

From SunFlurry wiki
Jump to: navigation, search

Функции TearStr и GetSubStr имеют сходное предназначение и используются, как универсальные средства для разбора строк. Однако использование GetSubStr заставляет создавать дополнительную переменную, что усложняет текст программы. Тем не менее, плюсом GetSubStr явлется то, что исходная строка не будет изменена, потенциально, отменяя необходимость дублирования исходной строки в дополнительной переменной, если есть необходимость сохранить ее начальное значение. Выбор той функции, которую выгоднее использовать в определенной ситуации, остается за программистом. Обе функции оптимизированы по скорости исполнения и для работы с большими строками. Ниже дан замер производительности для процессора i5 при сравнительно одинаковых условиях.

Randomize(1);
//Создание длинной строки, разделенной строками _NEWLINE
аСтр:="";
For i:=1 To 1000000 Do
  AppendStringToBufferedString(аСтр,Str(Random(1000000))+_NEWLINE);
EndDo;

//Для текущего алгоритма генерации псевдослучайных чисел, будет выведено 7888988
Message("Длина исходной строки: "+Length(аСтр));
//Аллоцируем все переменные заранее
i:=1;
j:=length(аСтр);


ProfilerClear();
ProfilerStart();
//Используется разбор длинной строки с помощью GetSubStr
While i<=j Do
  Стр2:=GetSubStr(аСтр,i,_NEWLINE);
EndDo;

//Используется разбор длинной строки с помощью TearStr
While аСтр<>"" Do
  Стр2:=TearStr(аСтр,_NEWLINE);
EndDo;
ProfilerStop();
DebugBreak;
Message("Done!");

Замер показывает, что строка Стр2:=TearStr(аСтр,_NEWLINE);, выполнявшаяся 1 млн. раз, заняла время в 2.2 сек, тогда как Стр2:=GetSubStr(бСтр,i,_NEWLINE); потратила 2.589 секунды времени. Это значит, что в данном примере функция GetSubStr выполнялась примерно на 17.7% медленнее.