2012-04-16 6 views
12

considere el siguiente código ...Por qué utiliza una Func <> de modo mucho más rápido que el uso de la nueva restricción() en una secuencia genérica creador

En mis pruebas para un lanzamiento (no depurar!) X86 construir Windows 7 x64 PC (Intel i7 3 GHz) que obtuvieron los siguientes resultados:

CreateSequence() with new() took 00:00:00.9158071 
CreateSequence() with creator() took 00:00:00.1383482 

CreateSequence() with new() took 00:00:00.9198317 
CreateSequence() with creator() took 00:00:00.1372920 

CreateSequence() with new() took 00:00:00.9340462 
CreateSequence() with creator() took 00:00:00.1447375 

CreateSequence() with new() took 00:00:00.9344077 
CreateSequence() with creator() took 00:00:00.1365162 

parece que el uso de un Func <> para definir un delegado para crear nuevos objetos es más de 6 veces más rápido que llamar "nueva camiseta() "directamente.

Me parece un poco inesperado ... Supongo que es debido a algunas incrustaciones realizadas por el Jitter, pero habría pensado que podría haber sido capaz de optimizar el "nuevo T()" igual de bien.

¿Alguien tiene una explicación para esto?

Quizás estoy cometiendo un error. (He considerado el efecto que podría tener el recolector de elementos no utilizados, pero reorganizar el código y agregar GC.Collect(), etc., no cambia los resultados significativamente).

De todos modos, aquí está el código:

+10

Ver https://msmvps.com/blogs/jon_skeet/archive/2011/08/22/optimization-and-generics-part-1-the-new-constraint.aspx –

+0

relacionado: http: // stackoverflow. com/questions/367577/why-does-the-c-sharp-compiler-emit-activator-createinstance-when-calling-new-in – nawfal

Respuesta

13

La restricción new() sólo asegura que el tipo aprobado en tiene un constructor sin parámetros. Si en realidad se llama new T() (o el nombre de su argumento es de tipo), lo que realmente hace esto:

Activator.CreateInstance<T>(); 

Lo cual, en su núcleo, utiliza la reflexión.

+1

Gracias (y a Jon también, por el interesante artículo). Parece que la restricción new() debería evitarse cuando necesitas un código muy rápido y puedes utilizar el enfoque "Func <> creator" en su lugar. –

+1

@MatthewWatson: Eso es lo que sugeriría –

+1

En cuanto a por qué es así, ver http://stackoverflow.com/questions/367577/why-does-the-c-sharp-compiler-emit-activator-createinstance-when- llamar-nuevo-en – nawfal

Cuestiones relacionadas