![コマンドを N 回実行して時間を計る方法 (CTRL-C で停止できるようにする)](https://rvso.com/image/168808/%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%82%92%20N%20%E5%9B%9E%E5%AE%9F%E8%A1%8C%E3%81%97%E3%81%A6%E6%99%82%E9%96%93%E3%82%92%E8%A8%88%E3%82%8B%E6%96%B9%E6%B3%95%20(CTRL-C%20%E3%81%A7%E5%81%9C%E6%AD%A2%E3%81%A7%E3%81%8D%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%99%E3%82%8B).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 に組み込まれていない便利でシンプルな機能としてはやや奇妙ですtime
)。次のものを使用できます。
time for i in {1..10}; do python3 foo.py ; done
しかし、CTRL-C ではそれを停止できません。その 1 つの Python スクリプトが停止され、残りのスクリプトは実行され続けます。幸いにも、それは入力されていませんでした100
。1000
それを使用する方法time
、またはそれを実行するより良い方法はありますか? (プログラムを変更する以外に?)
答え1
Ctrl-C
ループ内で新しいプロセスを生成しているため、これは不可能です。Ctrl-C
各反復の実行速度に合わせて を 100 回、1000 回押して、すべてのプロセスを中断する必要があります。代わりに、 を押すこと
で同じ効果を得ることができます。これにより、ループによって作成された最新のフォアグラウンドプロセスが停止し、bash
Ctrl-Z
やめるループ自体。
答え2
シェルが であると仮定するとzsh
、次のようにします。
time (repeat 10 python3 foo.py)
これは、python3 コマンドを 10 回実行するサブシェルを実行するプロセス (および子プロセスを待機) の時間です。
bash
またはksh93
(または)を使用するとzsh
、次の操作を実行できます。
time (for ((i=0;i<10;i++)) { python3 foo.py; })
POSIX では次のように実行できます。
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
1 行で。
約半分を追加しますMS1 ループあたり。
$ time for ((i=0;i<1000;i++)); do if [ ! -f "./stop" ]; then : ; fi ; done
real 0m0.548s
user 0m0.157s
sys 0m0.359s