Czas spędzasz na pracy
Polecenie nie zawiesza się ani nie czeka na coś marnującego czas, w
rzeczywistości działa, co wymaga czasu; Najprawdopodobniej zsumowanie wielu małych opóźnień sieci zajmuje trochę czasu. Ale może się również zdarzyć, że po stronie YouTube pojawią się opóźnienia, które się sumują.
Że jest to tylko czas potrzebny na pobranie potrzebnego kodu HTML;
Polecenie musi wykonać co najmniej dwa żądania HTTP, jeden po drugim i prawdopodobnie więcej.
Więc jeśli coś jest powolne, jest ono mnożone przez liczbę żądań już.
Dla mnie zajmuje to bardzo szybko 1,5 sekundy - to nie jest tak daleko od 8 sekund.
Jak się dowiedzieć
Pokażę polecenia, których się dowiedziałem:
Aby przykłady były bardziej uporządkowane, używamy zmiennej dla adresu URL:
$ u="https://www.youtube.com/watch?v=k4JGSAmu4lg"
Chcemy mierzyć czas trwania poleceń; Używając polecenia, time
należy uważać, aby nie pomieszać polecenia i wbudowanej powłoki. Używamy małej funkcji, aby skrócić linie:
$ t(){/usr/bin/time -f 'Time: %es' "$@";}
Twoje polecenie zapisuje adres URL pliku wideo (obciętego do 80 kolumn):
$ youtube-dl -g "$u"
https://r20---sn-cxg7en7d.googlevideo.com/videoplayback?signature=091F68E823
Zmierzmy czas potrzebny do uruchomienia na moim komputerze:
$ t youtube-dl -g "$u"
https://r20---sn-cxg7en7d.googlevideo.com/videoplayback?signature=091F68E823
Time: 1.44s
Ok, półtorej sekundy. Szybciej niż w pytaniu, ale nie tak dużo szybciej. Ale jak spędza czas? Może pobiera wideo w jakiś ukryty sposób i odrzuca je? Wideo trwa 11 minut w 360p. Pobranie go bez opcji zajmuje około 13 sekund - dziesięć razy dłużej.
Musisz przyjrzeć się bliżej, z opcją pełnego -v
:
$ t youtube-dl -v -g "$u"
[debug] System config: []
[debug] User config: []
[debug] Command-line args: ['-v', '-g', 'https://www.youtube.com/watch?v=k4J
[debug] Encodings: locale 'UTF-8', fs 'UTF-8', out 'UTF-8', pref: 'UTF-8'
[debug] youtube-dl version 2014.02.06
[debug] Python version 2.7.6 - Linux-3.13.0-24-generic-x86_64-with-Ubuntu-14
[debug] Proxy map: {}
https://r20---sn-cxg7en7d.googlevideo.com/videoplayback?sparams=id%2Cinitcwn
Time: 1.40s
Och, jest trochę opóźnienia, zanim zostaną wydrukowane wiersze „[debugowanie]”. Wygląda na to, że youtube-dl
poświęca trochę czasu na własną konfigurację konfiguracji. To jakieś kwadrans, a nie opóźnienie, którego szukamy. Ale możemy się z tego nauczyć, że youtube-dl
sama realizacja może być powolna.
Po wiadomościach nic się nie dzieje, dopóki nie zostanie wydrukowany wynikowy adres URL. Dlatego nadal nie widzimy interesującej części.
Opcją -g
jest „symulacja” pobierania wideo w tym sensie, że robi skomplikowaną część w celu znalezienia tego częściowo tajnego adresu URL, drukuje go, ale ostatecznie pomija faktyczne pobieranie. Istnieje podobna opcja -s
, która nie wyświetla adresu URL, a poza tym wydaje się podobna. Załóżmy, że jest wystarczająco podobny, jeśli zajmuje to mniej więcej tyle samo czasu; Musimy to sprawdzić.
$ t youtube-dl -v -s "$u"
[debug] System config: []
[debug] User config: []
[debug] Command-line args: ['-v', '-s', 'https://www.youtube.com/watch?v=k4J
[debug] Encodings: locale 'UTF-8', fs 'UTF-8', out 'UTF-8', pref: 'UTF-8'
[debug] youtube-dl version 2014.02.06
[debug] Python version 2.7.6 - Linux-3.13.0-24-generic-x86_64-with-Ubuntu-14
[debug] Proxy map: {}
[youtube] Setting language
[youtube] k4JGSAmu4lg: Downloading webpage
[youtube] k4JGSAmu4lg: Downloading video info webpage
[youtube] k4JGSAmu4lg: Extracting video information
Time: 1.45s
Ok, -s
zajmuje tyle samo czasu co -g
, więc można je zastąpić do testowania.
Bardziej interesujące jest to, że mamy teraz większą wydajność. I jest drukowany z ciekawym czasem: linie są drukowane z podobnym opóźnieniem względem siebie, więc wydaje się, że dotyczą działań, które w rzeczywistości zajmują czas, którego szukamy.
Z wiadomości pobierane są co najmniej dwie strony internetowe. Możemy jednak założyć, że słowo „strona” nie będzie oznaczać pojedynczego żądania HTTP i pojedynczego dokumentu HTML.
Czego się nauczyliśmy?
Chodzi przede wszystkim o to, że praca programu zajmuje dużo czasu, nie czeka na coś ani nie zawiesza się.
Widzimy też wiele kroków zajmujących podobny czas. Nie ma wiele do obliczenia, więc to w jakiś sposób obieg sieci, sumując.
Oznacza to, że opóźnienie naszego połączenia jest ważne tylko tutaj. Przepustowość połączenia jest po prostu nieistotna.
Jeśli chcesz, aby twoje połączenie internetowe było szybsze, aby mogło przesyłać dane z podwójną prędkością - to wcale nie pomogłoby. Ale jeśli uda ci się uzyskać lepsze ping
czasy, to znacznie przyspieszy.
Nie chodzi jednak o czasy „pingowania” dostawcy usług internetowych; Czas pingowania aż do YouTube ma znaczenie - i może nie być możliwy do zmiany.
Co ciekawe, do następnego kroku, pobierania filmu, wymagania dotyczące szybkiej linii są dokładnie odwrotne: opóźnienie nie jest w ogóle istotne, a przepustowość naprawdę ma znaczenie.
Nie jesteś jeszcze zmęczony?
Chcesz jeszcze więcej szczegółów, aby zrozumieć, na co tak naprawdę spędza czas?
Następnym krokiem byłoby prześledzenie połączenia HTTP; Podejrzewam, że może pokazywać o wiele więcej objazdów niż dwa, na przykład przekierowania. Możesz użyć wireshark
serwera proxy HTTP z logowaniem, lub strace
po prostu policzyć wywołania systemowe do łączenia się lub pisania.
Na dzień dzisiejszy oboje spojrzeliśmy wystarczająco głęboko w króliczą dziurę sieci.