|
23 / 22 / 4
Регистрация: 25.06.2018
Сообщений: 169
|
|||||||||||
Оптимальность использования "new" или объявление переменных в циклах25.02.2020, 19:40. Показов 2444. Ответов 13
Часто вижу использование "new" или объявление переменных в больших циклах. К примеру, при обновлении изображения.
Перерисовываем какой-нибудь кружечек - пишем "new", задаем его цвет, опять - "new". И все это в бесконечных циклах. Понятно что в ООП-шных компиляторах мусор чистится на корню. То есть, как я понимаю, на каждой итерации цикла "new" занимает память, а по завершении чистильщик ее освобождает. При этом, прятать переменные внутрь считается кошерным в среде ооп-шников. А. Инициализация В цикле
Интересует конкретно C# или Java. А. Инициализация ДО цикла
0
|
|||||||||||
| 25.02.2020, 19:40 | |
|
Ответы с готовыми решениями:
13
Обьявление переменных в циклах и до Найти в файле с текстом программы объявление переменных и подсчитать количество переменных Объявление структуры с возможностью использования в нескольких формах |
|
Модератор
3134 / 2281 / 469
Регистрация: 26.03.2015
Сообщений: 8,877
|
||
| 25.02.2020, 23:09 | ||
|
1
|
||
|
Администратор
|
|||||||
| 27.02.2020, 11:19 | |||||||
|
Серый74, если есть возможность вынести код создания объекта за пределы цикла, то лучше это сделать. Потому что, несмотря на то что сборщик мусора оптимизирован на быструю очистку нулевого поколения (в .NET по крайней мере), не надо создавать ему лишнюю работу.
2) Компилятор не имеет отношения к сборке мусора 3) "Чистка на корню" и сборка мусора это не одно и тоже. Если говорить про .NET и Java, то сборщик мусора запускается далеко не сразу.
0
|
|||||||
|
23 / 22 / 4
Регистрация: 25.06.2018
Сообщений: 169
|
||||||||||||
| 27.02.2020, 20:40 [ТС] | ||||||||||||
|
Анимация взлета ракеты
Анимация
С чисткой мусора вроде все понял, она тут вообще не сработает.
0
|
||||||||||||
|
Администратор
|
||||||||||||
| 28.02.2020, 00:57 | ||||||||||||
|
Серый74, я не большой специалист по графике, но я бы переписал код с меньшим количеством new. Нужно только убедиться что это не ломает программу. Если не ломает, то можно также посмотреть с помощью Process Explorer сколько памяти и, что важнее всего, GDI ресурсов потребляет программа. Потому что тут активно создаются объекты завязанные на GDI и ее ресурсы могут сильно напрягаться при активной анимации.
Более того - для скорости все эти brush-ы, pen-ы можно по идее закэшировать в полях класса. Добавлено через 1 час 27 минут new Point можно не брать в расчет т.к. Point это значимый тип.
0
|
||||||||||||
|
Модератор
3134 / 2281 / 469
Регистрация: 26.03.2015
Сообщений: 8,877
|
|
| 28.02.2020, 08:51 | |
|
Я бы вынес константные (по отношению к переменной цикла) вычисления за пределы цикла.
0
|
|
|
23 / 22 / 4
Регистрация: 25.06.2018
Сообщений: 169
|
|||||||||||
| 28.02.2020, 21:50 [ТС] | |||||||||||
|
Решил попробовать потестить разные варианты объявления переменной в консоли.
Адреса памяти - одинаково не меняются. Но что самое прикольное, при переобъявлении переменной в цикле, ее значение даже не обнуляется.
0
|
|||||||||||
|
Администратор
|
||||
| 29.02.2020, 00:02 | ||||
|
0
|
||||
|
|
||
| 29.02.2020, 10:53 | ||
|
Классы SolidBrush и GraphicsPath - это IDisposable классы, и к ним привязаны ресурсы системы. И для них обязательно нужно вызывать Dispose, иначе память очень быстро закончится.
0
|
||
|
23 / 22 / 4
Регистрация: 25.06.2018
Сообщений: 169
|
||||||||
| 29.02.2020, 11:21 [ТС] | ||||||||
|
То есть. При объявлении переменной внутри цикла, компилятор сперва проверяет, существует ли она или нет. И если нет - то создает ее, а если она уже есть - просто обращается к ней, без изменения значения. Сейчас проверил на C#. Этот костыль сидит только в цикле. Внутри функции такое не работает, переменная каждый раз создается заново. По крайней мере обнуляется, учитывая что адрес остается тот же. Я думаю, эта лишняя проверка замедляет работу цикла. Наверно это одна из причин, по которой всякие движки пишутся на чем-то низкоуровневом.
В ООП, по крайней мере в C#, код будет "плохим" в любом случае. Судя по моим тестам с объявлением переменной, вообще не важно где ее прописывать. Перед циклом или внутри него. Программа все-равно перепроверяет ее постоянно, как объект в singleton-е. И явно замедляет работу. А вот память как раз может и не тратится. В мое примере адрес переменной вообще не меняется. Уверен, с объектами будет не лучше.
0
|
||||||||
|
|
||
| 29.02.2020, 11:35 | ||
|
Если сильно упрощенно, то с локальными переменными метода компилятор работает так: 1) Компилятор смотрит какие переменные объявлены в методе(независимо от их местоположения) и создает их список. Обратите внимание, что число переменных в методе - фиксированно и заранее известно, даже если переменная в цикле. Известен также и размер переменных. Если переменная является указателем на объект - то 4(или 8) байта, если структурного типа - то размер равен размеру структуры. 2) Компилятор считает суммарный размер памяти под переменные. Это возможно, потому что известно их количество и их размер. 3) При вызове метода, компилятор один раз при входе в метод резервирует кусок памяти в стеке под все переменные метода. 4) При выходе из метода, стек автоматически откатывается и память освобождается. Что делает использование переменных практически бесплатным, поскольку сборщику мусора не нужно забоится о стеке, он освободится сам. Сборщик же мусора занимается только объектами, но не ссылками на них, которые и хранятся в переменных. Таким образом, что вы объявите переменную внутри цикла, что снаружи - разницы абсолютно нет. Тут главное не путать объявление переменной, и создание объекта для переменной. Это две большие разницы.
0
|
||
|
23 / 22 / 4
Регистрация: 25.06.2018
Сообщений: 169
|
||
| 29.02.2020, 12:00 [ТС] | ||
|
Вопрос по работе уже скомпилированной программы. Конкретно, "new" перед циклом или внутри него - даст разницу в производительности?
0
|
||
|
|
||
| 29.02.2020, 12:19 | ||
Сообщение было отмечено Серый74 как решение
РешениеДля структурных типов: при каждом new будет затрачено время на очистку и инициализацию уже выделенной памяти (в стеке). Для ссылочных типов: при new каждый раз будет выделяться память в куче и будет вызван конструктор объекта.
1
|
||
|
Модератор
3134 / 2281 / 469
Регистрация: 26.03.2015
Сообщений: 8,877
|
||
| 01.03.2020, 12:31 | ||
|
А пример с отрисовкой из другой серии - там константа вычисляется внутри цикла.
0
|
||
| 01.03.2020, 12:31 | |
|
Помогаю со студенческими работами здесь
14
объявление переменных Объявление переменных в С++ Объявление переменных Объявление переменных Объявление переменных Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога
SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
|
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога
SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
|
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
|
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога
SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
|
|
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога
Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip"
Извлеките архив и вы увидите. . .
|
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога
Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д.
Сборка примера
Скачайте. . .
|
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
|
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net
REST сервисы временно не работают, только через Web.
Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
|