реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Особенности кодогенерации и оптимизации в Keil
Timmy
сообщение Sep 13 2016, 06:17
Сообщение #1


Знающий
****

Группа: Участник
Сообщений: 835
Регистрация: 9-08-08
Из: Санкт-Петербург
Пользователь №: 39 515



Обнаружил сегодня, что в Кейле крайне нежелательно использовать функции std::min и std::max. Как и любые инлайн функции, которым передаётся ссылка на переменные интегрального типа.
Во-первых, если не включён режим оптимизации по времени, Кейл не инлайнит даже очень короткие функции, которые заинлайнить и короче и быстрее, чем выносить. По этой причине включение оптимизации по времени может давать и более короткий код biggrin.gif .
Во-вторых, даже если функция с параметром-ссылкой инлайнится, любая переменная, переданная в инлайн функцию по ссылке, будет принудительно размещена в памяти на стеке, а не в регистре, даже когда в этом нет никакой необходимости!

Хотя по-хорошему компилятор мог бы при возможности автоматически убирать ссылки на интегральные типы из прототипа, даже когда инлайн функция аутлайнится.
Go to the top of the page
 
+Quote Post
scifi
сообщение Sep 13 2016, 06:54
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(Timmy @ Sep 13 2016, 09:17) *
крайне нежелательно использовать функции std::min и std::max.

Ну, это вы загнули. Не все постоянно куда-то опаздывают и считают наносекунды biggrin.gif
И вообще, идеальных компиляторов не бывает. Поменьше заглядывайте в дизассемблер, и жизнь наладится biggrin.gif
Go to the top of the page
 
+Quote Post
Timmy
сообщение Sep 13 2016, 07:31
Сообщение #3


Знающий
****

Группа: Участник
Сообщений: 835
Регистрация: 9-08-08
Из: Санкт-Петербург
Пользователь №: 39 515



Цитата(scifi @ Sep 13 2016, 09:54) *
Ну, это вы загнули. Не все постоянно куда-то опаздывают и считают наносекунды biggrin.gif
И вообще, идеальных компиляторов не бывает. Поменьше заглядывайте в дизассемблер, и жизнь наладится biggrin.gif

Однако, я заметил, что мой МК непропорционально много времени проводит в одном часто вызываемом обработчике прерывания, несмотря на -O3 оптимизацию, заглянул в его листинг и... OMG! Пришлось сделать свой вариант min/max без ссылок.
Go to the top of the page
 
+Quote Post
scifi
сообщение Sep 13 2016, 07:36
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Быстрый обработчик прерывания на Си++? Боюсь, компиляторы до этого ещё не доросли. Собственно, топик именно об этом laughing.gif
Go to the top of the page
 
+Quote Post
Timmy
сообщение Sep 13 2016, 07:43
Сообщение #5


Знающий
****

Группа: Участник
Сообщений: 835
Регистрация: 9-08-08
Из: Санкт-Петербург
Пользователь №: 39 515



Цитата(scifi @ Sep 13 2016, 10:36) *
Быстрый обработчик прерывания на Си++? Боюсь, компиляторы до этого ещё не доросли. Собственно, топик именно об этом laughing.gif

А почему бы и нет? В нём же не используются исключения и даже конструкторы. Других серьёзных претензий к кодогенерации нет.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Sep 13 2016, 07:50
Сообщение #6


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (scifi @ Sep 13 2016, 10:36) *
Боюсь, компиляторы до этого ещё не доросли.
Ваши опасения напрасны.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
zltigo
сообщение Sep 13 2016, 08:26
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (scifi @ Sep 13 2016, 10:36) *
Быстрый обработчик прерывания на Си++? Боюсь, компиляторы до этого ещё не доросли. Собственно, топик именно об этом laughing.gif

Доросли. Вместе с Сишными где-то к концу 90x.



--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Kabdim
сообщение Sep 13 2016, 12:01
Сообщение #8


Знающий
****

Группа: Свой
Сообщений: 558
Регистрация: 26-11-14
Из: Зеленоград
Пользователь №: 83 842



А с чего бы ему инлайнить если нет указаний инлайнить? Сделано это очевидно почему - для удобства отладки.
Go to the top of the page
 
+Quote Post
Timmy
сообщение Sep 13 2016, 16:26
Сообщение #9


Знающий
****

Группа: Участник
Сообщений: 835
Регистрация: 9-08-08
Из: Санкт-Петербург
Пользователь №: 39 515



Цитата(Kabdim @ Sep 13 2016, 15:01) *
А с чего бы ему инлайнить если нет указаний инлайнить? Сделано это очевидно почему - для удобства отладки.
Потому, что включён режим максимальной оптимизации - O3, функции std::min/std::max определены с inline, и компилятор должен бы видеть, что эти функции с подстановкой реализуются короче, чем с вызовом, не говоря о том, что быстрее.
Go to the top of the page
 
+Quote Post
x893
сообщение Sep 13 2016, 16:35
Сообщение #10


Профессионал
*****

Группа: Свой
Сообщений: 1 333
Регистрация: 27-10-08
Из: Планета Земля
Пользователь №: 41 226



Напишите в форум ARM - пусть они точно ответят. Здесь никто не ответит за ARM.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 16th June 2025 - 21:28
Рейтинг@Mail.ru


Страница сгенерированна за 0.01444 секунд с 7
ELECTRONIX ©2004-2016