Profilowanie wydajności w .NET

Napisałem klasę, która używaStopwatch do profilowania metod ifor/foreach pętle. Zfor iforeach pętle testuje standardową pętlę przeciwko aParallel.For lubParallel.ForEach realizacja.

Pisałbyś testy wydajności w taki sposób:

Metoda:

PerformanceResult result = Profiler.Execute(() => { FooBar(); });

Dla pętli:

SerialParallelPerformanceResult result = Profiler.For(0, 100, x => { FooBar(x); });

Pętla ForEach:

SerialParallelPerformanceResult result = Profiler.ForEach(list, item => { FooBar(item); });

Ilekroć przeprowadzam testy (jeden z.Execute, .For lub.ForEach) Umieszczam je w pętli, aby zobaczyć, jak zmienia się wydajność w czasie.

Przykładem wydajności może być:

Wykonanie metody 1 = 200ms
Wykonanie metody 2 = 12ms
Wykonanie metody 3 = 0ms

Do wykonania 1 = 300ms (Serial), 100ms (Parallel)
Do wykonania 2 = 20ms (szeregowy), 75ms (równoległy)
Do wykonania 3 = 2 ms (szeregowy), 50 ms (równoległy)

Wykonanie ForEach 1 = 350ms (szeregowy), 300ms (równoległy)
Wykonanie ForEach 2 = 24 ms (szeregowe), 89 ms (równoległe)
Wykonanie ForEach 3 = 1 ms (szeregowy), 21 ms (równoległy)

Moje pytania to:

Dlaczego wydajność zmienia się w czasie, co robi .NET w tle, aby to ułatwić?

Jak / dlaczego operacja szeregowa jest szybsza niż równoległa? Upewniłem się, że sprawiłem, że operacje są skomplikowane, aby poprawnie zobaczyć różnicę ... w większości przypadków operacje seryjne wydają się szybsze !?

UWAGA: Do przetwarzania równoległego testuję na 8-rdzeniowym komputerze.

questionAnswers(2)

yourAnswerToTheQuestion