2

从Time Unix 命令的这个答案中,我得到了关于时间如何工作的基本概念。它派生一个新进程并在该新进程中执行命令。但是,我遇到了我无法理解的行为。

我正在尝试分析lusearch,这是DaCapo 基准套件的基准。我想以不同的配置(线程数和迭代次数)启动它,忽略基准输出并使用时间来记录真实、用户和系统时间。对于绝大多数配置,我的脚本运行良好,启动基准测试并记录时间。

对于一种特定的配置(大型数据集、两个线程和十次迭代),基准测试有时不会终止(80% 的情况,几乎 100 次尝试)。这是我用来启动它的命令:

(time -p java -jar DaCapo.jar lusearch -s large -t 2 -i 10 
 >/dev/null 2>/dev/null) 2>&1 | awk '{print $2 $4 $6}' > timed &

但是,如果我不预先设置时间,则基准测试只会终止 100% 的时间(也有大约 100 次尝试):

(java -jar DaCapo.jar lusearch -s large -t 2 -i 10 >/dev/null 2>/dev/null)

此行为仅在此基准测试和此配置中发生,而如果配置其他基准测试或使用不同数量的线程或不同数量的迭代,我看不到同样的事情发生。我的猜测是,它与时间正在做的干扰基准的事情有关。

我看不到 fork+exec 如何改变基准行为。有什么具体的原因会导致这种情况吗?例如:时间是否在使用基准测试也想要使用的某些资源?启动基准测试时我做错了什么?

4

1 回答 1

1

“没有达到终止”是相当模糊的。由于您将所有内容发送到/dev/null. 如果不知道该程序的功能,没有错误消息,没有回溯,就不可能给出明确的答案。

我能想到的唯一实际区别是您没有在第二种情况下将其作为背景。带有某些管道和重定向组合的 Bash 在后台运行时不会/dev/null隐式重定向到标准输入。程序的某些部分可能对此敏感。有关需要显式重定向的一些示例,请参阅我的测试用例。Bash 在这里并不完全遵循 POSIX,并且与所有其他 shell 不同,它具有异步列表、管道和重定向的某些组合。

我严重怀疑它与time. 如果您在这里没有得到更好的答案,可以询问 help-bash 列表,但如果没有更好的信息,他们将无法获得更好的答案。

于 2012-12-13T23:26:35.693 回答