【发布时间】: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