Насколько быстро создается AppDomain? - PullRequest
1 голос
/ 02 декабря 2008

Я только что обнаружил, что при создании сборок с помощью Reflection.Emit .NET Framework хранит ссылки в статическом члене, который предотвращает GC-классы классов Reflection.Emit.

Я не могу использовать DynamicMethod из-за ограничений. Я также генерирую много сборок (инкрементный компилятор IronScheme) в течение программы (может быть 1000+).

Следовательно, я думал просто обработать код в отдельном домене и выгрузить его позже (пока не решил, как это сделать).

Кто-нибудь знает, как дорого это будет?

Ответы [ 2 ]

2 голосов
/ 10 июля 2009

Я бы оценил его для вашего конкретного случая.

Если это окажется дорогостоящим, просто предварительно создайте несколько из них, затем используйте их по мере необходимости и заново создайте новые в фоновом режиме, чтобы убедиться, что у вас всегда будет достаточно неиспользуемых ожидающих (немного похоже на пул потоков, но вы воссоздаете их каждый раз, чтобы освободить память).

1 голос
/ 02 декабря 2008

Насколько я понимаю, это немного медленнее, чем порождение потока.


Проводил некоторые исследования, пытаясь найти реальную ссылку для этого. Пока что это лучшее, что я могу придумать:
http://msdn.microsoft.com/en-us/library/aa159887.aspx

Примерно в 2/3 пути это вызывает создание доменов приложений "дорого", но тогда вы можете сказать то же самое о потоках в определенных контекстах - это действительно зависит от того, что конкретный поток делает при создании.

Опять же: я понимаю, что домен приложений - это, по сути, поток (или несколько потоков) внутри процесса & mdash; логический разделитель, если вы будете & mdash; таким образом, что среда выполнения гарантирует, что действуют определенные дополнительные средства защиты, которые не позволяют отдельным доменам приложений мешать друг другу. Чтобы создать новый AppDomain в существующем процессе (приложении), фреймворк должен выполнить всю работу, связанную с созданием нового потока, плюс некоторые дополнительные издержки для его настройки в остальной части приложения (что может также включать загрузку одного или нескольких приложений). сборки в память). В конце концов, AppDomain живет где-то между потоком и процессом.

...