Stdin ve komut satırı argümanı arasındaki performans farkı


11

Bazı komutlar için belirli girdiyi stdin veya komut satırı bağımsız değişkeni olarak belirtmek mümkündür.

Özellikle, varsayalım commandStdin giriş ve komut satırı argümanı olarak bir dosya adı alabilir ve command < myfile, cat myfile | command ve command myfileaynı sonucu üretebilir.

Örneğin,

Komut şu olduğunda sed:

sed s/day/night/ <myfile >new   
sed s/day/night/ myfile >new    
cat myfile | sed s/day/night/ >new

Komut şu olduğunda cat:

cat < myfile
cat myfile
  1. Performansları hakkında bazı genel kurallar olup olmadığını merak ediyordum, yani hangileri genellikle en verimli ve hangisi en az?
  2. Yönlendirme her zaman borudan daha mı iyidir?

1
Herkese bu (tekrarlanan) soruları soran ve egzersiz olarak kendi kabuklarını sıfırdan yazmayı diliyorum.
alex

1
lütfen "Teşekkürler!" sorularınızda. Minnettarlığınızı ifade etmek için cevaplara oy verin.
alex

@Alex: Bu bir dupe ise, lütfen kopyaya bağlanın ve kapatmaya çalışacağız. Genellikle bir kopya olduğunu bildiğiniz bir soruyu cevaplamaktan kaçının ve moderatörlerin dikkatini çekmek için işaretleyin.
Caleb

1
@alex: Kendi kabuğumu nasıl yazacağımı nereden öğrenebilirim?
Tim

@Caleb: Geçtiğimiz ay 2 veya 3 kez istendiğinden eminim, sadece bağlantıyı kullanışlı değil :-p
alex

Yanıtlar:


6

cat file | commandSözdizimi bir sayılır bir Yararsız KullanımıCat . Tüm seçenekleriniz arasında, bir performans isabeti alır çünkü çekirdeğin başka bir sürecini ortaya çıkarmak zorundadır. Bununla birlikte, bu büyük resimde ortaya çıkabilir, ancak diğer formların sahip olmadığı havai. Bunun gibi sorular üzerinde durulmuştur: Gereksiz kedilere önem vermeli miyim?

Diğer iki form arasında neredeyse hiçbir performans farkı yoktur. STDIN, sürecin diğer tüm dosyalar gibi açması ve okuması gereken özel bir dosya düğümüdür. STDIN yerine bir dosya adı iletmek yalnızca farklı bir dosya açmasını sağlar.

Fark, hangi özellikleri / esnekliği aradığınız olacaktır.

  • Dosya adının programa iletilmesi, giriş dosyasının aranabilir olduğu anlamına gelir. Bu program için önemli olabilir veya olmayabilir, ancak akış aranabilirse bazı işlemler hızlandırılabilir.
  • Gerçek giriş dosyasını bilmek, programınızın ona potansiyel olarak yazmasına izin verir. Örneğin sed -iyerinde düzenleme için. (Not: Bunun sahne arkasında yeni bir dosya oluşturması gerektiğinden, diğer yönlendirmelere göre bir performans kazancı değildir, ancak bir kolaylık adımıdır.)
  • Kabuk yönlendirmelerini kullanmak size birden fazla dosyayı birleştirme veya hatta işlem yeniden yönlendirmesini kullanma olanağı verir. sed [exp] < file1 file2hatta sed [exp] < <(grep command). Bu kullanım senaryosunun ayrıntıları şu soruda bulunabilir: Proses ikamesi ve boru

Süreç ikamesi, sonucu ortaya çıkarmanıza gerek kalmadan çalışmalıdır; sed [exp] < <(grep command)gibi çalışır sed [exp] <(grep command)(çünkü <(grep command)komutun uzunluğu için sedkabuk yardımı olmadan kendi başına mükemmel bir şekilde açılabilen adlandırılmış geçici bir dosya oluşturur ).
ShadowRanger

2
  1. Olduğu göz önüne alındığında command filesadece dosyayı açar ve eğer gibi eserleri o andan itibaren stdin, çok az bir fark var. Kabuk yeniden yönlendirme ile, ikili komutun aksine dosyayı önceden açarsınız (kabuk yapar).

  2. Bahsettiğimiz varsa cat file | commandvs command <file, sonra ikincisi tercih edilir. Sen İkisi arasındaki önemli performans farkı fark edecek değildir, ancak eski gereksiz yere karmaşık (belirli akış ile, ekstra süreci ve boru bellek tampon paylaştı.) Ayrıca, olamaz seeka'da (keyfi dosya işaretçisi konumunu değiştirmek) boru, sıradan bir dosyada yapabilirsiniz. seekGiriş dosyasında -ing mümkün olduğunda bazı komutlar daha verimli algoritma kullanabilir .


Komut sıralı erişim bir tür yapabilir, çünkü komut dosyasının komut <dosya yerine tercih olduğunu söyleyebilirim.
user606723

Ve bunun bunu yapmasını ne engelleyecekti <file? Noktanız çıktı dosyasının adını zor elde etmek için girdi dosyası adını kullanmak için geçerlidir, örneğin: gzip fileüretir file.gz.
alex

belki de yeniden yönlendirmenin dahili olarak nasıl çalıştığını anlamıyorum. Diyelim ki 12GB'lık bir filmi mplayer / vlc'ye yönlendiriyoruz ve sonuna kadar atlıyoruz. Bu durumda tam olarak ne olurdu?
user606723

1
Kabuk dosyayı açar ve dosya tanımlayıcısını devralan bir alt süreci çatallar. Çatallı süreç closeler stdinve aramalar dupaçılan dosya tanımlayıcı üzerinde, eski yerine bu yüzden stdino ve arasında hiçbir fark yoktur bakış film oyuncusu açıdan (çoğu durumda tty'nin çeşit olan.) İçinde 's adıyla dosyası açılırken oyuncunun kendisi. Dosya tanımlayıcı her iki senaryoda da aranabilir, bu nedenle sonuna kadar atladığımızda kullanıcı tarafından algılanabilir bir fark yoktur.
alex
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.