26

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

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

4

4 に答える 4

54

はい、今日、ほとんどのハードウェアはこの種の解決策をサポートしており、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";
}

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

Boostは、Windowsではナノ秒を使用しているように見える実装boost::chronoも提供します。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
}
于 2012-10-17T15:44:25.887 に答える
2

あなたが時計を探しているのかdifftimeを探しているのかはわかりませんが、これらの1つがあなたが探しているものであるはずです:

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

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

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

于 2012-10-17T15:41:03.703 に答える
2

Windows APIでできる最善のことは、QueryPerformanceCounterですその解決策は、 QueryPerformanceFrequencyを使用して取得できます。状況によっては、CPUのRDTSC命令を使用する場合があります。この場合、周波数は基本的にCPUのクロック周波数になります。それ以外の場合は、周波数が1.024 MHzの別のクロックを使用するため、分解能は基本的に1マイクロ秒です。

C ++ 11は、chrono同様に役立つ可能性のあるクラスを追加します-すでにそれを持っているコンパイラーを使用していると仮定します。コンパイラーが実装を提供しない場合、Boost Chronoは、ほとんどの既存のコンパイラー/ライブラリーで機能する合理的な代替手段です。繰り返しになりますが、ナノ秒の解像度を提供するという保証はありませんが、WindowsではおそらくQPC / QPFのポータブルラッパーになると思います。したがって、おそらく同じ解像度を、より移植性の高い方法で提供します。

于 2012-10-17T15:42:03.040 に答える
1

そしてもちろん、古き良き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();

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

于 2012-10-17T15:50:21.047 に答える