Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Класс/Компонет [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);


Наверх

Титульная страница Поиск, карта сайта Написать письмо