Простой ответ на ваш вопрос - нет, такого API нет. Большинство современных ГХ спроектированы с учетом «гипотезы поколений», что большинство объектов умирают молодыми или живут долго. То, что вы описываете, обычно называют «кризисом среднего возраста» - объекты, живущие достаточно долго, чтобы перейти в старшее поколение, но сразу же больше не нужны. Это, очевидно, далеко не оптимально для современных ГХ. Обычный способ избежать этого состоит в том, чтобы: уменьшить распределение (меньше шансов быть продвинутым, поэтому мы часто остаемся в «умершей молодой» части) или повторно использовать объекты (таким образом, мы приземляемся в «живой длинной» части).
Путем интенсивного повторного использования структур и ссылок вы выбрали первый подход. Вы также можете подумать о повторном использовании объектов путем объединения, например, ArrayPool
или других.
Что касается вопросов, вы предлагаете API для:
«сборщик мусора может ответить, перемещая объект в кучу gen 0»
blockquote>Хотя это касается Возможных деталей реализации очень много, вряд ли можно представить, чтобы реализовать это эффективно. Многие GC, в том числе .NET, стараются изо всех сил не копировать / перемещать память. Поколения - это просто логические области памяти, границы которых перемещаются взад и вперед. Таким образом, «перемещение объекта в gen0» потребует его копирования (и, возможно, всего его сохраненного графа, чтобы сделать его разумным), что приведет к накладным расходам, значительно превышающим потенциальную выгоду. Что еще хуже, в настоящее время это может быть сделано только во время GC, поскольку у нас не реализовано одновременное сжатие (в общем, движущиеся объекты, пока они используются).
«Насколько я понимаю, .NET Framework плохо оптимизирован для любых структур, кроме небольшого количества байтов (официальные источники говорят 16, хотя я слышал 24), а также для изменяемых структур»
blockquote>Это похоже на маленькую ложь. Среда выполнения .NET значительно оптимизирует использование структур, и если вы передаете их по
ref
, это один из наиболее эффективных подходов, которые я могу придумать. Просто имейте в виду только ловушку защитного копирования , с которой вы можете столкнуться при использовании параметровin
.
Попробуйте что-то вроде:
import socket
socket.setdefaulttimeout(5.0)
...
try:
...
except socket.timeout:
(it timed out, retry)
Good question, I would be really interested in finding an answer. The only workaround I could think of is using the signal trick explained in python docs. In your case it will be more like:
import signal
import urllib2
def read(url):
stream = urllib2.urlopen(url)
return stream.read()
def handler(signum, frame):
raise IOError("The page is taking too long to read")
# Set the signal handler and a 5-second alarm
signal.signal(signal.SIGALRM, handler)
signal.alarm(5)
# This read() may hang indefinitely
try:
output = read('http://www.google.de/images/nav_logo4.png')
except IOError:
# try to read again or print an error
pass
signal.alarm(0) # Disable the alarm