2012-03-26 19 views
5

Si hay n propiedades, entonces ¿el Big-O de .GetProperties O (n) o hay procesos implicados en la reflexión que agregan complejidad?Big-O de .GetProperties()

decir que hay esta clase definida:

public class Reflector 
{ 
public string name { get; set; } 
public int number { get; set; } 
public bool flag { get; set; } 
public List<string> etc { get; set; } 
} 

Y entonces se hace esta llamada:

var reflect = new Reflector(); 
PropertyInfo[] properties = reflect.GetType().GetProperties(); 

¿Cuál es la complejidad de tiempo, es decir, Big-O, de .GetProperties()? Teniendo en cuenta que hay 4 propiedades, ¿esto solo tomaría 4 iteraciones o es más complejo que eso? O bien, ¿es O (1) con algún conjunto de complejidad estándar para llegar a la lista, que parece que todavía debe ser O (n) solo para construir la matriz de propiedades?

+0

Para las iteraciones de qué? .. Puede haber cero iteraciones implicadas, si la matriz está prefabricada para usted. – dasblinkenlight

+0

@dasblinkenlight - iteraciones del proceso interno utilizado para generar la lista de propiedades. Para esa parte de la pregunta, y de las respuestas a continuación, creo que la respuesta fue '' más compleja ''. –

Respuesta

3

Big-O es una complejidad asintótica, en otras palabras, O (n) solo es relevante para valores grandes de n.
Una clase nunca tendrá suficientes propiedades para que esto sea relevante.

Para fines prácticos, también podría considerarlo O (1), pero con una constante muy grande.

Este tipo de problema se expresa en nanosegundos, no en notación Big-O.

+0

Me doy cuenta de que puedo haber expresado esto indebidamente, a lo que estaba tratando de llegar era a la complejidad algorítmica interna de la reflexión. –

+0

Gracias, haré una pregunta diferente basada en los nanosegundos de reflexión, o buscaré para ver si existe alguna. –

+0

El tiempo será de la forma 'T = A + B * n', estimo A >> B pero tendrá que medir. Y probablemente dependerá de muchos factores, como clases base, llamadas de Reflexión previas, etc. –

3

Más complicado que eso. El algoritmo también debe incluir la cadena de tipo de base. Además, la implementación podría almacenar en caché el resultado, por lo que el costo amortizado podría ser O (1).

Pero en la práctica, la reflexión siempre es bastante lenta, por lo que probablemente deba crear un perfil de su aplicación y realizar cambios hasta que alcance sus objetivos de rendimiento.

+0

¿Qué lo hace 'siempre bastante lento'? –

+1

@ TravisJ sinceramente, no tengo un motivo específico. Mi experiencia personal en el desarrollo del framework ASP.NET MVC y ser responsable de algunas de las optimizaciones de rendimiento es que normalmente obtenemos un mayor rendimiento si podemos almacenar en caché la información derivada de la reflexión de alguna manera en lugar de realizar ese mismo reflejo todo el tiempo. Mi intuición de por qué podría ser así es porque el framework simplemente no está optimizado con eso en mente (después de todo, es un tiempo de ejecución compilado estáticamente). – marcind

Cuestiones relacionadas