![如何對命令進行「計時」N 次(並且能夠使用 CTRL-C 來停止它)](https://rvso.com/image/168808/%E5%A6%82%E4%BD%95%E5%B0%8D%E5%91%BD%E4%BB%A4%E9%80%B2%E8%A1%8C%E3%80%8C%E8%A8%88%E6%99%82%E3%80%8DN%20%E6%AC%A1%EF%BC%88%E4%B8%A6%E4%B8%94%E8%83%BD%E5%A4%A0%E4%BD%BF%E7%94%A8%20CTRL-C%20%E4%BE%86%E5%81%9C%E6%AD%A2%E5%AE%83%EF%BC%89.png)
簡短的問題:
這是在 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 倍來中斷所有這些操作。作為替代方案,您可以透過按來
實現相同的效果,這將停止由循環創建的最新前台進程,並且bash
Ctrl-Z
辭職循環本身。
答案2
假設 shell 是zsh
,只需執行以下操作:
time (repeat 10 python3 foo.py)
運行子 shell 的進程(並等待子進程)運行 python3 命令 10 次。
使用bash
或ksh93
(或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