Страница 1 из 2

Оптимизатор

СообщениеДобавлено: 16.10.2007 10:14:02
alexs
Вот ещё мысль.
Хрошо было бы научить оптимизатор разворачивать элементарные функции (не зависящие от других не элементарных функций) в константы - т.е. вычислят результат вызова функции на этапе компиляции и подставлять уже готовый результат.
например

Код: Выделить всё
a:=sin(0.5);

вместо этого можно дать готовый результат

Код: Выделить всё
b:=sin(j)

а вот тут уже обычный вызов

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

СообщениеДобавлено: 16.10.2007 11:00:05
Slavikk
А смысл? Мы же программируем, а не составляем из кусков программу. А синус 0,5 давно подсчитывается калькулятором и подставляется готовое значение. Если у тебя число постоянно меняется и ты не знаешь его значения, при работе программы, тогда вставляешь кусок кода на асме вычисляющий значения - для оптимизации.

СообщениеДобавлено: 16.10.2007 11:33:51
ev
a:=sin(0.5);

зависит от того, много ли таких конструкций в реальности

А синус 0,5 давно подсчитывается калькулятором и подставляется готовое значение.

ни разу так не делал :)
пусть лучше машина поработает на 1мсек больше, чем я в калькуляторе еще формулы считать буду
хотя конечно все зависит от задачи... если важо скорость обработки близкая к реальному времени - то и посчитать не грех ;)

СообщениеДобавлено: 16.10.2007 12:59:50
alexs
вот я и предлагаю чтобы компилятор разворачивал эти выражения автоматом.

СообщениеДобавлено: 19.10.2007 15:05:25
e-moe
alexs писал(а):вот я и предлагаю чтобы компилятор разворачивал эти выражения автоматом.
а вы думаете этого не происходит?

СообщениеДобавлено: 19.10.2007 19:31:38
alexs
именно подстановка готового значения вместо вызова функции - нет

СообщениеДобавлено: 20.10.2007 10:54:44
Bonart
alexs
alexs писал(а):именно подстановка готового значения вместо вызова функции - нет

Intel C Compiler, насколько мне известно - да.

СообщениеДобавлено: 20.10.2007 11:17:36
alexs
Ну мне хочется чтобы это было в FPC :)

СообщениеДобавлено: 20.10.2007 14:32:10
e-moe
fpc 2.2.0

Код: Выделить всё
var
  a : real;
begin
  a := sin(0.5);
end.

Код: Выделить всё
PASCALMAIN:
   PUBLIC   _main
_main:
      push   ebp
      mov   ebp,esp
      call   FPC_INITIALIZEUNITS
      mov   eax,dword ptr [dword ptr _$PROGRAM$_Ld1]
      mov   dword ptr [dword ptr U_P$PROGRAM_A],eax
      mov   eax,dword ptr [dword ptr _$PROGRAM$_Ld1+4]
      mov   dword ptr [dword ptr U_P$PROGRAM_A+4],eax
      call   FPC_DO_EXIT
      leave
      ret
; End asmlist al_procedures

...

_DATA      SEGMENT   PARA PUBLIC USE32 'DATA'
   ALIGN 8
_$PROGRAM$_Ld1      DQ    4.794255386042030e-001



СообщениеДобавлено: 20.10.2007 14:32:53
e-moe
еще вопросы будут?

СообщениеДобавлено: 21.10.2007 21:02:43
alexs
Синус я привёл в качестве примера
а более сложнй вариат:
Код: Выделить всё
function aaa(a:integer):double;
begin
  Result:=a*2/(a+1) + a;
end;
var
  i:integer;
begin
  writeln(aaa(12)); {1}
  for i:=1 to 10 do
    writeln(aaa(i));  {2}
end.

хочется чтобы при вызове {1} было подставлено готовое значение
а при вызове {2} был расчёт

СообщениеДобавлено: 22.10.2007 13:27:01
e-moe
>хочется чтобы при вызове {1} было подставлено готовое значение
ого, а еще компилятор должен говорить что при ваших данных, к примеру, возникает деление на 0? :)
Долго ждать тогда прийдется при компиляции. Скорости теперешнего Паскаля точно не будет :(

СообщениеДобавлено: 22.10.2007 16:12:31
alexs
а для чего ключ релиза вводится?
для отладки - работаем по старой методике
сборка релиза - углубленная оптимизация

СообщениеДобавлено: 22.10.2007 22:02:00
e-moe
забавно конечно... хотя, а почему бы и нет? :)

СообщениеДобавлено: 23.10.2007 08:57:09
Slavikk
Мужики вы либо рейтинг себе хотите накрутить, либо вам ещё учится и учится... Всякое обучение программированию начинается с основ алгоритмизации и оптимизации алгоритмов. Так вот - если вы вели подсчёт в функцию "aaa" - то из этого следует, что переменные в функции на начальном этапе программирования неизвестны и при работе программе они будут изменятся (в зависимости от параметров - например от температуры воздуха на Магадане). Из этого следует, что при компиляции нельзя однозначно дать ответ - какой результат вернёт переменная (+20 или +30), поэтому нельзя сразу это превратить в готовый ответ в машинном коде. Если у вас переменные в функции "aaa" можно узнать и подсчитать и они не будут изменятся в процессе существования программы, то - вам ещё теорию учить и учить (конкретно алгоритмизацию и оптимизацию алгоритмов)...

А то, что вы хотите - называется windows "Vista" или же волшебная кнопочка для денег - на неё нажимаешь и деньги сыплются с неба.... :D

Машина неможет телепатически угадать, чего вы хотите - если вы сами этого даже незнаете :D !!!

Сам такие вопросы задавал... правда давно это было... :D