Hallo,
ich möchte gerne Bildmanipulationen gleichzeitig berechnen lassen, dazu habe ich mir eine Klasse einmal threaded und einmal nicht threaded geschrieben...
Leider ist die Single Threaded Klasse immer schneller als die Threaded :question:
Und das nicht mal wenig:
Single Thread: ca 1000ms
4 Threads: ca 5500ms
:bahnhof:
Anbei mal Ausschnitte:
Single Thread:
Multi Thread:
Jemand eine Idee woran das liegen könnte?
Danke schon mal im vorraus
ich möchte gerne Bildmanipulationen gleichzeitig berechnen lassen, dazu habe ich mir eine Klasse einmal threaded und einmal nicht threaded geschrieben...
Leider ist die Single Threaded Klasse immer schneller als die Threaded :question:
Und das nicht mal wenig:
Single Thread: ca 1000ms
4 Threads: ca 5500ms
:bahnhof:
Anbei mal Ausschnitte:
Single Thread:
Java:
// walk over all pixels
for (int y = 0; y < target.getHeight(); y++) {
for (int x = 0; x < target.getTileWidth(); x++) {
// use only blue(should be grayscaled already)
if ( (source.getRGB(x, y) & 0xFF ) > threshold) {
target.setRGB(x, y, 0xFFFFFF);
} else {
target.setRGB(x, y, 0x000000);
}
}
}
Multi Thread:
Java:
// calculate height per core
int blockHeight = source.getHeight() / SettingsManager.CPU_CORES;
boolean odd = source.getHeight() % 2 != 0;
// create threads
Thread threads[] = new Thread[SettingsManager.CPU_CORES];
for (int i = 0; i < SettingsManager.CPU_CORES; i++) {
int start = i * blockHeight;
int end = i * blockHeight + blockHeight;
// if uneven and last block
if (odd && SettingsManager.CPU_CORES - 1 == 1) {
// add last line
end++;
}
OperatorRunner runner = new OperatorRunner(start, end, source, target);
threads[i] = new Thread(runner);
threads[i].setName("thread" + i);
}
// start threads
for (int i = 0; i < threads.length; i++) {
threads[i].start();
}
Log.debug("Threads: " + threads.length);
// reassemble the whole image
for (int i = 0; i < threads.length; i++) {
try {
threads[i].join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return target;
}
@Override
public void updateValue(String id, Object value) {
threshold = (Integer)value; // auto unboxing
}
private class OperatorRunner implements Runnable {
private BufferedImage source, target;
// line indices for this thread
private int lineStart, lineEnd;
public OperatorRunner(int lineStart, int lineEnd, BufferedImage source, BufferedImage target) {
this.lineStart = lineStart;
this.lineEnd = lineEnd;
this.source = source;
this.target = target;
}
@Override
public void run() {
Log.debug("OperatorRunner start: "+lineStart+" end: "+lineEnd);
long start = System.currentTimeMillis();
for (int y = 0; y < target.getHeight(); y++) {
for (int x = 0; x < target.getTileWidth(); x++) {
// use only blue(should be grayscaled already)
if ( (source.getRGB(x, y) & 0xFF ) > threshold) {
target.setRGB(x, y, 0xFFFFFF);
} else {
target.setRGB(x, y, 0x000000);
}
}
}
Log.debug("Zeit Thread: " + (System.currentTimeMillis() - start));
Log.debug("OperatorRunner end: "+lineStart+" end: "+lineEnd);
} // run
}
Jemand eine Idee woran das liegen könnte?
Danke schon mal im vorraus