Vlad писал(а):
Илья Ермаков писал(а):
Поэтому я и говорю - оптимизируем конкретные модули. В "числодробительных" вещах применение рефлекшну трудно найти.
Т.е. поведение программы будет зависеть от опций компиляции. Это мы уже проходили в C. Я категорически против
Поведение программы написанной на Блэкбоксе может изменяться непредсказуемым образом и без оптимизаций: берем, например, первый тест из Whetstone Benchmark
Код:
MODULE TestWhet1;
IMPORT Log := StdLog, Services;
TYPE ARRAY4 = ARRAY 5 OF REAL;
VAR E1 : ARRAY4;
T, T1, T2 : REAL;
J, K, L : INTEGER;
time0, time1 : LONGINT;
PROCEDURE Do*;
VAR NLoop, I, II, JJ : INTEGER;
N1, N2, N3, N4, N5, N6, N7, N8, N9, N10, N11 : INTEGER;
X1, X2, X3, X4, X, Y, Z : REAL;
BEGIN
time0:=Services.Ticks();
(* The actual benchmark starts here. *)
T := 0.499975; (* T := 0.499975; *)
NLoop := 100;
II := 8000;
FOR JJ:=1 TO II DO
(* Establish the relative loop counts of each module. *)
N2 := 12 * NLoop;
(* Module 2: Array elements *)
E1 [1] := 1.0;
E1 [2] := -1.0;
E1 [3] := -1.0;
E1 [4] := -1.0;
FOR I:=1 TO N2 DO
E1 [1] := (E1 [1] + E1 [2] + E1 [3] - E1 [4])*T;
E1 [2] := (E1 [1] + E1 [2] - E1 [3] + E1 [4])*T;
E1 [3] := (E1 [1] - E1 [2] + E1 [3] + E1 [4])*T;
E1 [4] := (-E1 [1] + E1 [2] + E1 [3] + E1 [4])*T;
END;
(* THIS IS THE END OF THE MAJOR LOOP. *)
END;
(* Stop benchmark timing at this point. *)
time1:=Services.Ticks();
Log.RealForm (E1[1], 5, 14, 2,8FX);
Log.RealForm (E1[2], 5, 14, 2,8FX);
Log.RealForm (E1[3], 5, 14, 2,8FX);
Log.RealForm (E1[4], 5, 14, 2,8FX);
Log.Ln; Log.String ('Time: '); Log.Int(time1-time0); Log.String (' msec'); Log.Ln;
END Do;
END TestWhet1.
Тест выполняется за 521 msec (PIII). Раскомментируем одну строку, т.е. вместо
Код:
(* The actual benchmark starts here. *)
T := 0.499975; (* T := 0.499975; *)
выполняем одно и то же присваивание 2 раза:
Код:
(* The actual benchmark starts here. *)
T := 0.499975; T := 0.499975;
Теперь тест выполняется за 1292 msec...
С одной стороны, для неоптимизирующего компилятора такое может происходить по многим причинам - например, из-за выравнивания, попадания/непопадания в кэш, регистры и т.п. И можно с этим просто смириться. С другой стороны, когда при добавлении нового теста внезапно меняется скорость предыдущих, это всё-таки как-то глупо. Может быть изменение бэкенд-кодогенератора могло бы чем-то помочь и в этом случае?