2

TCPを使用してサーバーへのラウンドトリップを完了するのにかかる時間を取得したいと考えています。Windowsクライアントを使用する場合。(私はpingを使用しますが、サーバーはこれをブロックしています)

私はこれを完了するためにPythonとソケットを使用することを検討していますが、現在は持っています。

import time
import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM )

start = time.time()
s.connect(('localhost',80))
print 'time taken ', time.time()-start ,' seconds'

s.close()

私が抱えている問題は、同じタイムスタンプが定期的に返されるため、接続タイマーが機能していないと思うことです。誰かがこの問題を整理するための正しい方向に私を向けることができますか?

4

2 に答える 2

5

Windows では、time.time()値の粒度が十分ではありません (1/60 秒のみ)。代わりtime.perf_counter()に、Windows ではミリ秒の約 1/3 の解像度を持つ which を使用します。

start = time.perf_counter()
s.connect(('localhost',80))
print 'time taken ', time.perf_counter()-start ,' seconds'

timeitこれは、モジュールが使用するタイマーと同じです。代わりに.default_timer()定義を使用できます。

import timeit

start = timeit.default_timer()
# etc.

time.perf_counter()これは、 が利用できない Python 2 でも機能timeit.default_timer()しますが、OS で利用可能な最適なタイマーを参照します ( time.clock()Windows では約 1/100 秒の解像度があり、time.time()他のシステムでは)。

于 2012-09-05T10:40:46.093 に答える
1

ping次の変更されたスクリプトを使用すると、Windows 7と同じ結果が得られます。

import time
import socket
while True:
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM )
    start = time.time()
    s.connect(('www.google.at',80))
    print 'time taken ', (time.time()-start)*1000 ,' ms'
    s.close()
    time.sleep(1)

localhost に ping を実行すると、常に同じ非常に小さな値が返されます。これが問題になる可能性があります。

于 2012-09-05T10:40:50.157 に答える