Linux中是否有shell命令以毫秒为单位获取时间?


当前回答

我只是想在Alper的回答中补充一下我必须做的事情:

在Mac上,你需要brew install coreutils,所以我们可以使用gdate。否则在Linux上,它只是日期。这个函数将帮助您执行命令,而无需创建临时文件或任何东西:

function timeit() {
    start=`gdate +%s%N`
    bash -c $1
    end=`gdate +%s%N`
    runtime=$(((end-start)/1000000000.0))
    echo " seconds"
}

你可以将它与字符串一起使用:

timeit 'tsc --noEmit'

其他回答

当你从4.1版本开始使用GNU AWK时,你可以加载时间库并执行以下操作:

$ awk '@load "time"; BEGIN{printf "%.6f", gettimeofday()}'

这将以秒为单位打印自1970-01-01T00:00:00以来的当前时间,精度为亚秒。

the_time = gettimeofday() Return the time in seconds that has elapsed since 1970-01-01 UTC as a floating-point value. If the time is unavailable on this platform, return -1 and set ERRNO. The returned time should have sub-second precision, but the actual precision may vary based on the platform. If the standard C gettimeofday() system call is available on this platform, then it simply returns the value. Otherwise, if on MS-Windows, it tries to use GetSystemTimeAsFileTime(). source: GNU awk manual

在Linux系统上,标准C函数getimeofday()以微秒精度返回时间。

像这样的Python脚本:

import time
cur_time = int(time.time()*1000)

输出十进制秒数:

start=$(($(date +%s%N)/1000000)) \
    && sleep 2 \
    && end=$(($(date +%s%N)/1000000)) \
    && runtime=$((end - start))

divisor=1000 \
    && foo=$(printf "%s.%s" $(( runtime / divisor )) $(( runtime % divisor ))) \
    && printf "runtime %s\n" $foo # in bash integer cannot cast to float

输出:runtime 2.3

Nano是10−9,milli是10−3。因此,我们可以使用纳秒的前三个字符来得到毫秒:

date +%s%3N

男人约会:

%N纳秒(000000000..999999999) 1970-01-01 00:00:00 UTC以来的%s秒

来源:服务器故障如何在Bash中以毫秒为单位获得当前Unix时间?

date命令在OS X上没有提供毫秒,所以使用了python中的别名

millis(){  python -c "import time; print(int(time.time()*1000))"; }

OR

alias millis='python -c "import time; print(int(time.time()*1000))"'

编辑:跟随@CharlesDuffy的评论。 fork任何子进程都需要额外的时间。

$ time date +%s%N
1597103627N
date +%s%N  0.00s user 0.00s system 63% cpu 0.006 total

Python仍然在改进它的虚拟机启动时间,它没有提前编译的代码(比如日期)快。

在我的机器上,它花了大约30 - 60毫秒(即日期花费的6毫秒的5 -10倍)

$ time python -c "import time; print(int(time.time()*1000))"
1597103899460
python -c "import time; print(int(time.time()*1000))"  0.03s user 0.01s system 83% cpu 0.053 total

我认为awk比python轻量级,所以awk的范围是6ms到12ms(即日期的1x到2x):

$ time awk '@load "time"; BEGIN{print int(1000 * gettimeofday())}'
1597103729525
awk '@load "time"; BEGIN{print int(1000 * gettimeofday())}'  0.00s user 0.00s system 74% cpu 0.010 total