定时器来衡量延迟

时间:2008-11-20 15:20:15

标签: c++ winapi timer latency

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

可选:它是如何运作的?

可选:你不使用什么计时器?为什么?

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

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

3 个答案:

答案 0 :(得分:6)

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

对于Windows,您要使用QueryPerformanceCounter。以下是QPC

的更多信息

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

  

QueryPerformanceCounter()和   QueryPerformanceFrequency()提供了一个   更好的分辨率,但有   不同的问题。例如在   Windows XP,所有AMD Athlon X2双   核心CPU返回任意一台的PC   核心“随机”(PC有时候   除非你,否则有点向后跳   特别安装AMD双核驱动程序   包来解决问题。我们没有   注意到任何其他双核心CPU   有类似的问题(p4双,p4 ht,   core2 dual,core2 quad,phenom quad)。

答案 1 :(得分:2)

你提到你使用GetTickCount(),所以我建议你看一下QueryPerformanceCounter()。

答案 2 :(得分:0)

rdtsc指令实际上没有替代品。您无法确定QueryPerformanceCounter将支持哪种分辨率。有些具有非常大的粒度(低增量率/频率),有些则根本没有返回。

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

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