İş yapmak için zaman harcamak
Komut zaman kaybetmeden bir şey beklemez veya beklemez,
aslında zaman alan işleri yapar; Büyük olasılıkla birden çok küçük ağ gecikmesi ekleyerek zaman alır. Ancak youtube tarafında gecikmeler de olabilir.
Gereken HTML'yi indirmek için gereken zamanın;
Komutun birbiri ardına ve muhtemelen daha fazla olmak üzere en az iki HTTP isteği yapması gerekir.
Dolayısıyla, herhangi bir şey yavaşsa, zaten talep sayısıyla çarpılır.
Benim için çok hızlı bir çizgide 1,5 saniye sürüyor - bu 8 saniyeden çok uzak değil.
Nasıl öğrenilir
Öğrenmek için kullandığım komutları göstereceğim:
Örnekleri daha düzenli hale getirmek için URL için bir değişken kullanıyoruz:
$ u="https://www.youtube.com/watch?v=k4JGSAmu4lg"
Komutların süresini ölçmek istiyoruz; Komutu kullanmak, komutu time
ve kabuk yerleşimini karıştırmamaya dikkat etmelidir. Hatları kısaltmak için küçük bir işlev kullanıyoruz:
$ t(){/usr/bin/time -f 'Time: %es' "$@";}
Komutunuz video dosyasının URL'sini yazar (80 sütuna kesilmiş):
$ youtube-dl -g "$u"
https://r20---sn-cxg7en7d.googlevideo.com/videoplayback?signature=091F68E823
Bilgisayarımda çalıştırmak için gereken süreyi ölçelim:
$ t youtube-dl -g "$u"
https://r20---sn-cxg7en7d.googlevideo.com/videoplayback?signature=091F68E823
Time: 1.44s
Tamam, bir buçuk saniye. Sorudan daha hızlı, ama o kadar hızlı değil. Ama zamanı nasıl geçiriyor? Belki videoyu gizli bir şekilde indirip atar? Video 360p'de 11 dakikadır. Hiçbir seçenek olmadan indirmeniz yaklaşık 13 saniye - on kat daha uzun sürer.
Ayrıntılı seçenekle daha yakından bakmanız gerekiyor -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, '[debug]' satırları basılmadan önce biraz gecikme yaşanıyor. Görünüşe göre youtube-dl
kendi yapılandırma kurulumu için biraz zaman harcıyor. Aradığımız gecikme değil, saniyenin çeyreği kadar. Ancak bundan öğrenebileceğimiz, youtube-dl
uygulamanın kendisinin yavaş olabileceğidir.
Mesajlardan sonra, sonuç URL'si yazdırılana kadar hiçbir şey olmaz. Bu yüzden hala ilginç kısmı görmüyoruz.
Seçenek -g
, video indirmeyi, yarı gizli URL'yi bulmanın karmaşık kısmını yaptığı, yazdırdığı, ancak sonunda gerçek indirmeyi atladığı anlamında "simüle etmektir". -s
URL'yi vermeyen benzer bir seçenek vardır ve aksi halde benzer görünür. Diyelim ki aynı zaman alırsa yeterince benzer olduğunu varsayalım; Bunu kontrol etmeliyiz.
$ 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
Tamam, -s
aynı zamanı alır -g
, bu yüzden onları test için değiştirmek iyidir.
Daha ilginç olan şu anda daha fazla üretimimiz var. Ve ilginç bir zamanlamayla basılıyor: Çizgiler birbirine benzer bir gecikmeyle basılıyor, bu yüzden aslında aradığımız zamanı alan eylemlerle ilgili görünüyorlar.
Mesajlardan en az iki web sayfası indirilir. Ancak "sayfa" sözcüğünün tek bir HTTP isteği ve tek bir HTML belgesi anlamına gelmeyeceğini varsayabiliriz.
Ne öğrendik?
Ana nokta, programın çalışması aslında zaman alıyor, bir şey beklemiyor veya asılı değil.
Ayrıca, benzer miktarlarda zaman alan birden fazla adım görüyoruz. Hesaplanacak çok şey yok, bu yüzden bir şekilde ağ gidiş dönüşleri toplanıyor.
Bu, bağlantımızın gecikmesinin sadece burada önemli olduğu anlamına gelir. Bağlantının verimi önemsizdir.
İnternet bağlantınızı daha hızlı hale getirirseniz, veriyi çift hızda aktarabilir - bu hiç yardımcı olmaz. Ancak daha iyi ping
zamanlar alabiliyorsanız , bu çok daha hızlı olacaktır.
Yine de, internet servis sağlayıcınıza 'ping' saatleri ile ilgili değildir; Önemli olan YouTube'a kadar olan ping süresi - ve değiştirilmesi mümkün olmayabilir.
İlginç bir şekilde, bir sonraki adım için, bir video indirmek, hızlı bir hat için gereksinimler tam tersidir: gecikme hiç önemli değildir ve iş hacmi gerçekten önemlidir.
Henüz yorgun değil misiniz?
Zamanın gerçekten ne kadar zaman harcadığını anlamak için daha fazla ayrıntı ister misiniz?
Bir sonraki adım HTTP bağlantısını izlemek olacaktır; Örneğin, yönlendirmeler için ikiden çok daha fazla gidiş-dönüş gösterebileceğinden şüphelenirim. Bağlanmak veya yazmak için sistem çağrılarını saymak wireshark
ya da bir günlük HTTP proxy'yi kullanabilirsiniz strace
.
Bugün, ikimiz de ağ oluşturmanın tavşan deliğine yeterince derin baktık.