Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];

Вниз

бред с оптимизацией   Найти похожие ветки 

 
Max   (2012-05-28 22:45) [0]

Обнаружил ошибку при дебаге программы - цикл for i:=1 to ... идет в обратном порядке 8-[] Соответсвенно не правильно работает программа. Два часа ломал голову в чем проблема - оказалось неправильно работает оптимизация в дельфи. Отключил галку - все стало нормально. Вопрос - как это решить нормально?


 
DVM ©   (2012-05-28 22:49) [1]


>  Два часа ломал голову в чем проблема - оказалось неправильно
> работает оптимизация в дельфи.

код в студию


 
Sha ©   (2012-05-28 23:00) [2]

> Max   (28.05.12 22:45)

ошибка у тебя, пока не доказал обратного


 
Max   (2012-05-28 23:19) [3]

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


unit Unit2;

interface

uses Windows;

type TTestRecord = record
 BlaBla: string;
end;

var TestRecords: array[1..3] of TTestRecord = (
 (BlaBla: "1"),
 (BlaBla: "2"),
 (BlaBla: "3"));

procedure Test;

implementation

procedure DoSomething(const AData: string);
begin
 if AData <> "" then Sleep(1); //что бы не выкинул оптимизатор
end;

procedure Test;
var
 i: integer;
begin
 for i:=1 to High(TestRecords) do
   DoSomething(TestRecords[i].BlaBla);
end;

initialization
 test;

end.


Смотрите в отладчике в процедуре test цикл с включенной оптимизацией и без нее. Будет в одном случае 1 2 3. В другом 3 2 1

ps: кстати, уже раньше на другие баги с оптимизацией натыкался


 
DVM ©   (2012-05-28 23:26) [4]

xe2 все работает правильно и с оптимизацией и без


 
Max   (2012-05-28 23:30) [5]

я ж в заголовке писал D7 :)


 
DVM ©   (2012-05-28 23:33) [6]


>  D7

нету у мну


 
Max   (2012-05-28 23:35) [7]

Ладно, отключил ее нафиг :) Все равно толку от нее минимум


 
Sha ©   (2012-05-28 23:37) [8]

При оптимизации кода компилятор может расщеплять управляющую переменную на 2 регистра:
первый (тот, что виден в дебаггере) содержит оставшееся число повторений,
второй изменяется в заказанную тобой сторону.

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


 
sniknik ©   (2012-05-28 23:38) [9]

> баги с оптимизацией натыкался
у тебя в голове баг... большой такой, серый, с извилинами. %)

ты куда смотришь? на i? с точкой останова на 30 строке. а нужно на AData с точкой на 22.
все правильно работает, оптимизирует, это ты это правильное поведение интерпретируешь как баг.


 
sniknik ©   (2012-05-28 23:39) [10]

> Ладно, отключил ее нафиг :) Все равно толку от нее минимум
мозги лучше себе отключи.


 
Max   (2012-05-29 00:03) [11]


>При оптимизации кода компилятор может расщеплять управляющую >переменную на 2 регистра

ты прав, спасибо. я этого не знал. ошибка была в самой логике. можно тему закрыть)
ps: хотя для отладки это плохо

> мозги лучше себе отключи

комрад, иди с воскресенья протрезвей) бухтит тут с перепоя)


 
Sha ©   (2012-05-29 00:05) [12]

Вот тебе еще более простой пример для иллюстрации [8]


procedure TForm1.FormCreate(Sender: TObject);
const
 a: array[5..7] of string = ("5", "6", "7");
var
 i: integer;
begin;
 for i:=Low(a) to High(a) do
   Memo1.Lines.Add(a[i]);
 end;


Memo1 заполняется верно, хотя дебаггер показывает значения i=3,2,1.

В ассемблерном коде видно, что перед выполнением цикла
в регистр esi заносится число повторений (3), а в ebx - адрес первой сроки.
Далее в цикле первый регистр уменьшается, второй - увеличивается.


 
Max   (2012-05-29 00:08) [13]

Sha, понял, спасибо


 
Германн ©   (2012-05-29 01:19) [14]


> DVM ©   (28.05.12 23:26) [4]
>
> xe2 все работает правильно

В Д2007 этот баг отладчика ещё присутствовал.


 
Sha ©   (2012-05-29 09:08) [15]

Это не баг.
Счетчик повторений показан корректно. Того кода, что ты писал просто нет.
Ты же не возмущаешься тому, что что некоторые операторы при оптимизации выброшены.
Ты ведь программист, не так ли?


 
Pavia ©   (2012-05-29 09:31) [16]

За более чем 10 летний опыт общения с Delphi большую часть на D7 быг с оптимизацией встретился мне один раз.
В примере
> Max   (28.05.12 23:19) [3]

его нету.


 
ProgRAMmer Dimonych ©   (2012-05-29 10:44) [17]

> [16] Pavia ©   (29.05.12 09:31)

А поподробнее?


 
Германн ©   (2012-05-29 15:47) [18]


> Sha ©   (29.05.12 09:08) [15]
>
> Это не баг.
> Счетчик повторений показан корректно. Того кода, что ты
> писал просто нет.
> Ты же не возмущаешься тому, что что некоторые операторы
> при оптимизации выброшены.
> Ты ведь программист, не так ли?
>

Это именно баг отладчика! И совсем при этом не важно, что есть оптимизатор, который выкинул из кода переменную цикла. Либо отладчик должен её "симулировать", либо честно говорить, что не может показать значение этой переменной из-за того, что она исключена из кода в целях оптимизации как это он говорит в ряде других случаев.


 
Sha ©   (2012-05-29 16:01) [19]

> Германн ©   (29.05.12 15:47) [18]

Понятно. Предположу, что ты не видел,
что вытворяли с кодом на ЕС ЭВМ оптимизаторы PLI и FORTH.


 
Германн ©   (2012-05-30 01:03) [20]


> Sha ©   (29.05.12 16:01) [19]
>
> > Германн ©   (29.05.12 15:47) [18]
>
> Понятно. Предположу, что ты не видел,
> что вытворяли с кодом на ЕС ЭВМ оптимизаторы PLI и FORTH.
>

Да мало ли что я видел или не видел. :)
По существу ты с моим определением согласен?


 
Sha ©   (2012-05-30 01:48) [21]

Нет, не согласен.
После работы оптимизатора понятие высокоуровневого оператора и даже переменной теряет смысл.
Если б оно сильно оптимизировало, было б удивительно, если б оно вообще там что-то показывало.
А ты балоны катишь, когда радоваться должен, что видишь почти все.


 
Германн ©   (2012-05-30 02:20) [22]


> Sha ©   (30.05.12 01:48) [21]
>
> Нет, не согласен.
> После работы оптимизатора понятие высокоуровневого оператора
> и даже переменной теряет смысл.
> Если б оно сильно оптимизировало, было б удивительно, если
> б оно вообще там что-то показывало.
> А ты балоны катишь, когда радоваться должен, что видишь
> почти все.
>

Т.е. ты утверждаешь, что RAD системы разработаны для "высокоуровневых" программистов?


 
Sha ©   (2012-05-30 02:37) [23]

Как у тебя получилось сделать такой вывод?


 
Германн ©   (2012-05-30 02:48) [24]


> Sha ©   (30.05.12 02:37) [23]
>
> Как у тебя получилось сделать такой вывод?
>

"Sha ©   (29.05.12 09:08) [15]

Это не баг.
Счетчик повторений показан корректно. Того кода, что ты писал просто нет.
Ты же не возмущаешься тому, что что некоторые операторы при оптимизации выброшены.
Ты ведь программист, не так ли?"
Т.е. я должен знать что именно мне показывает отладчик в том или другом случае?
А на кой нужен такой отладчик в RAD системе?


 
Германн ©   (2012-05-30 02:55) [25]


> Sha ©   (30.05.12 01:48) [21]

Вот кстати.
Обрати внимание на
> sniknik ©   (28.05.12 23:38) [9]
>
> > баги с оптимизацией натыкался
> у тебя в голове баг... большой такой, серый, с извилинами.
>  %)
>
> ты куда смотришь? на i? с точкой останова на 30 строке.
> а нужно на AData с точкой на 22.
> все правильно работает, оптимизирует, это ты это правильное
> поведение интерпретируешь как баг.
>


 
Sha ©   (2012-05-30 02:57) [26]

Для отладки и работы с отладчиком существуют отладочные компиляторы или режимы компиляции без оптимизации.
То, что в Delphi отладчик кое-что показывает после компиляции в режиме оптимизации - это жест доброй воли со стороны разработчиков. Могли бы этого не делать и были бы правы.


 
Германн ©   (2012-05-30 03:24) [27]


> То, что в Delphi отладчик кое-что показывает после компиляции
> в режиме оптимизации - это жест доброй воли со стороны разработчиков.
>

Саш, тебе самому это не смешно?
"Жест доброй воли" за туеву хучу баксов?


 
Anatoly Podgoretsky ©   (2012-05-30 07:29) [28]


>  это жест доброй воли со стороны разработчиков

Во всяком случае не для слабонервных, а то насмотрятся и бегут на форум.


 
Омлет ©   (2012-05-30 07:35) [29]

> Германн

Александр пытается объяснить, что в результате оптимизации может получиться код в котором ни в каком виде не будет тех переменных, которые задавал пользователь. Откуда же отладчику взять значения этих переменных, если их в помине нет? Размер кучи баксов на этот факт повлиять не могут.

С тем же успехом можно катить бочку на интерпретатор, который выкинул строчку "b := a + 2" в коде.

var
 a,b: integer;
begin
 a := 10;
 b := a + 2;
 caption := inttostr(a);
end;

Ты хоть кол на голове чеши, дебаггер не встанет на эту строку и не покажет значение b.


 
sniknik ©   (2012-05-30 08:00) [30]

> Германн
дебагер все показывает правильно, ИМХО, если бы он показывал ожидаемое ламерами, а не то, что реально есть, то были бы ОЧЕНЬ большие проблемы при малейшей ошибке/неточности в самом дебагере. да и связку между написанным и CPU хрен сделаешь.
вообще было бы невозможно разобраться, как при любом обмане.
ситуация была бы похожа на замену реальной ошибки на свой перевод... теми же ламерами, что доставляет больше всего проблем поддержке (не знают что происходит, поэтому непонятно в чем причина).


 
Sha ©   (2012-05-30 09:07) [31]

> Германн ©   (30.05.12 03:24) [27]
> "Жест доброй воли" за туеву хучу баксов?

Именно так.
Отладчик без оптимизации работает как надо.
А с оптимизацией и не должен по определению.


 
Anatoly Podgoretsky ©   (2012-05-30 09:19) [32]

> Sha  (30.05.2012 09:07:31)  [31]

Так и с оптимизацией работает как надо, только это другое надо.


 
Sha ©   (2012-05-30 09:47) [33]

> Anatoly Podgoretsky ©   (30.05.12 09:19) [32]

Хорошо, тогда разверну мысль.

После оптимизации относительно переменной цикла у разработчиков Delphi был следующий выбор.
В том виде, как писал программист, ее нет, но есть счетчик итераций.
Для доступа к элементам массива используется адрес текущего элемента,
который вместо умножения увеличивается или уменьшается на размер элемента.
Можно ничего не показывать, а можно показать этот счетчик.
Что лучше? Конечно, второе.

После "сильной" оптимизации на уровне ассемблерного кода (сейчас речь не о Delphi)
операторы размазаны и наползают друг на друга,
бывает даже, что в процедуре *все* операторы начинаются в одном месте.
Поставить точку прерывания на конкретном операторе просто невозможно.
Существуют только места, где вычисления переменных заканчиваются, да и то не всех.
Временные переменные могут вычисляться иначе, чем задумал программист,
и вообще не получать окончательного значения.

Так что то, что мы имеем, - дар Борланда.
Кому не нравится отлаживать код после оптимизатора, имеет возможност это делать без него.


 
Anatoly Podgoretsky ©   (2012-05-30 09:51) [34]

Ну так и я о том же.


 
Anatoly Podgoretsky ©   (2012-05-30 09:53) [35]

Кстати когда отладчик не может показать значение "переменной" то он прямо так и говорит, что значение недоступно из-за оптимизации. Вот только показ значений счетчика цикла смущает неокрепшие умы.


 
ProgRAMmer Dimonych ©   (2012-05-30 11:25) [36]

> [35] Anatoly Podgoretsky ©   (30.05.12 09:53)
> Кстати когда отладчик не может показать значение "переменной"
> то он прямо так и говорит, что значение недоступно из-за
> оптимизации. Вот только показ значений счетчика цикла смущает
> неокрепшие умы.

Но ведь он же их и укрепляет?



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

Форум: "Начинающим";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.54 MB
Время: 0.055 c
15-1347821674
Dmitry375
2012-09-16 22:54
2013.03.22
Running Delphi on Mac OS X


11-1244731932
Dy1
2009-06-11 18:52
2013.03.22
БД


15-1342612759
Кто б сомневался
2012-07-18 15:59
2013.03.22
Дженерики - примеры где с ними было бы лучше


15-1328942551
AV
2012-02-11 10:42
2013.03.22
Нужен ли XP mode, если на семерку хочу виртуалку поставить?


15-1344946625
tesseract
2012-08-14 16:17
2013.03.22
Сергей Петрович Капица





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский