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

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

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

как то прочитал (не помню где) что крупные комерческие проекты делают с оптимизацией -o2

Да. Иногда -O3. Ровно как и сборка дистрибутивов идет с -O2, куда можно еще добавить march=native (или архитектура МК при работе с ними).

Я бы работу с периферией, а особенно из сторонних библиотек, вообще бы собирал без оптимизации. Максимум -02. Какая-нибудь обработка данных может быть и с -O3. Алгоритмы обычно отлаживаются на моделях, зачастую даже на другом языке, ошибки искать проще, сравнивая выходы при подаче эталонных данных. При Ofast и fast (в ICC) происходит отклонение от стандарта при работе с float. За счет этого увеличивается быстродействие. Нужно проверять, удовлетворяют ли в этом случае полученные результаты в плане точности.

Я сам за различные уровни оптимизации для разных частей программы.

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


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

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

оптимизация иногда раздувает размер кода подстановкой функций

Если вам нужна компактность есть ключ -Os. Опять же для разных частей ПО можно и нужно использовать разные опции.

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


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

40 minutes ago, Kabdim said:

Если вам нужна компактность есть ключ -Os. Опять же для разных частей ПО можно и нужно использовать разные опции.

речь шла оптимизации как таковой

предыдущие ораторы накинулись на меня, назвав лохом

что мол прога должна работать при любой оптимизации

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


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

Приветствую!  

3 minutes ago, inventor said:

речь шла оптимизации как таковой

предыдущие ораторы накинулись на меня, назвав лохом

что мол прога должна работать при любой оптимизации

IMHO - и они правы - как минимум в части корректной работы программы при разных опциях оптимизации. :)

 

Удачи! Rob.

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


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

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

что мол прога должна работать при любой оптимизации

именно так.

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


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

2 hours ago, inventor said:

оптимизация иногда раздувает размер кода подстановкой функций

Только если инлайн прямо указан программистом в коде или такая подстановка соответствует стратегии оптимизации(к примеру, оптимизация по скорости и инлайн получается быстрее чем стандартный вызов).

 

2 hours ago, inventor said:

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

Только если пишешь на Асме. В остальных случаях получаешь нечто зависящее от компилятора и аргументов компиляции.

 

 
33 minutes ago, inventor said:

что мол прога должна работать при любой оптимизации

Так и только так. Если не работает - ищи собственный косяк. 

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


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

1 hour ago, inventor said:

править стек lwip или что то подобное? (как пример)

Вам нужно запомнить одно -  lwip, FatFS , FreeRTOS, mbed  ... вылизаны от и до. Не пытайтесь там искать траблы с оптимизацией.
Ищите в слое BSP на платформу.
А это не так уж много файлов. Как правило за пару дней все баги находятся.   

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


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

1 hour ago, AlexandrY said:

Вам нужно запомнить одно -  lwip, FatFS , FreeRTOS, mbed  ... вылизаны от и до. Не пытайтесь там искать траблы с оптимизацией.

    мне нравица ваша убежденность. это не оптимизация, но все же...

/**
         * Кто то из нас готов - разбираем.
         * таймаут ставим в ноль, иначе функция select не работает! 
         * В это случае сразу будет выходить если нет готового дескриптора
         * а если передать NULL - то работает неправильно!!! 
         * не стал исправлять lwip_select()!
         */
        t0.tv_sec = 0;
        t0.tv_usec = 0;
        memcpy(&rfds, &readfds, sizeof(rfds));
        n = -1;
        if (select(maxfd + 1, &rfds, NULL, NULL, &t0) > 0) {
            for (i = 0; i < MAX_ETH_NUM; i++) {
                if (FD_ISSET(sockfd[i], &rfds)) {
                    n = i;
                    break;
                }
            }
        }

 

вот сразу пример из lwip с которым я провозился несколько дней.

 

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


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

4 hours ago, AlexandrY said:

Не надо поднимать уровень токсичности форума.
Я за нулевую толерантность к личным выпадам. 

Я тоже. Абсолютно согласен. Но следует отличать критику (и даже упрёк) от личного выпада. Здесь личность автора не ущемлялась.

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

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


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

 

3 hours ago, inventor said:

что мол прога должна работать при любой оптимизации

Должна, но не всегда работает :(

Помню, возился с коммерческим С компилятором (Sun Pro Compilers). Там было несколько модулей, которые собирались с О2 (остальные с О3). Общий размер этого всего составлял десятки миллионов строк, а модулей с О2 - десятки тысяч. Содержимое их было - аццкая жесть, авторов их никто не знал, и что там происходит - никто не понимал. В таком случае можно ставить разные уровни оптимизации. Если у вас не так - то нельзя :)

 

В том же компиляторе выловили интересную багу (как пользователи сказали):

В некоторой функции (небольшой) возвращающиеся результаты зависели от уровня оптимизации. Исследования показали, что в функции была ИНОГДА неинициализированная переменная, которая ИНОГДА попадала в вычисления. Реально, при использованных параметрах, неинициализированные данные в вычисления не попадали. Однако компилятор, найдя неинициализированную переменную, посчитал что результатом вычисления мусора будет мусор и выкинул тело функции ВООБЩЕ. Однако формально он (компилятор) был прав. Багу переквалифицировали в фичу :)

 

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


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

20 минут назад, xvr сказал:

Должна, но не всегда работает :(

Абсолютно согласен. Чем выше уровень оптимизации, тем больше вероятность получить ошибку компилятора. Понятно, что эта величина всё равно довольно малая, но про неё не стоит забывать. На поиск подобных ошибок дни могут уйти :(

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


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

Интересный финт оптимизатора, приводящий к ошибке:

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

Оказалось, что оптимизатор заинлайнил функции, которые должны были быть в RAM, они слились с телом "обычных" функций и разместились во флэшке.

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

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


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

2 hours ago, inventor said:

    мне нравица ваша убежденность. это не оптимизация, но все же...

Вряд ли у  вас выйдет запрячь тут кого-то искать ваши траблы. 
Но я с закрытыми глазами скажу что тут проблема с функциями таймеров из BSP либо неправильно портировали RTOS.
lwip портировал еще на MSP430.
Будьте уверены, там все чисто. 

6 minutes ago, gerber said:

Интересный финт оптимизатора, приводящий к ошибке:

Финт в том, что это ваша ошибка.
Но кто покажет такие ошибки в больших опенсорсных проектах? 
Боюсь никто, поскольку тестировать на максимальной оптимизации стандартная практика. 

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


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

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

Оказалось, что оптимизатор заинлайнил функции, которые должны были быть в RAM, они слились с телом "обычных" функций и разместились во флэшке.

Т.е. - Вы включили оптимизацию (которая предполагает использование в том числе и инлайнинга функций), не удосужились запретить компилятору инлайнить данную функцию (или иным способом оставить её в виде автономной функции). И после этого виноват компилятор??? Где логика? :dash2:   

Видимо Вы ожидали, что компилятор откроет даташит :rtfm:, разберётся в вашем творчестве :paint2:, поймёт как оно должно работать :moil: и подкостылит его как надо :download:.

Нда... Повторюсь ещё раз: компилятор - это инструмент! А на инструменте надо уметь играть. Опять вспоминаем басню про мартышку и очки...

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


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

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

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


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

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

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

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

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

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

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

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

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

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