4

重複の可能性:
Windows での C++ 高精度時間測定

ftp からファイルをダウンロードするプログラムを開発しており、ダウンロード速度を計算するための高解像度タイマー ライブラリを探しています。現在は c++ time(NULL) を使用していますが、結果は正確ではありません。

Windows プラットフォーム用のシンプルで使いやすいプラグ N プレイの C++ ライブラリはありますか? 最後の呼び出しからの経過時間を秒単位で提供するものなど。

編集:

したがって、 QueryPerformanceCounter() は何度も言及されましたが、他のスレッドを調べてみると、次のことがわかりました。

これは CPU 周波数に基づいていることに注意してください。この周波数は、パワー セーブ モードが有効になっている場合などには安定しません。この API を使用する場合は、CPU の周波数が一定であることを確認してください。

ただし、インテルの SpeedStep テクノロジーは、コードが気付かないうちに PerformanceFrequency を変更する可能性があることに注意してください。

*また、各スレッドが常に QueryPerformanceCounter から一貫した値を取得することを保証するために、スレッドのスレッド アフィニティを修正しようとしましたが、これは機能しましたが、アプリケーションのパフォーマンスが完全に低下しました。*

状況を考慮して、それを使用することをお勧めしますか?プログラムのパフォーマンスとタイマーの信頼性は非常に重要です

4

3 に答える 3

3

MSDN ドキュメントのコメントで説明されているバグのあるユースケースに陥らない限り、QueryPerformanceCounter があります。

例: QueryPerformanceCounter の使用方法

#include <windows.h>

double PCFreq = 0.0;
__int64 CounterStart = 0;

void StartCounter()
{
    LARGE_INTEGER li;
    if(!QueryPerformanceFrequency(&li))
    cout << "QueryPerformanceFrequency failed!\n";

    PCFreq = double(li.QuadPart)/1000.0;

    QueryPerformanceCounter(&li);
    CounterStart = li.QuadPart;
}
double GetCounter()
{
    LARGE_INTEGER li;
    QueryPerformanceCounter(&li);
    return double(li.QuadPart-CounterStart)/PCFreq;
}

int main()
{
    StartCounter();
    Sleep(1000);
    cout << GetCounter() <<"\n";
    return 0;
}
于 2012-12-19T08:21:50.347 に答える
2

C++11 をサポートするコンパイラがある場合は、単純に を使用できますstd::chrono。そうでない場合boost::chronoは、自由に使用できます

于 2012-12-19T08:26:34.363 に答える
1

を使用timeGetTimeしてください。解像度はニーズに十分なはずです。

于 2012-12-19T09:43:01.097 に答える