Apakah menjalankan perintah secara lisan membuatnya lebih lambat?


37

Saya mendapati diri saya menggunakan -vflag untuk banyak aplikasi semakin sedikit (terutama untuk hal-hal sepele seperti tardan cp). Namun, ketika saya melakukannya dan saya, katakanlah, membuka ritsleting file besar, itu akan memakan waktu lebih lama daripada ketika saya tidak menggunakan -vbendera.

Saya berasumsi ini karena terminal harus memproses teks dan saya mengisi buffer apa pun yang mungkin ada. Tetapi pertanyaan saya adalah, apakah ini membuat aplikasi benar-benar berjalan lebih lambat atau apakah itu selesai dalam jumlah waktu yang sama dan apa yang saya lihat adalah terminal berusaha untuk mengejar ketinggalan?


Apakah Anda mencoba untuk waktu misalnya tar xvf file.tar > /dev/nullvs tar xf file.tar? Pengalihan ke /dev/nullharus mengambil terminal Anda dari ini.
Benjamin Bannier

3
Juga, perhatikan bahwa stdoutdan stderrmerupakan line-buffered - yang berarti bahwa mengisi buffer tidak mengambil yang lama - itu adalah memblokir printfpanggilan (dan dengan ekstensi terminal output) yang mengambil selamanya.
new123456

1
Jika Anda telah berbicara tentang perintah Windows, saya akan mengatakan bahwa itu benar :)
kokbira

Untuk tugas intensif CPU, tergantung pada seberapa banyak IO yang Anda lakukan, Anda mungkin melihat penurunan kinerja yang mengerikan.
pengguna

Jawaban:


31

Ya, menjalankan verbose akan memperlambat aplikasi Anda.

Berapa banyak tergantung pada aplikasi.

Setiap cetakan ke terminal akan membutuhkan waktu pemrosesan tambahan. Dalam hal menggunakan printf () atau saudara-saudara perempuannya, ini adalah proses pengolahan yang terbilang cukup berat.

Juga, terminal harus berurusan dengan data itu. Ada jumlah ruang buffer yang terbatas antara aplikasi dan terminal, dan saluran IO akan memblokir sampai ada cukup ruang di buffer tersebut untuk benar-benar menampilkan data. Aplikasi umumnya tidak dapat melanjutkan saat pemblokiran ini sedang berlangsung. 1

Juga, tindakan menampilkan teks debug pada terminal akan memakan siklus pemrosesan. Sekali lagi, ini tergantung pada aplikasi (jumlah debugging), program terminal (font yang digunakan, efek, dll) dan bahkan driver X windows yang digunakan (akselerasi perangkat keras, dll).

The timeprogram dapat digunakan untuk cukup akurat menentukan berapa lama perintah telah diambil untuk menjalankan. Menjalankan program yang sama dua kali sepanjang waktu, sekali dengan debugging, dan sekali tanpa, akan menunjukkan kepada Anda berapa banyak perbedaan yang terjadi. Saya akan menyarankan menjalankan perintah sekali sebelum melakukan tes untuk memastikan bahwa caching adalah sama untuk kedua tes berjalan dari perintah. Anda tidak ingin memiringkan hasilnya dengan menjalankan kedua berjalan lebih cepat karena sebagian besar data di-cache oleh jalankan pertama sekarang apakah Anda ...


1 Dalam kasus aplikasi multithreaded hanya utas yang melakukan keluaran debug yang benar-benar akan diblokir.


Sebagian besar programmer mengetahui ini dengan cukup cepat (Borland C dalam DOS);)
Dragos

Tentu saja jika jendela konsol disembunyikan (atau bahkan tertutup sebagian), maka itu tidak akan berdampak hampir sama seperti ketika konsol terlihat. Buka command-prompt dan lakukan a dir c:\/s/a. Anda dapat melihat perubahan kecepatan ketika benar-benar terlihat dan sebagian tertutup. Anda tidak dapat melihatnya mempercepat ketika diminimalkan, tetapi pasti lebih cepat, meskipun Anda harus reboot jika Anda ingin menguji, untuk mem-bypass caching yang akan membuatnya menjadi lebih cepat, karena itu tidak akan memiliki untuk mengakses disk.
Synetech

1
@ Sin Kami berbicara tentang Linux di sini.
Majenko

1
@ Matt masih komentar yang valid. Mohon hormat.
nhinkle

@ Mat, doh! Saya tidak memperhatikan. (Mungkin saya terganggu dari komentar DOS.) Bagaimanapun, Linux sangat berbeda, tapi saya bertanya-tanya apakah hal yang sama berlaku untuk itu (konsol terlihat dengan banyak teks bergulir berjalan lebih lambat).
Synetech

8

Itu tergantung pada aplikasi yang Anda jalankan. Namun, secara umum, kita dapat mengatakan bahwa verbose akan memperlambat aplikasi Linux yang paling umum karena mereka harus menyinkronkan tindakan mereka antara stdout dan I / O atau batas prosesor.


6

Menggunakan yessebagai test case pada OS X 10.7, tampaknya memang penting jika Anda mencetak banyak output ke terminal, seperti yang diharapkan.

Mengkuantifikasi ini sedikit lebih jauh, saya berlari yesselama 5 detik, dalam satu kasus mencetak output ke terminal dan menyimpannya ke file (dengan tee), dalam kasus lain melakukan hal yang sama kecuali mengarahkan stdoutke /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

Kasus 1. memberi 2371584 garis dan kasus 2. memberikan 136421376 garis, atau 57 kali lebih banyak. 'Kinerja' yes(yang diukur dengan jumlah garis yang dicetak per unit waktu) dalam hal ini 57 kali lebih lambat .

Satu catatan samping di sini adalah bahwa saya digunakan yesbersama dengan di teesini, yang mungkin mempengaruhi hasil sedikit, namun saya pikir hasilnya masih valid.

Indikasi lain bahwa program ini melambat adalah bahwa berjalan yessaat mengeluarkan ke terminal, terminal menggunakan sekitar 100% CPU dan yeshanya sekitar 37%, sementara berjalan yestanpa mengeluarkan ke terminal ia menggunakan penuh 100% (Ini adalah pada multi- mesin inti, jadi yesbisa menggunakan lebih banyak CPU jika bisa, kecuali itu diperlambat oleh terminal).


5

Mudah untuk menjawab ya, itu akan memperlambat aplikasi. Tetapi jawaban yang jauh lebih benar adalah 99% kasus tidak masalah.

Jika aplikasi Anda melakukan pekerjaan apa pun yang benar-benar membutuhkan daya CPU, kemungkinan mencetak beberapa baris teks tambahan ke layar membuat segala jenis perbedaan mendekati 0%.

Bahkan, Anda dapat dengan mudah membuat penilaian sendiri: Jika aplikasi tersebut memuntahkan tembok teks yang sangat besar, mungkin sebenarnya Anda harus membayar sedikit. Mungkin.


3
-1 ini tidak benar. printf()mahal sekali
Thomas Bonini

1
Apa yang saya katakan itu benar. Apa yang Anda coba buat seperti yang saya katakan, bagaimanapun, adalah sesuatu yang sama sekali berbeda. Saya tidak mengatakan apa-apa tentang efisiensi pencetakan stdlib spesifik. Saya mengatakan program harus melakukan pekerjaan yang cukup sehingga waktu yang dihabiskan untuk pencetakan dapat diabaikan. Sekarang pergi troll orang lain.
slarpspark

@slarpspark: itu tidak selalu dapat diabaikan, bahkan jika kita mengambil printf () dari persamaan, aliran byte masih harus melalui bash, kemudian terminal emulator, maka terminal emulator harus membuat teks ke layar setelah mem-parsing karakter escape, dan rendering teks tidak murah jika dilakukan pada tingkat yang mungkin dilakukan beberapa perintah verbose; dan itu akan menjadi sangat mahal jika program memerah buffer output di setiap baris karena itu berarti konteks beralih. Saya sering mengalami saat menulis skrip python, bahwa menghapus cetakan di loop ketat kadang-kadang dapat membawa 10s ke 1s.
Lie Ryan

Bagaimana dengan perintah yang berjalan di SSH, maka bahkan jika waktu CPU minimal, begitu Anda memperkenalkan latensi jaringan tentunya itu penting?
ec2011

3

Kode verbose biasanya dievaluasi dengan instruksi if dan setiap kali melewati kontrol ke fungsi tampilan, semakin lama waktu yang dibutuhkan, konteksnya bisa dialihkan, lebih banyak interupsi.

Tapi itu tergantung, jika kode verbose Anda adalah utas terpisah yang hanya memeriksa keadaan penyelesaian dari waktu ke waktu perbedaannya dapat diabaikan.

Pertanyaan ini bisa mendapat banyak manfaat dari kontribusi pemrogram berpengalaman stackoverflow. Saya sarankan pindah :)

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.