การแสดงแถบความคืบหน้าทำให้เวลาดำเนินการช้าลง

Aug 20 2020

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

สิ่งที่ฉันพบคือมีการแลกเปลี่ยนระหว่าง:

  • ประสบการณ์ของผู้ใช้ (รู้ว่างานกำลังทำงานอยู่)
  • เวลาเสร็จสิ้นของสคริปต์โดยรวม

การเพิ่มขั้นตอนในการสร้างแถบความคืบหน้าและแจ้งให้ทราบงานอาจใช้เวลานานถึง 2 เท่า

โดยทั่วไปแล้วนี่เป็นการแลกเปลี่ยนที่คาดหวัง (อาจไม่ใช่ในภาษาอื่น แต่เป็นภาษา Python)

คำตอบ

1 MikeMark Aug 20 2020 at 02:55

นั่นเป็นคำถามที่ดีมาก

โดยทั่วไปเราให้ความสำคัญกับประสบการณ์ของผู้ใช้เสมอ

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

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

ทำให้เร็วขึ้นเมื่อ

  • เวลาในการโหลดได้รับการพิสูจน์แล้วว่าส่งผลเสียต่อการนำไปใช้การใช้งานความน่าเชื่อถือความไว้วางใจ ฯลฯ
  • ความเร็วเป็นเรื่องของชีวิตหรือความตาย
  • ความเร็วเป็นเรื่องของการหาเงิน (เช่นลูกค้าทางโทรศัพท์ต้องการคำตอบเร่งด่วน)

แสดงแถบโหลดถ้า

  • การคูณเวลาด้วยสองไม่ได้สร้างเวลาที่ทำให้ผู้ใช้ผิดหวังอย่างสิ้นเชิง
  • ผู้ใช้ของคุณสามารถรอได้ในขณะที่อาจทำอย่างอื่น

สิ่งที่ต้องพิจารณาเพิ่มเติมบางทีคุณอาจต้องการโซลูชันแบบไฮบริดที่สำหรับบางกระบวนการคุณจะได้รับแถบโหลดและสำหรับบางกระบวนการคุณไม่ทำเช่นนั้น

บางทีคุณอาจต้องการตัวเลือกอื่นเช่นแสดงแถบโหลดและบอกผู้ใช้ว่าการซ่อนมันสามารถเร่งงานได้โดยถามผู้ใช้ว่าต้องการรับอีเมลแจ้งเตือนเมื่องานพร้อมหรือไม่เป็นต้น

ไม่ว่าในกรณีใดความคิดที่ดีที่สุดคือการดูว่าผู้ใช้ต้องการอะไรตามบริบทและความต้องการของพวกเขา

ขอให้โชคดี แต่มันเป็นความท้าทายที่น่าสนใจมาก อย่าโพสต์สิ่งที่คุณตัดสินใจในตอนท้าย :)

1 Ángel Sep 19 2020 at 09:12

ไม่สำคัญโปรแกรมใด ๆ ที่กำลังดำเนินการพร้อมกับการแสดงแถบความคืบหน้า (ดังนั้นการดำเนินการสองรายการ) จะใช้ซีพียูมากกว่าที่จะดำเนินการเพียงครั้งเดียว

อย่างไรก็ตามนี่ไม่ได้หมายความว่าเวลานาฬิกาแขวนควรจะช้าลงเสมอไป ในความเป็นจริง imho ที่ชะลอตัวลง 2x ดูเหมือนจะมากเกินไป

กลยุทธ์บางอย่าง ได้แก่ :

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

โดยทั่วไปแล้วนี่เป็นการแลกเปลี่ยนที่คาดไว้หรือไม่

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