Çalıştırma komutları ayrıntılı olarak onları yavaşlatır mı?


37

-vBayrağımı birçok uygulama için daha az kullandıkça buldum (özellikle tarve benzeri önemsiz şeyler için cp). Ancak, yaptığım ve büyük bir dosyayı açtığımda, -vbayrak kullanmadığımdan daha uzun sürüyordu.

Bunun, terminalin metni işlemesi gerektiğinden ve sahip olabileceği herhangi bir tamponu doldurduğumuza inanıyorum. Ancak benim sorum şu; bu, uygulamanın gerçekten daha yavaş çalışmasına neden oluyor mu yoksa aynı sürede tamamlanıyor mu ve terminalin yetişmeye çalıştığını görüyorum?


Zamana tar xvf file.tar > /dev/nullbenzedin tar xf file.tarmi, örneğin ? Yönlendirme /dev/null, terminalinizi bundan çıkarmalı.
Benjamin Bannier

3
Ayrıca, not olduğunu stdoutve stderrolan hat-tamponlu - tampon dolduruyor o kadar uzun sürmüyor yani - bu engelleme var printfaramaları (ve uzatma terminali çıkışı ile) sonsuza kadar sürer.
yeni123456,

1
Windows komutlarından bahsetseydiniz, kesinlikle doğru olduğunu söyleyebilirim :)
kokbira

İşlemcinin yoğun görevi için ne kadar G / Ç yaptığınıza bağlı olarak, korkunç performans düşüşü görebilirsiniz.
kullanıcı

Yanıtlar:


31

Evet, ayrıntılı çalıştırma uygulamalarınızı yavaşlatır.

Ne kadarı uygulamaya bağlıdır.

Terminale her yazdırma için ekstra işlem süresi gerekir. Printf () veya kız kardeşlerinden herhangi birinin kullanılması durumunda, bu oldukça ağır bir işlemdir.

Ayrıca, terminal bu verilerle ilgilenmek zorundadır. Uygulama ile terminal arasında sınırlı miktarda tampon alanı vardır ve IO kanalı, veriyi gerçekten vermek için bahsedilen tamponda yeterli alan bulunana kadar engelleyecektir. Bu engelleme yapılırken uygulama genellikle devam edemez. 1

Ayrıca, terminalde hata ayıklama metnini görüntüleme eylemi işlem döngülerini tüketecektir. Yine, bu hem uygulamaya (hata ayıklama miktarına) hem de terminal programına (kullanılan fontlar, efektler, vb.) Ve hatta kullanılan X windows sürücüsüne (donanım hızlandırma vb.) Bağlıdır.

timeProgram oldukça doğru bir komut çalıştırmak için almıştır süreyi belirlemek için kullanılabilir. Aynı programı zaman içerisinde iki kez, bir kez hata ayıklama ve bir kez olmadan çalıştırmak size ne kadar fark yarattığını gösterecektir. Önbelleğe almanın komutun her iki test çalışması için aynı olmasını sağlamak için testleri gerçekleştirmeden önce komutu bir kez çalıştırmanızı öneririm. İkinci çalıştırmayı çok daha hızlı ilerleterek sonuçları çarpıtmak istemezsiniz, çünkü verilerin çoğu ilk çalıştırmada önbelleklenir, şimdi ...


1 Çok iş parçacıklı bir uygulama olması durumunda, sadece hata ayıklama çıktısını gerçekleştiren iplik gerçekte bloke olacaktır.


Programcıların çoğu bu oldukça hızlı bir şekilde öğrenir (DOS'ta Borland C);)
Dragos

Elbette, konsol penceresi gizlenmişse (veya kısmen de olsa kapalıysa), o zaman konsolun göründüğü kadar etkili olmaz. Bir komut istemi açın ve yapmak dir c:\/s/a. Hız değişimini tamamen görünür durumda ve kısmen kapalıyken görebilirsiniz. Sen olamaz bkz minimize zaman hızlandırmak, ancak testin istiyorsa bunu olmazdı çünkü bu yine de daha hızlı olmasına neden olur önbelleğe alma baypas etmek için, yeniden başlatma olurdu olsa, kesinlikle hızlıdır diske erişmek için.
Synetech

1
@Syn Burada Linux konuşuyoruz.
Majenko,

1
@Matt hala geçerli bir yorum. Lütfen saygılı ol.
nhinkle

@Matt, doh! Fark etmedim. (Belki de DOS yorumundan dikkatim dağıldı.) Her neyse, Linux oldukça farklı, ama aynı şey bunun için de geçerli olup olmadığını merak ediyorum (çok sayıda metin kaydırması yavaş çalışan görünür konsollar).
Synetech

8

Çalıştırdığınız uygulamaya göre değişir. Bununla birlikte, genel olarak, genel Linux uygulamalarının, stdout ve I / O veya işlemci sınırları arasındaki eylemlerini senkronize etmeleri gerektiği için çoğu yavaşlattığını söyleyebiliriz.


6

yesOS X 10.7'de bir test durumu olarak kullanıldığında , terminale beklendiği gibi çok fazla çıktı yazdırmanız gerçekten önemli görünüyor.

Biraz daha bu a sayısallaştırabilmek Koştum yesterminali için çıkış baskı ve (bir dosyaya kaydederek bir vakada, 5 saniye boyunca teeyönlendirme haricinde aynı şeyi başka durumda) stdoutiçin /dev/null:

  1. yes | tee yeslog_term & sleep 5 && killall yes && wc -l yeslog_term
  2. yes | tee yeslog_noterm > /dev/null & sleep 5 && killall yes && wc -l yeslog_noterm

Durum 1, 2371584 satır verir ve durum 2, 136421376 satır veya 57 kat daha verir. 'Performansı' yes(birim zaman başına yazdırdığı satır miktarı ile ölçülen) bu durumda 57 kat daha yavaş olur .

Burada bir tarafı not kullandığım olmasıdır yesbirlikte teeancak sonuç hala geçerli olduğunu sanıyorsun, hafifçe sonuçlarını etkileyebilecek olabilir burada.

Programın yavaşladığına dair bir başka gösterge, yesbir terminale çıkarken çalışırken, terminalin% 100 civarında CPU kullandığı ve yessadece% 37 civarında yesolduğu, tam% 100 CPU kullandığı bir terminale çıkmadan çalıştığında (Bu bir çekirdek makine, bu yüzden yeseğer terminal tarafından yavaşlatılması dışında mümkün olsaydı daha fazla CPU kullanabilirdi).


5

Sadece evet cevabı kolaydır, uygulamayı yavaşlatır. Ancak çok daha doğru bir cevap, vakaların% 99'unda önemli olmayacağıdır.

Uygulamanız aslında biraz CPU gücü gerektiren herhangi bir iş yapıyorsa, ekrana herhangi bir fark yaratan bazı ekstra metin satırları basma olasılığı % 0'a yakındır.

Aslında, kendi kararınızı kolayca verebilirsiniz: Uygulama, çok büyük bir metin duvarı yayıyorsa, bu size küçük bir parçaya mal olabilir. Olabilir.


3
-1, bu doğru değil. printf()delicesine pahalı
Thomas Bonini

1
Söylediklerim doğruydu. Ancak söylediğim gibi görünmesini sağlamaya çalıştığınız şey, tamamen başka bir şey. Belirli bir stdlib baskısının etkinliği hakkında hiçbir şey söylemiyorum. Programların, harcanan zamanın ihmal edilebilir düzeyde olması için yeterince çalışma yapması gerektiğini söylüyorum. Şimdi git başkasını troll.
slarpspark

@slarpspark: denklemden printf () alsak bile, bayt akışının hala bash, sonra terminal emülatöründen geçmesi gerekirken, terminal emülatörünün metni ekrana getirmesi gerekiyordu. kaçış karakterlerini ayrıştırdıktan sonra ve bazı ayrıntılı komutların yapabileceği oranda yapılırsa metin oluşturma ucuz değildir; ve programın çıktı arabelleğini her satırda temizlemesi, bağlam anahtarları olduğu için özellikle pahalı olacaktır. Python scriptleri yazarken sık sık deneyimliyorum, baskıları sıkı döngüde çıkarmak bazen 10'ları 1'lere çıkarabilir.
Yalan Ryan

Peki ya SSH üzerinden çalışan bir komut, o zaman CPU süresi minimum olsa bile, ağ gecikmesini tanıttığınızda kesinlikle bu önemlidir?
ec2011

3

Bir ayrıntılı kod genellikle bir if komutu ile değerlendirilir ve kontrolü ne kadar uzun sürerse görüntüleme işlevi ne kadar uzun sürerse bağlam değişebilir, daha fazla kesilebilir.

Ancak, eğer ayrıntılı kod, zaman zaman sadece tamamlanma durumunu kontrol eden ayrı bir iş parçacığı ise, fark ihmal edilebilir.

Bu soru stackoverflow'un deneyimli programcılarının katkısından çok yararlanabilir. Hareket etmeyi öneririm :)

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.