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.