Hallo,
heute hat ein Kumpel mich um Hilfe gebeten. In der Uni hat er eine Aufgabe bekommen und diese auch bestmöglich gelöst. Die Aufgabe ist zwar "dumm", doch wir sind zufällig auf ein interessantes Phänomen gestoßen.
Die Aufgabe war es, Threads generieren zu lassen, die eine Last erzeugen und diese 30 Sekunden halten. In dem konkreten Programm erzeugt mein Kumpel die Last, indem er pi berechnet:
Wie sinnvoll der Quelltext jetzt ist, sei nun mal dahingestellt. Es steht fest, dass wenn man den Code ausführt, er bei ihm 35 Sekunden läuft und bei mir 23. Die gleiche Laufzeit hat das Programm auch, wenn die Berechnung in einem extra Thread durchgeführt wird.
Jetzt lasse ich den gleichen Code in zwei Threads parallel ablaufen.
Vorhersage:
- Worst Case Laufzeit 23sek*2 + Overhead = 50sek
- Best Case 23 sek
Und die 23 Sekunden habe ich auch erwartet. Denn der Rechner hatte noch drei CPU Kerne, die er verwenden konnte. In der Realität sah ich aber etwas anderes. Im Task Manager konnte ich beobachten, wie die Auslastung der CPUs hochging. Die Berechnung war nach 150sek zu Ende. Und die Rechenzeit steigt exponentiell mit der anzahl der Threads an.
1 Thread = 23 sek
2 Threads = 151 sek
3 Threads = 442 sek
Als ich den Double Aufruf rausgenommen habe, hatte ich die erwarteten Resultate. Kann mir von euch jemand sagen, wieso ich so ein Verhalten bekomme?
heute hat ein Kumpel mich um Hilfe gebeten. In der Uni hat er eine Aufgabe bekommen und diese auch bestmöglich gelöst. Die Aufgabe ist zwar "dumm", doch wir sind zufällig auf ein interessantes Phänomen gestoßen.
Die Aufgabe war es, Threads generieren zu lassen, die eine Last erzeugen und diese 30 Sekunden halten. In dem konkreten Programm erzeugt mein Kumpel die Last, indem er pi berechnet:
Code:
int n = 310000000;
int counter = 0;
for(int i = 0; i<n; i++){
double x = rand.nextDouble();
double y = rand.nextDouble();
if(x*x+y*y <= 1) counter++;
}
Wie sinnvoll der Quelltext jetzt ist, sei nun mal dahingestellt. Es steht fest, dass wenn man den Code ausführt, er bei ihm 35 Sekunden läuft und bei mir 23. Die gleiche Laufzeit hat das Programm auch, wenn die Berechnung in einem extra Thread durchgeführt wird.
Jetzt lasse ich den gleichen Code in zwei Threads parallel ablaufen.
Vorhersage:
- Worst Case Laufzeit 23sek*2 + Overhead = 50sek
- Best Case 23 sek
Und die 23 Sekunden habe ich auch erwartet. Denn der Rechner hatte noch drei CPU Kerne, die er verwenden konnte. In der Realität sah ich aber etwas anderes. Im Task Manager konnte ich beobachten, wie die Auslastung der CPUs hochging. Die Berechnung war nach 150sek zu Ende. Und die Rechenzeit steigt exponentiell mit der anzahl der Threads an.
1 Thread = 23 sek
2 Threads = 151 sek
3 Threads = 442 sek
Als ich den Double Aufruf rausgenommen habe, hatte ich die erwarteten Resultate. Kann mir von euch jemand sagen, wieso ich so ein Verhalten bekomme?