Masygreen писал(а):подскажите чем PushPos и PopPos лучше externel?
В общем, почему-то были необоснованные подозрения, что с external будет медленнее работать, но как только что выяснил, подозрения эти не оправдались. Написал на скорую руку небольшой тест:
Код: Выделить всё
Interface RecursionTest;
var
_start : time;
_stop : time;
times : array[1..4] of time;
Create view
var
vw_cPar: comp;
from
Catalogs
,Catalogs Catalogs1
where
((
vw_cPar == Catalogs1.cParent
))
;
function startTest(p_sTitle: string): void;
{
_start := Cur_Time;
WriteMessageLog(''#13'============ START : ' + p_sTitle + ' ============')
}
function stopTest(): time;
{
_stop := Cur_Time;
WriteMessageLog(''#13'============ END ============')
NextVisual;
result := Sub_Time(_stop, _start);
}
function recursion1(p_cPar: comp; p_sPad: string): void;
{
_loop Catalogs where ((p_cPar == catalogs.cParent))
{
WriteMessageLog(p_sPad + catalogs.Name)
PushPos(#Catalogs)
recursion1(catalogs.Nrec, p_sPad + ' ')
PopPos(#Catalogs)
}
}
function recursion2(p_cPar: comp; p_sPad: string): void;
{
external _loop Catalogs where ((p_cPar == catalogs.cParent))
{
WriteMessageLog(p_sPad + catalogs.Name)
recursion2(catalogs.Nrec, p_sPad + ' ')
}
}
function recursion3(p_cPar: comp; p_sPad: string): void;
var cCur: comp
{
cCur := vw_cPar := p_cPar
_loop Catalogs1
{
WriteMessageLog(p_sPad + catalogs1.Name)
PushPos(#Catalogs1)
recursion3(catalogs1.Nrec, p_sPad + ' ')
vw_cPar := cCur;
PopPos(#Catalogs1)
}
}
function recursion4(p_cPar: comp; p_sPad: string): void;
var cCur: comp
{
cCur := vw_cPar := p_cPar
external _loop Catalogs1
{
WriteMessageLog(p_sPad + catalogs1.Name)
recursion4(catalogs1.Nrec, p_sPad + ' ')
vw_cPar := cCur;
}
}
HandleEvent
cmInit :
{
OpenMessageLog('e:\garbage\log\recursion.log', mfLog2Stream)
var cStartNode: comp;
//cStartNode := comp(471);
cStartNode := comp(0);
StartNewVisual(vtIndicatorVisual, vfTimer, 'Печать иерархии Catalogs', 4)
startTest('Recursion1');
recursion1(cStartNode, '');
times[1] := stopTest();
startTest('Recursion2');
recursion2(cStartNode, '');
times[2] := stopTest();
startTest('Recursion3');
recursion3(cStartNode, '');
times[3] := stopTest();
startTest('Recursion4');
recursion4(cStartNode, '');
times[4] := stopTest();
var i : integer;
for (i := 1; i <= 4; i++)
{
WriteMessageLog('Тест №' + i + ': ' + timeToStr(times[i], 'HH:MM:SS:SSS'))
}
CloseMessageLog ;
StopVisual('',0);
}
end;
End.
Результаты трех прогонов получились такие:
Код: Выделить всё
Прогон 1
11:51:31 ¦ Тест №1: 00:00:06:29
11:51:31 ¦ Тест №2: 00:00:04:48
11:51:31 ¦ Тест №3: 00:00:05:95
11:51:31 ¦ Тест №4: 00:00:04:30
Прогон 2
11:52:16 ¦ Тест №1: 00:00:06:31
11:52:16 ¦ Тест №2: 00:00:04:50
11:52:16 ¦ Тест №3: 00:00:05:98
11:52:16 ¦ Тест №4: 00:00:04:22
Прогон 3
11:52:57 ¦ Тест №1: 00:00:06:36
11:52:57 ¦ Тест №2: 00:00:04:31
11:52:57 ¦ Тест №3: 00:00:05:94
11:52:57 ¦ Тест №4: 00:00:03:99
Так что зря я вас попутал, с external даже быстрее получается) А вод подцепки лучше все-таки во вьюху перенести.