2009-04-13 4 views
5

ためTTFB(最初のバイトまでの時間)を取得すると、URLをロードし、応答時間をキャプチャするPythonスクリプトです:ここでHTTPリクエスト

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 

私のタイマーは、リードを含めた全体の要求/応答(巻き付けられるので、 ())、これは私にTTLB(最後のバイトまでの時間)を与えます。

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

答えて

2

現在のopen/readペアを使用すると、2つのタイミングポイントの間に1つのタイミングポイントしか存在しません。

open()コールは実際にHTTPリクエストを送信する責任があり、送信されるとすぐに(AFAIK)戻って、アプリケーションが実際にread()経由で応答を読み取る準備ができている必要があります。

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

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

+0

感謝。オープンステップのために「接続時間」のようなことをすると、私が必要とするものが得られる可能性があります(実際はTTFBではありません) –

1

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

理論的には、HTTPResponseとHTTPHandlerの独自のサブクラスを作成し、install_openerを使用してurllib2にデフォルトのオープナーとしてインストールすることができます。標準的なライブラリから現在のHTTPResponse実装をコピー&ペーストしてソケットの読み込みを開始するときに処理またはコールバックを行うためにbegin()メソッドを微調整するなら、これは些細なことではありません。

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 
5

あなたはpyCurlをインストールpycurl、ないurllib2

  1. を使用する必要があります。
    あなたはピップ/ 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 
    

    かの名前 == "メイン":
    印刷メイン()