在Mac OS X下如何获取以毫秒为单位的Bash执行时间?


12

我检查这个,但所提供的解决方案并没有为我工作。

使用date,我可以获得以秒为单位的执行时间:

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(如上所述)以获得纳秒精度,我得到以下错误:-bash:1369320760N:值对于基数太大(错误令牌为“ 1369320760N”)

有谁知道如何在Mac OS X下使用bash测量执行时间(以毫秒为单位)?


您真的需要纳秒分辨率吗?使用这种方法您会产生很多开销。随着# some work here中省略,我得到的时间从0.2到0.3秒-什么应该是零(或至少不变),以达到自己的目标。而/usr/bin/time usleep 50000给出的合理稳定时间为0.05 +/- 0.01秒。(仅在Linux上经过测试,不知道/ usr / bin / time和/或usleep在OSX上是否可用。)
mpy

您确定内部时钟分辨率可提供精确到纳秒级的分辨率吗?
mdpc

Answers:



11

如果我需要毫秒并且BSD不支持日期,我会走这条路线 +%s%N

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

谢谢!!!那就是没人在报告的解决方案……
Daniele 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

好吧,这很烦人……(在错误的窗口上测试)看到相同的错误:/
demure

1
无需划分输出,只需使用即可date +%s.%N(但我无法在OSX上检查;它在Linux上运行)。但问题然后就是,那bash$(( ))恕我直言,是不能够处理浮点数。
mpy

@mpy在osx上有效。前10个字符相同,但Linux和OS X之间的行为有所不同。
娴静

这是否意味着我们无法获得使用日期的毫微秒信息?
pacodelumberg 2013年

3

如果安装coreutils,则可以date通过编写使用GNU Linux gdate

coreutils在Homebrew中可用brew install coreutils


1

正如其他答案所提到的,OS X的日期不支持%N(纳秒)。

您能将命令按时间保存为脚本吗?或为它们使用子shell或命令组:

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

%.3f是具有3个小数点的浮点数的格式说明符。Time.now是Time类的一个类方法。


感谢您的回答,能否请您描述上面的红宝石代码?
pacodelumberg

1
在中ruby -e 'puts "%.3f" % Time.now'ruby调用ruby解释器,-e执行命令行后的脚本。 puts是ruby的printf(某种),Time是ruby的对象,Time.now是距纪元以来的秒数。使用%.3f将输出修整为3个小数位,即毫秒(输出的“ .046”和“ .943”部分。)
Olie

1
另外,它time是一个命令行工具,用于计算运行以下命令所花费的时间。请参阅man time以获取更多详细信息。
Olie

1

Glenn是对的,它time是您要查找的命令,但是为了解析出所需的信息,您需要将其传递给其他处理器,例如sed

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

该命令将删除命令本身的输出(将标准输出和错误输出都发送到/ dev / null),并将时间结果传递给sed,在此您需要选择适当的规则来编辑流并输出所需的值。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.