![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Класс/Компонет [D7, WinXP]
tonich © (2010-02-11 10:51:00)Привет всем...
такой вот у меня вопрос.
есть класс, который, в ходе своей работы производит некоторые вычисления внутри себя и выдает их наверх результат. После того как я его написал и отладил, я решил его переделать в компонент, и просто создал еще один класс-обертку который, просто внутри себя создает первый класс и пользует его. Ну там было добавлено еще пару методов (конвертация полученных результатов, пару проверок на корректность вводимых данных), мелочи короче... После этого получилось такая странная штука.. Когда в проект используется компонент то время работы программы составляет порядка 7900 мс, когда же я использую просто первый класс без обертки компонентной, программа работает порядка 1800 мс. я пробовал уже в классе-обертке убирать все проверки и конвертации данных, ничего не меняется. Из-за чего может быть такая разница по времени в выполнении одного и того же кода , только в одном варианте на прямую а в другом варианте через компонент-обертку. ???
вот пример обертки
procedure TFastSolarSystem._GetVectorState(JD: Double; NTarget,
NCenter: Integer; InUnits: TUnit; var Vector: TCoordVector);
var
SV:TStateVector;
begin
inherited;
try
FillChar(Vector,SizeOf(Vector),0);
if not Factive then raise Exception.Create('Component is not active');
if Assigned(FBeforeCalculate) then FBeforeCalculate(Self);
if (JD>DE405.Header.ss[1]) or (JD<DE405.Header.ss[0]) then raise Exception.Create('Range JD date check error ');
DE405.StateVector(JD,NTarget-1,NCenter-1,@SV);
if Assigned(FAfterCalculate) then FAfterCalculate(Self);
case InUnits of
uAuDay:
begin
Vector[1] := SV[0]/DE405.Header.au; Vector[4] := SV[3]/DE405.Header.au;
Vector[2] := SV[1]/DE405.Header.au; Vector[5] := SV[4]/DE405.Header.au;
Vector[3] := SV[2]/DE405.Header.au; Vector[6] := SV[5]/DE405.Header.au;
end;
uKmSec:
begin
Vector[1] := SV[0]; Vector[4] := SV[3]/SecInDay;
Vector[2] := SV[1]; Vector[5] := SV[4]/SecInDay;
Vector[3] := SV[2]; Vector[6] := SV[5]/SecInDay;
end;
uReMin:
begin
Vector[1] := SV[0]/Re; Vector[4] := SV[3]/Re/MinInDay;
Vector[2] := SV[1]/Re; Vector[5] := SV[4]/Re/MinInDay;
Vector[3] := SV[2]/Re; Vector[6] := SV[5]/Re/MinInDay;
end;
uMtrSec:
begin
end;
end;
except
on Ex:Exception do MessageDlg(Ex.Message,mtInformation,[mbOK],0);
end;
end;
tonich (2010-02-13 11:46:00) [1]
> Даю 100%, что проблема окажется в неуказанном отроске, обсуждаемого
> тут сферического коня в вакууме...
черт должен признать свою ошибку, ну отростка не было но оказалось другое ))
Плохиш (2010-02-12 13:25:00) [2]Даю 100%, что проблема окажется в неуказанном отроске, обсуждаемого тут сферического коня в вакууме...
tonich (2010-02-12 12:58:00) [3]нее компонент обертка над классном не является его наследником.. если вы про это..
Дмитрий Белькевич (2010-02-11 17:22:00) [4]inherited; ?
Дмитрий Белькевич (2010-02-11 17:21:00) [5]Если закоментировать весь метод и его работа всё равно будет долгой, то, очевидно, проблема находится вне метода.
tonich (2010-02-11 12:54:00) [6]ну если были описаны обработчики было бы вообще смешно сравнивать ))
я коментарил и обработчики и все проверки ... и зануление вектора... все...перед тем как сравнивать время работы
Дмитрий Белькевич (2010-02-11 12:14:00) [7]
> Из-за чего может быть такая разница по времени в выполнении
> одного и того же кода , только в одном варианте на прямую
> а в другом варианте через компонент-обертку. ???
Из-за того, что код разный. Чудес, как известно, не бывает.
Как минимум вот этот процесс:
> просто внутри себя создает первый класс и пользует его
будет занимать какое-то время.
Обработчики прописаны? :
> if Assigned(FBeforeCalculate) then FBeforeCalculate(Self);
> if Assigned(FAfterCalculate) then FAfterCalculate(Self);
tonich (2010-02-11 10:52:00) [8]да, вот это и есть вызов метода класса (который я первым написал)
DE405.StateVector(JD,NTarget-1,NCenter-1,@SV);