You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Ada中获取integer64格式的微秒级当前时间(等效C的clock_gettime)

在Ada中实现等效于C clock_gettime的微秒级时间获取(Integer64格式)

如果你需要在Ada中获取微秒级的当前时间并以Integer_64格式返回,同时达到和C语言clock_gettime函数等效的功能,有两种可靠的实现方式:纯Ada标准库实现,或者直接调用系统的clock_gettime函数。

方法一:纯Ada标准库实现

实时墙钟时间(对应CLOCK_REALTIME)

利用Ada.Calendar包获取系统实时时间,将其转换为从纪元开始的总微秒数:

with Ada.Calendar; use Ada.Calendar;
with Interfaces; use Interfaces;

function Get_Current_Microseconds return Integer_64 is
   Now_Time    : Time := Clock;
   Now_Duration : Duration := Time_To_Seconds(Now_Time);
   Seconds     : Integer_64 := Integer_64(Now_Duration);
   -- 提取小数部分对应的纳秒数
   Nanoseconds : Integer_64 := Integer_64((Now_Duration - Duration(Seconds)) * 1_000_000_000.0);
begin
   return Seconds * 1_000_000 + Nanoseconds / 1000;
end Get_Current_Microseconds;

单调时钟(对应CLOCK_MONOTONIC)

如果需要不受系统时间调整影响的单调时钟(适合测量时间间隔),使用Ada.Real_Time包:

with Ada.Real_Time; use Ada.Real_Time;
with Interfaces; use Interfaces;

function Get_Monotonic_Microseconds return Integer_64 is
   Now   : Time := Clock;
   Span  : Time_Span := Now - Time_First;
   Seconds     : Integer_64 := Integer_64(Seconds(Span));
   Nanoseconds : Integer_64 := Integer_64(Nanoseconds(Span));
begin
   return Seconds * 1_000_000 + Nanoseconds / 1000;
end Get_Monotonic_Microseconds;

方法二:直接调用C的clock_gettime函数

如果需要完全对齐C语言的clock_gettime行为(比如和C代码交互或依赖特定时钟类型),可以通过Ada的C绑定实现:

首先定义C结构体和函数的绑定:

with Interfaces.C; use Interfaces.C;
with System;

package C_Clock_Bindings is
   -- 对应C的timespec结构体
   type timespec is record
      tv_sec  : time_t;
      tv_nsec : long;
   end record;
   pragma Convention(C, timespec);

   -- 时钟类型常量(根据目标系统调整,以下为Linux常见值)
   CLOCK_REALTIME  : constant int := 0;
   CLOCK_MONOTONIC : constant int := 1;

   -- 绑定clock_gettime函数
   function clock_gettime(clock_id : int; tp : access timespec) return int;
   pragma Import(C, clock_gettime, "clock_gettime");
end C_Clock_Bindings;

然后实现获取微秒的函数:

with C_Clock_Bindings; use C_Clock_Bindings;
with Interfaces; use Interfaces;

function Get_CLOCK_REALTIME_Microseconds return Integer_64 is
   Ts     : aliased timespec;
   Result : int;
begin
   Result := clock_gettime(CLOCK_REALTIME, Ts'Access);
   if Result /= 0 then
      raise Program_Error with "clock_gettime system call failed";
   end if;
   return Integer_64(Ts.tv_sec) * 1_000_000 + Integer_64(Ts.tv_nsec) / 1000;
end Get_CLOCK_REALTIME_Microseconds;

关键注意事项

  • Integer_64类型来自Interfaces包,必须通过with Interfaces; use Interfaces;引入。
  • 纯Ada方式的时钟精度依赖系统实现,现代操作系统通常能提供纳秒级精度,转换为微秒完全可靠。
  • 单调时钟不会因系统时间修改(如NTP同步)产生跳变,适合计算时间差;实时时钟对应墙钟时间,适合记录绝对时间点。

内容的提问来源于stack exchange,提问作者A.Pissicat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 16:52:49