คำสั่งที่รันอยู่ทำให้ verbosely ช้าลงหรือไม่?


37

ฉันพบว่าตัวเองใช้-vแฟล็กสำหรับแอปพลิเคชั่นมากมายน้อยลงเรื่อย ๆ (โดยเฉพาะอย่างยิ่งสำหรับสิ่งเล็กน้อยเช่นtarและcp) อย่างไรก็ตามเมื่อฉันทำและฉันพูดว่าการขยายไฟล์ขนาดใหญ่มันจะใช้เวลานานกว่าเมื่อฉันไม่ได้ใช้-vแฟล็ก

ฉันถือว่านี่เป็นเพราะเทอร์มินัลต้องประมวลผลข้อความและฉันเติมบัฟเฟอร์อะไรก็ตามที่มันอาจมี แต่คำถามของฉันคือสิ่งนี้ทำให้แอปพลิเคชันทำงานช้าลงจริงหรือทำให้เสร็จในระยะเวลาเท่ากันและสิ่งที่ฉันเห็นก็คือเครื่องพยายามติดตาม


คุณลองเวลาเช่นtar xvf file.tar > /dev/nullกับtar xf file.tarหรือไม่ การเปลี่ยนเส้นทางไปที่/dev/nullควรนำเทอร์มินัลของคุณออกจากสิ่งนี้
Benjamin Bannier

3
นอกจากนี้โปรดทราบว่าstdoutและstderrมีการบัฟเฟอร์บรรทัด - หมายความว่าการเติมบัฟเฟอร์ไม่ได้ใช้เวลานานนั่นคือการปิดกั้นการprintfโทร
new123456

1
ถ้าคุณได้พูดคุยเกี่ยวกับคำสั่งของ Windows ผมจะบอกว่าแน่นอนว่ามันเป็นความจริง :)
kokbira

สำหรับงานที่ต้องใช้ cpu มากขึ้นอยู่กับว่าคุณใช้งาน IO มากแค่ไหนคุณอาจเห็นว่าประสิทธิภาพการทำงานลดลงอย่างน่ากลัว
ผู้ใช้

คำตอบ:


31

ใช่การใช้ verbose จะทำให้แอปพลิเคชันของคุณช้าลง

ขึ้นอยู่กับแอพพลิเคชั่น

ทุกครั้งที่พิมพ์ไปที่เครื่องจะต้องใช้เวลาในการประมวลผลเพิ่มเติม ในกรณีของการใช้ printf () หรือน้องสาวของมันนี่เป็นการประมวลผลจำนวนมากที่สูญเปล่า

นอกจากนี้เทอร์มินัลต้องจัดการกับข้อมูลนั้น มีพื้นที่บัฟเฟอร์จำนวน จำกัด ระหว่างแอปพลิเคชันและเทอร์มินัลและช่อง IO จะบล็อกจนกว่าจะมีพื้นที่เพียงพอในบัฟเฟอร์ดังกล่าวเพื่อส่งออกข้อมูลจริง โดยทั่วไปแอปพลิเคชันจะไม่สามารถดำเนินการต่อได้ในขณะที่การบล็อกนี้กำลังเกิดขึ้น 1

นอกจากนี้การกระทำของการแสดงข้อความการแก้จุดบกพร่องใน terminal จะใช้เวลาในการประมวลผลรอบ อีกครั้งนี้ขึ้นอยู่กับทั้งแอปพลิเคชั่น (ปริมาณของการดีบัก) โปรแกรมเทอร์มินัล (แบบอักษรที่ใช้เอฟเฟ็กต์ ฯลฯ ) และแม้แต่ไดรเวอร์ X windows ที่ใช้งานอยู่ (การเร่งความเร็วฮาร์ดแวร์ ฯลฯ )

timeโปรแกรมสามารถใช้ในการอย่างเป็นธรรมอย่างถูกต้องกำหนดความยาวเป็นคำสั่งที่ได้ดำเนินการในการเรียกใช้ การรันโปรแกรมเดียวกันสองครั้งผ่านหนึ่งครั้งด้วยการดีบั๊กและอีกครั้งโดยไม่แสดงว่ามันสร้างความแตกต่างมากน้อยเพียงใด ฉันขอแนะนำให้เรียกใช้คำสั่งหนึ่งครั้งก่อนที่จะทำการทดสอบเพื่อให้แน่ใจว่าแคชนั้นเหมือนกันสำหรับการทดสอบทั้งสองคำสั่ง คุณไม่ต้องการที่จะบิดเบือนผลลัพธ์โดยการเรียกใช้ครั้งที่สองไปเร็วกว่ามากเพราะข้อมูลส่วนใหญ่ถูกแคชโดยการเรียกใช้ครั้งแรกตอนนี้คุณทำ ...


1ในกรณีของแอปพลิเคชันแบบมัลติเธรดเท่านั้นเธรดที่ดำเนินการเอาต์พุตการดีบักจะบล็อกจริง


โปรแกรมเมอร์ส่วนใหญ่เรียนรู้สิ่งนี้อย่างรวดเร็ว (Borland C ใน DOS);)
Dragos

แน่นอนถ้าหน้าต่างคอนโซลถูกซ่อนอยู่ (หรือแม้แต่บางส่วนที่ครอบคลุม) ก็จะไม่ส่งผลกระทบเกือบเท่าเมื่อมองเห็นคอนโซล dir c:\/s/aเปิดพร้อมรับคำสั่งและทำ คุณสามารถเห็นการเปลี่ยนแปลงความเร็วเมื่อมองเห็นได้อย่างสมบูรณ์และครอบคลุมบางส่วน คุณไม่เห็นว่ามันเร็วขึ้นเมื่อย่อเล็กสุด แต่มันเร็วขึ้นแน่นอนแม้ว่าคุณจะต้องรีบูตถ้าคุณต้องการทดสอบเพื่อเลี่ยงการแคชซึ่งจะทำให้มันเร็วขึ้นอยู่ดีเนื่องจากมันจะไม่มี เพื่อเข้าถึงดิสก์
Synetech

1
@Syn เรากำลังพูดถึง Linux ที่นี่
Majenko

1
@Matt มันยังคงเป็นความคิดเห็นที่ถูกต้อง กรุณาให้ความเคารพ
nhinkle

@ Matt, doh! ฉันไม่ได้สังเกต (บางทีฉันอาจได้รับความสนใจจากความคิดเห็น DOS) อย่างไรก็ตาม Linux แตกต่างกันมาก แต่ฉันสงสัยว่ามันเหมือนจริงหรือไม่ (คอนโซลที่มองเห็นได้ซึ่งมีการเลื่อนข้อความจำนวนมากทำงานช้าลง)
Synetech

8

ขึ้นอยู่กับแอพพลิเคชั่นที่คุณใช้งาน อย่างไรก็ตามโดยทั่วไปเราสามารถพูดได้ว่า verbose จะทำให้แอปพลิเคชั่นลีนุกซ์ทั่วไปส่วนใหญ่ช้าลงเนื่องจากพวกมันจะต้องซิงโครไนซ์การกระทำระหว่าง stdout และ I / O หรือขอบเขตตัวประมวลผล


6

การใช้yesเป็นกรณีทดสอบใน OS X 10.7 ดูเหมือนว่ามันจะสำคัญถ้าคุณพิมพ์เอาต์พุตจำนวนมากไปยังเทอร์มินัลตามที่คาดไว้

การหาจำนวนนี้อีกเล็กน้อยฉันวิ่งyesเป็นเวลา 5 วินาทีในกรณีหนึ่งพิมพ์เอาต์พุตไปยังเทอร์มินัลและบันทึกลงในไฟล์ (ด้วยtee) ในอีกกรณีหนึ่งทำแบบเดียวกันยกเว้นเปลี่ยนเส้นทางstdoutไปที่/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

กรณีที่ 1 ให้2371584บรรทัดและกรณีที่ 2 ให้136421376บรรทัดหรือ 57 ครั้ง ของผลการดำเนินงานของyes(วัดจากจำนวนของเส้นที่จะพิมพ์ต่อหน่วยเวลา) อยู่ในกรณีนี้จึง57 ครั้งช้า

ด้านหนึ่งที่นี่คือที่ฉันใช้yesร่วมกับteeที่นี่ซึ่งอาจมีผลต่อผลลัพธ์เล็กน้อย แต่ฉันคิดว่าผลลัพธ์ยังคงใช้ได้

อีกตัวบ่งชี้ว่าโปรแกรมทำงานช้าลงคือทำงานyesในขณะที่ส่งออกไปยังเทอร์มินัลเทอร์มินัลใช้ CPU ประมาณ 100% และyesเพียง 37% ในขณะที่ทำงานyesโดยไม่ส่งสัญญาณออกไปยังเทอร์มินัล เครื่องหลักดังนั้นจึงyesสามารถใช้ CPU ได้มากขึ้นถ้ามันสามารถทำได้ยกเว้นว่ามันจะชะลอตัวลงโดยสถานี)


5

มันง่ายที่จะตอบเพียงแค่ใช่มันจะทำให้แอปพลิเคชั่นช้าลง แต่คำตอบที่ถูกต้องกว่านั้นคือมันจะไม่สำคัญในกรณี 99%

หากแอปพลิเคชันของคุณทำงานประเภทใดก็ตามที่ใช้พลังงาน CPU จริง ๆ โอกาสของการพิมพ์ข้อความพิเศษลงบนหน้าจอทำให้ความแตกต่างใด ๆใกล้เคียงกับ 0%

ในความเป็นจริงคุณสามารถตัดสินใจเองได้ง่าย ๆ : หากแอปพลิเคชั่นพ่นข้อความที่ใหญ่โตออกไปจริงๆมันอาจจะทำให้คุณเสียค่าใช้จ่ายเล็กน้อย อาจจะ.


3
-1 นี่ไม่เป็นความจริง printf()แพงอย่างบ้าคลั่ง
โทมัสโบนินี

1
สิ่งที่ฉันพูดเป็นเรื่องจริง สิ่งที่คุณพยายามทำให้ดูเหมือนว่าฉันพูด แต่เป็นอย่างอื่นทั้งหมด ฉันไม่ได้พูดอะไรเกี่ยวกับประสิทธิภาพของการพิมพ์ stdlib ใด ๆ ฉันกำลังบอกว่าโปรแกรมควรจะทำงานให้เพียงพอซึ่งเวลาที่ใช้ในการพิมพ์นั้นน้อยมาก ตอนนี้ไปหมุนรอบคนอื่น
slarpspark

@slarpspark: มันไม่จำเป็นต้องมีความสำคัญแม้ว่าเราจะเอา printf () ออกจากสมการกระแสของไบต์ยังคงต้องผ่าน bash แล้วเทอร์มินัลอีมูเลเตอร์จากนั้นเทอร์มินัลอีมูเลเตอร์ หลังจากการวิเคราะห์อักขระ escape และการสร้างการแสดงผลข้อความไม่ถูกถ้าทำในอัตราที่คำสั่ง verbose บางคำสั่งอาจทำ; และมันจะมีราคาแพงโดยเฉพาะอย่างยิ่งหากโปรแกรมฟลัชบัฟเฟอร์เอาต์พุตที่ทุก ๆ บรรทัดซึ่งหมายถึงการสลับบริบท ฉันมักจะพบกับการเขียนสคริปต์ของงูหลามซึ่งการลบการพิมพ์ในลูปแบบคับสามารถนำ 10s to 1s
Lie Ryan

สิ่งที่เกี่ยวกับคำสั่งที่ทำงานผ่าน SSH แม้ว่าเวลา CPU จะน้อยที่สุดเมื่อคุณแนะนำ latency เครือข่ายที่สำคัญอย่างแน่นอน
ec2011

3

โดยปกติแล้วโค้ด verbose จะถูกประเมินด้วยคำสั่ง if และทุกครั้งที่มันผ่านการควบคุมไปยังฟังก์ชั่นการแสดงผลก็จะใช้เวลานานขึ้นบริบทสามารถสลับสลับได้

แต่มันก็ขึ้นอยู่กับว่าหากคุณ verbose code เป็นเธรดแยกต่างหากที่เพิ่งตรวจสอบสถานะความสมบูรณ์เป็นครั้งคราวความแตกต่างจะถูกละเลย

คำถามนี้สามารถได้รับประโยชน์มากมายจากการสนับสนุนโปรแกรมเมอร์ที่มีประสบการณ์ของ stackoverflow ฉันขอแนะนำให้ย้าย :)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.