如何對命令進行「計時」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

相關內容