一、函数原型

public static long nanoTime()

这里引用了在官方API中的一段关键的描述:

The value returned represents nanoseconds since some fixed but arbitrary origin time (perhaps in the future, so values may be negative)

翻译如下:
返回的值表示从某个固定但任意的起始时间开始的纳秒数(可能在将来,因此值可能为负数)

在Java虚拟机运行时,会设置某个固定但任意的起始时间T,在程序执行 t 纳秒后执行了语句System.nanoTime(),该函数的返回值为T+t

此方法只能用于测量运行时间,与计算机系统时间或我们使用的钟表时间概念无关。
我们的计算机系统时间是距离1970年1月1日 午夜 GMT的毫秒值。

在虚拟机启动时,会随机的选择一个固定的long类型的值作为时间的起点,每次调用该方法,会返回从虚拟机设定的时间起点到调用时经过的时间,单位为纳秒

此方法提供纳秒级精度,但不一定提供纳秒级分辨率(即值变化的频率)。可以这样理解,1纳秒之后不是2纳秒,可能是20纳秒,也可能是100纳秒,它们不是连续的。

关于起始时间是依据什么计算出的一个值,为什么表示将来的时间是一个负数,目前我也不清楚,希望知道的小伙伴可以给我回复下。(注,应该不是依据UTC时间,1970年1月1日0时,表示的时间,此方法表示的将来的系统时间应该是正数。目前,并没有影响此方法的使用,暂未深究)。

二、应用

1、用于随机函数的种子

Random类,伪随机数产生时的种子

2、用于测量算法的运行时间(最常用)

long startTime = System.nanoTime();
// 某个算法,例如:线性查找算法
long endTime = System.nanoTime();
double time = (endTime - startTime) / 1000000000.0  // 将纳秒转换为秒
System.out.println(time + "s");
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐