MGL::System::Chrono#

概要#

MGL::System::Chronoは実行環境の時間を取得するためのクラスです。

宣言#

namespace MGL::System
{
    class Chrono;
}

利用例#

現在の時刻を世界協定時で取得する例
// 現在時刻をUNIXエポック時間で取得
auto currentTime = MGL::System::Chrono().GetCurrentEpochTime();
MGL_TRACE("UNIXエポック時間: %lld", currentTime);

// UNIXエポック時間を日時に変換して表示
MGL::System::DateTime currentDateTime(currentTime);
MGL_TRACE("時刻(世界協定時): %d-%02d-%02d %02d:%02d:%02d",
            currentDateTime.year,
            currentDateTime.month,
            currentDateTime.day,
            currentDateTime.hour,
            currentDateTime.minute,
            currentDateTime.second);
UNIXエポック時間: 1711123023
時刻(世界協定時): 2024-03-22 15:57:03

注釈

ローカル時間を取得する場合はMGL::System::Locale::GetLocalDateTimeも参照してください。

経過時間を測定する例
MGL::System::Chrono chrono;

// 開始時間を取得
auto startTick = chrono.GetTickTime();

// 現在のスレッドを1秒間ブロック (1秒間処理を止める)
std::this_thread::sleep_for(std::chrono::seconds(1));

// 終了時間を取得し、差分を算出
auto endTick = chrono.GetTickTime();
auto passTick = chrono.GetTickPassTime(startTick, endTick);

// ミリ秒へ変換
auto passTime = chrono.TicksToMilliseconds(passTick);

// 差分のCPU時間を表示
MGL_TRACE("1秒間の差分(CPU時間): %lld", passTick);
MGL_TRACE("ミリ秒: %f", passTime);
1秒間の差分(CPU時間): 24025444
ミリ秒: 985.043213

メンバ情報#

種類

名前

内容

バージョン

関数

GetCurrentEpochTime

現在時刻をUNIXエポック時間で取得

1.1.12+

関数

DaysToSeconds

日数を秒数に変換

1.1.12+

関数

HoursToSeconds

時間を秒数に変換

1.1.12+

関数

MinutesToSeconds

分を秒数に変換

1.1.12+

関数

IsAvailableTickTimer

CPU時間が扱えるかの取得

1.0.0+

関数

GetTickTime

現在のCPU時間を取得

1.0.0+

関数

GetTickPassTime

2つのCPU時間から経過時間を取得

1.1.12+

関数

TicksToMilliseconds

CPU時間をミリ秒に変換

1.0.0+

関数

TicksToMicroseconds

CPU時間をマイクロ秒に変換

1.0.0+

関数

TicksToNanoseconds

CPU時間をナノ秒に変換

1.0.0+


GetCurrentEpochTime#

現在時刻をUNIXエポック時間で取得

宣言#

namespace MGL::System
{
    class Chrono
    {
        [[nodiscard]] EpochTime GetCurrentEpochTime() const noexcept;
    };
}

戻り値#

MGL::System::EpochTime

現在時刻を表すUNIXエポック時間

説明#

現在時刻をUNIXエポック時間で取得します。

戻り値のUNIXエポック時間は世界協定時の1970年1月1日0時0分0秒を0とした秒単位の時間です。一般的な日時の形式に変換する場合、MGL::System::DateTimeのコンストラクタの引数にこの値を指定して初期化してください。

UNIXエポック時間の詳細についてはMGL::System::EpochTimeを参照してください。

利用例#

// 現在時刻をUNIXエポック時間で取得
auto currentTime = MGL::System::Chrono().GetCurrentEpochTime();
MGL_TRACE("UNIXエポック時間: %lld", currentTime);

// UNIXエポック時間を日時に変換して表示
MGL::System::DateTime currentDateTime(currentTime);
MGL_TRACE("時刻(世界協定時): %d-%02d-%02d %02d:%02d:%02d",
            currentDateTime.year,
            currentDateTime.month,
            currentDateTime.day,
            currentDateTime.hour,
            currentDateTime.minute,
            currentDateTime.second);
実行結果
UNIXエポック時間: 1711123023
時刻(世界協定時): 2024-03-22 15:57:03

バージョン情報#

MGL 1.0.0
  • 初回リリース

MGL 1.1.13
  • 関数の戻り値に[[nodiscard]]属性を付与

関連#


DaysToSeconds#

日数を秒数に変換

宣言#

namespace MGL::System
{
    class Chrono
    {
        static constexpr int32_t DaysToSeconds(int32_t days) noexcept;
    };
}

引数#

int32_t days

変換する日数

戻り値#

int32_t

変換後の秒数

説明#

日数を秒に変換します。

利用例#

// 30日間を秒数に変換
auto seconds = MGL::System::Chrono::DaysToSeconds(30);
MGL_TRACE("30日間 = %d秒", seconds);
実行結果
30日間 = 2592000秒

バージョン情報#

MGL 1.1.12
  • 初回リリース

関連#


HoursToSeconds#

時間を秒数に変換

宣言#

namespace MGL::System
{
    class Chrono
    {
        static constexpr int32_t HoursToSeconds(int32_t hours) noexcept;
    };
}

引数#

int32_t hours

変換する時間

戻り値#

int32_t

変換後の秒数

説明#

時間を秒に変換します。

利用例#

// 12時間を秒数に変換
auto seconds = MGL::System::Chrono::HoursToSeconds(12);
MGL_TRACE("12時間 = %d秒", seconds);
実行結果
12時間 = 43200秒

バージョン情報#

MGL 1.1.12
  • 初回リリース

関連#


MinutesToSeconds#

分を秒数に変換

宣言#

namespace MGL::System
{
    class Chrono
    {
        static constexpr int32_t MinutesToSeconds(int32_t minutes) noexcept;
    };
}

引数#

int32_t minutes

変換する分

戻り値#

int32_t

変換後の秒数

説明#

分を秒に変換します。

利用例#

// 30分を秒数に変換
auto seconds = MGL::System::Chrono::MinutesToSeconds(30);
MGL_TRACE("30分 = %d秒", seconds);
実行結果
30分 = 1800秒

バージョン情報#

MGL 1.1.12
  • 初回リリース

関連#


IsAvailableTickTimer#

CPU時間が扱えるかの取得

宣言#

namespace MGL::System
{
    class Chrono
    {
        [[nodiscard]] bool IsAvailableTickTimer() const noexcept;
    };
}

戻り値#

bool

有効である場合はtrue、無効な場合はfalse

説明#

実行中の環境でCPU時間が扱えるかを取得します。

CPU時間についての詳細はMGL::System::TickTimeを参照してください。

この変数がfalseを返す場合、その環境ではCPU時間が扱えない事を意味しています。

利用例#

if (MGL::System::Chrono().IsAvailableTickTimer())
{
    MGL_TRACE("CPU時間の取得が有効");
}
else
{
    MGL_TRACE("CPU時間の取得が無効");
}

バージョン情報#

MGL 1.0.0
  • 初回リリース

MGL 1.1.13
  • 関数の戻り値に[[nodiscard]]属性を付与

関連#


GetTickTime#

現在のCPU時間を取得

宣言#

namespace MGL::System
{
    class Chrono
    {
        [[nodiscard]] TickTime GetTickTime() const noexcept;
    };
}

戻り値#

MGL::System::TickTime

現在のCPU時間

説明#

現在のCPU時間を取得します。

CPU時間は実行環境に依存するため厳格な定義はありませんが、多くの環境では電源投入時からの経過時間を、プロセッサの動作クロックに依存した精度で取得します。CPU時間の詳細についてはMGL::System::TickTimeを参照してください。

この関数が返す値はそのままでは人間が読み取ることはできないため、次のAPIにて変換して使用してください。

警告

macOS、iOS/iPadOS、tvOSにおいては、本関数はmach_absolute_time()を使用しています。この関数は理由の宣言が求められるAPIの対象であるため、用途が時間計測のみに限定されています。

AppleのApp Storeへの登録を前提としている場合、本関数を時間計測以外の用途で使用しないでください。それ以外の用途で使用した場合、App Storeへの登録が拒否される場合があります。

なお、理由の宣言はMGL側で行なっているため、アプリケーション側では対応する必要はありません。

利用例#

MGL::System::Chrono chrono;

// 実行環境がCPU時間に対応しているかを取得
if (chrono.IsAvailableTickTimer())
{
    // 現在のCPU時間を取得してトレース表示
    auto currentTickTime = chrono.GetTickTime();
    MGL_TRACE("現在のCPU時間: %lld", currentTickTime);
}
else
{
    MGL_TRACE("CPU時間の取得に対応していません");
}
実行結果(一例)
現在のCPU時間: 23549594551427

バージョン情報#

MGL 1.0.0
  • 初回リリース

MGL 1.1.13
  • 関数の戻り値に[[nodiscard]]属性を付与

関連#


GetTickPassTime#

2つのCPU時間から経過時間を取得

宣言#

namespace MGL::System
{
    class Chrono
    {
        [[nodiscard]] static constexpr TickTime GetTickPassTime(TickTime start, TickTime end);
    };
}

引数#

MGL::System::TickTime start

開始時間

MGL::System::TickTime end

終了時間

戻り値#

開始時間から終了時間までの経過時間

説明#

2つのCPU時間の差分を取り、経過時間を算出します。

CPU時間は64ビットで表現されており、時間経過によってオーバーフローにより0にループする性質があります。本関数は引数startendの大小関係を比較し、オーバーフローを考慮した経過時間の算出を行います。

利用例#

MGL::System::Chrono chrono;

// 開始時間を取得
auto startTick = chrono.GetTickTime();

// 現在のスレッドを1秒間ブロック (1秒間処理を止める)
std::this_thread::sleep_for(std::chrono::seconds(1));

// 終了時間を取得し、差分を算出
auto endTick = chrono.GetTickTime();
auto passTick = chrono.GetTickPassTime(startTick, endTick);

// 差分のCPU時間を表示
MGL_TRACE("1秒間の差分(CPU時間): %lld", passTick);
実行結果(一例)
1秒間の差分(CPU時間): 24025209

バージョン情報#

MGL 1.1.12
  • 初回リリース

MGL 1.1.13
  • 関数をstaticに変更

  • 関数の戻り値に[[nodiscard]]属性を付与

関連#


TicksToMilliseconds#

CPU時間をミリ秒に変換

宣言#

namespace MGL::System
{
    class Chrono
    {
        [[nodiscard]] float TicksToMilliseconds(TickTime tickTime) const noexcept;
    };
}

引数#

MGL::System::TickTime tickTime

変換元のCPU時間

戻り値#

float

ミリ秒への変換結果

説明#

CPU時間をミリ秒に変換します。

CPU時間の精度は実行環境によって異なるため、取得した環境で人間の読める時間に変換する必要があります。本関数は、実行環境が取得するCPU時間をミリ秒へと変換します。

CPU時間の詳細はMGL::System::TickTimeを参照してください。

利用例#

MGL::System::Chrono chrono;

// 開始時間を取得
auto startTick = chrono.GetTickTime();

// 現在のスレッドを1秒間ブロック (1秒間処理を止める)
std::this_thread::sleep_for(std::chrono::seconds(1));

// 終了時間を取得し、差分を算出
auto endTick = chrono.GetTickTime();
auto passTick = chrono.GetTickPassTime(startTick, endTick);

// ミリ秒へ変換
auto passTime = chrono.TicksToMilliseconds(passTick);

// 差分のCPU時間を表示
MGL_TRACE("1秒間の差分(CPU時間): %lld", passTick);
MGL_TRACE("ミリ秒: %f", passTime);
実行結果(一例)
1秒間の差分(CPU時間): 24025444
ミリ秒: 985.043213

注釈

測定時間の誤差の原因は様々な理由が考えられますが、この例においてはスレッドのブロック時間の精度に起因していると考えられます。

バージョン情報#

MGL 1.0.0
  • 初回リリース

MGL 1.1.12
  • リネーム: ConvertTickTimeToMillisecondTicksToMilliseconds

MGL 1.1.13
  • 関数の戻り値に[[nodiscard]]属性を付与

関連#


TicksToMicroseconds#

CPU時間をマイクロ秒に変換

宣言#

namespace MGL::System
{
    class Chrono
    {
        [[nodiscard]] float TicksToMicroseconds(TickTime tickTime) const noexcept;
    };
}

引数#

MGL::System::TickTime tickTime

変換元のCPU時間

戻り値#

float

マイクロ秒への変換結果

説明#

CPU時間をマイクロ秒に変換します。

CPU時間の精度は実行環境によって異なるため、取得した環境で人間の読める時間に変換する必要があります。本関数は、実行環境が取得するCPU時間をマイクロ秒へと変換します。

CPU時間の詳細はMGL::System::TickTimeを参照してください。

利用例#

MGL::System::Chrono chrono;

// 開始時間を取得
auto startTick = chrono.GetTickTime();

// 現在のスレッドを1秒間ブロック (1秒間処理を止める)
std::this_thread::sleep_for(std::chrono::seconds(1));

// 終了時間を取得し、差分を算出
auto endTick = chrono.GetTickTime();
auto passTick = chrono.GetTickPassTime(startTick, endTick);

// マイクロ秒へ変換
auto passTime = chrono.TicksToMicroseconds(passTick);

// 差分のCPU時間を表示
MGL_TRACE("1秒間の差分(CPU時間): %lld", passTick);
MGL_TRACE("マイクロ秒: %f", passTime);
実行結果(一例)
1秒間の差分(CPU時間): 24025050
マイクロ秒: 985027.062500

注釈

測定時間の誤差の原因は様々な理由が考えられますが、この例においてはスレッドのブロック時間の精度に起因していると考えられます。

バージョン情報#

MGL 1.0.0
  • 初回リリース

MGL 1.1.12
  • リネーム: ConvertTickTimeToMicrosecondTicksToMicroseconds

MGL 1.1.13
  • 関数の戻り値に[[nodiscard]]属性を付与

関連#


TicksToNanoseconds#

CPU時間をナノ秒に変換

宣言#

namespace MGL::System
{
    class Chrono
    {
        [[nodiscard]] float TicksToMilliseconds(TickTime tickTime) const noexcept;
    };
}

引数#

MGL::System::TickTime tickTime

変換元のCPU時間

戻り値#

float

ナノ秒への変換結果

説明#

CPU時間をナノ秒に変換します。

CPU時間の精度は実行環境によって異なるため、取得した環境で人間の読める時間に変換する必要があります。本関数は、実行環境が取得するCPU時間をナノ秒へと変換します。

CPU時間の詳細はMGL::System::TickTimeを参照してください。

利用例#

MGL::System::Chrono chrono;

// 開始時間を取得
auto startTick = chrono.GetTickTime();

// 現在のスレッドを1秒間ブロック (1秒間処理を止める)
std::this_thread::sleep_for(std::chrono::seconds(1));

// 終了時間を取得し、差分を算出
auto endTick = chrono.GetTickTime();
auto passTick = chrono.GetTickPassTime(startTick, endTick);

// ナノ秒へ変換
auto passTime = chrono.TicksToNanoseconds(passTick);

// 差分のCPU時間を表示
MGL_TRACE("1秒間の差分(CPU時間): %lld", passTick);
MGL_TRACE("ナノ秒: %f", passTime);
実行結果(一例)
1秒間の差分(CPU時間): 24025431
ナノ秒: 985042688.000000

注釈

測定時間の誤差の原因は様々な理由が考えられますが、この例においてはスレッドのブロック時間の精度に起因していると考えられます。

バージョン情報#

MGL 1.0.0
  • 初回リリース

MGL 1.1.12
  • リネーム: ConvertTickTimeToNanosecondTicksToNanoseconds

MGL 1.1.13
  • 関数の戻り値に[[nodiscard]]属性を付与

関連#