Вверх ↑
Ответов: 1924
Рейтинг: 172
#1: 2017-12-22 21:49:26 ЛС | профиль | цитата
Вот, сравните скорости работы двух вариантов схемы:

Add(StrList,10529341,364,196)
{
}
Add(DropFile,3316770,231,224)
{
link(onDropFile,6375637:doEvent1,[])
}
Add(Hub,6375637,287,224)
{
OutCount=7
link(onEvent1,10529341:doLoad,[])
link(onEvent2,852630:doStart,[(344,237)(344,370)])
link(onEvent3,2337639:doFilter,[(339,244)(339,279)])
link(onEvent4,852630:doStop,[(334,251)(334,377)])
link(onEvent5,5063727:doStart,[(325,258)(325,538)])
link(onEvent6,981907:doEnum,[(320,265)(320,468)])
link(onEvent7,5063727:doStop,[(314,272)(314,545)])
}
Add(ArrayFilterRepeats,2337639,378,273)
{
link(onFilter,16647966:doAdd,[])
link(Array,2540263:Var2,[])
}
Add(StrList,16647966,441,273)
{
}
Add(TimeCounter,852630,378,364)
{
link(onStop,10842207:doText,[])
}
Add(Label,10842207,427,371)
{
Left=10
Top=10
}
Add(ArrayEnum,981907,350,462)
{
link(onItem,1315296:doGetIndex,[])
link(Array,2540263:Var1,[(356,257)])
}
Add(GetDataEx,2540263,378,252)
{
link(Data,10529341:Array,[])
}
Add(TimeCounter,5063727,350,532)
{
link(onStop,6318540:doText,[])
}
Add(Label,6318540,399,539)
{
Left=10
Top=35
}
Add(StrList,1315296,546,420)
{
Point(onGetIndex)
Point(doGetIndex)
link(Str,981907:Item,[(552,408)(454,408)(454,506)(356,506)])
link(onGetIndex,788058:doCase,[])
}
Add(Case,788058,595,427)
{
Value=Integer(-1)
link(onTrue,1315296:doAdd,[(639,440)(639,482)(531,482)(531,426)])
}

Разница в 3-4 раза в пользу doGetIndex! Так почему бы в компоненте не заменить


procedure THIArrayFilterRepeats._work_doFilter0;
var
i, j: integer;
Repeats: boolean;
s:string;
begin
ArrIn := ReadArray(_data_Array);
if (ArrIn = nil) or (ArrIn._Count = 0) then exit;

StrArray.Clear;

for i := 0 to ArrIn._Count - 1 do
begin
s := ToString(GetArrayVal(i));
Repeats := false;
for j := 0 to StrArray.Count - 1 do
if StrArray.Items[j] = s then
begin
Repeats := true;
break;
end;
if Repeats then continue;

StrArray.Add(s);
_hi_onEvent(_event_onFilter, s);
end;
_hi_CreateEvent_(_Data, @_event_onEndFilter);
end;

на


procedure THIArrayFilterRepeats._work_doFilter0;
var
i, j: integer;
Repeats: boolean;
s:string;
begin
ArrIn := ReadArray(_data_Array);
if (ArrIn = nil) or (ArrIn._Count = 0) then exit;

StrArray.Clear;

for i := 0 to ArrIn._Count - 1 do
begin
s := ToString(GetArrayVal(i));
{Repeats := false;
for j := 0 to StrArray.Count - 1 do
if StrArray.Items[j] = s then
begin
Repeats := true;
break;
end;
if Repeats then continue;

StrArray.Add(s);}
//---------------------правка от 22.12.2017 by 3042
if StrArray.IndexOf(s) = -1 then
begin
StrArray.Add(s);
_hi_onEvent(_event_onFilter, s);
end;
//--------------------конец правки-----------------
end;
_hi_CreateEvent_(_Data, @_event_onEndFilter);
end;


Nesco, как считаешь?
карма: 9
0