Профилирование производительности в .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-ядерном компьютере.

Ответы на вопрос(2)

Ваш ответ на вопрос