我应该用什么来替换 Windows 上的 gettimeofday() ?
我正在编写一个可移植的 Socket 类,它支持发送和接收超时...为了实现这些超时,我使用 select()
...但是,我有时需要知道多长时间我被阻塞在 select()
内部,当然在 Linux 上我会通过在调用 select()
之前和之后调用 gettimeofday()
来实现然后使用 timersub()
计算增量...
鉴于 Windows 上的 select()
接受 struct timeval
作为超时,应该使用什么方法我曾经在 Windows 上替换 gettimeofday() ?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
我最终找到了这个页面:
gettimeofday()
Windows 函数(现在通过 Wayback Machine),它有一个方便、花哨的gettimeofday()
实现视窗。它使用GetSystemTimeAsFileTime()
方法来获取准确的时钟。更新:这是来自“Unix to Windows Porting Dictionary for HPC”的替代活动链接
gettimeofday()
(现在通过 Wayback Machine)指向 OP 引用的实现。另请注意,链接实现中存在拼写错误:显示的值末尾缺少额外的
0
(它们假定为微秒,而不是 100 纳秒间隔的数量)。此拼写错误是通过此评论发现的谷歌代码项目页面。使用的正确值如下所示:PostgreSQL 对 Windows 的 gettimeofday 实现:
I ended up finding this page:
gettimeofday()
function for Windows (now via the Wayback Machine) which has a handy, dandy implementation ofgettimeofday()
on Windows. It uses theGetSystemTimeAsFileTime()
method to get an accurate clock.Update: Here's an alternative active link from the 'Unix to Windows Porting Dictionary for HPC'
gettimeofday()
(now via the Wayback Machine) that points to the implementation the OP referred to. Note also that there's a typo in the linked implementation:The values shown are missing an extra
0
at the end (they assumed microseconds, not the number of 100-nanosecond intervals). This typo was found via this comment on a Google code project page. The correct values to use are shown below:PostgreSQL's implementation of gettimeofday for Windows:
怎么样:
GetTickCount()
不是很精确,但可能会工作得很好。如果您看到大量 0、16 或 31 毫秒的间隔,请尝试计时更长的间隔或使用更精确的函数,例如timeGetTime
。我通常做的是这样的:
How about:
GetTickCount()
is not very precise, but will probably work well. If you see a lot of 0, 16 or 31 millisecond intervals, try timing over longer intervals or use a more precise function liketimeGetTime
.What I usually do is this:
在您的情况下,我将使用独立于平台的 std::clock
In your case I would use the platform independent std::clock
您可以查看 QueryPerformanceCounter 和 QueryPerformanceFrequency。这些分辨率非常 - 在某些硬件定时器上低至每十个周期一次。
You can check out QueryPerformanceCounter and QueryPerformanceFrequency. These are very high resolution- down to one tick per ten cycles on some hardware- timers.