Я написал класс, который использует методы Stopwatch
для профилей и циклы for/foreach
. При циклах for
и foreach
он проверяет стандартный цикл на реализацию Parallel.For
или Parallel.ForEach
.
Вы должны написать тесты производительности следующим образом:
Метод:
PerformanceResult result = Profiler.Execute(() => { FooBar(); });
Для цикла:
SerialParallelPerformanceResult result = Profiler.For(0, 100, x => { FooBar(x); });
Цикл ForEach:
SerialParallelPerformanceResult result = Profiler.ForEach(list, item => { FooBar(item); });
Всякий раз, когда я запускаю тесты (один из .Execute
, .For
или .ForEach
), я помещаю их в цикл, чтобы я мог видеть, как производительность изменяется с течением времени.
Пример производительности может быть:
Выполнение метода 1 = 200 мс
Выполнение метода 2 = 12 мс
Выполнение метода 3 = 0ms
Для выполнения 1 = 300 мс (последовательный), 100 мс (параллельно)
Для исполнения 2 = 20 мс (серийный), 75 мс (параллельный)
Для выполнения 3 = 2 мс (последовательный), 50 мс (параллельный)
ForEach исполнение 1 = 350 мс (серийный), 300 мс (параллельный)
ForEach исполнение 2 = 24ms (последовательный), 89ms (параллельный)
ForEach исполнение 3 = 1 мс (последовательный), 21 мс (параллельный)
Мои вопросы:
-
Почему производительность меняется со временем, что делает .NET в фоновом режиме, чтобы облегчить это?
-
Как/почему последовательная операция выполняется быстрее параллельной? Я убедился, что я делаю операцию сложной, чтобы увидеть разницу правильно... в большинстве случаев последовательные операции кажутся быстрее!?
ПРИМЕЧАНИЕ.. Для параллельной обработки я тестирую 8-ядерную машину.