相当于窗口的Timespec
timespec equivalent for windows
我正在将我的应用程序从unix
移植到windows
,我遇到了一个瓶颈。在我的应用程序中,我需要找到以微秒为单位的时间(整个应用程序严重依赖于它,因为它是一个高精度应用程序)。
以前我使用timespec
结构,但窗口不包含这样的东西。命令GetTickCount
是不够的,因为它以毫秒为单位返回时间。我也在考虑QueryPerformanceFrequency
。
有没有人碰巧知道一些与timespec
尽可能相同的东西?
在未来,我甚至可能需要纳秒,这是我在windows中搜索不到的。
参见,例如,如何使用c++在windows上实现长期高分辨率定时?和c++定时器功能,提供以纳秒为单位的时间。
我在Windows XP下用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, Windows XP无法使用。
还请注意,在Linux中,clock()是进程时间,而在Windows中,它是墙时间。
所以一些示例代码,既适用于标准Unix,也适用于在Windows下运行的CYGWIN代码,它提供了大约50微秒的粒度(在我的机器上)。返回值以秒为单位,并给出自函数首次调用以来经过的秒数。(我后来才意识到这是我一年前给出的一个答案)。#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
可在Windows, UNIX, Linux和任何模糊的现代之间移植:std::chrono::high_resolution_clock
。分辨率可能会有所不同,但您可以在编译时找出它是什么。在现代硬件上,纳秒是完全可能的。
请记住,纳秒精度实际上意味着亚米精度。光速下的一纳秒只有30厘米。将计算机从机架的顶部移动到底部实际上是移动了几个纳秒。
- 如何在Qt窗口小部件中使用QStringView(或QStringRef)
- 问:如何使用C++中的按钮从窗口打开窗口
- SDL 窗口不会弹出
- 在createdialog创建的窗口中捕获用于编辑控件的OnMouseMove消息
- 如何在cpp文件之间切换窗口?在Qt中
- QuadTree只在窗口的右上角绘制
- VS Code "command":"make"与终端窗口中的命令行"make"不同
- 如何在C++中找到active directory中禁用和锁定的窗口帐户
- 处理闪烁窗口事件
- 如何通过按下第三个窗口中的按钮,将QString从一个窗口获取到另一个窗口
- C++win32 API创建多个类似视口的窗口
- SFML RenderWindow打开窗口需要很长时间
- 如何将不同的可执行文件合并到一个窗口框架中进行编码?像浏览器一样
- 获取 SFML 窗口的 HWND 和高可用性?
- 如何获取 GLFW 窗口 ID?
- GLEW/GLUT:调用init并创建一个窗口后,取消初始化并重新初始化?
- 用于窗口的 HID 终端
- SFML 文本未绘制在窗口上
- 如何为窗口截屏
- 相当于窗口的Timespec