web-dev-qa-db-ja.com

ナノ秒単位の現地時間を取得

可能性のある複製:
ナノ秒単位で時間を提供するC++タイマー関数

関数の実行時間をナノ秒の解像度で測定する必要があります。出来ますか?私たちの通常のコンピューターのハードウェアとソフトウェアは、そのような精度を時間に与えることができますか?はいの場合、C++でそれを達成する方法は? Boostライブラリで可能ですか?

14
Narek

はい、現在、ほとんどのハードウェアはこの種の解像度をサポートしています。C++標準ライブラリには、それをサポートできるAPIもあります。残念ながら、C++のすべての実装が実際に提供するわけではありません。

APIは <chrono> C++ 11で導入されたライブラリ:

#include <iostream>
#include <chrono>

int main() {
    auto start = std::chrono::high_resolution_clock::now();

    // operation to be timed ...

    auto finish = std::chrono::high_resolution_clock::now();
    std::cout << std::chrono::duration_cast<std::chrono::nanoseconds>(finish-start).count() << "ns\n";
}

<chrono> Darwinのlibc ++での実装はナノ秒の解像度を提供しますが、VS2012の実装は10分の1ミリ秒に過ぎないようです。上記のコードは、ナノ秒単位の時間を提供しますが、100マイクロ秒未満のタイミングはゼロナノ秒になります。

Boostは、boost :: chronoの実装も提供します。これは、Windowsでナノ秒を使用しているようです。 C++ 03でも使用できます。

#include <boost/chrono.hpp>

int main() {
    boost::chrono::high_resolution_clock::time_point t1 =
        boost::chrono::high_resolution_clock::now();

    boost::chrono::high_resolution_clock::time_point t2 =
        boost::chrono::high_resolution_clock::now();

    std::cout << boost::chrono::duration_cast<boost::chrono::nanoseconds>(t2-t1) << "\n";
    // boost chrono has more advanced output, .count() isn't needed, nor is manually writing out the units
}
42
bames53

Windows APIでできる最善の方法は、 QueryPerformanceCounter です。 QueryPerformanceFrequency で解像度を取得できます。状況に応じて、これはCPUのRDTSC命令を使用する場合があります。この場合、周波数は基本的にCPUのクロック周波数です。それ以外の場合、1.024 MHzの周波数の独立したクロックを使用するため、解像度は基本的に1マイクロ秒です。

C++ 11はchronoクラスも追加しますが、これは既に使用しているコンパイラを使用していると仮定すると便利です。コンパイラが実装を提供しない場合、 Boost Chrono は、既存のほとんどのコンパイラ/ライブラリで機能する合理的な代替品です。繰り返しますが、ナノ秒の解像度を提供するという保証はありませんが、WindowsではおそらくQPC/QPFの移植可能なラッパーになると予想されます。

3
Jerry Coffin

クロックを探しているのか、difftimeを探しているのかはわかりませんが、探しているものは次のいずれかです。

http://www.cplusplus.com/reference/clibrary/ctime/clock/

http://www.cplusplus.com/reference/clibrary/ctime/difftime/

これを関数の前後で使用し、ランタイムの違いを比較して、関数の全体的なランタイムを確認できます。

2
mttalxndrgrrtt

そしてもちろん、古き良き時代もあります Boost :: date_time

#include <boost/date_time/posix_time/posix_time.hpp>

boost::posix_time::ptime date_time = boost::posix_time::microsec_clock::universal_time();

ただし、マイクロ秒のみ。

0
Offirmo