手机屏幕点亮又熄灭算是一瞬,CPU 干活时算的却是纳秒。主频 3GHz 的处理器,一个时钟周期只有 0.33 纳秒左右,一秒里要重复 30 亿次。纳秒到底多短,先把换算关系摆出来。
纳秒到秒的换算关系
1 纳秒等于十亿分之一秒,写成小数是 0.000000001 秒,科学计数法是 1 乘 10 的负 9 次方秒。相邻时间单位之间都是 1000 倍的关系:
- 1 秒 = 1000 毫秒(ms)
- 1 毫秒 = 1000 微秒(μs)
- 1 微秒 = 1000 纳秒(ns)
- 1 纳秒 = 0.001 微秒 = 0.000000001 秒
- 1 分钟 = 600 亿纳秒
反过来看:1 秒里有 10 亿纳秒,1 毫秒里有 100 万纳秒,纳秒比毫秒小 100 万倍。这也解释了为什么测网络延迟用毫秒(ping 值几十到几百),而内存和 CPU 的参数用纳秒。
用身边的东西感受纳秒
光在真空里 1 纳秒大约走 30 厘米,一臂的长度。你眨一次眼约 0.3 秒,等于 3 亿纳秒,这点时间里光已经绕地球二十多圈了。
再看设备:内存访问延迟一般以十纳秒计,SSD 的响应在几十微秒量级,机械硬盘寻道要几毫秒,人按下键盘到屏幕出字超过 100 毫秒。设备越快,讨论问题用的时间单位就越小。
还有个拉尺度的比喻:把 1 秒拉长成 32 年,原来的 1 纳秒才刚好变成新的 1 秒。CPU 里的一个时钟周期,放在这个尺度下还不到半秒钟,机器一秒干完的事,用人的一生去衡量几乎是白驹过隙。
哪些地方会碰到纳秒
最常见的是内存参数。内存条标称的 CL 时序乘以时钟周期,算出来的延迟就是纳秒数,两条频率不同的内存,同样的 CL 值实际延迟并不一样。写代码测性能时,Java 的 System.nanoTime 返回的也是纳秒级数值。
给数字排个队找感觉:网络 ping 值 30 毫秒,是 3000 万纳秒;一次鼠标点击到系统响应约几十毫秒;CPU 内部一次基本运算的时间以纳秒甚至更小计。数量级差这么多,所以不同场景用不同单位,不是故意绕人。
换算记住一句就够:纳秒和秒之间隔 9 个数量级,1 纳秒等于 0.000000001 秒。看到单位先数零,毫秒是千分位,微秒是百万分位,纳秒是十亿分位,一般不会算错。