Zen言語の標準ライブラリ紹介〜time〜

はじめに

けっこう標準ライブラリが充実しているわけですが、ドキュメントがないのがもったいないですね。 まとまった時間が取れないので、ちょこちょこ書いていくシリーズです。

リクエストあれば、優先する、かも?

今日は時間関係です。

std.time.

std.time.sleep

普通のスリープ関数です。 引数は、スリープする秒数をナノ秒単位で与えます。

/// Spurious wakeups are possible and no precision of timing is guaranteed.
pub fn sleep(nanoseconds: u64) void
test "sleep" {
    // sleep 1 second
    time.sleep(1 * time.second);
}

ナノ秒単位で真面目に指定するのは大変ですが、定数が次のように定義されているので、必要に応じて使います。

/// Multiples of a base unit (nanoseconds)
pub const nanosecond = 1;
pub const microsecond = 1000 * nanosecond;
pub const millisecond = 1000 * microsecond;
pub const second = 1000 * millisecond;
pub const minute = 60 * second;
pub const hour = 60 * minute;

/// Divisions of a second
pub const ns_per_s = 1000000000;
pub const us_per_s = 1000000;
pub const ms_per_s = 1000;
pub const cs_per_s = 100;

/// Common time divisions
pub const s_per_min = 60;
pub const s_per_hour = s_per_min * 60;
pub const s_per_day = s_per_hour * 24;
pub const s_per_week = s_per_day * 7;

std.time.timestamp

秒単位のPOSIXタンムスタンプを取得します。

/// Get the posix timestamp, UTC, in seconds
pub fn timestamp() u64
test "timestamp" {
    debug.warn("timestamp = {}\n", .{ time.timestamp() });
    // sleep 1 second
    time.sleep(1 * time.second);

    debug.warn("timestamp = {}\n", .{ time.timestamp() });
}

出力は次のような感じです。タイムスタンプが1増えてますね。

timestamp = 1582431127
timestamp = 1582431128

std.time.milliTimestamp

ミリ秒版です。

pub fn milliTimestamp() u64

std.timer.Timer

簡易タイマーです。 イベントのハンドリングなどはできません。

Timer.start() もしくは Timer.reset() から経過した時間を計測できます。

pub const Timer = struct {
    /// Initialize the timer structure.
    pub fn start() Error!Timer

    /// Reads the timer value since start or the last reset in nanoseconds
    pub fn read(self: *Timer) u64

    /// Resets the timer value to 0/now.
    pub fn reset(self: *Timer) void

    /// Returns the current value of the timer in nanoseconds, then resets it
    pub fn lap(self: *Timer) u64
test "timer" {
    var timer = try time.Timer.start();

    const time_0 = timer.read();
    time.sleep(50 * time.millisecond);
    const time_1 = timer.read();
    testing.ok((time_1 - time_0) > 50 * time.millisecond);

    timer.reset();
    for ([_]u8 {0} ** 10) |_| {
        debug.warn("lap = {}\n", .{ timer.lap() });
    }
}