# java与Python获取时间的方法底层是调用什么实现的呢?

编程语言只是工具。我们的大脑不是用来记忆每一种语言不同的语法。而是用来思考的?思考不同编程语言底层到底是怎么实现的?

# java获取时间的底层实现

System.currentTimeMillis()

// 源码追踪(OpenJDK):
public static native long currentTimeMillis();
1
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

底层调用路径:

// 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

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

# Windows API

1. GetSystemTimeAsFileTime()    // 100ns精度
2. QueryPerformanceCounter()    // 高精度计数器
3. GetTickCount()              // 毫秒精度
1
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

# 性能考虑

方法 精度 开销 是否受系统时间调整影响
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

# 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

# 总结

  1. Java和Python最终都依赖操作系统的系统调用来获取时间
  2. 不同精度的时间使用不同的时钟源
    • 日历时间:访问RTC,可能被NTP调整
    • 单调时间:使用TSC/HPET,仅递增
  3. 跨平台差异:各操作系统提供不同的API,运行时库进行封装
  4. 性能与精度的权衡:高精度时间获取通常开销更大

对于需要高精度计时的场景(如性能分析),建议使用单调时钟(nanoTime()/monotonic()),避免系统时间调整带来的影响。

Last Updated: 12/23/2025, 11:46:58 AM