【发布时间】:2010-09-23 06:24:04
【问题描述】:
在通过 TCP 测量任何协议中的网络延迟(收到确认的时间 - 发送的消息的时间)时,您建议使用什么计时器,为什么?它有什么分辨率?其他优点/缺点是什么?
可选:它是如何工作的?
可选:你不会使用什么计时器,为什么?
我主要在寻找 Windows / C++ 解决方案,但如果您想对其他系统发表评论,请随时这样做。
(目前我们使用 GetTickCount(),但它不是一个非常准确的计时器。)
【问题讨论】:
在通过 TCP 测量任何协议中的网络延迟(收到确认的时间 - 发送的消息的时间)时,您建议使用什么计时器,为什么?它有什么分辨率?其他优点/缺点是什么?
可选:它是如何工作的?
可选:你不会使用什么计时器,为什么?
我主要在寻找 Windows / C++ 解决方案,但如果您想对其他系统发表评论,请随时这样做。
(目前我们使用 GetTickCount(),但它不是一个非常准确的计时器。)
【问题讨论】:
这是我的回答的副本:C++ Timer function to provide time in nano seconds
对于 Linux(和 BSD),您想使用 clock_gettime()。
#include <sys/time.h>
int main()
{
timespec ts;
// clock_gettime(CLOCK_MONOTONIC, &ts); // Works on FreeBSD
clock_gettime(CLOCK_REALTIME, &ts); // Works on Linux
}
对于您想要使用QueryPerformanceCounter 的窗口。这里有更多关于QPC
显然在某些芯片组上存在带有 QPC 的已知 issue,因此您可能需要确保您没有这些芯片组。此外,一些双核 AMD 也可能导致problem。请参阅 sebbbi 的第二篇文章,他在其中指出:
QueryPerformanceCounter() 和 QueryPerformanceFrequency() 提供一个 更好的分辨率,但有 不同的问题。例如在 Windows XP,所有 AMD Athlon X2 双 核心 CPU 返回任何一个的 PC 核心“随机”(PC有时 向后跳一点),除非你 专门安装AMD双核驱动 包来解决这个问题。我们没有 注意到任何其他双核CPU 有类似的问题(p4 dual、p4 ht、 core2 dual, core2 quad, phenom quad)。
【讨论】:
您提到您使用 GetTickCount(),所以我将建议您看一下 QueryPerformanceCounter()。
【讨论】:
rdtsc 指令确实无可替代。您无法确定 QueryPerformanceCounter 将支持什么分辨率。有些具有非常大的粒度(低增量率/频率),有些则根本不返回任何内容。
相反,我建议您使用 rdtsc 指令。它不需要任何操作系统实现,并返回自计算机/处理器/内核启动以来经过的 CPU 内部时钟周期数。对于每秒 30 亿次增量的 3 GHz 处理器 - 它没有比这更精确的了,是吗?此指令适用于从 Pentium 或 Pentium MMX 开始的 x86-32 和 -64。因此,它也应该可以从 x86 Linux 访问。
stackoverflow.com 上有很多关于它的帖子。我自己也写过一些...
【讨论】: