Пример сравнения функций строк-массивов и таблиц

From SunFlurry wiki
Jump to: navigation, search

Пример разницы в скорости и сложности программирования для конъюнкции двух текстовых массивов. Данный пример выполнялся для процессора i5.

Randomize(1);

//Подготовка:
//Создание и заполнение двух строк с префиксами, разделенной строками _NEWLINE
//Строки будут иметь формат: <Префикс-индекс> Chr(1) <Случайная строка>
//Также заполнение двух таблиц такими же значениями

aTab:=Tab.Create("Индекс,Значение,ФлНайден");
aTab2:=Tab.Create("Индекс,Значение");
аСтр:="";
аСтр2:="";

//Вариант 1: количество элементов: 10000, длина одного элемента: 5, количество одинаковых элементов (длина результата): 928
//Вариант 2: количество элементов: 100000, длина одного элемента: 7, количество одинаковых элементов (длина результата): 1043

For i:=1 To 10000 Do //Изменить для варианта 2: 100000
  бСтр:=Str(Random(10))+Random(10)+Random(10)+Random(10)+Random(10);//Добавить для варианта 2: "+Random(10)+Random(10)"
  бСтр2:=Str(Random(10))+Random(10)+Random(10)+Random(10)+Random(10);//Добавить для варианта 2: "+Random(10)+Random(10)"
  AppendStringToBufferedString(аСтр,Str(i)+Chr(1)+бСтр+_NEWLINE);
  AppendStringToBufferedString(аСтр2,Str(i)+Chr(1)+бСтр2+_NEWLINE);
  aTab.AddLine("Индекс,Значение,ФлНайден",i,бСтр,0);
  aTab2.AddLine("Индекс,Значение",i,бСтр2);
EndDo;


ProfilerClear();
ProfilerStart();

JoinStringValues(аСтр,аСтр2,_NEWLINE,"AND",Chr(1));
//Функция выполнялась:
//Вариант 1: 245 мс.
//Вариант 2: 22.9 с.

aTab.Sort("Значение");
aTab2.Sort("Значение");
aTab2.Select();
While aTab2.Next() Do
  If aTab.FindAndGoto(aTab2.Значение,,"Значение",1) Then
    aTab.ФлНайден:=1;
  EndIf;
EndDo;
aTab.CurLine:=0;
aTab.RemoveLocated("ФлНайден",0);
//Конструкция была выполнена за:
//Вариант 1: 148 мс.
//Вариант 2: 6.9 с.

ProfilerStop();
DebugBreak;
Message("Done!");
//Таким образом в первом случае скорость выполнения строк-массивов меньше на 65.5%, 
//  во втором случае, когда массив стал в 10 раз больше и количество совпадающих элементов уменьшилось, скорость выполнения строк-массивов стала меньше в 3.32 раза.
//Вывод: для очень больших массивов рекомендуется пользоваться стандартными методами, даже если начальные данные получены в виде строки с разделителями.