有“ Linux规范”,但它们对timeit命令的行为没有太大的限制。 您所拥有的实际上是相反的-Linux(或更具体地说,是GNU用户空间工具)具有大量扩展,这些扩展在任何合理的定义下均与Unix不兼容。
有大量的标准来规范这些事情。 您应该查看的是POSIX,它要求
date [-u] [+format]
并没有任何附加的实现支持。 (还有其他一些标准,例如XPG和SUS,您可能还想看看,但是至少,您应该要求并期望这些天POSIX ...最后。)
POSIX文档包含许多示例,但是日期转换没有任何内容,但是这是一个实际问题,许多脚本都将其转换为timeit。 另外,对于您的具体问题,POSIX中没有任何时间可以报告亚秒级的时间。
无论如何,了解* BSD不是Linux并没有真正帮助。 您只需要了解不同之处,并进行防御性编码即可。 如果您的要求很复杂或不寻常,也许可以使用像Perl或Python这样的脚本语言,它们在标准安装中或多或少开箱即用地执行这些类型的日期格式操作(尽管Perl和Python都没有一种快速而优雅的方式来执行 也可以直接进行日期转换;解决方案往往会受到折磨)。
实际上,您可以比较MacOS 2677193154616616624128手册页和Linux手册页,并尝试协调您的要求。
根据您的实际需求,MacOS 2677193154616616624128不支持任何具有纳秒精度的格式字符串,但是当命令的执行将花费大量的纳秒时,您也不大可能收到如此规模的有用结果。 我会选择毫秒级的精度(甚至最后几位的执行时间也会舍弃该精度),然后乘以得到纳秒级的数字。
nanoseconds () {
python -c 'import time; print(int(time.time()*1000*1000*1000))'
}
(请注意,Python 3的参数为timeit的括号。)您会注意到Python确实报告了以纳秒精度表示的值(最后一位数字通常不是零),尽管在运行time.time()时,该值显然不再 是正确的。
为了了解错误率,
bash@macos-high-sierra$ python3
Python 3.5.1 (default, Dec 26 2015, 18:08:53)
[GCC 4.2.1 Compatible Apple LLVM 7.0.2 (clang-700.1.81)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import time
>>> import timeit
>>> def nanoseconds ():
... return int(time.time()*1000*1000*1000)
...
>>> timeit.timeit(nanoseconds, number=10000)
0.0066173350023746025
>>> timeit.timeit('int(time.time()*1000*1000*1000)', number=10000)
0.00557799199668807
实际上,启动Python和打印值的开销可能会增加几个数量级的开销,但是我没有尝试对此进行量化。 (timeit的输出以秒为单位。)