3

私はそれを正しくやっていますか?時々、私のプログラムはクロノソリューションに対して2000+を出力し、CLOCKS_PER_SECに対して常に1000を出力します..

私が実際に計算しているその値は何ですか? それは毎秒クロックですか?

#include <iostream>
#include <chrono>
#include <thread>
#include <ctime>

std::chrono::time_point<std::chrono::high_resolution_clock> SystemTime()
{
    return std::chrono::high_resolution_clock::now();
}

std::uint32_t TimeDuration(std::chrono::time_point<std::chrono::high_resolution_clock> Time)
{
    return std::chrono::duration_cast<std::chrono::nanoseconds>(SystemTime() - Time).count();
}

int main()
{
    auto Begin = std::chrono::high_resolution_clock::now();
    std::this_thread::sleep_for(std::chrono::milliseconds(1));
    std::cout<< (TimeDuration(Begin) / 1000.0)<<std::endl;

    std::cout<<CLOCKS_PER_SEC;
    return 0;
}
4

2 に答える 2

5

Linux で 1 秒あたりの正確なティックを取得するには、マクロではなく::sysconf(_SC_CLK_TCK)、(ヘッダーで宣言されている) の戻り値を使用する必要があります。unistd.hCLOCKS_PER_SEC

後者は POSIX 標準で定義された定数です。これは、CPU クロックの 1 秒あたりの実際のティック数とは関係ありません。たとえば、次のマニュアル ページを参照してくださいclock

C89、C99、POSIX.1-2001。POSIX では、実際の解像度に関係なく、CLOCKS_PER_SEC が 1000000 に等しいことが必要です。

ただし、正しい ticks-per-second 定数を使用しても、実際の 1 秒あたりの CPU サイクル数は得られないことに注意してください。「クロック ティック」は、CPU クロックで使用される特殊な単位です。それが実際の CPU サイクルにどのように関係するかについての標準化された定義はありません。

于 2013-01-23T03:58:30.247 に答える
0

boost のライブラリにはタイマー クラスがあり、CLOCKS_PER_SEC を使用して、タイマーが経過できる最大時間を計算します。Windows では CLOCKS_PER_SEC は 1000、Mac OS X では Linux では 1000000 とのことでした。したがって、後者の OS では精度が高くなります。

于 2016-08-13T12:52:52.380 に答える