2012-06-22 19 views
27

Próbuję zbudować narzędzie do testowania opóźnienia mojego połączenia internetowego, a dokładniej czasu ładowania strony internetowej. Myślałem o użyciu modułu python requests dla części ładującej.Zmierz czas wczytywania witryny za pomocą zapytań w języku Python

Problem polega na tym, że nie ma wbudowanej funkcji umożliwiającej pomiar czasu potrzebnego na uzyskanie pełnej odpowiedzi. Do tego pomyślałem, że użyłbym modułu timeit.

Co nie jestem pewien, że jeśli uruchomię timeit tak:

t = timeit.Timer("requests.get('http://www.google.com')", "import requests") 

Jestem naprawdę pomiaru czasu zajęło odpowiedź przyjazd, czy jest to czas potrzebny dla wniosek o zbudowanie, wysłanie, otrzymanie itp.? Zgaduję, że mógłbym zignorować ten czas ekskomuzyjny odkąd testuję sieci z bardzo długimi opóźnieniami (~ 700 ms)?

Czy jest lepszy sposób to zrobić programowo?

Odpowiedz

19

Jeśli chodzi o Twoje pytanie, powinno być całkowity czas dla

  1. czasu do tworzenia obiektu żądania
  2. Wysłać prośbę
  3. otrzyma odpowiedzi
  4. odpowiedź parse (patrz komentarz od Thomas Orozco)

Inne sposoby mierzenia czasu ładowania pojedynczego żądania to użycie urllib:

nf = urllib.urlopen(url) 
start = time.time() 
page = nf.read() 
end = time.time() 
nf.close() 
# end - start gives you the page load time 
+5

+ 4. analizowania odpowiedzi HTTP –

+1

który wygląda bardzo ładnie, ale patrząc na jeden z przykładów widzę '1. start_timer = time.time() 2. Otwórz przeglądarkę + odczytaj odpowiedź 3. opóźnienie = time.time() - start_timer' Czy to byłby ten sam problem? – cookM

+0

@ Cookook: Nie widziałem, jak to problem, ale w czasie rzeczywistym, doświadczenie opóźnienia żądania. W rzeczywistości jest to średnia dla wielu wniosków, które będą bliższe realistycznemu czasowi. – pyfunc

105

Jest taka funkcjonalność w najnowszej wersji wniosków:

http://docs.python-requests.org/en/latest/api/?highlight=elapsed#requests.Response.elapsed

Na przykład:

requests.get("http://127.0.0.1").elapsed.total_seconds() 
+24

, aby uzyskać czas odpowiedzi w sekundach: 'requests.get (" http://127.0.0.1 ") .elapsed.total_seconds()' –

+1

Aby dodać do komentarza Micael Osl: 'total_seconds()' jest liczbą dziesiętną, która wydaje się mieć dokładność mikrosekundy. – Luc

+4

Nie należy tego używać do profilowania i optymalizacji kodu po stronie klienta. Mierzy on tylko czas odpowiedzi serwera (co było pytaniem dotyczącym programów operacyjnych). _ Czas pomiędzy wysłaniem wniosku a przybyciem odpowiedzi (jako timedelta). Ta właściwość mierzy czas między wysłaniem pierwszego bajta żądania a zakończeniem analizowania nagłówków. Nie ma więc wpływu na zawartość odpowiedzi lub wartość słowa kluczowego argument stream._ - dokumenty. – ChaimG