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