gpt4 book ai didi

Java 执行器调用外部可执行文件的速度仅稍快一些

转载 作者:行者123 更新时间:2023-11-30 04:48:00 24 4
gpt4 key购买 nike

我有一个 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();
}
}

我希望有一种更有效的方法来做到这一点...或者也许我尝试一次运行此进程 6 次而“堵塞”了我的计算机资源。此过程确实涉及文件 I/O 并写入大小约为 30mb 的文件。

最佳答案

唯一一次 fork 可执行文件 6 次将获得性能提升的情况是,如果您至少有 6 个 CPU 核心,并且您的应用程序受 CPU 限制,即主要执行处理器操作。由于每个应用程序都会写入一个 30mb 文件,因此听起来它正在执行大量 IO,而应用程序却受 IO 限制 - 受到硬件服务 IO 请求的能力的限制。

为了加快程序速度,您可以尝试 2 个并发进程,看看是否有所改进。但是,如果您的程序受 IO 限制,那么通过 fork 多个副本永远不会获得太大的速度提升。

关于Java 执行器调用外部可执行文件的速度仅稍快一些,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10517827/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com