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

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

Восстановить пароль Регистрация
 
Izual
 Аватар для Izual
93 / 118 / 6
Регистрация: 13.11.2012
Сообщений: 1,525
13.07.2016, 22:37     Скорость или размер. Динамика #1
Есть ряд вопросов..
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)...

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

C++ WinAPI Как изменить размер файла (если программно) или существует ли функция SetFileSize?
C++ Скорость или структурность кода
C++ размер окна или на весь экран
Динамика, динамика и снова динамика C++
HTTP: скорость загрузки сайта, размер веб-страницы, количество файлов C++ Builder
C++ Builder Установочник - быстрая скорость установки и небольшой размер
C++ Linux канировать вложеные каталоги или узнать размер папки
C++ WinAPI Как изменять размер контролов при разворачивании на весь экран диалога или изменении его размера?
C++ Builder TXMLDocument статика или динамика?
TStringList, как к нему обратиться, чтобы изменить размер или стиль шрифта? C++ Builder
Значение lim-1 неизвестно. Как программа узнаёт размер? или это формальный параметр C++
Не работает динамический массив в классе: что раньше, указатель или размер? C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
hoggy
5418 / 2217 / 410
Регистрация: 15.11.2014
Сообщений: 4,984
Завершенные тесты: 1
14.07.2016, 11:17     Скорость или размер. Динамика #2
1-2, если утрировать, то у камня есть кэш.
в этот кэш страничками влазиют данные.
если понадобились данные, которые находятся за пределами странички,
тогда текущую страничку в топку, и подгружаем новую.

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

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

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

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

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

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

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

5.
не распарсил этот поток сознания.
Izual
 Аватар для Izual
93 / 118 / 6
Регистрация: 13.11.2012
Сообщений: 1,525
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.
hoggy
5418 / 2217 / 410
Регистрация: 15.11.2014
Сообщений: 4,984
Завершенные тесты: 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

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

основная масса конечно как всегда на языке вероятного противника.
Izual
 Аватар для Izual
93 / 118 / 6
Регистрация: 13.11.2012
Сообщений: 1,525
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?
Izual
 Аватар для Izual
93 / 118 / 6
Регистрация: 13.11.2012
Сообщений: 1,525
18.07.2016, 15:13  [ТС]     Скорость или размер. Динамика #6
Заинтересовал более конкретно вопрос почему подобия realloc нету в плюсах, а так же его внутреннее устройство. Кроме sbrk() функции правда, почти ничего не написано, хотя есть пару статей, где описано подобие того, как устроено выделение памяти логически(не программно), смущяет правда, что даже ASM вставок для этих дел - нету, хотя думаю что именно asm разъяснил бы вопрос о том как и где конкретно выделяется память и как контролировать процесс realloc. (ведь если бы бы открытый код выделения памяти, то можно было бы хотя бы смотреть сколько свободного куска есть после текущей выделенной памяти.
Yandex
Объявления
18.07.2016, 15:13     Скорость или размер. Динамика
Ответ Создать тему
Опции темы

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