【问题标题】:Python timing a socket connectionPython定时套接字连接
【发布时间】:2012-08-30 01:07:28
【问题描述】:

我正在寻找使用 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()

我的问题是我不认为连接计时器正常工作,因为我经常得到相同的时间戳返回。有人能指出我解决这个问题的正确方向吗?

【问题讨论】:

    标签: python windows sockets network-programming


    【解决方案1】:

    在 Windows 上,time.time() 值没有足够的粒度(只有 1/60 秒)。请改用time.perf_counter(),它在 Windows 上的分辨率约为 1/3 微秒:

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

    这与timeit module 使用的计时器相同;您可以改用.default_timer() 定义:

    import timeit
    
    start = timeit.default_timer()
    # etc.
    

    这也适用于 Python 2,其中 time.perf_counter() 不可用,但 timeit.default_timer() 将引用适用于您的操作系统的最佳可用计时器(time.clock() 在 Windows 上,分辨率约为 1/100 秒, time.time() 在其他系统上)。

    【讨论】:

    • 这正是问题所在。这是时间函数的粒度。谢谢
    • +1 表示timeit 模块。我在 Linux 上,所以不是问题的焦点,但我对 time.time()time.clock() 甚至 time.perf_counter() 都没有运气。我一直看到与 Wireshark 测量的结果截然不同的结果。但timeit.default_timer() 给出的结果与 Wireshark 显示的非常接近。
    • 实际上,在 Python 3.3+ 中,timeit.default_timer 被定义为time.perf_counter。我可能在time.perf_counter 测量中犯了一个错误。但我已经做了更多,time.clocktime.time 有时肯定会给出错误的答案,而我还没有看到 time.perf_countertimeit.default_timer 是错误的。
    • @NickS:这个答案已经超过 5 年了,Python 3.3 直到我写完这篇文章之后才出来,而 Python 2 仍然是所有行动的所在。 :-) 我会更新答案。
    • @MartijnPieters 对不起,应该明确表示这是对我的第一条评论的更正。我主要想说我感谢指向timeit.default_timer() 的指针,因为我意识到其他方法可能有多么不准确。
    【解决方案2】:

    使用以下修改后的脚本,我在 Windows 7 上得到了与 ping 相同的结果。

    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)
    

    ping 我的本地主机总是给我同样非常小的值。这可能是问题所在。

    【讨论】:

      猜你喜欢
      • 2016-02-14
      • 1970-01-01
      • 1970-01-01
      • 2020-12-09
      • 2016-08-19
      • 1970-01-01
      • 2016-01-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多