C++ 测量延迟的计时器

C++ 测量延迟的计时器,c++,winapi,timer,latency,C++,Winapi,Timer,Latency,在通过TCP测量任何协议中的网络延迟(收到ack的时间-发送msg的时间)时,您建议使用什么计时器?为什么?它有什么决议?还有哪些优点/缺点 可选:它是如何工作的 可选:您不使用什么定时器,为什么 我主要是在寻找Windows /C++解决方案,但是如果您想对其他系统进行评论,请随意这样做。 (目前我们使用GetTickCount(),但它不是一个非常精确的计时器。)您提到使用GetTickCount(),因此我建议您查看QueryPerformanceCounter()。这是我的答案的副本,来

在通过TCP测量任何协议中的网络延迟(收到ack的时间-发送msg的时间)时,您建议使用什么计时器?为什么?它有什么决议?还有哪些优点/缺点

可选:它是如何工作的

可选:您不使用什么定时器,为什么

<>我主要是在寻找Windows /C++解决方案,但是如果您想对其他系统进行评论,请随意这样做。
(目前我们使用GetTickCount(),但它不是一个非常精确的计时器。)

您提到使用GetTickCount(),因此我建议您查看QueryPerformanceCounter()。

这是我的答案的副本,来自:

对于要使用的Linux(和BSD)

#包括
int main()
{
timespects;
//clock_gettime(clock_MONOTONIC,&ts);//适用于FreeBSD
clock_gettime(clock_REALTIME,&ts);//在Linux上工作
}
对于要使用的windows。这里有更多关于

显然,某些芯片组上存在已知的QPC问题,因此您可能希望确保没有这些芯片组。此外,一些双核AMD也可能导致故障。见Sebbi的第二篇文章,他在文章中指出:

QueryPerformanceCounter()和 QueryPerformanceFrequency()提供一个 分辨率稍高,但有 不同的问题。例如在 Windows XP,所有AMD Athlon X2双 核心CPU返回以下任意一个的PC 内核“随机”(有时在PC上) 向后跳一点),除非你 专门安装AMD双核驱动程序 包来修复该问题。我们没有 注意到任何其他双核CPU吗 有类似问题(p4双,p4 ht, core2 dual、core2 quad、phenom quad)


rdtsc指令真的没有替代品。您无法确定QueryPerformanceCounter将支持何种分辨率。有些具有非常大的粒度(较低的增量率/频率),有些则完全不返回任何内容

相反,我建议您使用rdtsc指令。它不需要任何操作系统实现,并返回自计算机/处理器/内核通电以来经过的CPU内部时钟周期数。对于每秒递增30亿次的3GHz处理器来说,没有比这更精确的了,是吗?此指令适用于以奔腾或奔腾MMX开头的x86-32和-64。因此,它也应该可以从x86 Linux访问

stackoverflow.com上有很多关于它的帖子。我自己也写了一些

#include <sys/time.h>

int main()
{
   timespec ts;
   // clock_gettime(CLOCK_MONOTONIC, &ts); // Works on FreeBSD
   clock_gettime(CLOCK_REALTIME, &ts); // Works on Linux
}