Arokh
2007-08-11, 23:56:44
Hi Leute,
Nachdem es mir endlich gelungen war, meinen neuen AMD X2 4200 erfolgreich in Dual Core Betrieb zu nehmen, wollte ich den direkt mal auf Herz und Nieren testen und gucken wie der sich in Multithreading-Umgebungen schlägt.
Dazu habe ich ein- und denselben Programmcode einmal in einem einzelnen Thread ablaufen lassen und einmal gleichzeitig in zwei paralell laufenden Threads. Auf einem Dual Core Prozessor sollte man erwarten, daß beide Lösungen gleich schnell sind (auf einem Single Core wäre die Zwei-Threads-Lösung nur halb so schnell, da doppelt so viel zu berechnen ist).
Entsetzt stellte ich aber fest, daß die Zwei-Threads-Lösung erheblich langsamer war und 3-4 mal so lange brauchte (also sogar noch länger als es bei einem Single Core zu erwarten wäre). Dies konnte ich sowohl unter Java als auch unter Delphi beobachten.
Nach einigem Testen fand ich heraus, woran es lag: am Zufallszahlengenerator! Mein Programmcode ruft mit hoher Frequenz den Zufallszahlengenerator auf (jeweils den in Java bzw. Delphi eingebauten), und als ich das mal spaßeshalber deaktiviert habe, waren Einzelthread- und Zweithread-Lösung plötzlich gleich schnell!
Jetzt frage ich mich wie das sein kann: was ist am Zufallszahlengenerator dran, das beim Multithreading so sehr bremst?
Man könnte vielleicht annehmen, daß der mit einer Threadsicherheit ausgestattet ist, so daß nicht zwei Threads gleichzeitig denselben Generator aufrufen können und daher aufeinander warten müssen. Das dürfte die Performance aber nur halbieren, und nicht dritteln oder vierteln wie bei mir geschehen.
Nachdem es mir endlich gelungen war, meinen neuen AMD X2 4200 erfolgreich in Dual Core Betrieb zu nehmen, wollte ich den direkt mal auf Herz und Nieren testen und gucken wie der sich in Multithreading-Umgebungen schlägt.
Dazu habe ich ein- und denselben Programmcode einmal in einem einzelnen Thread ablaufen lassen und einmal gleichzeitig in zwei paralell laufenden Threads. Auf einem Dual Core Prozessor sollte man erwarten, daß beide Lösungen gleich schnell sind (auf einem Single Core wäre die Zwei-Threads-Lösung nur halb so schnell, da doppelt so viel zu berechnen ist).
Entsetzt stellte ich aber fest, daß die Zwei-Threads-Lösung erheblich langsamer war und 3-4 mal so lange brauchte (also sogar noch länger als es bei einem Single Core zu erwarten wäre). Dies konnte ich sowohl unter Java als auch unter Delphi beobachten.
Nach einigem Testen fand ich heraus, woran es lag: am Zufallszahlengenerator! Mein Programmcode ruft mit hoher Frequenz den Zufallszahlengenerator auf (jeweils den in Java bzw. Delphi eingebauten), und als ich das mal spaßeshalber deaktiviert habe, waren Einzelthread- und Zweithread-Lösung plötzlich gleich schnell!
Jetzt frage ich mich wie das sein kann: was ist am Zufallszahlengenerator dran, das beim Multithreading so sehr bremst?
Man könnte vielleicht annehmen, daß der mit einer Threadsicherheit ausgestattet ist, so daß nicht zwei Threads gleichzeitig denselben Generator aufrufen können und daher aufeinander warten müssen. Das dürfte die Performance aber nur halbieren, und nicht dritteln oder vierteln wie bei mir geschehen.