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

 
 
> Вопрос по оптимизации.
Jenya7
сообщение Feb 10 2015, 07:47
Сообщение #1


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

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Когда я в компайлере ставлю директиву оптимизировать по скорости то в дебаг моде при переходе на какую нибудь переменную дебагер пишет optimized out.
вопрос влияет ли оптимизация на работу переменных в run time?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 12)
RabidRabbit
сообщение Feb 10 2015, 08:30
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 397
Регистрация: 3-12-09
Из: Россия, Москва
Пользователь №: 54 040



Это означает, что по мнению компилятора данная переменная в Вашей программе не нужна. Код в "дебаг моде" и в "run time" ничем не отличается, те же байтики.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Feb 10 2015, 08:49
Сообщение #3


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

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(RabidRabbit @ Feb 10 2015, 14:30) *
Это означает, что по мнению компилятора данная переменная в Вашей программе не нужна. Код в "дебаг моде" и в "run time" ничем не отличается, те же байтики.

тогда я не понимаю. мне что все переменные volatile сделать? он даже локальные optimaze out!

Сообщение отредактировал Jenya7 - Feb 10 2015, 08:50
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Feb 10 2015, 09:49
Сообщение #4


Гуру
******

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



Цитата(Jenya7 @ Feb 10 2015, 10:49) *
тогда я не понимаю. мне что все переменные volatile сделать? он даже локальные optimaze out!
Если хотите написать большую медленную программу - делайте все переменные volatile.
Если хотите писать маленькую быструю - ходите по дизассемблеру, анализируйте код и смотрите содержимое регистров. В каком-то из них может быть ваша преременная. Причем по ходу программы она может перемещаться из регистра в регистр. А может компилятор действительно выкинул переменную вместе со всем породившим ее кодом. Бывает удобно на время отладки завести volatile-переменные, в которые записывать промежуточнве значения интересующих вас переменных в ключевых точках программы.
Если хотите программу среднего размера и скорости, но с облегченной отладкой - уменьшайте оптимизацию.


--------------------
На любой вопрос даю любой ответ
"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
CrimsonPig
сообщение Feb 10 2015, 10:09
Сообщение #5


Местный
***

Группа: Участник
Сообщений: 329
Регистрация: 23-04-14
Пользователь №: 81 502



Цитата(Jenya7 @ Feb 10 2015, 07:47) *
Когда я в компайлере ставлю директиву оптимизировать по скорости то в дебаг моде при переходе на какую нибудь переменную дебагер пишет optimized out.
вопрос влияет ли оптимизация на работу переменных в run time?


Хм.. обычно в debug mode все оптимизации отключаются, чтобы компилятор что-нибуть не выкинул, полезное для отладки.
А в release оптимизации включаются; кого волнует, что умный компилятор там выкинет. А выкинуть он может очень много, заинлайнить все static функции итп.

Бывают, конечно, случаи, когда debug версия просто не лезет в ROM, например, приходится извращаться с отладкой в релизе.

...А бывают еще случаи, когда горе-программисты пишут код, который в дебаге работает, а в релизе - нет sm.gif
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Feb 10 2015, 10:10
Сообщение #6


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

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(Сергей Борщ @ Feb 10 2015, 15:49) *
Если хотите написать большую медленную программу - делайте все переменные volatile.
Если хотите писать маленькую быструю - ходите по дизассемблеру, анализируйте код и смотрите содержимое регистров. В каком-то из них может быть ваша преременная. Причем по ходу программы она может перемещаться из регистра в регистр. А может компилятор действительно выкинул переменную вместе со всем породившим ее кодом. Бывает удобно на время отладки завести volatile-переменные, в которые записывать промежуточнве значения интересующих вас переменных в ключевых точках программы.
Если хотите программу среднего размера и скорости, но с облегченной отладкой - уменьшайте оптимизацию.

мне кажется что optimized out переменная сохранит свою функциональность. может он ее засунул в регистр а не в стек вот и optimized out.
Go to the top of the page
 
+Quote Post
CrimsonPig
сообщение Feb 10 2015, 10:20
Сообщение #7


Местный
***

Группа: Участник
Сообщений: 329
Регистрация: 23-04-14
Пользователь №: 81 502



Цитата(Jenya7 @ Feb 10 2015, 10:10) *
мне кажется что optimized out переменная сохранит свою функциональность. может он ее засунул в регистр а не в стек вот и optimized out.


креститься надо, когда кажется sm.gif

void foo(int arg1)
{
int var1 = 23;
var1 += arg1;
printf("%d", var1);
}

в release переменная var1 просто не будет существовать. тоесть вообще.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Feb 10 2015, 11:03
Сообщение #8


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

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(CrimsonPig @ Feb 10 2015, 16:20) *
креститься надо, когда кажется sm.gif

void foo(int arg1)
{
int var1 = 23;
var1 += arg1;
printf("%d", var1);
}

в release переменная var1 просто не будет существовать. тоесть вообще.

что то вы ужасами какими то нас стращаете.
вопрос даже не в том будет существовать или нет, а в том сохраниться ли функциональность.

Сообщение отредактировал Jenya7 - Feb 10 2015, 11:06
Go to the top of the page
 
+Quote Post
CrimsonPig
сообщение Feb 10 2015, 11:40
Сообщение #9


Местный
***

Группа: Участник
Сообщений: 329
Регистрация: 23-04-14
Пользователь №: 81 502



Цитата(Jenya7 @ Feb 10 2015, 11:03) *
что то вы ужасами какими то нас стращаете.
вопрос даже не в том будет существовать или нет, а в том сохраниться ли функциональность.


а не будет ли благородный дон дать определенние этой самой "функциональности" ? А то получатся разговор ни о чем.

В моем примере локальная переменная с т.з. умного оптимизирующего компилятора никакой _функциональности_ не несет. Поэтому в релизе она будет соптимизирована до инструкции прибавления константы к аргументу и никакого места на стеке ей выделено не будет.
В дебаге оптимизации отключены обычно и эта переменная будет выделена на стеке.

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


Сообщение отредактировал CrimsonPig - Feb 10 2015, 11:43
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Feb 10 2015, 11:50
Сообщение #10


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

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(CrimsonPig @ Feb 10 2015, 17:40) *
Так это решается формально, прогоном соотв. тестов в дебаге и релизе и курением результатов тестов.

ну да 32кило кода, пойди прогони сейчас. sm.gif .
Go to the top of the page
 
+Quote Post
CrimsonPig
сообщение Feb 10 2015, 11:56
Сообщение #11


Местный
***

Группа: Участник
Сообщений: 329
Регистрация: 23-04-14
Пользователь №: 81 502



Цитата(Jenya7 @ Feb 10 2015, 11:50) *
ну да 32кило кода, пойди прогони сейчас. sm.gif .


Даже не смешно. У меня в одном из проектов есть такой файлец sqlite3.c
Он содержит более 5 мегабайт исходного кода. По заявлению автора, код покрыт тестами на 100%.

Сообщение отредактировал CrimsonPig - Feb 10 2015, 11:56
Go to the top of the page
 
+Quote Post
megajohn
сообщение Feb 10 2015, 14:02
Сообщение #12


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

Группа: Свой
Сообщений: 1 080
Регистрация: 16-11-04
Из: СПб
Пользователь №: 1 143



Цитата(CrimsonPig @ Feb 10 2015, 14:40) *
В дебаге оптимизации отключены обычно и эта переменная будет выделена на стеке.


на анализе работы IAR AVR/ARM могу сказать что:
локальные переменные размещаются на стеке когда уже не хватает регистров. Либо при переходе в функции, когда нужно для вызова высвободить требуемые регистры

то есть первоочередное размещение локальных переменных в регистрах, а уж потом на стеке.
Прикрепленное изображение


P.S. предполагаю что и в других компиляторах такой же механизм



--------------------
Марс - единственная планета, полностью населенная роботами (около 7 штук).
Go to the top of the page
 
+Quote Post
CrimsonPig
сообщение Feb 10 2015, 16:12
Сообщение #13


Местный
***

Группа: Участник
Сообщений: 329
Регистрация: 23-04-14
Пользователь №: 81 502



Цитата(megajohn @ Feb 10 2015, 14:02) *
на анализе работы IAR AVR/ARM могу сказать что:
локальные переменные размещаются на стеке когда уже не хватает регистров. Либо при переходе в функции, когда нужно для вызова высвободить требуемые регистры
то есть первоочередное размещение локальных переменных в регистрах, а уж потом на стеке.
P.S. предполагаю что и в других компиляторах такой же механизм


Это все очень платформозависимо. "на стеке" это я в общих чертах сказал. Например, у мелких пиков специального стека данных как такового совсем нет, что не мешает тому же ИАРу размещать локальные переменные в регистровом файле.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 12:39
Рейтинг@Mail.ru


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