Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.04.08;
Скачать: CL | DM;

Вниз

Сижу, как столица одного из государств Азии...   Найти похожие ветки 

 
ProgRAMmer Dimonych ©   (2007-03-13 16:23) [0]

Попросил тут один человек отладить маленько программу, чтобы работала быстрее.

Первым делом, конечно, позаменял все Exp(a*Ln(2)) на отдельную переменную, в которую значение этого выражения вычисляется один раз, а потом раза три используется. Ну, и ещё слегка пооптимизировал - выиграл в среднем в 2 раза.

В поисках, чего бы ещё наоптимизировать, вспомнил о том, что говорил нам в своё время один уважаемый человек на сборах по подготовке к Республиканской олимпиаде: вместо использования Ln лучше сгенерировать самому в массив степени двойки и их использовать.

Самое забавное, что в данной конкретной программе и без массива обойтись можно, т.к. степени двойки вычисляются и используются только в порядке возрастания степени.

RealA:=1;
for a:=1 to pp do
begin
 Inc(RealA,RealA);
 StringGrid1.Cells[a,0]:="a="+IntToStr(RealA);
 for b:=0 to m-1 do
 begin
  W_a_b:=0;
  for i:=0 to m-1 do
  begin
   Delta_T:=X[2].Time-X[1].Time;
   Ti:=i*Delta_T;
   Ti2:=Ti*Ti;
   W_a_b:=W_a_b+Sqrt(Delta_T/RealA)*X[b].Value*(1-Ti2)*Exp(-Ti2/2)*(Ti-b)/RealA*Delta_T;
  end;
  StringGrid1.Cells[0,b+1]:="b="+IntToStr(b+1);
  StringGrid1.Cells[a,b+1]:=FloatToStr(W_a_b);
 end;
end;

Вот такой вот код. Все переменные объявлены соответствующим образом. Вместо Inc(RealA,RealA) первоначально использовалось RealA:=RealA*2. IntToStr в самом первом (совсем неоптимизированном) варианте выглядели, как FloatToStr, хотя по логике приложения IntToStr уместнее, да и работать должна быстрее.

Внимание, вопрос!!! Объясните мне тёмному, почему
1) RealA:=Exp(a*Ln(2)) работает быстрее, чем мой вариант?
2) Почему замена FloatToStr на IntToStr замедлила работу программы?


 
alien1769 ©   (2007-03-13 16:26) [1]

Хотя бы версию дельфи дал и режим компиляции


 
ProgRAMmer Dimonych ©   (2007-03-13 16:32) [2]

> alien1769 ©   (13.03.07 16:26) [1]
Даю: Delphi 7.
Настройки компилятора...

<Создание кода>
Оптимизация=True
Фреймы стека=False
Pentium safe FDIV=False
Запись полной привязки=8
</Создание кода>
<Ошибки выполнения>
Проверка диапазона=False
Проверка I/O=True
Проверка переполнения=False
</Ошибки выполнения>
<Отладка>
Инфо отладки=True
Локальные символы=True
Инфо ссылки=True
Только Определения=True
Утверждения=True
Использовать DCU отладки=False
</Отладка>

P.S. Вот такой кривой перевод (локализация) Delphi...


 
Ketmar ©   (2007-03-13 16:32) [3]

есть подозрение, оформлю как хинт: преобразования форматов.


 
Ketmar ©   (2007-03-13 16:33) [4]

это не "локализация". это "дебилизация".


 
ProgRAMmer Dimonych ©   (2007-03-13 16:34) [5]

> Ketmar ©   (13.03.07 16:32) [3]
Знаковый-беззнаковый, Целый-Плавающий. Это это?


 
SlymRO ©   (2007-03-13 16:34) [6]

ProgRAMmer Dimonych ©   (13.03.07 16:23)
RealA:=RealA*2

быстрее... т.к. сдвиг это раз, два (непомню inc инлайнится или нет) inc вызов процедуры...


 
ProgRAMmer Dimonych ©   (2007-03-13 16:35) [7]

> SlymRO ©   (13.03.07 16:34) [6]
Но по сравнению с Exp(a*Ln(2)) даёт худший результат: потери от 10-15 мс на небольших m до 1000-1500 на m>1000. :(


 
SlymRO ©   (2007-03-13 16:37) [8]

ProgRAMmer Dimonych ©   (13.03.07 16:23)
Delta_T:=X[2].Time-X[1].Time;

vj;yj dsxbckbnm jlby hfp&
можно вычислить один раз?


 
SlymRO ©   (2007-03-13 16:40) [9]

RealA:=RealA shl 1;


 
ProgRAMmer Dimonych ©   (2007-03-13 16:46) [10]

> SlymRO ©   (13.03.07 16:37) [8]
> ProgRAMmer Dimonych ©   (13.03.07 16:23)
> Delta_T:=X[2].Time-X[1].Time;
> vj;yj dsxbckbnm jlby hfp&
> можно вычислить один раз?
Вот, блин... Слона-то я и не заметил. Надо только уточнить, не очепятка ли это у автора проги...

> SlymRO ©   (13.03.07 16:40) [9]
> RealA:=RealA shl 1;
Попробую как дополнительную оптимизацию... Хотя, кажется, разница на современных процессорах будет максимум такта 2 (mul выполняется за 1 такт для большинства типов операндов - регистр, память, immediate - а переменная - Integer).

В любом случае огромное спасибо.


 
SlymRO ©   (2007-03-13 16:49) [11]

Ti:=i*Delta_T;
Ti2:=Ti*Ti;
*(1-Ti2)*Exp(-Ti2/2)*
зависит от i, и вычисляется одно и тоже m раз
Загони их в массив и пользуй


 
SlymRO ©   (2007-03-13 17:03) [12]

var cached_Ti2:array of extended;
begin

 Delta_T:=X[2].Time-X[1].Time;
 SetLength(cached_Ti2,m);
 for i:=0 to m-1 do
 begin
   Ti:=i*Delta_T;
   Ti2:=Ti*Ti;
   cached_Ti2[i]:=(1-Ti2)*Exp(-Ti2/2);
 end;

 RealA:=1;
 for a:=1 to pp do
 begin
   RealA:=RealA shl 1;
   StringGrid1.Cells[a,0]:="a="+IntToStr(RealA);

   for b:=0 to m-1 do
   begin
     W_a_b:=0;
     for i:=0 to m-1 do
     begin
      Ti:=i*Delta_T;
      W_a_b:=W_a_b+Sqrt(Delta_T/RealA)*X[b].Value*cached_Ti2[i]*(Ti-b)/RealA*Delta_T;
     end;
     StringGrid1.Cells[0,b+1]:="b="+IntToStr(b+1);
     StringGrid1.Cells[a,b+1]:=FloatToStr(W_a_b);
   end;
 end;
end;


 
Jeer ©   (2007-03-13 17:12) [13]

sqrt(dT/R)/R*dT == sqrt(R/dT)


 
SlymRO ©   (2007-03-13 17:14) [14]

Jeer ©   (13.03.07 17:12) [13]
ааа!!! не заметил! пипец однако пошел спать...


 
Jeer ©   (2007-03-13 17:16) [15]

Нет, сбрехал.
Но формула странная - зачем нам степени 1.5 ?


 
SlymRO ©   (2007-03-14 04:04) [16]

Ti:=i*Delta_T;
DeltaT_RealA:=Delta_T/RealA;
W_a_b:=W_a_b+DeltaT_RealA*Sqrt(DeltaT_RealA)*X[b].Value*cached_Ti2[i]*(Ti-b);


 
SlymRO ©   (2007-03-14 04:06) [17]

Автар, спидап наблюдается?


 
TUser ©   (2007-03-14 06:07) [18]

> inc вызов процедуры...

Одна команда (inc/add). D7.


 
SlymRO ©   (2007-03-14 06:47) [19]

TUser ©   (14.03.07 6:07) [18]
Одна команда

На то я предварительно отбрехался "(непомню inc инлайнится или нет)"
значит таки инлайнится


 
TUser ©   (2007-03-14 07:01) [20]

Что значит инлапйнится или нет? А оператор for инлайнится? Конпилятор видит этот for и генерирует в этом месте соответствующий код. А когда видит inc/dec/write/... - то тоже генерирует. Что с того, что синтаксис похож на вызов procedure Inc (var A: ...; B: .... = ...); overload;? Нету такой процедуры и нигде в библиотеках она не описана. Это просто замена оператору присвоения. Или := - это тоже inline-procedure?


 
SlymRO ©   (2007-03-14 07:16) [21]

Под инлайном имею ввиду, что процедура (синтаксическая) компилируется не в call inc а в содержимое это процедуры inc какойто_регистр...



Страницы: 1 вся ветка

Текущий архив: 2007.04.08;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.03 c
2-1173889736
Kolan
2007-03-14 19:28
2007.04.08
XMLDocument преврашает знаки тега <> в &amp;laquo;&amp; lt;&amp;raquo;


1-1171379304
Вопрошающий
2007-02-13 18:08
2007.04.08
Новые диалоги Vista для открытия и сохранения файлов


2-1173947665
Alex_C
2007-03-15 11:34
2007.04.08
Компонент для липких окошек


15-1173794839
novill
2007-03-13 17:07
2007.04.08
Гостевую специально отключили?


2-1174170900
Malik
2007-03-18 01:35
2007.04.08
Excel+Delphi