【问题标题】:why is Java Processbuilder 4000 times slower at running commands then Python Subprocess.check_output为什么 Java Processbuilder 在运行命令时比 Python Subprocess.check_output 慢 4000 倍
【发布时间】:2015-05-28 10:05:23
【问题描述】:

我正在尝试使用 Java processbuilder 为第三方 C 工具编写包装器。我需要运行这个流程构建器数百万次。但是,我发现速度有点奇怪。

我已经有了这个第三方工具 C 工具的包装器。在 python 中,包装器使用 python subprocess.check_output。

所以,我使用相同的命令运行了 java 包装器 10000 次。此外,使用相同的命令运行 python 包装器 10000 次。

使用 python,我的 10000 次测试在大约 0.01 秒内运行。

使用 java processbuilder,它在 40 秒内运行。

有人可以解释为什么我在两种语言之间的速度差异很大吗?

您可以使用“时间”之类的简单命令来尝试这个实验。

【问题讨论】:

  • 您是否在阅读 Java 提供给您的流?如果不是,这肯定可以解释问题。
  • 如果我需要 processbuilder 的输出,我正在读取 java 给我的流。但是,即使我不阅读流。例如,如果我们有这样的 java 程序。第 1 行:Processbuilder pb = new ProcessBuilder("time");第 2 行:进程 p = pb.start();仅此一项就花了 40 秒,而 python 只花了 0.01 秒。
  • 向我们展示包装器的完整代码。在幕后,你必须做一些明显不同的事情。在 0.01 秒内运行 10,000 个命令似乎快得难以置信。
  • 您确定check_output 不会立即引发异常吗?启动 10000 个子进程并使用 C program that calls fork(), write(), read(), select() directly (compile with -DN=10000) 从它们读取一些输出大约需要 0.3 秒,即正如 @Stephen C 所说:每 10000 个进程 0.01 秒似乎太快了。
  • @MSUcomprotein:你可能应该add your comment as an answer(python 更快,因为它不会产生子进程,即check_output() 实际上没有使用)。

标签: java python performance subprocess processbuilder


【解决方案1】:

似乎 python 没有产生子进程。这就是它更快的原因。

我很抱歉混淆了。

谢谢

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-19
    • 2019-04-05
    • 1970-01-01
    相关资源
    最近更新 更多