スレッドに静的なBufferedImageがあり、各スレッドに画像の一部のセクションを変更させています。各ピクセルが別々に行われるため、処理は非常に独立していますが、シーケンシャルバージョンの方が高速です。どうすれば修正できますか?
編集1:ここでコードはどのように見えるか
public static void main(String[] args) throws IOException, InterruptedException {
long startime, endtime;
long Time;
startime = System.currentTimeMillis();
//also tried to use nano
WorkingThread T1 = new WorkingThread("input.jpg");
WorkingThread T2 = new WorkingThread();
WorkingThread T3 = new WorkingThread();
WorkingThread T4 = new WorkingThread();
T1.start();
T2.start();
T3.start();
T4.start();
T1.join();
T2.join();
T3.join();
T4.join();
endtime = System.currentTimeMillis();
Time = endtime - startime;
System.out.println("The time consumed in miliseconds is " + Time);
}
public class WorkingThread extends Thread {
public static BufferedImage img;
public static int p;
public int nb;
public static int width, height;
public WorkingThread(String file) throws IOException {
File f = new File(file);
img = ImageIO.read(f);
width = img.getWidth();
height = img.getHeight();
p = 1;
nb = 0;
}
public WorkingThread() {
nb = p;
p++;
}
public void run() {
int start=nb*height/p;
int end = (nb + 1) * height/p;
//the image will be split according to y axis in this case
for(y=start; y < end ; y++) {
for(x =0; x<width; x++) {
pixel = img.getRGB(x, y);
//processing
img.setRGB(x, y, pixel);
}
}
}
コメントですでに指摘されているように、ベンチマークの欠陥は、スレッドのセットアップとティアダウンのオーバーヘッドが、コードを順番に実行するのに実際にかかる時間よりも大きいことです。
以下のように、時間がかかる愚かなコードを挿入する。
//processing
for (int i = 0; i < 1000; i++) {
pixel = ((~pixel ^ pixel) | pixel) & pixel;
}
... for
x
/y
ループ内で、の最大値を増やすと、i
最終的にマルチスレッドバージョンがシーケンシャルバージョンよりも高速になることがわかります。
PS:私はおよそ2500 x3300ピクセルの画像を使用しました。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加