Итак, я испускаю динамические прокси через DefineDynamicAssembly
, и во время тестирования я обнаружил, что:
- Один тип для динамической сборки: быстрый, но использует много памяти
- Все типы в одной динамической сборке: очень медленно, но использует гораздо меньше памяти
В моем тесте я генерирую 10 000 типов, а код одного типа для сборки выполняется примерно в 8-10 раз быстрее. Использование памяти полностью соответствует ожидаемому, но как получилось, что время генерации типов намного длиннее?
Изменить: добавлен пример кода.
Одна сборка:
var an = new AssemblyName( "Foo" );
var ab = AppDomain.CurrentDomain.DefineDynamicAssembly( an, AssemblyBuilderAccess.Run );
var mb = ab.DefineDynamicModule( "Bar" );
for( int i = 0; i < 10000; i++ )
{
var tb = mb.DefineType( "Baz" + i.ToString( "000" ) );
var met = tb.DefineMethod( "Qux", MethodAttributes.Public );
met.SetReturnType( typeof( int ) );
var ilg = met.GetILGenerator();
ilg.Emit( OpCodes.Ldc_I4, 4711 );
ilg.Emit( OpCodes.Ret );
tb.CreateType();
}
Одна сборка для каждого типа:
for( int i = 0; i < 10000; i++ )
{
var an = new AssemblyName( "Foo" );
var ab = AppDomain.CurrentDomain.DefineDynamicAssembly( an,
AssemblyBuilderAccess.Run );
var mb = ab.DefineDynamicModule( "Bar" );
var tb = mb.DefineType( "Baz" + i.ToString( "000" ) );
var met = tb.DefineMethod( "Qux", MethodAttributes.Public );
met.SetReturnType( typeof( int ) );
var ilg = met.GetILGenerator();
ilg.Emit( OpCodes.Ldc_I4, 4711 );
ilg.Emit( OpCodes.Ret );
tb.CreateType();
}