代码之家  ›  专栏  ›  技术社区  ›  Marcin

测量延迟的计时器

  •  5
  • Marcin  · 技术社区  · 16 年前

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

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

    我主要是在寻找Windows /C++解决方案,但是如果您想对其他系统进行评论,请自由地这样做。

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

    3 回复  |  直到 16 年前
        1
  •  6
  •   Community T.Woody    7 年前

    这是我的答案的副本,来自: 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

    issue 在某些芯片组上使用QPC,因此您可能需要确保没有这些芯片组。此外,一些双核AMD也可能导致 problem . 见Sebbi的第二篇文章,他在文章中指出:

    分辨率稍高,但有 核心CPU返回以下任意一个的PC 内核“随机”(有时在PC上) 专门安装AMD双核驱动程序 包来修复该问题。我们没有 注意到任何其他双核CPU吗 有类似问题(p4双,p4 ht, core2 dual、core2 quad、phenom quad)。

        2
  •  2
  •   John Dibling    16 年前

        3
  •  0
  •   Olof Forshell    13 年前

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

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