2010-12-13 20 views
33

Estoy usando RedGate para hacer una evaluación del rendimiento. Noto que crear dinámicamente una instancia usando Activator.CreateInstance (con dos parámetros de constructor) está tomando una cantidad decente de tiempo ... ¿hay alguna alternativa mejor que todavía utilice un enfoque reflexivo (no una creación de instancias explícita)?Activator.CreateInstance Performance Alternative

+0

Proporcioné una respuesta [aquí] (http://stackoverflow.com/a/16162809/661933) para la instancia predeterminada. – nawfal

Respuesta

35
+1

+1. Si eso aún no es lo suficientemente rápido, entonces puede intentar emitir reflejo, pero es poco probable que produzca una gran mejora con respecto a un lambda compilado, y es mucho más complicado de codificar. –

+1

¿La operación de compilación() es más lenta o más lenta? ¿Asumo que el rendimiento se tiene en cuenta sin incluir el tiempo de compilación? En escenarios donde son necesarias múltiples instancias de diferentes tipos y donde se determina el tipo de objeto en tiempo de ejecución, ¿Sería mucho más lento tener una operación de compilación cada vez que Activator.CreateInstance? –

+8

Ese vínculo es ahora un 404 –

12

No se olvide de DynamicMethod

Aquí es ejemplo de cómo crear nueva instancia a través constructor por defecto

public static ObjectActivator CreateCtor(Type type) 
{ 
    if (type == null) 
    { 
     throw new NullReferenceException("type"); 
    } 
    ConstructorInfo emptyConstructor = type.GetConstructor(Type.EmptyTypes); 
    var dynamicMethod = new DynamicMethod("CreateInstance", type, Type.EmptyTypes, true); 
    ILGenerator ilGenerator = dynamicMethod.GetILGenerator(); 
    ilGenerator.Emit(OpCodes.Nop); 
    ilGenerator.Emit(OpCodes.Newobj, emptyConstructor); 
    ilGenerator.Emit(OpCodes.Ret); 
    return (ObjectActivator)dynamicMethod.CreateDelegate(typeof(ObjectActivator)); 
} 

public delegate object ObjectActivator(); 

aquí es más sobre performance comparison

medición InvokeMember .. .1000000 iteraciones en 1.5643784 segundos.

medición MethodInfo.Invoke ... 1000000 iteraciones en 0.8150111 segundos.

medición DynamicMethod ... 1000000 iteraciones en 0.0330202 segundos.

medición llamada directa ... 1000000 iteraciones en 0.0136752 segundos.

+1

comparación de rendimiento [http://www.wintellect.com/blogs/krome/getting-to-know-dynamicmethod] muestra 404 ahora. – Lcng