Leistungsprofilerstellung in .NET

Ich habe eine Klasse geschrieben, die verwendetStopwatch zu Profilmethoden undfor/foreach Schleifen. Mitfor undforeach Schleifen testet eine Standardschleife gegen eineParallel.For oderParallel.ForEach Implementierung.

Sie würden Leistungstests wie folgt schreiben:

Methode:

PerformanceResult result = Profiler.Execute(() => { FooBar(); });

For-Schleife:

SerialParallelPerformanceResult result = Profiler.For(0, 100, x => { FooBar(x); });

Für jede Schleife:

SerialParallelPerformanceResult result = Profiler.ForEach(list, item => { FooBar(item); });

Wann immer ich die Tests durchführe (einer von.Execute, .For oder.ForEach) Ich lege sie in eine Schleife, damit ich sehen kann, wie sich die Leistung im Laufe der Zeit ändert.

Ein Beispiel für die Leistung könnte sein:

Methodenausführung 1 = 200ms
Methodenausführung 2 = 12ms
Methodenausführung 3 = 0ms

Bei Ausführung 1 = 300 ms (seriell), 100 ms (parallel)
Bei Ausführung 2 = 20 ms (seriell), 75 ms (parallel)
Bei Ausführung 3 = 2 ms (seriell), 50 ms (parallel)

Für jede Ausführung 1 = 350 ms (seriell), 300 ms (parallel)
Für jede Ausführung 2 = 24 ms (seriell), 89 ms (parallel)
Für jede Ausführung 3 = 1 ms (seriell), 21 ms (parallel)

Meine Fragen sind:

Warum ändert sich die Leistung im Laufe der Zeit, was macht .NET im Hintergrund, um dies zu ermöglichen?

Wie / warum ist eine serielle Operation schneller als eine parallele? Ich habe dafür gesorgt, dass die Vorgänge komplex sind, um den Unterschied richtig zu erkennen ... in den meisten Fällen scheinen serielle Vorgänge schneller zu sein !?

HINWEIS: Für die Parallelverarbeitung teste ich auf einem 8-Kern-Rechner.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage