用于测量延迟的计时器

发布于 2024-07-09 01:33:20 字数 248 浏览 11 评论 0原文

在通过 TCP 测量任何协议中的网络延迟(收到确认的时间 - 发送消息的时间)时,您建议使用什么计时器?为什么? 它有什么分辨率? 还有哪些其他优点/缺点?

可选:它是如何工作的?

可选:您不会使用哪种计时器?为什么?

我主要寻找 Windows / C++ 解决方案,但如果您想对其他系统发表评论,请随意这样做。

(目前我们使用 GetTickCount(),但它不是一个非常准确的计时器。)

When measuring network latency (time ack received - time msg sent) in any protocol over TCP, what timer would you recommend to use and why? What resolution does it have? What are other advantages/disadvantages?

Optional: how does it work?

Optional: what timer would you NOT use and why?

I'm looking mostly for Windows / C++ solutions, but if you'd like to comment on other systems, feel free to do so.

(Currently we use GetTickCount(), but it's not a very accurate timer.)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

永言不败 2024-07-16 01:33:20

这是我的答案的副本: C++ 计时器函数提供以纳秒为单位的时间

对于 Linux(和 BSD),您要使用 时钟_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
}

对于 Windows,您希望使用 QueryPerformanceCounter。 这里有更多关于 QPC

显然有一个已知的 某些芯片组上的 QPC 存在问题,因此您可能需要确保您没有这些芯片组。 此外,某些双核 AMD 也可能会导致问题。 请参阅 sebbbi 的第二篇文章,他在其中指出:

QueryPerformanceCounter() 和
QueryPerformanceFrequency() 提供
分辨率好一点,但有
不同的问题。 例如在
Windows XP、所有 AMD Athlon X2 双
核心 CPU 返回以下任意一个的 PC
核心“随机”(PC有时
向后跳一点),除非你
专门安装AMD双核驱动
包来解决这个问题。 我们还没有
注意到任何其他双核+CPU
有类似的问题(p4 Dual、p4 ht、
core2 双核、core2 四核、phenom 四核)。

This is a copy of my answer from: C++ Timer function to provide time in nano seconds

For Linux (and BSD) you want to use 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
}

For windows you want to use the QueryPerformanceCounter. And here is more on QPC

Apparently there is a known issue with QPC on some chipsets, so you may want to make sure you do not have those chipset. Additionally some dual core AMDs may also cause a problem. See the second post by sebbbi, where he states:

QueryPerformanceCounter() and
QueryPerformanceFrequency() offer a
bit better resolution, but have
different issues. For example in
Windows XP, all AMD Athlon X2 dual
core CPUs return the PC of either of
the cores "randomly" (the PC sometimes
jumps a bit backwards), unless you
specially install AMD dual core driver
package to fix the issue. We haven't
noticed any other dual+ core CPUs
having similar issues (p4 dual, p4 ht,
core2 dual, core2 quad, phenom quad).

離殇 2024-07-16 01:33:20

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

You mentioned that you use GetTickCount(), so I'm going to recommend that you take a look at QueryPerformanceCounter().

白首有我共你 2024-07-16 01:33:20

rdtsc 指令确实无可替代。 您无法确定 QueryPerformanceCounter 将支持什么分辨率。 有些具有非常大的粒度(低增量率/频率),有些则根本不返回任何内容。

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

stackoverflow.com 上有很多关于它的帖子。 我自己写了几篇...

There is really no substitute for the rdtsc instruction. You cannot be sure of what resolution the QueryPerformanceCounter will support. Some have a very large granularity (low increment rate/frequency), some return nothing at all.

Instead, I recommend you use the rdtsc instruction. It does not require any OS implementation and returns the number of CPU internal clock cycles that have elapsed since the computer/processor/core was powered up. For a 3 GHz processor that's 3 billion increments per second - it doesn't get more precise than that, now does it? This instruction is available for x86-32 and -64 beginning with the Pentium or Pentium MMX. It should therefore be accessible from x86 Linuxes as well.

There are plenty of posts about it here on stackoverflow.com. I've written a few myself ...

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文