Форум программистов, компьютерный форум, киберфорум
Наши страницы

C++

Войти
Регистрация
Восстановить пароль
 
 
karat39
6 / 6 / 2
Регистрация: 09.02.2016
Сообщений: 137
#1

На что влияет правильный выбор типа данных? - C++

09.06.2016, 11:05. Просмотров 748. Ответов 32
Метки нет (Все метки)

Вопрос банальный. Предлагаю некий мозговой штурм. Сам не очень владею этой темой.

Код работает с целыми числами. Для целых чисел в с++ разработан целый набор типов для конкретных задач. На что может повлиять выбор того или иного типа?
Если я работаю с числами до 1000, то например, можно использовать short int и unsigned short int и int. При этом логично использовать short int в целях экономии памяти. Но не проиграю ли я в производительности? Что очень важно.

Заранее спасибо за аргументированные мысли.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.06.2016, 11:05
Здравствуйте! Я подобрал для вас темы с ответами на вопрос На что влияет правильный выбор типа данных? (C++):

Ошибка что то типа не объявленный идентификатор,и типа невозможно преобразовать CStringW в там что..то - C++
Даже не знаю как сказать... короче есть база а Access,которую я подключил к проекту MFC,и в этой базе всего одно поле с текстовым типом...

Нужен способ помещения разного рода типа данных в контейнеры типа массивов или структур - C++
Сабж. Нужен способ помещения разного рода типа данных в контейнеры типа массивов или структур или... пободного рода простых для восприятия...

Как сделать что бы в listbox было типа заголовков, а в ValueListEditor содержание(что то типа бд) - C++ Builder
Как сделать что бы в listbox было типа заголовков, а в ValueListEditor содержание?

Выбор верного типа данных - C++
Здравствуйте! У меня такой вопрос, если я хочу использовать в программе число 10^-9, то какой тип мне для этого надо использовать? ...

Правильный выбор типа данных - VBA
Помогите ,пожалуйста, выбрать тип данных. Считаем уравнение.:wall: Sub lab() Dim y As Currency Dim k As Integer Dim m As Integer ...

Как организовать правильный выбор данных из таблицы? - C# MVC
Здравствуйте господа программисты :-) Имеется сложность с выбором данных из таблицы. Есть представление @model...

32
rao
854 / 407 / 119
Регистрация: 02.04.2014
Сообщений: 1,183
09.06.2016, 19:32 #2
Мне кажется на быстродействие кода размер и тип операндов не влияет потому что процессору без разницы что складывать/вычитать/умножать/делить char'ы (или byte), short'ы или int'ы - количество тактов на операцию будет одинаковое.
0
_liv_
234 / 234 / 87
Регистрация: 07.10.2015
Сообщений: 643
Завершенные тесты: 1
09.06.2016, 19:39 #3
Цитата Сообщение от rao Посмотреть сообщение
количество тактов на операцию будет одинаковое
Не совсем так...
Short-ы преобразуются в int-ы.
Так что, если хотите (совсем чуть-чуть!) выиграть в скорости, то лучше хранить в int-ах.
1
rao
854 / 407 / 119
Регистрация: 02.04.2014
Сообщений: 1,183
09.06.2016, 20:11 #4
_liv_, а с чего это short'ам преобразовываться в int'ы если процессор может спокойно работать не только с целыми регистрами (32 битными: EAX, ECX, EDX и т.д.), но и с их половинками (8 битными AX, BX, и тд.) ?
0
_liv_
234 / 234 / 87
Регистрация: 07.10.2015
Сообщений: 643
Завершенные тесты: 1
09.06.2016, 21:13 #5
rao, разумеется, может. Но, при работе, например, на 32-битной системе, основной единицей является 32-битный int.
При работе с 16-битными регистрами, в код добавляется префикс, который удлиняет и код, и время работы, даже если не будет преобразования в 32-битный int.
Поэтому оптимальнее всего работать именно с 32-битными величинами.
Посмотрите в отладчике ассемблерный код и сами убедитесь...
1
rao
854 / 407 / 119
Регистрация: 02.04.2014
Сообщений: 1,183
09.06.2016, 22:58 #6
Посмотрел, но сомнения остались. Потому что преобразование происходит не всегда. Например строка
C++
1
WORD wordTest = 3;
компилируется в
Assembler
1
2
mov         ecx,3 
mov         word ptr [ebp-0C0h],cx
Т.е. никакого преобразования нет.
А вот сложение двух ячеек памяти происходит с "расширением:"
C++
1
WORD wordSum =  wordTest + wordTest;
выглядит так:
Assembler
1
2
3
4
movzx       eax,word ptr [ebp-0C0h] 
movzx       ecx,word ptr [ebp-0C0h] 
add         eax,ecx 
mov         word ptr [ebp-0CCh],ax
Так себя ведет компилятор Visual Studio 2008 с выключенной оптимизацией. Вполне возможно, что другие компиляторы генерируют другой код. Поэтому однозначно утверждать об оптимальности 32-битных переменных я бы все таки не стал.
2
karat39
6 / 6 / 2
Регистрация: 09.02.2016
Сообщений: 137
09.06.2016, 23:11  [ТС] #7
Спасибо, хорошее обсуждение получается

Добавлено через 8 минут
Цитата Сообщение от _liv_ Посмотреть сообщение
При работе с 16-битными регистрами, в код добавляется префикс, который удлиняет и код, и время работы
я правильно понял, что удлинение кода ведет к увеличению времени работы?
0
Почтальон
Модератор
462 / 390 / 76
Регистрация: 22.03.2015
Сообщений: 3,025
Завершенные тесты: 1
10.06.2016, 08:28 #8
Цитата Сообщение от karat39 Посмотреть сообщение
я правильно понял, что удлинение кода ведет к увеличению времени работы?
Такое бывает не всегда, все зависит от сложности алгоритма, наличие циклов, вызовы библиотек и т.п.
0
CheshireCat
Эксперт С++
2896 / 1245 / 78
Регистрация: 27.05.2008
Сообщений: 3,411
10.06.2016, 10:01 #9
Цитата Сообщение от karat39 Посмотреть сообщение
Код работает с целыми числами. Для целых чисел в с++ разработан целый набор типов для конкретных задач. На что может повлиять выбор того или иного типа? Если я работаю с числами до 1000, то например, можно использовать short int и unsigned short int и int. При этом логично использовать short int в целях экономии памяти. Но не проиграю ли я в производительности? Что очень важно.
Premature optimization is the root of all evil. (c) Donald Ervin Knuth.

Не лучше ли сначала написать правильный алгоритм, и, если он "вдруг" окажется недостаточно производительным, - посмотреть профилировщиком, где узкое место, и оптимизировать именно и только это узкое место?
0
karat39
6 / 6 / 2
Регистрация: 09.02.2016
Сообщений: 137
10.06.2016, 10:06  [ТС] #10
Цитата Сообщение от CheshireCat Посмотреть сообщение
Не лучше ли сначала написать правильный алгоритм, и, если он "вдруг" окажется недостаточно производительным, - посмотреть профилировщиком, где узкое место, и оптимизировать именно и только это узкое место?
конечно лучше. Код и так не плох. Я просто человек въедливый и мне важна каждая мелочь. Если есть шанс на данной платформе выжать еще микросекунду, я буду ее выжимать. =)
0
CheshireCat
Эксперт С++
2896 / 1245 / 78
Регистрация: 27.05.2008
Сообщений: 3,411
10.06.2016, 10:38 #11
Ну ты перфекционист ) А что говорит Заказчик по этому поводу? Нужно ли ее выжимать? Будет ли Заказчик платить за это деньги?
0
karat39
6 / 6 / 2
Регистрация: 09.02.2016
Сообщений: 137
10.06.2016, 10:46  [ТС] #12
Цитата Сообщение от CheshireCat Посмотреть сообщение
Ну ты перфекционист ) А что говорит Заказчик по этому поводу? Нужно ли ее выжимать? Будет ли Заказчик платить за это деньги
Да, бьемся за каждую микросекунду.
Приходится замерять под конкретной платформой даже стандартные функции (например, sprintf, atoi) и реализовывать свои решения.
0
CheshireCat
Эксперт С++
2896 / 1245 / 78
Регистрация: 27.05.2008
Сообщений: 3,411
10.06.2016, 10:55 #13
Тады да, согласен. Ну что ж, лучший выход в твоем случае - спускаться на уровень ассемблерного кода и смотреть. Потому что даже из одного и того же исходного кода две разные версии одного и того же компилятора (например, GCC 4.8 и 5.2) могут нагенерировать разный код.
0
karat39
6 / 6 / 2
Регистрация: 09.02.2016
Сообщений: 137
10.06.2016, 11:02  [ТС] #14
Цитата Сообщение от CheshireCat Посмотреть сообщение
Потому что даже из одного и того же исходного кода две разные версии одного и того же компилятора (например, GCC 4.8 и 5.2) могут нагенерировать разный код.
Спасибо, так и эксперементирую. Применяю даже Intel. Но сколько бы его не хвалили, ощутимо в моих задачах он себя еще не показал.
Что касается ассма, тоже пытаюсь до него спуститься. Не все пока получалось. Я заводил тут тему соответствующую.
Пытаюсь банально на асме обогнать и strcpy и memcpy, подгоняя размеры блоков памяти (db, dw, и тд) для меньшего количества итераций, не получается обогнать. Хотя дизассебмлерный strcpy генерирует невероятное кол-во кода. Не хватает знаний скорее всего про память, процессор, взаимодействие и тд. Ну ничего, решатся более глобальные задачи, спущусь до оптимизации и до этого уровня =))
0
_liv_
234 / 234 / 87
Регистрация: 07.10.2015
Сообщений: 643
Завершенные тесты: 1
10.06.2016, 11:03 #15
rao, Вы забыли добавить, что перед каждой командой, у которой стоит word ptr
добавляется префикс 0x66, который удлиняет и команду и время работы на один цикл
Если в одном месте, то немного, но если будет везде, то может и набежать...
Кроме того, некоторые компиляторы формируют так:
mov eax, [dword]
and eax, 0xffff
что тоже удлиняет код
2
10.06.2016, 11:03
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.06.2016, 11:03
Привет! Вот еще темы с ответами:

Выбор типа базы данных - C#
Лирическая часть. В университете получил тему на доклад: "Тенденції в утворенні складних слів.", для того что-бы сделать выводы надо...

Выбор типа источника данных - Visual C++ БД
Работаю в Visual Studio 2008. При попытке выбрать тип источника данных на вкладке "Data Source Configuration Wizard" отсутствуют ...

Выбор типа данных пользователем во время работы программы - C#
Работаю с формами, хочется сделать выбор пользователем типа данных во время работы. Собственно вопрос, можно ли сделать так что бы...

Выбор типа данных VBA при сравнении нецелых чисел - VBA
Добрый день! Подскажите, плз., какой тип данных выбрать если необходимо сравнить нецелые числа между собой и произвести с ними...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.