Java executor调用外部可执行文件的速度仅略快

Java executor调用外部可执行文件的速度仅略快,java,concurrency,runnable,executorservice,Java,Concurrency,Runnable,Executorservice,我有一个Java程序,需要调用相同的外部可执行文件6次。此可执行文件生成一个输出文件,一旦所有6次运行完成,我将这些文件“合并”在一起。我确实有一个for循环,在那里我运行代码,等待外部可执行文件的第一次运行结束,然后再次调用它,等等 我发现这非常耗时,平均运行6次需要52.4秒。。。我认为一次运行外部可执行文件6次会很容易提高速度,特别是因为它们彼此不依赖。我使用了ExecutorService和Runnable等来实现这一点 在我目前的实施中,我节省了约5秒的时间,只比以前快了约11% 下面

我有一个Java程序,需要调用相同的外部可执行文件6次。此可执行文件生成一个输出文件,一旦所有6次运行完成,我将这些文件“合并”在一起。我确实有一个for循环,在那里我运行代码,等待外部可执行文件的第一次运行结束,然后再次调用它,等等

我发现这非常耗时,平均运行6次需要52.4秒。。。我认为一次运行外部可执行文件6次会很容易提高速度,特别是因为它们彼此不依赖。我使用了
ExecutorService
Runnable
等来实现这一点

在我目前的实施中,我节省了约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();
    }
}
private final List tasks=new ArrayList();
....
私有void setUpThreadsAndRun(){
ExecutorService executor=Executors.newFixedThreadPool(6);
对于(int i=0;i<6;i++){
//创建params对象
tasks.add(Executors.callable(newrunthread(params));
}
试一试{
执行人。调用所有(任务);
}捕获(中断异常例外){
//哦
}
executor.shutdown();
System.out.println(“完成所有线程!”);
}
私有类RunThread实现Runnable{
公共运行线程(ModelParams-params){
this.params=params;
}
@凌驾
公开募捐
{
//注意:cmdarray是从params对象构造的
ProcessBuilder pb=新的ProcessBuilder(cmdarray);
pb.directory(新文件(位置));
p=pb.start();
}
}

我希望有一种更有效的方法来实现这一点……或者我试图一次运行6次,这会“阻塞”我的计算机资源。此过程确实涉及文件I/O,并写入大小约为30mb的文件。

将可执行文件分叉6次将获得性能提升的唯一时间是,如果您至少有6个CPU内核,并且您的应用程序受CPU限制,即主要执行处理器操作。因为每个应用程序都写一个30mb的文件,所以听起来好像它在做大量的IO,而应用程序是IO绑定的——受硬件服务IO请求的能力限制


为了加快程序的速度,您可以尝试两个并发进程,看看是否有改进。但是,如果您的程序是IO绑定的,那么您将永远无法通过分叉多个副本来获得速度提升。

我做了一些测试,我将代码从6改为1并计时,然后改为2,性能优势可以忽略不计。所以我想我的代码是“正确的”,但我的硬件太慢了……谢谢你确认我的怀疑,是时候按下CTRL-Z了。)