การแสดงแถบความคืบหน้าทำให้เวลาดำเนินการช้าลง
ฉันเขียนสคริปต์ภายในจำนวนมากที่ทำให้งานเป็นระบบอัตโนมัติสำหรับทีม เพื่อป้องกันไม่ให้พวกเขาสงสัยว่าสคริปต์ "หยุด" หรือไม่ฉันจะแสดงแถบความคืบหน้าอย่างง่ายสำหรับงานที่ต้องดำเนินการเป็นเวลานาน ฉันทำเช่นนี้เพราะฉันสามารถวัดจำนวนเงินที่เสร็จสมบูรณ์ได้เมื่อฉันรู้จำนวนเงินที่ต้องทำให้เสร็จก่อนที่จะทำงาน เพื่อประหยัดจำนวนการดำเนินการที่กำลังดำเนินการฉันจะอัปเดตแถบความคืบหน้าทุกๆn
วินาทีหรือเมื่องานถูกเปิด / เสร็จสิ้น
สิ่งที่ฉันพบคือมีการแลกเปลี่ยนระหว่าง:
- ประสบการณ์ของผู้ใช้ (รู้ว่างานกำลังทำงานอยู่)
- เวลาเสร็จสิ้นของสคริปต์โดยรวม
การเพิ่มขั้นตอนในการสร้างแถบความคืบหน้าและแจ้งให้ทราบงานอาจใช้เวลานานถึง 2 เท่า
โดยทั่วไปแล้วนี่เป็นการแลกเปลี่ยนที่คาดหวัง (อาจไม่ใช่ในภาษาอื่น แต่เป็นภาษา Python)
คำตอบ
นั่นเป็นคำถามที่ดีมาก
โดยทั่วไปเราให้ความสำคัญกับประสบการณ์ของผู้ใช้เสมอ
ตัวอย่าง:เครื่องมือค้นหาเที่ยวบินสามารถให้ผลลัพธ์ได้ทันที แต่มีการโหลดนานขึ้นเนื่องจากผู้ใช้รู้สึกปลอดภัยมากขึ้นเมื่อทำการค้นหาอย่างละเอียด
เมื่อพูดถึงช้าลง 2 เท่า 2x น่าจะใช้ได้เมื่อเป็นเวลาสองถึงสามวินาทีและอาจแย่มากหากเป็นเวลาหลายปี ทุกอย่างขึ้นอยู่กับบริบทของผู้ใช้ของคุณ หากประเภทของงานในไซต์ของคุณเป็นเรื่องชีวิตหรือความตายเร็วกว่านั้นจะดีกว่าหากผู้ใช้ของคุณผ่อนคลายมากขึ้นตามเวลาที่ใช้และสิ่งสำคัญยิ่งกว่าที่พวกเขาจะต้องรู้ว่าเมื่อใดควรกลับมาตรวจสอบแล้วบอกเวลาที่คาดว่าจะ ตัวเลือกที่ดีที่สุด
ทำให้เร็วขึ้นเมื่อ
- เวลาในการโหลดได้รับการพิสูจน์แล้วว่าส่งผลเสียต่อการนำไปใช้การใช้งานความน่าเชื่อถือความไว้วางใจ ฯลฯ
- ความเร็วเป็นเรื่องของชีวิตหรือความตาย
- ความเร็วเป็นเรื่องของการหาเงิน (เช่นลูกค้าทางโทรศัพท์ต้องการคำตอบเร่งด่วน)
แสดงแถบโหลดถ้า
- การคูณเวลาด้วยสองไม่ได้สร้างเวลาที่ทำให้ผู้ใช้ผิดหวังอย่างสิ้นเชิง
- ผู้ใช้ของคุณสามารถรอได้ในขณะที่อาจทำอย่างอื่น
สิ่งที่ต้องพิจารณาเพิ่มเติมบางทีคุณอาจต้องการโซลูชันแบบไฮบริดที่สำหรับบางกระบวนการคุณจะได้รับแถบโหลดและสำหรับบางกระบวนการคุณไม่ทำเช่นนั้น
บางทีคุณอาจต้องการตัวเลือกอื่นเช่นแสดงแถบโหลดและบอกผู้ใช้ว่าการซ่อนมันสามารถเร่งงานได้โดยถามผู้ใช้ว่าต้องการรับอีเมลแจ้งเตือนเมื่องานพร้อมหรือไม่เป็นต้น
ไม่ว่าในกรณีใดความคิดที่ดีที่สุดคือการดูว่าผู้ใช้ต้องการอะไรตามบริบทและความต้องการของพวกเขา
ขอให้โชคดี แต่มันเป็นความท้าทายที่น่าสนใจมาก อย่าโพสต์สิ่งที่คุณตัดสินใจในตอนท้าย :)
ไม่สำคัญโปรแกรมใด ๆ ที่กำลังดำเนินการพร้อมกับการแสดงแถบความคืบหน้า (ดังนั้นการดำเนินการสองรายการ) จะใช้ซีพียูมากกว่าที่จะดำเนินการเพียงครั้งเดียว
อย่างไรก็ตามนี่ไม่ได้หมายความว่าเวลานาฬิกาแขวนควรจะช้าลงเสมอไป ในความเป็นจริง imho ที่ชะลอตัวลง 2x ดูเหมือนจะมากเกินไป
กลยุทธ์บางอย่าง ได้แก่ :
- ไม่แสดงแถบความคืบหน้า (จริงๆแล้วเสียงกระซิบเป็นค่าเริ่มต้นสำหรับคำสั่ง Unix ส่วนใหญ่ซึ่งคุณจะต้องเพิ่มตัวเลือกแบบละเอียด)
- ให้ตัวเลือกที่เงียบเพื่อปิดใช้งานแถบความคืบหน้า สิ่งนี้ควรมีไว้สำหรับ UI (เช่นสมมติว่าผู้ใช้จะเรียกใช้จาก cron หรือเปลี่ยนเส้นทางเอาต์พุตไปยังไฟล์) แต่จะมีผลข้างเคียงจากการข้ามการชะลอตัวของแถบความคืบหน้า
- กำลังแสดงความคืบหน้าผ่านชุดข้อความอื่น อาจซับซ้อนในการดำเนินการกับ python แต่ปกติกับภาษาอื่น คุณมีเธรด GUI ที่แสดงความคืบหน้าและผู้ปฏิบัติงานกำลังปฏิบัติงานจริง
- การลดช่วงเวลาการอัปเดตแถบความคืบหน้า / ขนาดขั้นตอน
- หากคุณกำลังคัดลอกไฟล์แบบไบต์ต่อไบต์ (เพื่อประโยชน์ในการโต้แย้งสิ่งนี้ไม่มีประสิทธิภาพอย่างเห็นได้ชัด) แทนที่จะวาดแถบความคืบหน้าใหม่ทุกไบต์คุณอาจต้องการอัปเดตหลังจากคัดลอกทุก MB เท่านั้น
- หรือตามเวลาที่ใช้เช่นการตั้งค่าตัวจับเวลาที่จะอัปเดตสถานะทุกๆ X วินาที (อีกครั้งควรเป็นแบบอะซิงโครนัสกับการดำเนินการหลักหรือบนเธรดอื่น)
- โดยทำให้แถบความคืบหน้าถูกที่สุด สิ่งนี้อาจเปลี่ยนไปจากการแสดงผลเฉพาะจุดแทนที่จะเป็นแถบความคืบหน้าเต็มรูปแบบไปจนถึงการมีแถบความคืบหน้า "วาด" และหลีกเลี่ยงการคำนวณซ้ำในแต่ละขั้นตอน (คุณควรดำเนินการประมวลผลแบบเต็มบน SIGWINCH)
โดยทั่วไปแล้วนี่เป็นการแลกเปลี่ยนที่คาดไว้หรือไม่
โดยทั่วไปฉันคิดว่ามันขึ้นอยู่กับว่าสามารถหลีกเลี่ยงได้หรือไม่ หากเรากำลังดาวน์โหลดไฟล์ขนาดใหญ่จากอินเทอร์เน็ตคุณสามารถใส่แถบความคืบหน้าให้เหมาะสมได้เกือบตลอดเวลาเนื่องจากการดาวน์โหลดจะใช้ทรัพยากรที่แตกต่างกัน หากคุณต้องการคัดลอกไฟล์จากระบบไฟล์ระยะไกลที่ทำงานช้า (เช่นสมาร์ทโฟน) การเรียกดูแผนผังไดเรกทอรีทั้งหมดที่จะต้องคัดลอกเพื่อให้แถบความคืบหน้าแสดง 7 อาจต้องใช้ทรัพยากร (แบนด์วิดท์ของการเชื่อมต่อ ด้วยโทรศัพท์) ที่สามารถข้ามได้หากพบไฟล์และคัดลอก "ตามที่ปรากฏ"