Профилирование производительности в .NET

Я написал класс, который использует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 = 0 мс

Для исполнения 1 = 300 мс (последовательный), 100 мс (параллельный)

Для исполнения 2 = 20 мс (последовательный), 75 мс (параллельный)

Для исполнения 3 = 2 мс (последовательный), 50 мс (параллельный)

Выполнение ForEach 1 = 350 мс (последовательный), 300 мс (параллельный)

Выполнение ForEach 2 = 24 мс (последовательный), 89 мс (параллельный)

Выполнение ForEach 3 = 1 мс (последовательный), 21 мс (параллельный)

Мои вопросы:

Почему производительность меняется со временем, что делает .NET в фоновом режиме, чтобы облегчить это?

Как / почему последовательная операция быстрее, чем параллельная? Я позаботился о том, чтобы сделать операции сложными, чтобы правильно увидеть разницу ... в большинстве случаев последовательные операции кажутся быстрее !?

НОТА: Для параллельной обработки я тестирую на 8-ядерном компьютере.

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

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