Die Zeit wird für die Arbeit aufgewendet
Der Befehl bleibt nicht hängen oder wartet auf etwas, das Zeit verschwendet.
Er funktioniert tatsächlich, was Zeit braucht. Es dauert höchstwahrscheinlich einige Zeit, bis mehrere kleine Netzwerkverzögerungen addiert sind. Es kann aber auch sein, dass es auf der Youtube-Seite Verzögerungen gibt, die sich summieren.
Dass es nur die Zeit ist, die benötigt wird, um den benötigten HTML-Code herunterzuladen;
Der Befehl muss mindestens zwei HTTP-Anforderungen nacheinander und wahrscheinlich mehr stellen.
Wenn also etwas langsam ist, wird es mit der Anzahl der bereits vorhandenen Anforderungen multipliziert.
Für mich dauert es 1,5 Sekunden auf einer sehr schnellen Linie - das ist nicht weit von 8 Sekunden.
Wie man es herausfindet
Ich werde die Befehle zeigen, mit denen ich es herausgefunden habe:
Um die Beispiele übersichtlicher zu gestalten, verwenden wir eine Variable für die URL:
$ u="https://www.youtube.com/watch?v=k4JGSAmu4lg"
Wir wollen die Dauer von Befehlen messen; Bei der Verwendung des Befehls time
muss darauf geachtet werden, dass der Befehl und die integrierte Shell nicht verwechselt werden. Wir verwenden eine kleine Funktion, um die Zeilen kürzer zu machen:
$ t(){/usr/bin/time -f 'Time: %es' "$@";}
Ihr Befehl schreibt die URL der Videodatei aus (auf 80 Spalten gekürzt):
$ youtube-dl -g "$u"
https://r20---sn-cxg7en7d.googlevideo.com/videoplayback?signature=091F68E823
Messen wir die Zeit, die für die Ausführung auf meinem Computer benötigt wird:
$ t youtube-dl -g "$u"
https://r20---sn-cxg7en7d.googlevideo.com/videoplayback?signature=091F68E823
Time: 1.44s
Ok, eineinhalb Sekunden. Schneller als in der Frage, aber nicht viel schneller. Aber wie verbringt es die Zeit? Vielleicht lädt es das Video auf versteckte Weise herunter und verwirft es? Das Video ist 11 Minuten in 360p. Das Herunterladen ohne Optionen dauert ungefähr 13 Sekunden - zehnmal länger.
Müssen Sie genauer hinsehen, mit der ausführlichen Option -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
Oh, es gibt eine gewisse Verzögerung, bevor die '[Debug]' - Zeilen gedruckt werden. Sieht so aus, als würde er youtube-dl
einige Zeit für die Einrichtung seiner eigenen Konfiguration aufwenden. Es ist ungefähr eine Viertelsekunde, nicht die Verzögerung, nach der wir suchen. Wir können jedoch daraus lernen, dass die youtube-dl
Implementierung selbst langsam sein kann.
Nach den Nachrichten passiert nichts, bis die Ergebnis-URL gedruckt wird. Wir sehen den interessanten Teil also immer noch nicht.
Die Option -g
besteht darin, den Video-Download in dem Sinne zu "simulieren", dass er den komplizierten Teil des Herausfindens dieser halbgeheimen URL erledigt, sie druckt und am Ende den eigentlichen Download überspringt. Es gibt eine ähnliche Option -s
, die die URL nicht ausgibt und ansonsten ähnlich erscheint. Nehmen wir an, es ist ähnlich genug, wenn es ungefähr zur gleichen Zeit dauert. Wir müssen das überprüfen.
$ 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
dauert genauso lange wie -g
, also ist es in Ordnung, sie zum Testen zu ersetzen.
Interessanter ist, dass wir jetzt mehr Output haben. Und es wird mit einem interessanten Timing gedruckt: Die Zeilen werden mit einer ähnlichen Verzögerung gedruckt, so dass es anscheinend um die Aktionen geht, die tatsächlich die Zeit in Anspruch nehmen, nach der wir suchen.
Aus den Nachrichten werden mindestens zwei Webseiten heruntergeladen. Wir können jedoch davon ausgehen, dass das Wort "Seite" keine einzelne HTTP-Anforderung und kein einzelnes HTML-Dokument bedeutet.
Was haben wir gelernt?
Der Hauptpunkt ist, dass die Arbeit des Programms tatsächlich Zeit braucht, nicht auf etwas wartet oder hängt.
Außerdem sehen wir mehrere Schritte, die ähnlich viel Zeit in Anspruch nehmen. Es gibt nicht viel zu berechnen, das sind also in gewisser Weise Netzwerk-Roundtrips, die sich summieren.
Das heißt, die Latenz unserer Verbindung ist nur hier wichtig. Der Durchsatz der Verbindung ist nur irrelevant.
Wenn Sie Ihre Internetverbindung beschleunigen würden, damit Daten mit doppelter Geschwindigkeit übertragen werden können, würde dies überhaupt nicht helfen. Aber wenn Sie bessere ping
Zeiten bekommen können, wird es viel schneller.
Es geht jedoch nicht darum, Ping-Zeiten an Ihren Internetdienstanbieter zu senden. Die Ping-Zeit bis hin zu YouTube ist wichtig - und kann möglicherweise nicht geändert werden.
Interessanterweise sind für den nächsten Schritt, das Herunterladen eines Videos, die Anforderungen für eine schnelle Leitung genau umgekehrt: Die Latenz ist überhaupt nicht relevant, und der Durchsatz ist wirklich wichtig.
Noch nicht müde?
Möchten Sie noch mehr Details erfahren, wofür die Zeit wirklich aufgewendet wird?
Der nächste Schritt wäre, die HTTP-Verbindung zu verfolgen. Ich würde vermuten, dass es viel mehr Hin- und Rückfahrten als zwei zeigt, zum Beispiel für Weiterleitungen. Sie können wireshark
einen HTTP-Proxy strace
für die Protokollierung verwenden oder nur die Systemaufrufe zum Verbinden oder Schreiben zählen.
Für heute haben wir beide tief genug in das Kaninchenloch der Vernetzung geschaut.