Threads Multithreading- langsamer als Singlethreading-Programm

Sesostris

Aktives Mitglied
Folgendes kurze Programm gibt eine Näherung für Pi aus. Dabei wird der Monte-Carlo-Algorithmus benutzt, der durch eine sich sehr oft wiederholende Schleife die CPU voll auslastet.

Java:
public class Bsp1 {
	public static void main(String[] args) {
		int dotsSquare = 10000000, dotsCircle = 0;
		double cordX, cordY, pi;
		long time = System.currentTimeMillis();
		
		for (int i=0; i<dotsSquare; i++) {
			cordX = Math.random();
			cordY = Math.random();
			if (cordX*cordX + cordY*cordY <= 1.0)
				dotsCircle++;
		}
		pi = (4.0*dotsCircle)/dotsSquare;
		
		System.out.println("Laufzeit: " + (System.currentTimeMillis()-time) + "ms");
		System.out.println("Näherung PI: " + pi);
	}
}

Nach ca. 1500ms terminiert auf meinem Rechner dieses Programm. Die CPU-Auslastung steigt auf einem Quadcore-Rechner auf 25%, da logischerweise nur ein Kern damit beschäftigt ist.

Um die Sache etwas effektiver zu gestalten, habe ich mir gedacht, das wäre ein ideals Beispiel, um Multithreading in Java auszuprobieren.

Java:
public class Bsp2 {
	public static void main(String[] args)
	{
		int dots = 10000000;
		double pi;
		Calculation c1 = new Calculation(dots/2);
		Calculation c2 = new Calculation(dots/2 + dots%2);
		Thread t1 = c1;
		Thread t2 = c2;

		long time = System.currentTimeMillis();
		t1.start();
		t2.start();

		try {
			t2.join();	
			t1.join();
			System.out.println("Beide Threads beendet");
			System.out.println();
		} catch (Exception e) {
			System.out.printf("Fehler: " + e.toString());		
		}
		
		pi = 4.0*(c1.dotsCircle+c2.dotsCircle)/dots;
		System.out.println("Laufzeit: " + (System.currentTimeMillis()-time) + " ms");
		System.out.println("1. Ergebnis: " + c1.dotsCircle);
		System.out.println("2. Ergebnis: " + c2.dotsCircle);
		System.out.printf("Näherung PI: " + pi);
	}
}

class Calculation extends Thread {
	public Calculation(int dots) {
		dotsSquare = dots;
		nr = cnt++;
	}
	
	private int dotsSquare;
	public int dotsCircle = 0;
	int nr;
	static private int cnt = 1;

	@Override public void run()
	{
		System.out.println(nr + ". Thread startet");
		double cordX, cordY;
		for (int i=0; i<dotsSquare; i++) {
			cordX = Math.random();
			cordY = Math.random();
			if (cordX*cordX + cordY*cordY <= 1.0)
				dotsCircle++;
		}
		System.out.println(nr + ". Thread beendet");
	}
}
Das Programm lastet nun zwei Kerne zu 100% aus, braucht aber enttäuschenderweise mit ca. 4000ms wesentlich länger als das Singlethreading-Programm.
Wie ist das zu erklären? Bzw. wo liegt mein Fehler?
 

Cola_Colin

Top Contributor
Aus dem Javadoc von Math.random():

* <p>This method is properly synchronized to allow correct use by
* more than one thread. However, if many threads need to generate
* pseudorandom numbers at a great rate, it may reduce contention
* for each thread to have its own pseudorandom-number generator.

Mit dieser Version von Calculation brauche ich ca. 60% weniger Zeit bei 2 Threads als bei Verwendung von einem:

Java:
class Calculation extends Thread {
	public Calculation(int dots) {
		dotsSquare = dots;
		nr = cnt++;
	}

	Random random = new Random();
	
	private int dotsSquare;
	public int dotsCircle = 0;
	int nr;
	static private int cnt = 1;

	@Override
	public void run() {
		System.out.println(nr + ". Thread startet");
		double cordX, cordY;
		for (int i = 0; i < dotsSquare; i++) {
			cordX = random.nextDouble();
			cordY = random.nextDouble();
			if (cordX * cordX + cordY * cordY <= 1.0)
				dotsCircle++;
		}
		System.out.println(nr + ". Thread beendet");
	}
}
 
Zuletzt bearbeitet:

Kr0e

Gesperrter Benutzer
@Cola Colin: DAs "Math.random()" kannst dann aber rausnehmen, das bringt ja bei dir nichts und verlangsamt alles nur unnötig.
 

Cola_Colin

Top Contributor
Haha, ja klar, das war bei meinem Test auch raus. Aber um zur Javadoc davon zu kommen hatte ich es reingeschrieben, um dann mit Eclipse per F3 zum Code zu kommen. Hab vergessen es danach wieder zu entfernen xD
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
W Multithreading Alphabet Allgemeine Java-Themen 3
T Multithreading: Wie viele Threads sollte ich erstellen? Allgemeine Java-Themen 12
J Threads Multithreading Allgemeine Java-Themen 15
K Multithreading plattform übergreifend? Allgemeine Java-Themen 3
R Bruteforce hashes mit multithreading. Funktioniert das so? Allgemeine Java-Themen 0
B Threads Multithreading Threads sollen warten Allgemeine Java-Themen 12
K Multithreading: Service(Task), wait und continue Allgemeine Java-Themen 21
M JUnit & Multithreading - sehr seltener Fehler Allgemeine Java-Themen 3
C Ressourcensparendes Multithreading Allgemeine Java-Themen 3
A Multithreading mit JButtons Allgemeine Java-Themen 5
D Threads Multithreading Allgemeine Java-Themen 25
A MultiThreading.. Scheduling-Problem? Allgemeine Java-Themen 10
M Multithreading Problem Allgemeine Java-Themen 3
dayaftereh Multithreading Allgemeine Java-Themen 16
E Multithreading and volatile Allgemeine Java-Themen 10
J Wie die gleichzeitige Ausführung mehrerer Tasks trotz Multithreading verhindern? Allgemeine Java-Themen 2
G multithreading, concurrency conveyor belt beispiel Allgemeine Java-Themen 2
A Problem mit Zufallszahlen und Multithreading Allgemeine Java-Themen 14
I Problem mit Multithreading Allgemeine Java-Themen 4
H Singleton und MultiThreading [erledigt] Allgemeine Java-Themen 3
C Collection Multithreading? Allgemeine Java-Themen 33
O Multithreading mit Java 5 u den Concurrency APIs Allgemeine Java-Themen 7
O Multithreading und Multiprozessor Allgemeine Java-Themen 4
K Multithreading bei statischen Methoden Allgemeine Java-Themen 2
T ungewöhnliche Exception (Multithreading und JList) Allgemeine Java-Themen 10
K Frage zu ProgressBars, Algorithmen und Multithreading ->F Allgemeine Java-Themen 2
flashfactor Multithreading-Problem Allgemeine Java-Themen 4
E Threads Ausführung in Threads ist langsamer als ohne Threads Allgemeine Java-Themen 13
M Rechnen mit kleinen Zahlen langsamer!? Allgemeine Java-Themen 11
A Rekursives Programm wird immer langsamer Allgemeine Java-Themen 10
M Methodenaufrufe sind über Interfaces langsamer. Allgemeine Java-Themen 43
G Programm wird immer langsamer Allgemeine Java-Themen 7
egrath Zu langsamer Methodenaufruf Allgemeine Java-Themen 4
S Web Applikation wird immer langsamer Allgemeine Java-Themen 5
K Zu viele Threads -> langsamer angehen. Allgemeine Java-Themen 3

Ähnliche Java Themen

Neue Themen


Oben