Перейти к содержанию
    

Оптимизация в компиляторе. Нужна или нет?

Только что, inventor сказал:

работает с оптимизацией без volatile

если asm Закоментить не работает

А Вы не находите, что наличие asm("nop") изменяет предположение компилятора о ненадобности пустого цикла при оптимизации в обратную сторону?

Оптимизатор выкидывает бесполезные действия. И одним из таких действий как раз является бесконечный цикл с пустым телом.

Вопрос, почему оно с непустым телом работает - тоже вопрос (хорошо проверяли? тесты достоверны, либо просто так совпало?), по-хорошему компилятор вправе закинуть тухлыми помидорами и этот код, превратив его в то, что я описал в предыдущем посте. Смотреть нужно сгенерированный ассемблер.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 minutes ago, Arlleex said:

А Вы не находите, что наличие asm("nop") изменяет предположение компилятора о ненадобности пустого цикла при оптимизации в обратную сторону?

Оптимизатор выкидывает бесполезные действия. И одним из таких действий как раз является бесконечный цикл с пустым телом.

 

то есть по мнению оптимизатора - действия с переменной - это бесполезные действия, который можно выкинуть.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

18 минут назад, inventor сказал:

в чем правильное?

Ну так если "неправильное" - напишите свой компилятор, "правильный".  :wink:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Только что, inventor сказал:

то есть по мнению оптимизатора - действия с переменной - это бесполезные действия, который можно выкинуть.

В данном случае - да. Вы логически подумайте - зачем вообще нужен цикл, который ничего не делает? Задержки программные делать? Тогда я могу только посоветовать отходить от ардуино-стиля, где принято лепить задержки на пустых тактах процессора:yu:

Изменено пользователем Arlleex

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 minutes ago, Arlleex said:

В данном случае - да. Вы логически подумайте - зачем вообще нужен цикл, который ничего не делает? Задержки программные делать? Тогда я могу только посоветовать отходить от ардуино-стиля, где принято лепить задержки на пустых тактах процессора:yu:

 

ну зачем то он стоит, 

может сам оптимизатор должен не так работать,

почему я должен предугадывать как поведет себя в какой то ситуации

может опцию предусмотреть ну типа

#optimize_that

... какой то код

#end_optimize

а все что не оформлено такими рамками-не трогать

в этом случае это было бы правильнее поведение

я так думаю

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Только что, inventor сказал:

ну зачем то он стоит

Чтобы индус, который писал этот код, смог побыстрее получить гонорар за набитые строки кода и уйти домой пораньше. Не более.

 

Только что, inventor сказал:

может сам оптимизатор должен не так работать

почему я должен предугадывать как поведет себя в какой то ситуации

Оптимизатор работает правильно.

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

 

Только что, inventor сказал:

#optimize_that

... какой то код

#end_optimize

Сделайте раздельную компиляцию проекта. И каждый файл компилируйте с соответствующими опциями. Но, ИМХО, возможности оптимизатора значительно сократятся, поскольку оптимизация проводится не только на уровне исходного файла, насколько я знаю, но также на уровне компоновки.

http://www.keil.com/support/docs/3704.htm

Изменено пользователем Arlleex

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

30 minutes ago, Arlleex said:

Чтобы индус, который писал этот код, смог побыстрее получить гонорар за набитые строки кода и уйти домой пораньше. Не более.

 

Оптимизатор работает правильно.

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

 

Сделайте раздельную компиляцию проекта. И каждый файл компилируйте с соответствующими опциями. Но, ИМХО, возможности оптимизатора значительно сократятся, поскольку оптимизация проводится не только на уровне исходного файла, насколько я знаю, но также на уровне компоновки.

http://www.keil.com/support/docs/3704.htm

 

в иаре #pragma optimize=none

жаль нету #pragma push и

#pragma pop

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, inventor сказал:

то есть по мнению оптимизатора - действия с переменной - это бесполезные действия, который можно выкинуть.

Именно так. Потому что согласно Стандарту языка определяющим является "наблюдаемое поведение". Понятия "затраченое время" в наблюдаемое поведение, согласно Стандарту, не входит. Если единственным выхлопом вашего кода является потраченное впустую время (та самая "большая и медленная программа") - ваш код, согласно Стандарту, бесполезен. Если вам необходимо потратить время - есть ключевое слово volatile. Если вам не нравится Стандарт - жалуйтесь в Лигу Сексуальных Реформ или используйте более другой язык. Если вы не хотите изучать язык - это ваше право, но вины языка или Стандарта в этом нет. Не вижу смысла что-то еще доказывать. 

Ваш asm() по логике обладает свойствами volatile - компилятор обязан выполнить его указанное в условии цикла количество раз, поэтому не может выкинуть и цикл. Копаться внутри вашего ассемблерного текста и понимать, что там тоже ничего полезного нет - не его задача.

 

48 минут назад, inventor сказал:

жаль нету #pragma push и

 #pragma pop

Что, уже нету? Лет 10 назад были.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

__nop() никогда не выбрасывается компилятором 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

56 minutes ago, Сергей Борщ said:

Потому что согласно Стандарту языка определяющим является "наблюдаемое поведение"

Стандарт подходит к объяснению того, что компилятор должен сохранять наблюдаемое поведение при выполнении оптимизации.

 

http://qaru.site/questions/2132338/does-c99-standard-define-observable-behavior-as-c03-does

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

30 минут назад, inventor сказал:

Стандарт подходит к объяснению того, что компилятор должен сохранять наблюдаемое поведение при выполнении оптимизации.

Насчет подхода не понял, но что именно в наблюдаемом поведении вашей программы меняется? Ваш цикл на наблюдаемое поведение не влияет в обоих случаях.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

9 minutes ago, Сергей Борщ said:

Насчет подхода не понял, но что именно в наблюдаемом поведении вашей программы меняется? Ваш цикл на наблюдаемое поведение не влияет в обоих случаях.

если предположим функция будет давать на выходе разный результат

при исползовании оптимизаора и не

то и наблюдаемое поведение будет разным

разве не так?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

32 минуты назад, inventor сказал:

если предположим функция будет давать на выходе разный результат

при исползовании оптимизаора и не

то и наблюдаемое поведение будет разным

разве не так?

Да. Но ваша функция результата не выдает.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 часа назад, jcxz сказал:

Ну так если "неправильное" - напишите свой компилятор, "правильный".  :wink:

Я думаю тут стоит начать с "правильного" языка. А С/С++ явно "неправильный" т.к. делает не то о чем "программист" подумал, но не записал в исходнике.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

 

4 minutes ago, Сергей Борщ said:

Да. Но ваша функция результата не выдает.

почему же, если при оптимизации пишешь local_time как volatile - то она работает как задержка

а если нет-то не работает

разный результат

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...