【问题标题】:Java - Optimized calling of multiple commandsJava - 多个命令的优化调用
【发布时间】:2013-02-01 11:02:16
【问题描述】:

问题
从 Java 程序调用多个命令的最有效方法是什么?

背景
我和我的团队的任务是创建一个程序,该程序最终在 UNIX 系统上调用一系列(从一百到一万,甚至更多)命令。这些命令不是简单的内置命令,而是已经安装在机器上的软件的一部分。因为这些命令工作量很大,而性能是我们软件成功的关键因素,所以我一直在研究从 Java 调用多个命令的最有效方法。不幸的是,我还没有找到一个从性能角度讨论调用多个命令的帖子、问题或论坛。

知识
我对 Java 中的 IO 非常熟悉,之前使用过 RuntimeProcessProcessBuilder 类。

我在寻找什么
我正在寻找关于如何最好地优化从 Java 程序中调用多个命令的高级或低级(仅伪,如果是低级,请)解释。我无法在网络上发布我们的代码,但我不认为在这种情况下我们的代码是必要的。为方便起见,随意假设我们调用的命令是cmd,它接受参数-a arg0 -b arg1。知道命令字符串是在程序的早期生成的,并且不会根据其他调用的结果而更改,这可能会有所帮助。知道所有调用的结果将是要添加到ArrayList 的字符串也可能会有所帮助。


非常感谢你的帮助。

【问题讨论】:

  • 命令是指单独的可执行文件?
  • 是的,我们调用的软件是ImageMagick,但是我们不能使用他们的Java库
  • 请明确您对控制的需求:每个命令都应该被控制,或者脚本文件(bash)中的一批命令可能是一个解决方案?
  • @Aubin - 如果“受控”是指被调用的其他命令取决于先前命令的结果,而“批量命令”是指预编译列表要调用的命令,那么答案是后者(命令批处理)
  • 为什么不使用 shell 脚本?命令本身(即图像处理)将花费时间,并且启动它们的方式不会有太大变化(如果有的话)。

标签: java performance optimization command command-line-arguments


【解决方案1】:

我认为这里的主要问题是并行运行尽可能多的命令,这些命令可以有效地并行运行。与管理命令的方式上的任何差异相比,这通常会在性能上产生更大的差异。

一般来说,我同意使用某种脚本并让 Java 直接运行仅脚本的解释器的想法。

特别是在这种情况下,我有时会使用并行 make。 makefile 可以指定要运行的命令,以及它们之间的任何依赖关系。例如,在需要进行数百次模拟的情况下,我的规则使原始模拟报告每个都依赖于模拟控制文件,而处理后的报告则依赖于原始报告。

Parallel make 可以在失败后轻松高效地恢复工作,而无需重做所有已成功完成的工作。它还可以管理将并行性限制为合理数量的线程。

【讨论】:

  • 你会说使用并行 make 会比创建多个 thread 对象更好吗?
  • @ZacharyKniebel 如果您单独驱动每个命令并且可以具有显着的并行性,您将需要大量线程来消耗每个命令的标准输出和标准错误。我不建议直接从 Java 驱动大量命令。无论您使用 make 还是其他脚本,我认为您应该将管理命令委托给某种脚本语言。
  • 顺便说一句,您可以从 Java 创建脚本,而不是手动编辑它,如果这样更方便的话。
  • 非常好!感谢你一如既往的支持! :)
  • +1 用于并行技术,这在具有许多处理器的现代机器上很重要。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-01-26
  • 1970-01-01
  • 2019-04-20
  • 1970-01-01
  • 1970-01-01
  • 2019-01-10
  • 2010-11-14
相关资源
最近更新 更多