2
私はこの問題を示すためにここで少しテストをしました。Java Graphics2dで並列描画が可能ですか?
明らかにコードは機能しますが、スレッド数を増やすほど(十分なコアがあると仮定して)パフォーマンスは向上しません。
描画操作がシリアル化されているかのようです。
import java.awt.*;
import java.awt.image.BufferedImage;
import java.util.Date;
import java.util.Random;
public class Para2dTest {
class DrawSomething implements Runnable {
@Override
public void run() {
Random r = new Random();
long start = new Date().getTime();
BufferedImage image = new BufferedImage(100, 100, BufferedImage.TYPE_INT_ARGB);
Graphics2D g2d = image.createGraphics();
for (int i = 0; i < 100000; i++) {
Color c = new Color(r.nextInt(256), r.nextInt(256), r.nextInt(256));
g2d.setPaint(c);
g2d.fillRect(0, 0, 100, 100);
}
g2d.dispose();
long end = new Date().getTime();
System.out.println(Thread.currentThread().getName() + " " + (end - start));
}
}
public Para2dTest(int threads) {
for (int t = 0; t < threads; t++) {
Thread ds = new Thread(new DrawSomething());
ds.start();
}
}
public static void main(String[] args) {
System.setProperty("java.awt.headless", "true");
int threads = 16;
if (args.length > 0) {
try {
threads = Integer.parseInt(args[0]);
System.out.println("Processing with " + threads + " threads");
} catch (NumberFormatException e) {
System.err.println("Argument" + " must be an integer");
}
}
new Para2dTest(threads);
}
}
これは、[何度も尋ねられる]の特定のバージョンです(http://stackoverflow.com/questions/1223072/how-do-i-optimize-for-multi-core-and-multi-cpu-マルチコアシステム上でスレッドがどのように処理されるかをコーダが制御できるかどうかについて一般的な質問があります。 –
AWTに大きなロックがあります。 (本来のロックではあったが、パフォーマンス上の理由からJDK 6の 'Lock'に変更されました.JackclockとロックされているHotSpotとほぼ同じ時期にロックされていました)。 –
おかげでトム。私はopen jdkのソースを調べ、何かができるかどうかを見ます。 – Johnny