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

 
 
 
Closed TopicStart new topic
> IAR 3.10C, Цена доверия
KSN
сообщение Dec 9 2005, 08:23
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 404
Регистрация: 3-12-04
Из: Новосибирск
Пользователь №: 1 304



Вот небольшой фрагмент кода:
ktmp=0;
PultFlag=4;
for(pult=0;pult<3;pult++)
ktmp|= ((PultFlag&(0x01<<pult)))?(1<<pult):0;
ktmp=0;
PultFlag=5;
for(pult=0;pult<3;pult++)
ktmp|= ((PultFlag>>pult)&0x01)?(1<<pult):0;
Если уровень оптимизации по скорости минимален или вооще нет, то все хорошо, но как только делаю уровень оптимизации High, то в первом цикле перестает вычисляться ktmp. Поэтому вопрос: в какой степени компилятор наплевательски относится к написанному коду при оптимизациях? Как с этим обстоят дела в более поздних версиях компилятора. Я так полагаю, что не стоит полагаться на оптимизацию компилятора, надо самому грамотно писать программу.
Go to the top of the page
 
+Quote Post
mse
сообщение Dec 9 2005, 08:32
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 709
Регистрация: 3-05-05
Пользователь №: 4 693



Ну прально
Цитата
ktmp|= ((PultFlag&(0x01<<pult)))?(1<<pult):0;
ktmp=0;

результата использования ktmp нет, зачем её вычислять ваще? Оптимизаццыя то по скорости! ;О) В других оптимизаццыях компилер предполагает, что это, мобуть, какая-то задержка калиброванная ;О) и не торгает. А при макс скорости он её таво...
Go to the top of the page
 
+Quote Post
Георгий
сообщение Dec 9 2005, 08:39
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 269
Регистрация: 17-11-05
Из: Киров-Москва
Пользователь №: 10 957



Только хотел ответить, уже опередили. Я тоже очень грешил на компилятор, когда начал переходить на C IAR (закрытая мною тема про повторный вызов функции), а оказывается, алгоритм надо лучше продумывать.


--------------------
Обычно последним смеется тот, кто хуже соображает!
Go to the top of the page
 
+Quote Post
dxp
сообщение Dec 9 2005, 08:55
Сообщение #4


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



Цитата(KSN @ Dec 9 2005, 14:23) *
Вот небольшой фрагмент кода:
ktmp=0;
PultFlag=4;
for(pult=0;pult<3;pult++)
ktmp|= ((PultFlag&(0x01<<pult)))?(1<<pult):0;
ktmp=0;
PultFlag=5;
for(pult=0;pult<3;pult++)
ktmp|= ((PultFlag>>pult)&0x01)?(1<<pult):0;

Дык. После первого цикла значение ktmp не используется. Более того, сразу после этого ему конкретно присваивается 0. С точки зрения компилятора и здравого смысла работа, произведенная в первом цикле сделана впустую. И оптимизатор совершенно справедливо удаляет этот ненужный код, уменьшая размер программы и увеличивая скорость ее работы. В этом весь смысл оптимизации и состоит. Если Вам надо проследить за значениями и подавить оптимизацию, то объявите ktmp как volatile. Так часто делают при отладке, когда надо отследить промежуточные значения. В этом случае компилятор не будет ничего оптимизировать в части этой переменной.

Цитата(KSN @ Dec 9 2005, 14:23) *
Я так полагаю, что не стоит полагаться на оптимизацию компилятора, надо самому грамотно писать программу.

Истину глаголите. smile.gif volatile. smile.gif


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
arttab
сообщение Dec 9 2005, 09:30
Сообщение #5


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

Группа: Свой
Сообщений: 1 432
Регистрация: 7-12-04
Из: Новосибирск
Пользователь №: 1 371



Пока была только одна крутая хрень от компилятора.
Человек сделал следующее:
if чегото
if чегото2
продолжение проги

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

прога работала не верно. Он залез в дебагер и увидел:
if чегото
else чегото2

сейчас он в отпуске кайфует,но если очень интересен код, могу попробовать связаться


--------------------
OrCAD, Altium,IAR, AVR....
Go to the top of the page
 
+Quote Post
KSN
сообщение Dec 9 2005, 09:45
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 404
Регистрация: 3-12-04
Из: Новосибирск
Пользователь №: 1 304



Pultflag во истину volatile был объявлен изначально. Вот поэтому и возник вопрос: куда он этот код девал?
Go to the top of the page
 
+Quote Post
KRS
сообщение Dec 9 2005, 10:29
Сообщение #7


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

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



Попробуйте использовать 3.20D
в 3.10 были проблемы с volatile
достаточно просто заменить exeшник компилера
Go to the top of the page
 
+Quote Post
KSN
сообщение Dec 9 2005, 10:49
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 404
Регистрация: 3-12-04
Из: Новосибирск
Пользователь №: 1 304



Как насчет 4.11А? Он в этом отношении лучше своих предшественников или такой же? И вообще, стоит ли на него переходить или ограничиться 3.хх?
Go to the top of the page
 
+Quote Post
KRS
сообщение Dec 9 2005, 11:09
Сообщение #9


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

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



Цитата(KSN @ Dec 9 2005, 13:49) *
Как насчет 4.11А? Он в этом отношении лучше своих предшественников или такой же? И вообще, стоит ли на него переходить или ограничиться 3.хх?


Хороший компилер, многие сложные врыажения там где умножение есть лучше компилит.
Но вот часть оптимизации похуже стала например если константа или указатель (константный) много раз испольуется 3.20D его в регистрах хранил а 4.11 какждый раз загружает.


Я вот решил пока на 3.20D остаться.
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Dec 9 2005, 11:27
Сообщение #10


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Код сам по себе ошибочный.
Компилятор старый.
Зато какое пафосное название темы!
Go to the top of the page
 
+Quote Post
KSN
сообщение Dec 9 2005, 11:47
Сообщение #11


Местный
***

Группа: Свой
Сообщений: 404
Регистрация: 3-12-04
Из: Новосибирск
Пользователь №: 1 304



[quote name='IgorKossak' post='70214' date='Dec 9 2005, 17:27']
Код сам по себе ошибочный.
Компилятор старый.
Зато какое пафосное название темы!
[/quote]
Оговорюсь: фрагмент кода, который в программе в данной последовательности не используется. Здесь приведен фрагмент, который я написал, чтобы поглядеть в отладчике что же происходит. Слова благодарности dxp, который на двух пальцах объяснил, как все это воспринимает компилятор(что собственно и хотелось услышать). Версия компилятора - абсолютно не при чем, если она не содержит в себе ошибок. И менее всего я уделял названию темы...

[quote name='KRS' date='Dec 9 2005, 17:09' post='70203']
[/quote]
Хороший компилер, многие сложные врыажения там где умножение есть лучше компилит.
Но вот часть оптимизации похуже стала например если константа или указатель (константный) много раз испольуется 3.20D его в регистрах хранил а 4.11 какждый раз загружает.


Я вот решил пока на 3.20D остаться.
[/quote]
Где добыть можно 3.20D?
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Dec 9 2005, 12:39
Сообщение #12


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Цитата(KSN @ Dec 9 2005, 13:47) *
Где добыть можно 3.20D?

Зайти по ссылке, далее - Product updates, далее - Version 3.20 и далее выбрать C или CPP обновлять.
Лечится уникраком.
Но перед этим надо снести и поставить заново непролеченную версию 3.20C.
Go to the top of the page
 
+Quote Post
KSN
сообщение Dec 10 2005, 03:25
Сообщение #13


Местный
***

Группа: Свой
Сообщений: 404
Регистрация: 3-12-04
Из: Новосибирск
Пользователь №: 1 304



Спасибо большое!
Go to the top of the page
 
+Quote Post

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

 


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


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