2012-04-16 5 views
12

Rozważmy następujący kod ...Dlaczego używa Func <> więc znacznie szybciej niż przy użyciu nowego() ograniczenie na rodzajowy sekwencji twórcy

W moich testów na RELEASE (nie debugowania!) Zbudować na x86 Windows 7 x64 PC (Intel i7 3GHz) I uzyskano następujące wyniki:

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 

wydaje się, że przy użyciu Func <> zdefiniować delegata do tworzenia nowych obiektów jest więcej niż 6 razy szybciej niż powołanie „nowej T() "bezpośrednio.

Uważam, że jest to trochę nieoczekiwane ... Myślę, że jest to spowodowane wprowadzeniem przez Jittera inline, ale pomyślałem, że byłby w stanie zoptymalizować "nowy T()" równie dobrze.

Czy ktoś ma wyjaśnienie tego?

Może popełniam jakiś błąd. (Rozważyłem efekt, jaki może mieć garbage collector, ale przeorganizowanie kodu i dodanie GC.Collect() i tak dalej nie zmienia znacząco wyników).

W każdym razie, oto kod:

+10

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

+0

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

Odpowiedz

13

new() ograniczenie zapewnia tylko, że rodzaj przekazany ma konstruktora bez parametrów. Jeśli rzeczywiście nazwać new T() (lub cokolwiek nazwa Twojego typu argumentu jest), to faktycznie robi to:

Activator.CreateInstance<T>(); 

, które w swej istocie, wykorzystuje odbicie.

+1

Dzięki (a także Jonowi za interesujący artykuł). Wygląda na to, że należy unikać ograniczenia new(), gdy potrzebujesz bardzo szybkiego kodu i możesz zamiast tego użyć metody "Func <> creator"! –

+1

@MatthewWatson: To proponuję –

+1

Co to jest, zobacz http://stackoverflow.com/questions/367577/why-does-the-c-sharp-compiler-emit-activator-createinstance-when- call-new-in – nawfal

Powiązane problemy