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.