Форум: "Потрепаться";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.03.21;
Скачать: [xml.tar.bz2];




Вниз

Об оптимизации. 


McSimm   (2002-02-06 10:21) [0]

Иссяк источник задачек в глубинах памяти. (Во какой слог!)
Предлагаю вашему вниманию собственную хитрую задачку.

Программисты! Все мы (или почти) наблюдали действие оптимизатора при отладке программ.
А может ли включение оптимизации (конкретно - Delphi) повлиять каким-либо образом на результаты работы программы?
Предлагаю задание. Требуется написать (и проверить) функцию:
function OptimizationFounded: Boolean;
такую, чтобы вернула True если программа компилировалась со включенным оптизатором. И, соответственно, False - в противном случае.
Возможно ли такое средствами Делфи?

--
С уважением,
McSimm

P.S. Если кто-то сходу найдет решение, просьба не кидать в первые же минуты. Дайте возможность остальным подумать.



Алексей Петров   (2002-02-06 10:24) [1]

function OptimizationFounded: Boolean;
begin
{$IFOPT O+}
Result := true
{$ELSE}
Result := false
end;



McSimm   (2002-02-06 10:40) [2]

Надо было попросить "в первые же четыре минуты"
:)



Алексей Петров   (2002-02-06 10:44) [3]

Пусть думают - в моем коде есть ошибки :)



panov   (2002-02-06 10:52) [4]

Хитрые!:-)
А вы напишите функцию, которая действительно возвратит разный результат при выполнении каких-либо операций, а не в результате использования директив компилятора.



VuDZ   (2002-02-06 11:16) [5]

а не проще ли поискать список глюков оптимизатора и по ним риентироваться?



McSimm   (2002-02-06 11:30) [6]

>Алексей Петров © (06.02.02 10:44)
>Пусть думают - в моем коде есть ошибки :)
Ошибка есть, но это не принципиально. Вопрос был построен специально, чтобы пустить по ложному пути, при этом не обманывая.
Мой любимый тип задач. На нестандартность мышления.

>panov © (06.02.02 10:52)
Надеюсь, что такой путь все-таки бесперспективен. Возможно, асы могут ассемблерными инструкциями распознать различие, но это совсем другой путь

>VuDZ © (06.02.02 11:16)
Проще? Неужели может быть проще?



Алексей Петров   (2002-02-06 11:49) [7]

> McSimm © (06.02.02 11:30)
> Надеюсь, что такой путь все-таки бесперспективен.

Готов "на спор" написать такой код :)

К стати ассемблерные инструкции не оптимизируются а включаются "как есть."



McSimm   (2002-02-06 11:54) [8]

>ассемблерные инструкции не оптимизируются
А без них сможешь? Используя только паскаль?



Алексей Петров   (2002-02-06 12:08) [9]

Чистый паскаль? Как это слово будем понимать?
Весь ObjectPascal кроме слова asm? ОК?



Алексей Петров   (2002-02-06 12:16) [10]

А не сложнее получилось :)
function OptimizationFounded: Boolean;
begin
Result := PChar(@OptimizationFounded)^<>#$55;
end;


Просто для примитивных функций оптимизатор выкидывает стековый кадр, который начинается с
push ebp = $55
А для не оптимизированных - такой байт в начале кода есть.



McSimm   (2002-02-06 12:20) [11]

Да. 5 баллов!
Съел ты меня. Надо было с этого и начинать :)



MBo   (2002-02-06 12:43) [12]

>стековый кадр, который начинается
где бы почитать про такие тонкости реализации?
в хелпе только и есть, что "оптимизатор однако крутой и безопасный"
т.е. литература хотя бы вроде той, что была для TPascal "Programmers Guide"



Алексей Петров   (2002-02-06 12:45) [13]

> MBo © (06.02.02 12:43)
Встаешь на Breakpoint-е и смотришь CPU-window - там вся информация :)



MBo   (2002-02-06 12:50) [14]

это-то ясно. заранее бы подковаться.



McSimm   (2002-02-06 13:02) [15]

Я надеялся что мараторий на ассемблер не даст возможности доступа к регистрам и возможности получить подобной информации.
Но Алексей и тут всех обошел :)



Алексей Петров   (2002-02-06 13:04) [16]

Так я регистры и не трогал. Я просто простейший анализ машинного кода провел. :)



VuDZ   (2002-02-06 14:21) [17]

2McSimm
Я надеялся что мараторий на ассемблер не даст возможности доступа к регистрам и возможности получить подобной информации.
??? а при чём тут регистры проца ???

>VuDZ © (06.02.02 11:16)
Проще? Неужели может быть проще?

да, но для С++, так как у него слишком агрессивные оптимизаторы и иногда случаются глюки... По этому поводу в инете немерено статей...

ЗЫ если не секрет, то какой смысл в определение оптимизации?



Алексей Петров   (2002-02-06 14:25) [18]

> VuDZ © (06.02.02 14:21)
> да, но для С++, так как у него слишком агрессивные оптимизаторы и иногда случаются глюки... По этому поводу в инете немерено статей...

За Delphi-йским такого не замечено. А твое утверждение не корректно. Говорить можно о конкретном компиляторе а не о языке С++. Т.к. компиляторов этих десятки.

> ЗЫ если не секрет, то какой смысл в определени и оптимизации.
Интерес чисто академический. Практической пользы, ИМХО, нет.



McSimm   (2002-02-06 14:36) [19]

>??? а при чём тут регистры проца ???
Например: посмотреть значение for-переменной после его выполнения, или стек просмотреть.
Но Алексею для этого и регистры не понадобились

>ЗЫ если не секрет, то какой смысл в определение оптимизации?
Никакого.



VuDZ   (2002-02-06 14:40) [20]

Алексей Петров
Говорить можно о конкретном компиляторе а не о языке С++. Т.к. компиляторов этих десятки.
я и подразумевал компилятор, а не язык :D
через мои руки прошла куча компилеров, среди них: MS VC++ (cl), intel C Compiler, gcc - в последнем меньше всех багов, но ошибки есть к _каждом_ компиляторе С++ из-за его чертовской сложности, в основном при работе с шаблонами и множесвенным наследование (иногда это не ошибки, а не строгое следование букве стандарта)




Форум: "Потрепаться";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.03.21;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.75 MB
Время: 0.02 c
3-66767           sizmrebi              2002-02-20 11:51  2002.03.21  
QREPORT


3-66794           Demon ltd             2002-02-24 01:15  2002.03.21  
Работа с sql ом из базы в dbgreed и отчёт


1-66917           archer                2002-03-06 16:40  2002.03.21  
Проблема с Delphi5 под Win2000


3-66736           dmitriyk              2002-02-18 02:49  2002.03.21  
Никто не встречал компонент TDBGrid у которог можно былобы вставить фоновую картинку ?


6-66950           xmag                  2002-01-04 21:41  2002.03.21  
Вопрос о TThread & TClientSocket