Performenceverlust durch mehrere Threads

Maldito

Mitglied
Hallo,

ich habe hier ein Programm das die Farbtiefe in Bilder auf einen eingebenen Wert reduziert. Der Wert wird als parameter beim Programmstart übergeben oder mittels GUI ausgewähtl, ebenso Quelldatei, Zieldatei etc und die Anzahl der Threads mit denen das Programm ausgeführt.
Das Problem ist allerdings, dass das Programm immer langsamer wird je mehr Threads ich angebe (habe 4 CPU Kerne). Ich verwende nur einmal join(), sonst nie etwas in der Art, und das habe ich auch schon weggelassen, hat nichts an der Ausführungszeit geändert. Wie kann das sein?

Hier der Code des Threads :

Java:
private class MyThread extends Thread implements Runnable{		
		int[] zielfarbraum;
		int[] fehler;
		int alterFarbwert;
		int neuerFarbwert;
		int threadNummer;
		int anzahlThreads;
		public MyThread (int threadNummer, int[] zielfarbraum, int[] fehler, int anzahlThreads) {
			this.fehler = fehler;
			this.zielfarbraum = zielfarbraum;			
			this.anzahlThreads = anzahlThreads;
			this.threadNummer = threadNummer;
		}
		public void run() {				
			for (int y = threadNummer * (bild.getHeight()/anzahlThreads); y < Math.min(((bild.getHeight()/
					anzahlThreads) * (threadNummer + 1)), bild.getHeight()) ; ++y
					/*int y = threadNummer; y < bild.getHeight(); y += anzahlThreads*/) {
				for (int x = 0; x < bild.getWidth(); ++x) {
					alterFarbwert = bild.getRGB(x, y);
					neuerFarbwert = holeNaechsteFarbe(alterFarbwert, zielfarbraum);
					bild.setRGB(x, y, neuerFarbwert);
					fehler = berechneFehler(alterFarbwert, neuerFarbwert);
					wendeFehlerAn(x + 1, y, fehler, 7);
					wendeFehlerAn(x - 1, y + 1, fehler, 3);
					wendeFehlerAn(x, y + 1, fehler, 5);
					wendeFehlerAn(x + 1, y + 1, fehler, 1);	
					}
		}
			}
	}

Vielleicht hat ja einer eine Idee, ich bin mit meinem Latein am Ende.
 

Maldito

Mitglied
So. Besagt join() anweisung hab ich auch gleich reingepackt
Java:
for (int i = 0; i < anzahlThreads; i++) {
			threads[i] = new MyThread(i, zielfarbraum, fehler, anzahlThreads);
			threads[i].start();			
		} 
		
		for (int i = 0; i < anzahlThreads; i++) {
			try {threads[i].join();}
			catch(InterruptedException e) {
				System.out.println("interrupted");
			}
		}
 
S

SlaterB

Gast
ich bin allgemein skeptisch ob man mal eben mehrere CPUs gleichzeitig benutzen kann,
aber ist hier vielleicht besonders störend, dass alle auf denselben Arrays arbeiten?

falls du Zeit zum Testen hast, schaue doch ob sich was ändert, wenn jeder Thread eigene Daten hat
oder ganz ohne Parameter nur irgendwas berechnet was lange dauert
(4 Threads schneller als ein Thread eine Aufgabe allein * 4?)
 

Oben