コマンドを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回測定したいと思います。このコマンドが10回または100回の時間を測定する方法はないようですtime(Unixでは少し奇妙なことです。数年が過ぎた後もそのように便利で簡単なものがUnixに組み込まれていないためですtime)。以下を使用できます。

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

ただし、CTRL-Cはこれを停止しません。 Pythonスクリプトを停止し、残りを実行し続けます。幸いなことに、そうでないか100入力されていません1000timeこれを使用する方法やより良い方法はありますか? (プログラムを変える以外に?)

答え1

Ctrl-Cループ内で新しいプロセスを作成するため、これは不可能です。Ctrl-C各繰り返し速度の100、1000倍でこれらすべてを破る必要があります。あるいは、
ループによって生成された最新のフォアグラウンドプロセスを停止するを押すと、同じ効果が得られます。bashCtrl-Z辞めるループ自体。

答え2

シェルが次のようになると仮定したzsh場合は、次のようにします。

time (repeat 10 python3 foo.py)

サブシェルを実行してサブプロセスを待つプロセスは、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

関連情報