Mac OS XでBashの実行時間をミリ秒単位で取得する方法は?


12

私がチェックした本を、しかし提供される解決策は私のために動作しませんでした。

日付を使用して、実行時間を秒単位で取得できます。

T="$(date +%s)"
#some work here
T="$(($(date +%s)-T))"
echo "execution time (secs) ${T}"

ただし、これを試してみると:

T="$(date +%s%N)"
#some work here
T="$(($(date +%s%N)-T))"

ナノ秒の精度を得るために日付に%N(上記のように)を追加すると、次のエラーが表示されます。

Mac OS Xでbashを使用して実行時間をミリ秒単位で測定する方法を知っている人はいますか?


本当にナノ秒の解像度が必要ですか?このアプローチでは、多くのオーバーヘッドが発生します。# some work hereゼロをどうあるべきか(あるいは、少なくとも定数)があなたの目標を達成するために- ommited、私は0.2から0.3秒に時間を取得します。一方/usr/bin/time usleep 50000、0.05 +/- 0.01秒の合理的な安定時間を与えます。(Linuxでのみテストされており、OSXで/ usr / bin / timeおよび/またはusleepが利用可能かどうかわからない。)
mpy

内部クロックの解像度は、ナノ秒レベルまで正確な解像度を提供しますか?
mdpc

回答:



11

ミリ秒が必要で、BSDが日付をサポートしていなかった場合、このルートを使用します +%s%N

perl -MTime::HiRes -e 'printf("%.0f\n",Time::HiRes::time()*1000)'

ありがとう!!! それは...誰も周りに報告しなかったソリューションです
ダニエルB

3

echo $(($(date +%s%N)/1000000))

これは、ナノ秒からミリ秒に変換されます。

@mpyから、date +%s.%N動作します。

ただし、LinuxとOS Xでは出力が異なります:
linux:1369322592.573787111
OS X:1369322610.N


私は、次のエラーを取得しています:-bash:1369321446N:ベースの値が大きすぎる(エラー・トークンは「1369321446N」である)、これは、MAC OSXで仕事をしない、私は取得しています:
pacodelumberg

まあ、それは迷惑なんだ...同じエラーを見て(間違ったウィンドウ上でテスト):/
おとなしそうな

1
出力を分割する必要date +%s.%Nはなく、使用するだけです(ただし、OSXでは確認できません。Linuxで動作しています)。しかし問題は、bash's $(( ))IMHOが浮動小数点数を処理できないことです。
mpy

@mpy osxで動作します。ただし、最初の10文字についても同様で、LinuxとOS Xの間で異なる動作をします。
おとなしそうな

日付を使用してナノ秒の情報を取得できないということですか?
pacodelumberg

3

インストールするcoreutils場合date、を書くことでGNU Linuxを使用できますgdate

coreutilsはHomebrewで利用可能です:brew install coreutils


1

他の答えが述べたように、OS Xの日付は%N(ナノ秒)をサポートしていません。

コマンドをスクリプトとして保存するだけですか?または、サブシェルまたはコマンドグループを使用します。

time (sleep 0.1; echo a; sleep 0.1)
time { sleep 0.1; echo a; sleep 0.1; }

または、個々のコマンドの時間を合計します。

$ time=$(TIMEFORMAT=%R; (time sleep 0.1; echo a) 2>&1 > /dev/null)
$ time+=+$(TIMEFORMAT=%R; (time sleep 0.1) 2>&1)
$ bc <<< $time
.206

または、いくつかのスクリプト言語を使用します。

$ ruby -e 'puts "%.3f" % Time.now'
1369329611.046
$ time ruby -e '""'
0.029
$ time ruby -e 'puts "%.3f" % Time.now'
1369329622.943
0.029

%.3f3つの小数点を持つ浮動小数点数の形式指定子です。Time.nowは、Timeクラスのクラスメソッドです。


答えてくれてありがとう、上記のルビコードを説明してもらえますか?
pacodelumberg

1
ではruby -e 'puts "%.3f" % Time.now'rubyRubyインタプリタを呼び出し、-eコマンドラインで以下のスクリプトが実行されます。 putsはルビーprintf(の一種)でTimeあり、ルビーオブジェクトでありTime.now、エポックからの秒数です。を使用すると%.3f、出力が小数点以下3桁に切り捨てられます。これはミリ秒(出力の「.046」および「.943」の部分です)
オリー14年

1
また、time後続のコマンドの実行にかかる時間を計測するコマンドラインツールもあります。詳細man timeを参照してください。
オリー14年

1

Glennは正しい、timeあなたが探しているコマンドですが、必要な情報を解析するために、それをのような他のプロセッサーに渡す必要がありますsed

time command-goes-here >/dev/null 2>$1|sed rules-go-here

このコマンドは、コマンド自体からの出力を削除し(標準出力とエラー出力の両方を/ dev / nullに送信します)、時刻の結果をsedに渡します。ストリームを編集するには、適切なルールを選択する必要があります。目的の値。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.