Template:Сравнение функций поиска и добавления по именам в списках

From SunFlurry wiki
Jump to: navigation, search

Данный пример сравнивает скорость работы функции FindByName, GetByName и SetByName для сортированного и не сортированного по наименованию списков. Внутри цикла поиска также происходит изменение и увеличение массива для проверки корректности работы функции SetByName. В примере использованы версии функций с учетом регистра, так как преобразование регистра при поиске замедляет работу функций и несколько нивелирует преимущество функций с сортировкой перед обычными функциями.

ProfilerClear();
ProfilerStart();

//Блок с несортированным массивом
randomize(1);
aList:=List.Create();
For i:=1 To 100000 Do
  aList.SetByName(""+Random(10000),1,,0);
EndDo;

For i:=1 To 100000 Do
  j:=Random(aList.Size())+1;
  aNum:=aList.GetName(j);
  j2:=aList.FindByName(aNum,,,0);
  If j<>j2 Then
    Message("Проблема при поиске значения!","!");
  EndIf;
  //Тестируем также функцию GetByName
  aList.GetByName(aNum,,0);
  //Изменение или увеличение массива 50 на 50
  aList.SetByName(""+Random(20000),2,,0);
EndDo;  

//Блок с сортированным массивом
randomize(1);
aList:=List.Create();
For i:=1 To 100000 Do
  aList.SetByName(""+Random(10000),1,1,0);
EndDo;

For i:=1 To 100000 Do
  j:=Random(aList.Size())+1;
  aNum:=aList.GetName(j);
  j2:=aList.FindByName(aNum,,1,0);
  If j<>j2 Then
    Message("Проблема при поиске значения (2)!","!");
  EndIf;
  //Тестируем также функцию GetByName
  aList.GetByName(aNum,1,0);
  //Изменение или увеличение массива 50 на 50, используется сортированное изменение
  aList.SetByName(""+Random(20000),2,1,0);
EndDo;  


ProfilerStop();
debugbreak;

writeln("Done!");
//Для i5, конечные результаты для среднего времени исполнения каждой операции:
//aList.SetByName(""+Random(10000),1,,0)      -- 3186 мс./100000
//j2:=aList.FindByName(aNum,,,0)              -- 4725 мс./100000
//aList.GetByName(aNum,,0)                    -- 4697 мс./100000
//aList.SetByName(""+Random(20000),2,,0)      -- 5200 мс./100000
//
//aList.SetByName(""+Random(10000),1,1,0)     -- 429 мс./100000
//j2:=aList.FindByName(aNum,,1,0)             -- 312 мс./100000
//aList.GetByName(aNum,1,0)                   -- 263 мс./100000
//aList.SetByName(""+Random(20000),2,1,0)     -- 568 мс./100000
//
//Как показывает эксперимент, для больших массивов поиск и изменение в сортированном массиве по именам имеет большое преимущество перед поиском без учета сортировки (примерно в 10 раз в нашем случае).