7

URL をロードして応答時間を取得する Python スクリプトを次に示します。

import urllib2
import time

opener = urllib2.build_opener()
request = urllib2.Request('http://example.com')

start = time.time()
resp = opener.open(request)
resp.read()
ttlb = time.time() - start

私のタイマーは要求/応答全体 (read() を含む) にラップされているため、TTLB (最後のバイトまでの時間) が得られます。

TTFB (最初のバイトまでの時間) も取得したいのですが、タイミングを開始/停止する場所がわかりません。urllib2 は TTFB タイマーを追加するのに十分な粒度ですか? もしそうなら、彼らはどこに行きますか?

4

4 に答える 4

8

を使用する必要がありますpycurlurllib2

  1. install pyCurl:
    pip / easy_install を使用するか、ソースからインストールできます。

    easy_install pyCurl

    多分あなたはスーパーユーザーになるべきです。

  2. 利用方法:

    import pycurl
    import sys 
    import json
    
    WEB_SITES = sys.argv[1]
    
    def main():
        c = pycurl.Curl()
        c.setopt(pycurl.URL, WEB_SITES)              #set url
        c.setopt(pycurl.FOLLOWLOCATION, 1)  
        content = c.perform()                        #execute 
        dns_time = c.getinfo(pycurl.NAMELOOKUP_TIME) #DNS time
        conn_time = c.getinfo(pycurl.CONNECT_TIME)   #TCP/IP 3-way handshaking time
        starttransfer_time = c.getinfo(pycurl.STARTTRANSFER_TIME)  #time-to-first-byte time
        total_time = c.getinfo(pycurl.TOTAL_TIME)  #last requst time
        c.close()
    
        data = json.dumps({'dns_time':dns_time,         
                           'conn_time':conn_time,        
                           'starttransfer_time':starttransfer_time,    
                           'total_time':total_time})
        return data
    
    if __name__ == "__main__":    
        print main()
    
于 2016-08-12T10:21:47.343 に答える
2

現在のopen/readペアを使用すると、可能なタイミングポイントは 1 つだけです - 2 つの間にあります。

呼び出しは、open()実際に HTTP 要求を送信する責任があり、(AFAIK) が送信されるとすぐに戻り、アプリケーションが実際に を介して応答を読み取る準備ができている必要がありますread()

技術的には、サーバーの応答が長いと、アプリケーションが への呼び出しでブロックされる可能性がread()あります。この場合、これは TTFB ではありません。

ただし、データ量が少ない場合は、とにかく TTFB と TTLB の間に大きな違いはありません。read()大量のデータの場合は、最初の可能な限り小さいチャンクを返すのにかかる時間を測定してください。

于 2009-04-13T16:51:11.267 に答える
1

良好な近接性を得るには、read(1) を実行する必要があります。そして、時間をめちゃくちゃにします。

それは私にとってかなりうまくいきます。心に留めておくべき唯一のこと: Python は read(1) の呼び出しで複数のバイトをロードする可能性があります。内部バッファに応じて。しかし、ほとんどのツールは同じように不正確に動作すると思います。

import urllib2
import time

opener = urllib2.build_opener()
request = urllib2.Request('http://example.com')

start = time.time()
resp = opener.open(request)
# read one byte
resp.read(1)
ttfb = time.time() - start
# read the rest
resp.read()
ttlb = time.time() - start
于 2012-06-14T10:12:53.310 に答える
1

デフォルトでは、urllib2 での HTTP オープンの実装には、読み取りが実行されるときのコールバックがありません。HTTP プロトコルの OOTB オープナーは で、ソケットを介して実際の読み取りを行うためurllib2.HTTPHandlerに使用します。httplib.HTTPResponse

理論的には、HTTPResponse と HTTPHandler の独自のサブクラスを作成し、それをデフォルトのオープナーとしてinstall_openerを使用して urllib2 にインストールできます。これは些細なことではありませんが、基本的に標準ライブラリから現在の HTTPResponse 実装をコピーして貼り付け、begin()そこにあるメソッドを微調整して、ソケットからの読み取りが開始されたときに何らかの処理またはコールバックを実行する場合は、耐え難いほどではありません。

于 2009-04-13T17:27:51.693 に答える