![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Пользователь
Регистрация: 07.06.2011
Сообщений: 28
|
![]()
Написал статью по оптимизации памяти в программах на С++. Ее можно почитать тут:
http://itw66.ru/blog/c_plus_plus/491.html А какие методы вы можете предложить по повышению эффективности программы, при помощи организации данных в памяти определенным образом?
Портал "It Works" (http://itw66.ru), на котором веду множество блогов по программированию и философии (FiloXSee).
|
![]() |
![]() |
![]() |
#2 | ||||||||
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
![]() Цитата:
Цитата:
почему медленнее, то? где обьяснения причин?(если что я знаю почему) Цитата:
Цитата:
![]() не знал что банальный test dword[ecx+<смещение>],0 будет так долго выполнятся... Цитата:
Цитата:
и дальше, данные то теперь не рядом хранятся, тут вступает пункт выделенный жирным. да и возможность утечек выше. Цитата:
да и работать с таким не очень уютно Цитата:
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. Последний раз редактировалось Пепел Феникса; 05.07.2011 в 11:05. |
||||||||
![]() |
![]() |
![]() |
#3 | |
Пользователь
Регистрация: 07.06.2011
Сообщений: 28
|
![]() Цитата:
Проверка флага - это не долго. Долго перестраивать конвейер процессора, в случае ошибки бранч предикшена (который на PS3 и так слабый). Я же написал "для получения объекта", а не для его создания. Т.е. идем по массиву указателей на объекты. Чтобы проверить поле каждого объекта нужно разыменовать указатель и получить объект из памяти. Кашмис будет стопроцентный, т.к. объекты идут не подряд в памяти. Это значит, что для получения каждого объекта будет обращение к оперативной памяти, а это уже 600 тактов процессора. И так для каждого объекта.
Портал "It Works" (http://itw66.ru), на котором веду множество блогов по программированию и философии (FiloXSee).
|
|
![]() |
![]() |
![]() |
#4 |
Пользователь
Регистрация: 07.06.2011
Сообщений: 28
|
![]()
Разыменование указателя - это получение данных из памяти по указателю:
Обращение к L1 - 20 тактов. Обращение к L2 - 100 тактов. Обращение к общей памяти - 600 тактов. Это значит, что разыменовывать указатель очень дешево, если все данные в памяти процессора и намного выгоднее чем кэшмис. Если вы работаете с данными которые уже в памяти, то кэшмиса не будет. А если заменить указатель на сами данные, то размер увеличивается, данные не помещаются в кэш и все работает намного дольше т.к. для каждого объекта нужно заново получить данные из оперативной памяти.
Портал "It Works" (http://itw66.ru), на котором веду множество блогов по программированию и философии (FiloXSee).
|
![]() |
![]() |
![]() |
#5 | ||||
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
![]() Цитата:
std::vector<class> и std::vector<class*> совсем разные вещи, но говорите вы про первое Цитата:
Цитата:
а то у вас написано коллекция объектов, ну я на код внимания не обратил.(в коде то коллекция указателей на объекты) Цитата:
да и не думаю что проц будет ради работы с полем класса, грузить в кэш весь объект ![]() Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. Последний раз редактировалось Пепел Феникса; 05.07.2011 в 11:20. |
||||
![]() |
![]() |
![]() |
#6 |
Пользователь
Регистрация: 07.06.2011
Сообщений: 28
|
![]()
Внешний код работает с коллекцией, так что ему без разницы как она устроена. Хранить однотипные данные в своих массивах намного эффективнее чем группировать их в объекты и хранить объекты.
ООП - это хорошо для бизнесс логики. Но часто очень плохо, когда речь идет о данных и работе с ними. Если нужно часто перемножать матрицы, то значительно эффективнее, если они будут в смежной памяти, чем в составе своих объектов.
Портал "It Works" (http://itw66.ru), на котором веду множество блогов по программированию и философии (FiloXSee).
|
![]() |
![]() |
![]() |
#7 | |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
![]() Цитата:
тут нужно верно проектировать, если нам чаще нужен весь объект а не отдельное поле, то лучше группировать данные, если же чаще нужно какое то отдельное поле, то лучше будет если оно будет отдельно.(причем это все для коллекций, для одиночных объектов не особо актуально) Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
|
![]() |
![]() |
![]() |
#8 |
Пользователь
Регистрация: 07.06.2011
Сообщений: 28
|
![]()
Согласен. Это все более справедливо для систем с большим количество данных чем для иерархий логических объектов. Хотя и для них пункт 3 является актуальным.
Портал "It Works" (http://itw66.ru), на котором веду множество блогов по программированию и философии (FiloXSee).
|
![]() |
![]() |
![]() |
#9 |
C/C++, Asm
Участник клуба
Регистрация: 02.03.2010
Сообщений: 1,323
|
![]()
При выполнении какой либо оптимизации, нужно ответить вопрос: для чего эта оптимизация нужна?
Большинство современных компиляторов довольно нелохо справляются с различного рода оптимизациями самостоятельно. Плюс системный менеджер памяти тоже не дураки писали. Конечно, в общеоразовательных целях можно попробовать разное и посмотреть как оно влияет на производительность. Вот например Intel для достижения максимальной производительности рекоммендует выранивать блоки памяти как минимумум по 64 байтной границе, еще лучше если и размер самих блоков кратен 64. Последовательное заполнение это конечно позитив, но принимая во внимание, что современные процы могут кешить данные из 8 различных страниц памяти одновременно то позитив от подобного раположения будут испытывать только однопроходные процедуры не использующие одни и те же данные многократно. Плюс общая рекоменданция это не столько последовальное расположение данных сколько регулярное (разрешен ненулевой интервал, не больше 64 байт, между группами данных). Плюс есть операции перещения данных в обход кеша, которые в теории страшно увеличивают производительность. Ну, вобщем есть много различных путей, и не факт, что компилятор делает хуже. |
![]() |
![]() |
![]() |
#10 | |
C/C++, Asm
Участник клуба
Регистрация: 02.03.2010
Сообщений: 1,323
|
![]() Цитата:
Такое возможно если память используется несколькими потоками одновременно и любая операция на ней приводит к событию синхронизации. Если память приватная, то эти цифры нужно поделить на 5, чтобы приблизиться к реальности. Кстати, случайно заметил постоянные референсы на PS3, это что про оптимизацию для PS3? Потому что я писал про х86 от Intel. Последний раз редактировалось f.hump; 05.07.2011 в 11:55. |
|
![]() |
![]() |
![]() |
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Методы оптимизации кода | FiloXSee | Общие вопросы C/C++ | 33 | 09.06.2011 09:06 |
Методы оптимизации | Lazio | Фриланс | 3 | 11.12.2010 12:05 |
методы оптимизации первого порядка | Olenka555 | Помощь студентам | 0 | 21.05.2010 16:43 |
Методы оптимизации в Excel | Raikhman | Microsoft Office Excel | 2 | 10.02.2009 11:17 |