Template:Сравнение функций поиска и добавления по именам в списках
Данный пример сравнивает скорость работы функции 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 раз в нашем случае).