В .NET вы можете установить генерацию объекта GC или иным образом указать, что он собирается выйти из области видимости?

Чтобы увеличить размер вашей фигуры в N раз, вам нужно вставить это прямо перед вашим pl.show ():

N = 2
params = pl.gcf()
plSize = params.get_size_inches()
params.set_size_inches( (plSize[0]*N, plSize[1]*N) )

Он также хорошо работает с ноутбуком ipython.

3
задан TheHansinator 2 March 2019 в 01:04
поделиться

2 ответа

Фундаментальный принцип работы сборщиков мусора в .NET и Java заключается в том, что, если память не будет полностью повреждена, никогда не будет возможно наблюдать ненулевую ссылку, которая не идентифицирует живой объект. Если в .NET Framework или виртуальной машине Java была включена функция для явного освобождения связанной с управляемой GC ссылки, они должны были бы убедиться, что никаких наблюдаемых ссылок на объект нигде не существует, прежде чем он сможет перезапустить хранилище. Поскольку такая гарантия будет стоить примерно столько же, сколько цикл сбора мусора, а цикл GC может освободить хранилище для объекта без необходимости ссылки на него, возможность «ручного» удаления объекта редко добавляет много значение.

0
ответ дан supercat 2 March 2019 в 01:04
поделиться

Простой ответ на ваш вопрос - нет, такого API нет. Большинство современных ГХ спроектированы с учетом «гипотезы поколений», что большинство объектов умирают молодыми или живут долго. То, что вы описываете, обычно называют «кризисом среднего возраста» - объекты, живущие достаточно долго, чтобы перейти в старшее поколение, но сразу же больше не нужны. Это, очевидно, далеко не оптимально для современных ГХ. Обычный способ избежать этого состоит в том, чтобы: уменьшить распределение (меньше шансов быть продвинутым, поэтому мы часто остаемся в «умершей молодой» части) или повторно использовать объекты (таким образом, мы приземляемся в «живой длинной» части).

Путем интенсивного повторного использования структур и ссылок вы выбрали первый подход. Вы также можете подумать о повторном использовании объектов путем объединения, например, ArrayPool<T> или других.

Что касается вопросов, вы предлагаете API для:

«сборщик мусора может ответить, перемещая объект в кучу gen 0»

Хотя это касается Возможных деталей реализации очень много, вряд ли можно представить, чтобы реализовать это эффективно. Многие GC, в том числе .NET, стараются изо всех сил не копировать / перемещать память. Поколения - это просто логические области памяти, границы которых перемещаются взад и вперед. Таким образом, «перемещение объекта в gen0» потребует его копирования (и, возможно, всего его сохраненного графа, чтобы сделать его разумным), что приведет к накладным расходам, значительно превышающим потенциальную выгоду. Что еще хуже, в настоящее время это может быть сделано только во время GC, поскольку у нас не реализовано одновременное сжатие (в общем, движущиеся объекты, пока они используются).

«Насколько я понимаю, .NET Framework плохо оптимизирован для любых структур, кроме небольшого количества байтов (официальные источники говорят 16, хотя я слышал 24), а также для изменяемых структур»

Это похоже на маленькую ложь. Среда выполнения .NET значительно оптимизирует использование структур, и если вы передаете их по ref, это один из наиболее эффективных подходов, которые я могу придумать. Просто имейте в виду только ловушку защитного копирования , с которой вы можете столкнуться при использовании параметров in.

0
ответ дан Konrad Kokosa 2 March 2019 в 01:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: