Javaマルチスレッド化されたアプリケーションに慣れようとしています。私は非常によく並列化できる単純なアプリケーションを考えようとしました。私は、ベクターの追加はそうするのに適していると思っていました。 しかし、私のLinuxサーバ(4つのコアを持っています)で走っているとき、私はスピードを上げません。 4,2,1スレッドで実行する時間はほぼ同じです。Javaマルチスレッド化されたベクトルの追加
ここに私が思い付いたコードです:
public static void main(String[]args)throws InterruptedException{
final int threads = Integer.parseInt(args[0]);
final int length= Integer.parseInt(args[1]);
final int balk=(length/threads);
Thread[]th = new Thread[threads];
final double[]result =new double[length];
final double[]array1=getRandomArray(length);
final double[]array2=getRandomArray(length);
long startingTime =System.nanoTime();
for(int i=0;i<threads;i++){
final int current=i;
th[i]=new Thread(()->{
for(int k=current*balk;k<(current+1)*balk;k++){
result[k]=array1[k]+array2[k];
}
});
th[i].start();
}
for(int i=0;i<threads;i++){
th[i].join();
}
System.out.println("Time needed: "+(System.nanoTime()-startingTime));
}
長さは常にスレッドとgetRandomArray(の倍数である)は、0と1の
実行時間とのダブルスのランダムな配列を作成します1スレッドのために:74211325ns
実行時間4スレッドのための:89215100ns
長= 10000000 実行時間2スレッドのための84579446nsここでは
getRandomArrayのコードは()です:
private static double[]getRandomArray(int length){
Random random =new Random();
double[]array= new double[length];
for(int i=0;i<length;i++){
array[i]=random.nextDouble();
}
return array;
}
私は任意の助けをいただければ幸いです。
長さが「10000000」という巨大な値で試しましたか? –
長さ= 10000000のテストを実行し、スピードアップを見ることができません。コードの下の私の編集を参照してください。 – CheckersGuy
'getRandomArray'のコードを私に投稿できますか? –