# java与Python获取时间的方法底层是调用什么实现的呢?
编程语言只是工具。我们的大脑不是用来记忆每一种语言不同的语法。而是用来思考的?思考不同编程语言底层到底是怎么实现的?
# java获取时间的底层实现
System.currentTimeMillis()
// 源码追踪(OpenJDK):
public static native long currentTimeMillis();
1
2
2
底层调用路径:
- JNI调用 → 操作系统API → 硬件时钟
- Linux: 通过
clock_gettime(CLOCK_REALTIME)系统调用 - Windows: 通过
GetSystemTimeAsFileTime()API - 最终访问:硬件RTC(实时时钟)或TSC(时间戳计数器)
System.nanoTime()
public static native long nanoTime();
1
底层调用路径:
- Linux:
clock_gettime(CLOCK_MONOTONIC) - Windows:
QueryPerformanceCounter() - 使用高精度计时器,不保证与真实时间的关联
# Python获取时间的底层实现
time.time()
import time
time.time() # 返回Unix时间戳
1
2
2
底层调用路径:
// CPython源码(Modules/timemodule.c):
static PyObject *
time_time(PyObject *self, PyObject *args)
{
struct timeval tv;
gettimeofday(&tv, NULL);
return PyFloat_FromDouble(tv.tv_sec + tv.tv_usec / 1000000.0);
}
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
time.monotonic()
time.monotonic() # 单调递增时间,不受系统时间调整影响
1
底层调用:
- Linux:
clock_gettime(CLOCK_MONOTONIC) - Windows:
GetTickCount64()或QueryPerformanceCounter()
# 操作系统级别的系统调用
# Linux系统调用
// 主要时间相关系统调用:
1. gettimeofday() // 获取日历时间(微秒精度)
2. clock_gettime() // 多种时钟源,高精度
3. time() // 秒级时间戳
1
2
3
4
2
3
4
# Windows API
1. GetSystemTimeAsFileTime() // 100ns精度
2. QueryPerformanceCounter() // 高精度计数器
3. GetTickCount() // 毫秒精度
1
2
3
2
3
# 硬件层面
# 时间源层级结构:
应用层 (Java/Python)
↓
运行时库/标准库
↓
操作系统内核 (系统调用)
↓
硬件抽象层 (HAL)
↓
硬件时钟源:
- RTC (Real Time Clock) // 电池供电,保持时间
- TSC (Time Stamp Counter) // CPU周期计数器
- HPET (High Precision Event Timer)
- ACPI PM Timer
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
# 性能考虑
| 方法 | 精度 | 开销 | 是否受系统时间调整影响 |
|---|---|---|---|
currentTimeMillis() | 1ms | 低 | 是 |
nanoTime() | 纳秒级 | 中等 | 否 |
time.time() | 微秒级 | 低 | 是 |
time.monotonic() | 纳秒级 | 中等 | 否 |
# 示例代码对比
# Java示例
// 系统时间(可调整)
long currentTime = System.currentTimeMillis();
// 单调时间(不可调整,适合测量间隔)
long start = System.nanoTime();
// 执行代码
long elapsed = System.nanoTime() - start;
1
2
3
4
5
6
7
2
3
4
5
6
7
# Python示例
import time
# 日历时间
timestamp = time.time() # 调用gettimeofday()
# 单调时间(适合性能测量)
start = time.monotonic()
# 执行代码
elapsed = time.monotonic() - start
# 最高精度(平台相关)
perf_counter = time.perf_counter()
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
# 总结
- Java和Python最终都依赖操作系统的系统调用来获取时间
- 不同精度的时间使用不同的时钟源:
- 日历时间:访问RTC,可能被NTP调整
- 单调时间:使用TSC/HPET,仅递增
- 跨平台差异:各操作系统提供不同的API,运行时库进行封装
- 性能与精度的权衡:高精度时间获取通常开销更大
对于需要高精度计时的场景(如性能分析),建议使用单调时钟(nanoTime()/monotonic()),避免系统时间调整带来的影响。
← ang- 开始掌握docsify →