|
77 / 50 / 16
Регистрация: 17.05.2015
Сообщений: 262
|
|
Оптимизация, сжатие переменных10.02.2016, 05:19. Показов 3175. Ответов 35
Метки нет (Все метки)
Есть у меня програмка, абстракный эмулятор псевдо эволюции так сказать.
Есть в нем класс, который имеет много перемен типа double и int. Порядка 20-25 (в будущем будет 35+). Класс сам себя регулярно копирует и помещает в список. Когда делаю тестовый прогон - то миллион созданных обьектов сжирают у меня 1-1.2ГБ оперативной памяти (а я замахиваюсь на 10 миллионов). Большая часть этих перемен почти никогда не достигнит значения 10 000, от сюда мне пришла идея, что если хранить эти параметры в одной unsigned long (или нескольких). Вот например, создаем переменную 's = 1' (первая цифра в ней условная), умножаем ее на 10 000 и прибавляем наш первый блок данных, потом умножаем опять на 10 000 и прибавляем второй блок данных, опять на 10 000 и опять прибавляем блок данных и т.д. Например: 1*10000 + 455 10455 * 10000 + 2865 104552865 * 10000 + 54 1045528650054... С плавающей точкой нужно определить, сколько знаков после запятой нам надо (мне лично нужен только один знак), тут все тоже самое, только блок данных будут на один символ больше занимать. Но перед тем как городить огород. Есть же наверняка готовые велосипеды, что бы хранить много данных в одной переменной или оптимизированном под это контейнере, что бы не выделять под каждый блок данных по 4-8 байт? Хотя есть у меня сомнения, что QObject сам по сибе жрет больше, чем все эти переменные.
0
|
|
| 10.02.2016, 05:19 | |
|
Ответы с готовыми решениями:
35
Оптимизация в пределах линейных участков - исключение лишних переменных Сжатие и оптимизация БД
|
|
1379 / 406 / 144
Регистрация: 22.10.2014
Сообщений: 872
|
|
| 12.02.2016, 12:30 | |
|
0
|
|
|
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
|
|||
| 12.02.2016, 23:24 | |||
|
0
|
|||
|
77 / 50 / 16
Регистрация: 17.05.2015
Сообщений: 262
|
||||||||||||||||||||||||||||||||||||
| 13.02.2016, 12:23 [ТС] | ||||||||||||||||||||||||||||||||||||
|
И так. Переписал пол кода.
Использовал стандартные классы, не QObject. Использовал стандартные контейнеры. (хотя QLinkedList мне кажется шустрее работает, чем std::list). Там где возможно, double заменил на флоат. На short|uint16_t думал менять, но пока на float остановился. Запили новый класс, общая карта координат всех обьектов, банально это лист указателей, не более. Так же я нарушил принцип инкапсуляции, ибо пришлось передавать указатели (хотя может мне просто зафриендить все эти классы между друг другом?) В функции life_cicle() у меня на каждом втором шаге вызывался rand() для создания случайности в разных просчета. Но эта rand жрала у меня 22% процессорного времени. Тут я просто создал переменную r = rand() и поставил ее везде за место rand. Так же передаю ее в функцию mutations, что бы там не вызывать rand(). В итоге и рандоминизация осталась в принципе и с экономил около двадцати процентов процессорного времени. Самое прожорливое теперь у меня, это конструктор самого обьекта, а именно оператор new и map.push. =) main.cpp Кликните здесь для просмотра всего текста
dna.h, dna.cpp Кликните здесь для просмотра всего текста
Кликните здесь для просмотра всего текста
simpleOrganism.h, .cpp Кликните здесь для просмотра всего текста
Кликните здесь для просмотра всего текста
map.h, .cpp Кликните здесь для просмотра всего текста
Кликните здесь для просмотра всего текста
После всех этих манипуляций в 1077Мб влезло 2.18 миллиона. обьектов.
0
|
||||||||||||||||||||||||||||||||||||
|
1379 / 406 / 144
Регистрация: 22.10.2014
Сообщений: 872
|
|||||||||||
| 13.02.2016, 12:56 | |||||||||||
|
Valeryn,
0
|
|||||||||||
|
77 / 50 / 16
Регистрация: 17.05.2015
Сообщений: 262
|
||
| 13.02.2016, 13:08 [ТС] | ||
|
Я если честно не могу не как понять принцип работы оператора auto. Почему у тебя написано именно auto&, а не auto?
0
|
||
|
1379 / 406 / 144
Регистрация: 22.10.2014
Сообщений: 872
|
|||||||
| 13.02.2016, 14:48 | |||||||
0
|
|||||||
|
77 / 50 / 16
Регистрация: 17.05.2015
Сообщений: 262
|
|
| 13.02.2016, 14:51 [ТС] | |
|
0
|
|
|
1379 / 406 / 144
Регистрация: 22.10.2014
Сообщений: 872
|
||
| 13.02.2016, 14:54 | ||
|
Просто поменяйте цикл в деструкторе мапы и дальше валгриндом посмотрите что да как получается.
0
|
||
|
77 / 50 / 16
Регистрация: 17.05.2015
Сообщений: 262
|
|||||||||||||
| 13.02.2016, 15:00 [ТС] | |||||||||||||
|
Еще такой момент сделал. Убрал цикл очистки, который удалял "трупы", теперь в том же цикле, где и просчитывается жизнь обьекта - проверяется, не мертв ли обьект и не пора ли его удалить, перед вызовом жизненного цикла.
Пошел костылями, теперь внутри каждого обьекта находится итератор, который указывает на них же в объекте map, что бы при удалении обьекта, он сам себя удалял из контейнера, не вызывая лишних циклов. До этого был отдельный цикл, который удалял мертвые обьекты и еще один отдельный цикл, который удалял из карты все мертвые обьекты. (т.е. два лишьних цикла, но благодоря костылю - он теперь один, он же и слишком мертвых удаляет, он же и контейнер Map::map очищает, что бы не дай бог указатель не указал на удаленный обьект.) SimpleOrganism::dna_calc() Кликните здесь для просмотра всего текста
map: ush()Кликните здесь для просмотра всего текста
Добавлено через 3 минуты Вот я к чему
0
|
|||||||||||||
|
1379 / 406 / 144
Регистрация: 22.10.2014
Сообщений: 872
|
||
| 13.02.2016, 15:02 | ||
|
Valeryn, У вас организмы в течении одного жизненного цикла осуществляют взаимодействие? а будут взаимодействовать?
Что-то я такого не нашел в коде ) Добавлено через 46 секунд
0
|
||
|
77 / 50 / 16
Регистрация: 17.05.2015
Сообщений: 262
|
||
| 13.02.2016, 15:37 [ТС] | ||
|
В дальнейшем конечно будут взаимодействовать. Для этого им координаты прикрутил и сделал список, по которому они друг друга искать будут. Хотя я думаю может лучше пусть друг друга ищут с помощью бродкастов/сообщений? Но тут все равно им придется от куда то извлекать координаты получателей.
0
|
||
|
1379 / 406 / 144
Регистрация: 22.10.2014
Сообщений: 872
|
|
| 13.02.2016, 16:01 | |
|
Valeryn, Тогда если размеры живности - не определены - то гуглите и пишите QuadTree, если определены, то vector<vector<живность*>> сойдёт.
И соответственно никаких листов. )
0
|
|
|
77 / 50 / 16
Регистрация: 17.05.2015
Сообщений: 262
|
||
| 13.02.2016, 16:27 [ТС] | ||
|
QuadTree - это некий двумерный массив, в нутри которого обсчитываются обьекты. Но когда их много - массив делиться на несколько массивов, а потом еще на несколько и т.д.? А вот второе, зачем мне вектор векторов обьектов?) Ну будет этакий двумерный контейнер с обьектами, а что даст? Я лист почему использую то, потому что последовательно обрабатываются все обьекты и из контейнера периодически удаляются и создаются обьекты, лист по сравнению с вектором существенно быстрее удаляет/добавляет обьекты из произвольной позиции.
0
|
||
|
1379 / 406 / 144
Регистрация: 22.10.2014
Сообщений: 872
|
||||
| 13.02.2016, 16:49 | ||||
0
|
||||
|
77 / 50 / 16
Регистрация: 17.05.2015
Сообщений: 262
|
||||||||||||||||||||||
| 15.02.2016, 03:40 [ТС] | ||||||||||||||||||||||
|
Но тут есть неоспоримый плюс - можно в отдельном потоке просчитывать каждый квадрат. Но тут же и минус, ибо надо обьекты перекидывать из потока в поток, при миграции между блоками, а тут блокировки/тормоза. Но пока сделал однопоточное решение. map.h, cpp Кликните здесь для просмотра всего текста
Кликните здесь для просмотра всего текста
VectorMove.h, cpp Кликните здесь для просмотра всего текста
Кликните здесь для просмотра всего текста
Написал вектор движения и просчет движения обьекта. Но пока мне кажется, что функция new_vector слишком тяжелая, из за вычесления длины вектора и деления его на скорость. Последущее
0
|
||||||||||||||||||||||
|
77 / 50 / 16
Регистрация: 17.05.2015
Сообщений: 262
|
|
| 16.02.2016, 09:25 [ТС] | |
|
IT'S ALIVE!
0
|
|
| 16.02.2016, 09:25 | |
|
Помогаю со студенческими работами здесь
36
Оптимизация функции n переменных Оптимизация двух переменных Безусловная оптимизация. Функция 2-х переменных.
Оптимизация кода, универсальное имя переменных Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
|
Оттенки серого
Argus19 18.03.2026
Оттенки серого
Нашёл в интернете 3 прекрасных модуля:
Модуль класса открытия диалога открытия/ сохранения файла на Win32 API;
Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
|
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога
Финальные проекты на Си и на C++:
finish-rectangles-sdl3-c. zip
finish-rectangles-sdl3-cpp. zip
|
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие.
Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
|
|
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ВВЕДЕНИЕ
Выполняя задание на управление насосной группой заполнения резервуара,. . .
|
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
|
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога
Финальные проекты на Си и на C++:
hello-sdl3-c. zip
hello-sdl3-cpp. zip
Результат:
|
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога
MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
|