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

C++

Войти
Регистрация
Восстановить пароль
 
Izual
94 / 119 / 6
Регистрация: 13.11.2012
Сообщений: 1,551
#1

Скорость или размер. Динамика - C++

13.07.2016, 22:37. Просмотров 268. Ответов 5
Метки нет (Все метки)

Есть ряд вопросов..
1) Что быстрее считает процессор (соответственно с разрядностью). К примеру динамически создаётся массив. Из этого массива надо вычислить к примеру c=a+b. Если c = m[0] и a = m[1], то есть ли разница в скорости обработки (подачи аргумента в функцию/арифметическую операцию?) если сравнивать b = m[2] или b = m[3].
2) Какова скорость обработки указателей, есть ли какие то зависимости? Например если передача аргумента через одиночный указатель = 1т, то через двойной указатель, будет например 2т..
3) При применении realloc (аналога в плюсах не нашёл, кроме как vector), если последующий размер массива больше предыдущего, то данные которые были в предыдущем - копируются, однако если непрерывная память будет свободна для дополнения меньшего массива, то копировать не придётся, т.к. данные малого массива останутся на месте, а новый указатель будет указывать на тот же байт что и прошлый. И так, есть ли возможность отследить, что realloc'у прийдётся передвинуть целиком массив (что поведёт к копированию старых данных, это же затраты на скорость)?
4) Если создавать свой VARIANT, встаёт проблема, что необходимо хранить тип переменных, это значит что прийдётся как минимум увеличить размер структуры/класса VARIANT в два раза (от размера большего типа, например - double 8byte, и для добавления поля type прийдётся выделить хотя-бы один байт, но т.к. спецификация структур/классов такова, что полный размер структуры должен быть кратен - большему из его членов, то один байт превращяется в 8byte, и структура становится равной 16byte-минимум). И так следуюя из этого, не выгодно использовать VARIANT вообще, с позиции размера памяти, с другой стороны можно создать ещё один массив, который будет хранить типы в числовом значении (типа enum), но тогда при обращении к перменной прийдётся постоянно передвигать указатель (стэковый или что это?) из Var[i] в Type[i] соответственно, где один массив - variant(8байтный), другой - массив типов. Оправданно ли будет использование вторичного массива содержащего типы, дабы не "засорять" оперативку лишними 7 байтами(от каждой переменной, т.е. ~+85% лишней памяти). Или может есть какой то более оптимизированный подход? (конешно, если разсматривать Variant, то 7 байтов не будут простаивать в ряде случаев, например если переменная - PTR массив, и ему будет нужно число - опр. размерность этого под-массива, но в случае с 64ОС мы не сможем гарантировать что размер под-массива может быть предельным в 2^64, сдругой стороны это и не надо, ведь учитывая все переменные и текущую загруженность ОЗУ другими программами нам будет достаточно 7 байтов (можно даже обойтись unsigned long(4byte) 2^32 ).
5) Как один из вариантов, разсмотрел тут битовые поля, наткнулся на мысль, о возможности создания переменной с отличием от оригинала на 1бит, оправдано ли это? (если unsigned char - 2^8=256, то 2^7=128, потенциально структура примет размер в 1 байт, при этом у меня будет ещё 1 бит на хранение доп информации в виде true/false, данный пример разсматриваю как предпосылку к созданию 8 байтовой структуры/класса, где можно было бы переопределить размер большей переменной с 2^64, скажем до 2^58 + 2^6, для типов хватило бы 64)...

Буду благодарен как целевым ответам, так и ссылкам, где можно прочитать пару статей по данной тематике.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.07.2016, 22:37
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Скорость или размер. Динамика (C++):

TXMLDocument статика или динамика? - C++ Builder
Доброе всем время суток... Решал задачку по переводу данных из XML файла в текстовый определенного формата. Сделал при помощи...

Установочник - быстрая скорость установки и небольшой размер - C++ Builder
Друзья,есть программа написанная в Билдере.Как сделать к ней установочник?какими утилитами пользоваться?Никаких наворотов не надо,главное...

HTTP: скорость загрузки сайта, размер веб-страницы, количество файлов - C++ Builder
здраствуйте, у меня возникло ряд вопросов: буду делать дипломную работу, для етого думаю написать програму, кторая сможет следуючее: 1....

TStringList, как к нему обратиться, чтобы изменить размер или стиль шрифта? - C++ Builder
у меня есть переменные TStringList *inv; //текст вопроса и варианты ответов этот класс предназначен для хранения набора строк ...

Какой приблизительно размер добавляемого компонента и влияет ли он на размер самой программы - C++ Builder
Здравствуйте, меня интересует вопрос, когда создаешь какой нить компонент, какой приблизительно его размер и влияет ли он на размер самой...

Автоматически изменять размер объектов Image под размер формы - C++ Builder
Как сделать чтобы после запуска программы в C++ Builder можно было изменить размер формы, и размер объектов Image автоматически изменялся...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
hoggy
Нарушитель
6566 / 2747 / 474
Регистрация: 15.11.2014
Сообщений: 6,096
Завершенные тесты: 1
14.07.2016, 11:17 #2
1-2, если утрировать, то у камня есть кэш.
в этот кэш страничками влазиют данные.
если понадобились данные, которые находятся за пределами странички,
тогда текущую страничку в топку, и подгружаем новую.

ситуация, когда приходится гонять туда-сюда странички называется "кэш-миссы".

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

это интересная и объемная тема.
я рекомендую вам воспользоваться гуглом,
и открыть для себя "дата ориентированное программирования".

3.
насколько мне известно - нет.

4.
Цитата Сообщение от Izual Посмотреть сообщение
Или может есть какой то более оптимизированный подход?
вариативный тип данных представляет собой хранилище данных
для объектов разного типа.

и указатель на объект helper (type erasure),
который умеет "запоминать" тип хранимого ресурса.

в принципе, это все,
что нужно знать для его изготовления.

5.
не распарсил этот поток сознания.
1
Izual
94 / 119 / 6
Регистрация: 13.11.2012
Сообщений: 1,551
14.07.2016, 12:28  [ТС] #3
Цитата Сообщение от hoggy Посмотреть сообщение
указатель на объект helper (type erasure),
который умеет "запоминать" тип хранимого ресурса.
Не пойдёт мне кажется, загуглил.. но результатом возврата type_id будет соответствовать общяя структура VARIANT. (вложенный union он не возьмёт)
Вообще исходя из потери памяти при использовании VARIANT/union меня напрягает.. (например если я возьму максимальный член в union'e 8 байт, то всё что меньше - будет просто жрать лишнюю память, и ничего я с этим не смогу поделать, в виду того, что даже если хотел бы это оптимизировать, то всё к чему я смогу свести затраты - это использование в 86х - 4байтовых указателей на доп массивы с 8 байтовыми типами. А все что ниже границы в 4 байта - будет провисать. С другой стороны можно для меньших типов тоже сделать доп массивы, а в самом VARIANT держать порядковые номера.)
Цитата Сообщение от hoggy Посмотреть сообщение
в принципе, это все,
что нужно знать для его изготовления.
Да я уже давно этим занимаюсь, как сделать косо-криво, ну так как "принято" - это не проблема, но хочется же чего то более оптимального.
Цитата Сообщение от hoggy Посмотреть сообщение
"дата ориентированное программирования".
зайимусь) спс.

По поводу битовых полей - изначально я задумался а чем отличается signed от unsigned. Поидее если использовать 1бит, то можно в нём хранить знак, остальные биты уйдут непосредственно на значение, допустим Short: (unsigned)2^16=65536, если юзать 1 бит как показатель знака, то максимум останется 2^15 = 32768, но ведь если оно unsigned, то бит знака будет лишним. И так, значит компилер не юзает 1бит, а грубо говоря где то в кэше хранит type_id, в соответствии с которым в случае signed - если число заходит за предел в 32768, то автоматически делает X-32768, что и гарантирует отрицательное значение(ну это я утрирую конешно, в реалии я думаю сделано чуть логичнее). Так вот в этом случае использование битового поля неоправдано, но ведь если сущуствуют, то есть реальный пример того, где они могут сыграть полезную роль. Я не имею ввиду разбитие 1 байта на 8bool переменных, хотя это тоже хороший плюс. Я задумался над проблемой выделения больших кусков памяти, если в 86х ОС максимальный размер стэка (как и читаемой области памяти) это 4ГБ (2^32), то использовать unsigned long long не имеет смысла, т.к. как бы мы не хотели - помимо нашей программы ОСи придётся потратить ~1ГБ на себя и минимальные службы. Остаётся 3ГБ, если мы их выделим - это будет равносильно 100% использования ОЗУ, что поведёт плачевные последствия, тогда максимум для 86х будет 1.5 Гб (можно даже 2ГБ, ну с 500 метрами в запасе - жить возможно, подобный случай выделения 2гб=2^31 будет достаточно редким, поэтому можно ещё сократить, а 2гб планку оставить как exception. Думается что для нормы будет достаточно давать максимум на выделение - 250мб (должно быть это 2^28), в этом случае остаётся 4бита -> 2^4=16, ну в числе 16 можно сохранить покрайней мере основные типы. Это я всё к тому, чтоб оптимизировать максимальную границу с возможностью использовать "лишние биты" для нужных целей, в этом случае в памяти не будет лишних сегментов.

Добавлено через 20 минут
Цитата Сообщение от hoggy Посмотреть сообщение
"дата ориентированное программирования".
Такое not exist.
0
hoggy
Нарушитель
6566 / 2747 / 474
Регистрация: 15.11.2014
Сообщений: 6,096
Завершенные тесты: 1
14.07.2016, 12:42 #4
Цитата Сообщение от Izual Посмотреть сообщение
Такое not exist.
полным полно статей:
http://gamesfromwithin.com/data-oriented-design
http://www.dice.se/wp-content/upload...ted_Design.pdf
http://www.dataorienteddesign.com/dodmain/node3.html

если хорошенько поискать:
есть русские статьи,
есть переводы.

основная масса конечно как всегда на языке вероятного противника.
0
Izual
94 / 119 / 6
Регистрация: 13.11.2012
Сообщений: 1,551
14.07.2016, 14:09  [ТС] #5
hoggy, ну да, перевёл то не так) Ну пока гуглил наткнулся на пару статей, но это скорее про ООП, нежели о конкретике скорости обработки.
Я честно говоря даже сам вопрос толком сформулировать не могу, т.к. на столько глубоко не копался.
Поидее подвопрос таков:
Скорость доступа к ячейке памяти, относительная естественно, т.е. самое быстрое например это сдвиг (указателя на ячейку памяти?) принять за 1т. Ну и например если у меня будет 2 динамических массива, то посчитать во сколько раз больше уйдёт времени, если я буду использовать число через указатель на второй массив, нежели напрямую.
C++
1
2
3
4
5
6
7
8
int max = 100;
int *m = new int[max];
//заполнение массива лялля..
int *v = new int[max];
//заполнение массива лялля..
//а вот это сравнить:
int f = m[0];
int f = m[v[0]];
Так вот и непонятки из за того что я не особо понимаю как практически можно посчитать.
Ну например для получения значения из СД-диска, чисто физически должно быть что типа такого:
Разкрутка Привода (зависит от самого привода, ну и порченности диска) -> Перемещение головки к нужному адресу (т.е. сначала берём всё пространство диска, смотрим сколько там.. далее головка перемещяется от той точки где она сейчас, к той точке(радиусу диска?) где должен быть нужный адрес) -> Чтение битов из ячейки.
Ну и опять же я не знаю как головка там стоит, и какие то ещё ньансы..
А с оперативкой вообще туго.. Что читает адресную ячейку? (тоже что то типа головки) Если она прочитала адрес скажем в одном месте, то останется ли она там же, до следующего действия? При следующем действии, зависимость от расстояния адресов играет роль? А зависимость от кратности к каким то числам или операциям?
Поидее же при выполнении m[v[10]], должны быть последовательно: взятие адреса из ptr &v, смещение адреса на 10 ед(bits*type/byte), получение значения (int kk) по адресу, взятие адреса из ptr &m, смещение адреса на kk, получение значения. При этом окончательная скорость будет ли зависеть от расстояния адресов &v и &m?
0
Izual
94 / 119 / 6
Регистрация: 13.11.2012
Сообщений: 1,551
18.07.2016, 15:13  [ТС] #6
Заинтересовал более конкретно вопрос почему подобия realloc нету в плюсах, а так же его внутреннее устройство. Кроме sbrk() функции правда, почти ничего не написано, хотя есть пару статей, где описано подобие того, как устроено выделение памяти логически(не программно), смущяет правда, что даже ASM вставок для этих дел - нету, хотя думаю что именно asm разъяснил бы вопрос о том как и где конкретно выделяется память и как контролировать процесс realloc. (ведь если бы бы открытый код выделения памяти, то можно было бы хотя бы смотреть сколько свободного куска есть после текущей выделенной памяти.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.07.2016, 15:13
Привет! Вот еще темы с ответами:

Изменять размер панели под размер причаливаемых окон - C++ Builder
Имеется панель, которая выравнена относительно главного окна как alLeft. На панель причаливаются и отчаливаются другие окна фиксированного...

Как изменить размер файла (если программно) или существует ли функция SetFileSize? - C++ WinAPI
Друзья! До сей поры не было в этом необъходимости, а поскольку задача тривиальная (вроде бы) в существовании подобной функции я не...

Как изменять размер контролов при разворачивании на весь экран диалога или изменении его размера? - C++ WinAPI
Вся суть вопроса описана в заголовке темы)

Может ли оконная процедура различить, изменён ли размер окна функцией MoveWindow, или мышью за рамку окна? - C++ WinAPI
Стиль WS_BORDER | WS_SIZEBOX | WS_CHILDWINDOW | WS_CLIPSIBLINGS | WS_THICKFRAME | WS_VISIBLE.


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
18.07.2016, 15:13
Ответ Создать тему
Опции темы

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