А можно пожалуйста поподробнее, а то до меня не дошло откуда тут такое вылазит? Я то думал что глобальные переменные помогают тут тем что под них не выделяется отдельно память каждый раз, а 1 и то же место в памяти переписывает. И откуда получается что отладочная версия компиляции в 8 раз меньше замедляет работу программы с глобальными переменными, чем с локальными(или как их называть?)?
Глобальные переменные - прежде всего, зло еще в концепции структурного программирования Э.Дейкстры. Их наличие затрудняет понимание логики работы отдельной программной единицы, усложняет раздельную компиляцию, поскольку компилятору приходится решать, как работать с этой, непонятно откуда вдруг свалившейся на голову “чужой” переменной. Глобальные переменные пришли в программирование из ассемблера и COMMON-областей Фортрана и, по мнению Э.Дейкстры, их использование должно быть крайне ограниченным и продиктованным жесткой необходимостью.(кроме констант, конечно).
Ну время компиляции допустим меня волнует в последнюю очередь, а вот чем в готовой программе так плохи глобальные переменные и почему при компиляции с дебаг информацией они работают быстрее - я всё ещё не понимаю.
Конкретно про дебаггер - это только разработчики смогут ответить. Время компиляции меня тоже не сильно волнует, а вот гадать, откуда в модуль свалилась какая-то переменная (или, хуже того, объект) и каким было её значение (набор значений, свойств и т.д.) - это куда менее приятно.
Вангую, что конструкции вида
var i1:=i + 1;
var i2:=i1 + 1;
var i3:=i2 + 1;
были попросту выкинуты компилятором в релизной версии за ненадобностью, так как впоследствии не используются. Дебажная версия так делать не умеет и не должна.
Глобальные переменные - то, что может быть доступно из 1) других потоков 2) других функций 3) по адресации в памяти на протяжении всей работы программы, поэтому работу с ними оптимизировать нельзя ни в каком виде.
Локальность переменных позволяет заводить ну очень эффективные оптимизации кода на уровне компилятора, чего не сделаешь при их глобальности. Ну, ИМХО.
Различие в 2/8 раз как раз объяснимо разными используемыми уровнями оптимизации кода.
Не выкинуты. Вот пример:
var
i2, i3, i4: integer;
function p1(i: integer): integer;
begin
i2 := i + 1;
i3 := i2 + 1;
i4 := i3 + 1;
Result := i4 + i2 + i3;
end;
begin
var s := 0;
loop 100000000 do
s += p1(1);
Println(s, Milliseconds);
end.
и
function p1(i: integer): integer;
begin
var i2 := i + 1;
var i3 := i2 + 1;
var i4 := i3 + 1;
Result := i4 + i2 + i3;
end;
begin
var s := 0;
loop 100000000 do
s += p1(1);
Println(s, Milliseconds);
end.
Второе быстрее в 4 раза.
Хорошо, идея номер два. Вангую последовательную замену
var i1:= ...Result:= ... => Result := (i + 1) + ((i + 1) + 1) + (((i + 1) + 1) + 1) => Result := 3 * i + 6
, , или хотя бы Result := i + i + i + 6
.
Упрощать выражения вроде как компиляторы умеют Нельзя в первом случае, там побочный эффект
Идея номер три.
Еще - p1(1)
- число константное, вполне могло быть выполнено один-единственный раз, а затем просто подставляться при каждом шаге цикла во втором варианте. А вот в первом нельзя, там побочный эффект
Проверил бы, но рефлектора под рукой нет, да и несподручно на работе
Нет, PascalABC.NET оптимизацией не занимается (почти), но какие-то простейшие оптимизации делает Jit-компилятор (скажем, inlining). p(1) считать константой - это глубокий анализ тела p - его никакие почти компиляторы не делают.
Нет. Зло - это динамические переменные. Не могу выполнить по ним задание
Динамические переменные - это самое прекрасное, что есть. Только потому, что под них можно подконтрольно выделять память. А значит, можно оптимизировать программу довольно эффективней, чем с обычными, статическими.
а если правда нужно оптимизировать, то лучше вообще не смотреть в сторону управляемых языков
Оптимизировать для чего? Для прошивки в кристаллы бортовых компьютеров? Там на С пишут и на ассемблере.
Обычно тот, кому надо оптимизировать, знает для чего Области, где применяются только неуправляемые языки, довольно обширные на самом деле.
ну я Теорию читаю, не пойму, 1 задание у нас вычислить выражение ln(xxx+3) с помощью динамических переменных. Думаю надо еще раз прочитать теорию. В справке абц.нет нету конкретного раздела по этой теме
каких еще динамических переменных?
Честно говоря, я думал, что он имел ввиду те переменные, под которые выделяется динамическая ОП, типа как динам. массивы через “new” ну или хотя бы он нашёл где-то метод запроса ОП у ОС, как в Си “malloc();”
в которых используются кавычки 1^
^ - это если я правильно помню, операция разыменования для типизированного указателя, так что 1^ - нечто бессмысленное.