我想了解在终端中输入 date +%s%N 时显示的时间有多准确。
我知道这给出了以纳秒为单位的纪元时间,但这些数字是真实的吗?它是否以纳秒为单位代表我按下 Enter 键的时刻,还是在某种精度下是假的,并且低于毫秒?
答案1
它是否以纳秒为单位表示我按下回车键的时刻?
那不可能。在你点击Enter和命令输出之间会发生很多事情:
- 您的 shell 解释该命令并执行
/bin/date
。 - 内核创建一个进程,赋予它一个 PID,设置它的父进程,赋予一些地址空间,注册该进程,等等......
- 程序
/bin/date
执行。它可能需要分配一些内存。它调用几个与时间相关的内核例程,这会导致进程在用户模式和内核模式之间交替多次(就像任何其他进程一样……)。 - 命令输出被发送到stdout,您可以在终端中看到它,hourray!
基本上,你可以这样说:
- 你打了 Enter。
- [几毫秒过去,见上文]
- 该
date
程序调用中的神奇例程time.h
,并为每个例程切换到内核模式。这里,操作系统从硬件时钟获取当前时间。 - [几毫秒过去,见上文]
- 您得到了输出。
那些中间的时间可能会因多种因素而有所不同,但几乎无法测量。例如,如果您的 CPU 有许多进程要处理,那么您的date
进程将不得不在每个执行阶段之间休眠更长时间。
还可以进一步添加:
- 您得到了输出。
- 你眨眼(100-400 毫秒维基百科说)。
- 你实际上看输出。
- 你的大脑会解释并理解它。
在计数中增加几毫秒。
答案2
当然不是。你做的每件事都需要花费可测量的时间。从按下回车键,到键盘对其做出反应,将其传递给将运行的 shell,date
再到在终端上显示输出并读取它。为了更好地理解,请查看这个非常好的问答当你按下键盘上的一个键时究竟发生了什么。
如果我们重复使用该文章中的图表:
输入
+-------------------+ +-------------+
----->| terminal emulator |-------------->| application |
+-------------------+ +-------------+
keypress character or
escape sequence
输出
+-------------+ +-------------------+
| application |-------------->| terminal emulator |
+-------------+ +-------------------+
character or
escape sequence
上面显示的每个箭头和每个框都代表需要可测量时间的过程。对于该date
程序,您看到的时间是它在查询系统当前时间时得到的时间。该过程类似于
You hit enter --> `date` is executed -> queries current time
再次强调,上述每个步骤(以及其他较小的步骤,运行strace date
以获得想法)都需要时间,所以返回的时间不会是您击中的确切时间Enter。
当结果打印到终端上时,时间(以纳秒精度)将再次改变。您看到的是系统在date
询问时返回的。
但是,您可以放心,它足够精确,可以满足您在计算机上执行的任何操作。如果您需要纳秒级的精度,您可能需要定制硬件。