Профилирование производительности в .NET
Я написал класс, который используетStopwatch
профилировать методы иfor/foreach
петли. Сfor
а такжеforeach
зацикливает это проверяет стандартный цикл противParallel.For
или жеParallel.ForEach
реализация.
Вы бы написали тесты производительности примерно так:
Method:
PerformanceResult result = Profiler.Execute(() => { FooBar(); });
For loop:
SerialParallelPerformanceResult result = Profiler.For(0, 100, x => { FooBar(x); });
ForEach loop:
SerialParallelPerformanceResult result = Profiler.ForEach(list, item => { FooBar(item); });
Всякий раз, когда я запускаю тесты (один из.Execute
, .For
или же.ForEach
) Я поместил их в цикл, чтобы видеть, как со временем меняется производительность.
Пример производительности может быть:
Выполнение метода 1 = 200 мс
Выполнение метода 2 = 12 мс
Выполнение метода 3 = 0 мс
Для исполнения 1 = 300 мс (последовательный), 100 мс (параллельный)
Для исполнения 2 = 20 мс (последовательный), 75 мс (параллельный)
Для исполнения 3 = 2 мс (последовательный), 50 мс (параллельный)
Выполнение ForEach 1 = 350 мс (последовательный), 300 мс (параллельный)
Выполнение ForEach 2 = 24 мс (последовательный), 89 мс (параллельный)
Выполнение ForEach 3 = 1 мс (последовательный), 21 мс (параллельный)
My questions are:
Why does performance change over time, what is .NET doing in the background to facilitate this?
How/why is a serial operation faster than a parallel one? I have made sure that I make the operations complex to see the difference properly...in most cases serial operations seem faster!?
NOTE: Для параллельной обработки я тестирую на 8-ядерном компьютере.