如何对命令进行“计时”N 次(并且能够使用 CTRL-C 来停止它)

如何对命令进行“计时”N 次(并且能够使用 CTRL-C 来停止它)

简短的问题:

这是在 Mac 上完成的:

time for i in {1..10}; do python3 foo.py ; done

但 CTRL-C 无法阻止它。如何让它发挥作用? (或者如何计时N次的运行时间?)


细节:

github上有一些标准的程序测试,我可以运行它:

 python3 foo.py

或者

 time python3 foo.py

它报告运行时间为 0.27 秒。由于测试已连接 1000 个测试用例并连接到测试框架,因此我不想更改测试,因此我想对其计时 100 次。看起来这个命令time没有办法计时 10 或 100 次(这对 Unix 来说有点奇怪,这么多年了,这么有用和简单的东西还没有内置到 Unix 中time)。可以使用以下内容:

time for i in {1..10}; do python3 foo.py ; done

但是 CTRL-C 无法停止它——它会停止那个 python 脚本并继续运行其余的脚本。幸运的是它不是100或者1000是输入的。有没有办法使用time或更好的方法来做到这一点? (除了改变程序?)

答案1

这是不可能的,Ctrl-C因为您是在循环中生成新进程。您必须Ctrl-C按每次迭代执行速度的 100、1000 倍来中断所有这些操作。作为替代方案,您可以通过按
来实现相同的效果,这将停止由循环创建的最新前台进程,并且bashCtrl-Z辞职循环本身。

答案2

假设 shell 是zsh,只需执行以下操作:

time (repeat 10 python3 foo.py)

运行子 shell 的进程(并等待子进程)运行 python3 命令 10 次。

使用bashksh93(或zsh),您可以执行以下操作:

time (for ((i=0;i<10;i++)) { python3 foo.py; })

POSIXly,你可以这样做:

time -p sh -c '
  i=0; while [ "$i" -lt 10 ]; do
    python3 foo.py
    i=$((i + 1))
  done'

答案3

这不是“Ctrl+C”解决方案,而是如果您想“优雅地”停止长循环序列的解决方案。您所需要做的就是创建./stop-foo-py文件;例如$ echo "" > ./stop-foo-py(在另一个终端中)。

rm ./stop-foo-py
time for ((i=0;i<1000;i++));
    do if [ ! -f "./stop-foo-py" ]; then
        python foo.py ;
        fi ;
    done

rm ./stop-foo-py; time for ((i=0;i<1000;i++)); do if [ ! -f "./stop-foo-py" ]; then python foo.py ; fi ; done排成一行。

大约增加了一半多发性硬化症每个循环。

$ time for ((i=0;i<1000;i++)); do if [ ! -f "./stop" ]; then : ; fi ; done

real    0m0.548s
user    0m0.157s
sys     0m0.359s

相关内容