# Performenceverlust durch mehrere Threads



## Maldito (7. Jul 2011)

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 :


```
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.


----------



## Murray (7. Jul 2011)

Wie startest du die Threads?


----------



## Maldito (7. Jul 2011)

So. Besagt join() anweisung hab ich auch gleich reingepackt

```
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");
			}
		}
```


----------



## SlaterB (7. Jul 2011)

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?)


----------

