Hallo,
ich habe die Aufgabe, einen sog. Jobserver zu erstellen, welcher eine beliebige Anzahl von beliebigen Aufgaben bekommt und jede Aufgabe in einem eigenen Thread abarbeiten muss (Thread-per-request Architektur). Dies soll später mit einer ThreadPool-Architektur verglichen werden, doch zunächst zur per-request-Variante:
Die Jobs sind erstmal alle identisch und simulieren eine CPU-Belastung, indem jeder Job nichts anderes tut als eine Variable von 0 bis eine Milliarde hochzählt.
Um eine Gleichzeitigkeit zu simulieren, verfügt der Jobserver über folgende Methode performTask:
IJob ist ein Interface, welches von jedem Job implementiert wird und unter anderem eine Methode performTask enthält, welche die Aufgabe ausführt, hier also das Hochzählen. Um nun jeden Job in einem eigenen Thread zu starten, hab ich die Implementierung der Methode performTask auf dem Jobserver folgendermaßen gewählt:
Die Jobs werden in einer anderen Klasse erzeugt und dann dem Server als Array übergeben. Ich halte u.a. folgende Zeitpunkte fest: Erstellung der Objekte, Annahme am Server (s. Kommentar im Code), Beginn der Ausführung, Ende der Ausführung.
Nun wundert mich das Ergebnis ein wenig, daher würde ich hier mal gern nachfragen ob das tatsächlich so sein kann oder ob ich irgendwo einen Denkfehler hab:
Läuft nur ein Job, so braucht dieser ca. 1,6s.
Fünf Jobs benötigen bereits durchschnittlich 7,9s. Die Zeit von der Erstellung der Objekte bis zur 'Annahme' auf dem Server (also quasi bis zur Erzeugung der Threads) ist noch 0s.
Zehn Jobs brauchen durchschnittlich etwa 15s (!), hier vergeht auch bei den letzten Jobs eine gewisse Zeit von der Erstellung bis zur Erzeugung der Threads (beim letzten Job ca. 0,3s).
Ich finde es etwas verwunderlich dass die Zeiten so schnell in die Höhe gehen. Ist das normal oder hab ich irgendwo einen Denkfehler oder Programmierfehler? Ferner würde ich gern alle Threads zum exakt gleichen Zeitpunkt starten, wie ließe sich so etwas realisieren? Denn wenn - wie im letzten Fall - der letzte Thread gestartet wird (so ergeben Auswertungen), läuft der Erste bereits seit 0,5s. Lässt sich hier eine absolute Gleichzeitigkeit überhaupt erreichen? Gibts evtl. ne bessere Möglichkeit als die Array-Variante, die ich oben gewählt hab?
Naja, ich danke schonmal jedem der sich das hier anschaut und ein paar Anmerkungen dazu schreibt.
Viele Grüsse,
JBubble
ich habe die Aufgabe, einen sog. Jobserver zu erstellen, welcher eine beliebige Anzahl von beliebigen Aufgaben bekommt und jede Aufgabe in einem eigenen Thread abarbeiten muss (Thread-per-request Architektur). Dies soll später mit einer ThreadPool-Architektur verglichen werden, doch zunächst zur per-request-Variante:
Die Jobs sind erstmal alle identisch und simulieren eine CPU-Belastung, indem jeder Job nichts anderes tut als eine Variable von 0 bis eine Milliarde hochzählt.
Um eine Gleichzeitigkeit zu simulieren, verfügt der Jobserver über folgende Methode performTask:
Code:
public void performTask(final IJob[] myJobs)
IJob ist ein Interface, welches von jedem Job implementiert wird und unter anderem eine Methode performTask enthält, welche die Aufgabe ausführt, hier also das Hochzählen. Um nun jeden Job in einem eigenen Thread zu starten, hab ich die Implementierung der Methode performTask auf dem Jobserver folgendermaßen gewählt:
Code:
public void performTask(final IJob[] myJobs) {
for(int i=0; i<myJobs.length; i++) {
// setze Zeit, wann der Job vom Server 'angenommen' wurde
myJobs[i].setServerStart(System.currentTimeMillis());
final IJob aktJob = myJobs[i];
new Thread(new Runnable() {
public void run() {
aktJob.performTask();
}
}).start();
}
}
Die Jobs werden in einer anderen Klasse erzeugt und dann dem Server als Array übergeben. Ich halte u.a. folgende Zeitpunkte fest: Erstellung der Objekte, Annahme am Server (s. Kommentar im Code), Beginn der Ausführung, Ende der Ausführung.
Nun wundert mich das Ergebnis ein wenig, daher würde ich hier mal gern nachfragen ob das tatsächlich so sein kann oder ob ich irgendwo einen Denkfehler hab:
Läuft nur ein Job, so braucht dieser ca. 1,6s.
Fünf Jobs benötigen bereits durchschnittlich 7,9s. Die Zeit von der Erstellung der Objekte bis zur 'Annahme' auf dem Server (also quasi bis zur Erzeugung der Threads) ist noch 0s.
Zehn Jobs brauchen durchschnittlich etwa 15s (!), hier vergeht auch bei den letzten Jobs eine gewisse Zeit von der Erstellung bis zur Erzeugung der Threads (beim letzten Job ca. 0,3s).
Ich finde es etwas verwunderlich dass die Zeiten so schnell in die Höhe gehen. Ist das normal oder hab ich irgendwo einen Denkfehler oder Programmierfehler? Ferner würde ich gern alle Threads zum exakt gleichen Zeitpunkt starten, wie ließe sich so etwas realisieren? Denn wenn - wie im letzten Fall - der letzte Thread gestartet wird (so ergeben Auswertungen), läuft der Erste bereits seit 0,5s. Lässt sich hier eine absolute Gleichzeitigkeit überhaupt erreichen? Gibts evtl. ne bessere Möglichkeit als die Array-Variante, die ich oben gewählt hab?
Naja, ich danke schonmal jedem der sich das hier anschaut und ein paar Anmerkungen dazu schreibt.
Viele Grüsse,
JBubble