Unix時代以降のミリ秒数を取得するには?

Unix時代以降のミリ秒数を取得するには?

私はhtmlを使っていて、JavaScriptを使ってロードタイムスタンプをミリ秒単位で取得するので、ブラウザの起動時間を測定するbashスクリプトを作成したいと思います。

ブラウザを呼び出す前のシェルスクリプトからタイムスタンプを取得します。

date +%s

問題は、タイムスタンプを秒単位で取得し、ミリ秒単位で必要であることです。なぜなら、ブラウザの2回目の実行が1秒以内に開始され、秒ではなくミリ秒を使用してその時間を正確に測定できる必要があるからです。

Bashスクリプトからミリ秒単位のタイムスタンプを取得するには?

答え1

GNUまたはast-open実装date(またはそのオプションが有効な場合はbusybox ' FEATURE_DATE_NANO)を使用して、次を使用します。

$ date +%s%3N

Unix epoch 以降のミリ秒数を返します。

答え2

date +%s.%Nたとえば、を提供します1364391019.877418748。 %Nは現在秒に経過しているナノ秒数です。これは9桁で、日付が100000000未満の場合はデフォルトでゼロで埋められます。数値に対して数学演算を実行したい場合、これは実際には問題になります。bash は、前に 0 の数字を 8 進数として扱います。。フィールド仕様にハイフンを使用してこのパディングを無効にできます。

echo $((`date +%s`*1000+`date +%-N`/1000000))

エポック以降のミリ秒数を素早く教えてくれます。

しかし、以下の説明でStephane Chazelasが指摘したように、これはわずかにdate異なる2つの時間を生成する2つの異なる呼び出しです。 2番目の秒がその間にある場合、計算は1秒遅れます。だから:

echo $(($(date +'%s * 1000 + %-N / 1000000')))

または最適化(明確にする必要がありますが、以下の説明のおかげで):

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

答え3

bash誰でもではなくシェルを使用ksh93してzsh浮動小数点変数がある場合は、次のように$SECONDS時間typeset -F SECONDSを正確に測定するのが便利です。

$ typeset -F SECONDS=0
$ do-something
something done
$ echo "$SECONDS seconds have elapsed"
18.3994340000 seconds have elapsed

バージョン4.3.13(2011)以降、モジュールに特殊浮動小数点変数がzshあります。$EPOCHREALTIMEzsh/datetime

$ zmodload zsh/datetime
$ echo $EPOCHREALTIME
1364401642.2725396156
$ printf '%d\n' $((EPOCHREALTIME*1000))
1364401755993

これは、から返される2つの整数(秒とナノ秒)から派生しますclock_gettime()。ほとんどのシステムでは、これはdouble単一のC浮動小数点数が受け入れることができるよりも精度が高いため、算術式で使用すると精度が低下します(1970年の最初の数ヶ月の日付を除く)。

$ t=$EPOCHREALTIME
$ echo $t $((t))
1568473231.6078064442 1568473231.6078064

高精度の時間差を計算するには(ミリ秒以上の精度が必要になると予想されますが)、$epochtime特別な配列(秒とナノ秒を2つの別々の要素として含む)を使用できます。

バージョン5.7(2018)以降、strftimeシェル組み込みは%NGNUのナノ秒形式date%.指定された精度もサポートしているため、次の方法でエポック以降のミリ秒数を取得することもできます。

zmodload zsh/datetime
strftime %s%3. $epochtime

(または変数に保存-s var

答え4

Bash 5+にはマイクロ秒単位の変数があります$EPOCHREALTIME

だから:

$ echo "$(( ${EPOCHREALTIME//.} / 1000 ))"
1568385422635

エポック(1/1/70)以降の時間をミリ秒単位で印刷します。

それ以外の場合は日付を使用する必要があります。 GNU日付:

echo "$(date +'%s%3N')"

に記載されている代替案の一つhttps://serverfault.com/a/423642/465827

またはbrew install coreutilsOS Xの場合

または、他のすべての方法が失敗した場合は、このcプログラムをコンパイル(gcc epochInμsec.c)します(必要に応じて調整)。

#include <stdio.h>
#include <sys/time.h>
int main(void)
{
  struct timeval time_now;
    gettimeofday(&time_now,NULL);
    printf ("%ld secs, %ld usecs\n",time_now.tv_sec,time_now.tv_usec);

    return 0;
}

外部プログラムを呼び出すと、ディスクから読み込み、ロード、起動、実行、出力を印刷するのに時間がかかります。これには数ミリ秒かかります。これは、日付を含む外部ツールを使用して達成できる最も低い精度です。

関連情報