6

windowsアプリケーションをfromに移植していますunixが、壁にぶつかりました。私のアプリケーションでは、マイクロ秒単位で時間を見つける必要があります (高精度のアプリケーションであるため、アプリケーション全体がそれに大きく依存しています)。

以前はtimespec構造を使用していましたが、windows にはそのようなものは含まれていません。このコマンドGetTickCountは時間をミリ秒単位で返すため、十分ではありません。も考えていQueryPerformanceFrequencyました。

可能な限り同じものを知っている人はいtimespecますか?

将来的には、ナノ秒も必要になるかもしれませんが、Windowsで検索したものは何もサポートしていません。

4

2 に答える 2

10

たとえば、C++を使用してWindowsで長期的な高解像度のタイミングを実現する方法を参照してください。ナノ秒単位の時間を提供するC++タイマー機能。

私はWindowsXPでCygwinを使用していくつかのテストを行いました。私のマシンでは、gettimeofday()の粒度は約15ミリ秒(〜1/64秒)です。これはかなり粗いです。そして、次の粒度も同様です。

* clock_t clock(void) (divisor CLOCKS_PER_SEC)
* clock_t times(struct tms *) (divisor sysconf(_SC_CLK_TCK))

両方の除数は1000です(POSIXは最初に1000000になる場合があります)。

また、clock_getres(CLOCK_REALTIME、...)は15ミリ秒を返すため、clock_gettime()が役立つ可能性はほとんどありません。また、CLOCK_MONOTONICとCLOCK_PROCESS_CPUTIME_IDは機能しません。

Windowsの他の可能性はRDTSCかもしれません; ウィキペディアの記事を参照してください。また、HPETは、WindowsXPでは使用できません。

また、Linuxではclock()がプロセス時間であり、Windowsではウォールタイムであることに注意してください。

そのため、標準のUnix用とWindowsで実行されているCYGWINコード用のサンプルコードがあります。これにより、(私のマシンでは)約50マイクロ秒の粒度が得られます。戻り値は秒単位で、関数が最初に呼び出されてから経過した秒数を示します。(私は遅ればせながら、これが1年以上前に私が与えた答えにあることに気づきました)。

#ifndef __CYGWIN32__
double RealElapsedTime(void) { // returns 0 seconds first time called
   static struct timeval t0;
   struct timeval tv;
   gettimeofday(&tv, 0);
   if (!t0.tv_sec)
      t0 = tv;
   return tv.tv_sec - t0.tv_sec + (tv.tv_usec - t0.tv_usec) / 1000000.;
}
#else
#include <windows.h>
double RealElapsedTime(void) { // granularity about 50 microsecs on my machine
   static LARGE_INTEGER freq, start;
   LARGE_INTEGER count;
   if (!QueryPerformanceCounter(&count))
      FatalError("QueryPerformanceCounter");
   if (!freq.QuadPart) { // one time initialization
      if (!QueryPerformanceFrequency(&freq))
         FatalError("QueryPerformanceFrequency");
      start = count;
   }
   return (double)(count.QuadPart - start.QuadPart) / freq.QuadPart;
}
#endif
于 2011-12-20T23:39:11.440 に答える
4

Windows、UNIX、Linux、および漠然と最新のものの間で移植可能: std::chrono::high_resolution_clock. 解像度は異なる場合がありますが、コンパイル時にそれが何であるかを確認できます。最新のハードウェアでは確かにナノ秒が可能です。

ナノ秒の精度は実際にはサブメートルの精度を意味することに注意してください。光速でのナノ秒はわずか 30 センチメートルです。コンピューターをラックの上から下に移動すると、文字通り数ナノ秒移動します。

于 2015-10-13T08:33:26.417 に答える