5

TCP を介した任意のプロトコルでネットワーク遅延 (ACK 受信時間 - メッセージ送信時間) を測定する場合、どのタイマーを使用することをお勧めしますか? また、その理由は何ですか? それはどのような解像度を持っていますか?その他のメリット/デメリットは?

オプション: どのように機能しますか?

オプション: 使用しないタイマーとその理由は?

主に Windows / C++ ソリューションを探していますが、他のシステムについてコメントしたい場合は、遠慮なくコメントしてください。

(現在、GetTickCount() を使用していますが、あまり正確なタイマーではありません。)

4

3 に答える 3

6

これは私の答えのコピーです:ナノ秒で時間を提供するC++タイマー関数

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の詳細があります

一部のチップセットではQPCに既知の問題があるようです。そのため、これらのチップセットがないことを確認することをお勧めします。さらに、一部のデュアルコアAMDも問題を引き起こす可能性があります。sebbbiによる2番目の投稿を参照してください。彼は次のように述べています。

QueryPerformanceCounter()とQueryPerformanceFrequency()は少し優れた解像度を提供しますが、異なる問題があります。たとえば、Windows XPでは、問題を解決するためにAMDデュアルコアドライバパッケージを特別にインストールしない限り、すべてのAMD Athlon X2デュアルコアCPUはいずれかのコアのPCを「ランダムに」返します(PCは少し後方にジャンプすることがあります)。他のデュアル+コアCPUにも同様の問題があることに気づいていません(p4デュアル、p4 ht、core2デュアル、core2 quad、フェノムクワッド)。

于 2008-11-20T17:15:21.760 に答える
2

GetTickCount() を使用しているとのことでしたので、QueryPerformanceCounter() を参照することをお勧めします。

于 2008-11-20T15:21:59.710 に答える
0

rdtsc 命令に代わるものは実際にはありません。QueryPerformanceCounter がサポートする解像度を確認することはできません。粒度が非常に大きい (インクリメント レート/頻度が低い) ものもあれば、何も返さないものもあります。

代わりに、rdtsc 命令を使用することをお勧めします。OS の実装を必要とせず、コンピュータ/プロセッサ/コアの電源が入ってから経過した CPU 内部クロック サイクル数を返します。1 秒間に 30 億回インクリメントする 3 GHz プロセッサの場合、それ以上の精度はありません。この命令は、Pentium または Pentium MMX 以降の x86-32 および -64 で使用できます。したがって、x86 Linux からもアクセスできるはずです。

ここstackoverflow.comには、それに関する投稿がたくさんあります。自分でも何枚か書いた...

于 2011-02-08T22:16:39.060 に答える