2012-05-09 10 views
1

同じ外部実行可能ファイルを6回呼び出す必要があるJavaプログラムがあります。この実行ファイルは出力ファイルを生成し、6回の実行がすべて完了すると、これらのファイルをまとめてマージします。私はちょうど私がコードを実行したfor-loopを持っていました。そして、外部実行可能ファイルの最初の実行が終了するまで待機しました。 6回実行する...特に、互いに依存しないので、外部実行可能ファイルを一度に6回実行することでスピードアップするのはかなり簡単だと考えました。これを実現するためにExecutorServiceRunnableなどを使用しました。外部実行可能ファイルをわずかに速く呼び出すJava実行プログラム

私の現在の実装では、自分の時間を約5秒短縮できるので、わずか11%の速さに過ぎません。ここで

私がやっているかを説明いくつかの(簡体字)のコードです:

private final List<Callable<Object>> tasks = new ArrayList<Callable<Object>>(); 

.... 

private void setUpThreadsAndRun() { 
    ExecutorService executor = Executors.newFixedThreadPool(6); 

    for (int i = 0; i < 6; i++) { 
     //create the params object 
     tasks.add(Executors.callable(new RunThread(params))); 
    } 

    try { 
     executor.invokeAll(tasks); 
    } catch (InterruptedException ex) { 
     //uh-oh 
    } 

    executor.shutdown(); 
    System.out.println("Finished all threads!"); 
} 

private class RunThread implements Runnable { 
    public RunThread(ModelParams params) { 
     this.params = params; 
    } 

    @Override 
    public void run() 
    { 
     //NOTE: cmdarray is constructed from the params object 
     ProcessBuilder pb = new ProcessBuilder(cmdarray); 
     pb.directory(new File(location)); 
     p = pb.start(); 
    } 
} 

は、私がこれを行うには、より効率的な方法がある願っています...または多分私は「目詰まり」しています一度にこのプロセスを6回実行しようとすると、コンピュータのリソースが失われます。このプロセスはファイルI/Oを伴い、サイズが約30MBのファイルを書き込みます。

答えて

2

実行可能ファイルを6回フォークするのはパフォーマンスが向上する唯一の時間です。少なくとも6つのCPUコアを持ち、アプリケーションがCPUにバインドされている場合、つまり主にプロセッサ操作を行う場合です。各アプリケーションは30MBのファイルを書き込むため、大量のIOを実行しているように聞こえ、アプリケーションはIOバインドされているため、ハードウェアのIO要求を処理する能力によって制限されます。

プログラムをスピードアップするには、2つの並行処理を試して、改善が得られているかどうかを確認してください。しかし、プログラムがIOバウンドの場合、複数のコピーをフォークすることで速度の向上はほとんど得られません。

+0

私はいくつかのテストを行いました。コードを6から1に変更し、それをタイムアウトしてから2になり、パフォーマンス上のメリットはごくわずかでした。だから私のコードは "正しい"と思うが、私のハードウェアは遅すぎる...私の疑惑を確認してくれてありがとう、CTRL-Zまでの時間;) – user869525

関連する問題