โฮมเพจ » ทำอย่างไร » เหตุใดแถบความคืบหน้าจึงไม่ถูกต้อง

    เหตุใดแถบความคืบหน้าจึงไม่ถูกต้อง

    เมื่อนึกถึงครั้งแรกดูเหมือนว่าการสร้างการประมาณเวลาอย่างแม่นยำน่าจะค่อนข้างง่าย ท้ายที่สุดอัลกอริทึมที่สร้างแถบความคืบหน้าจะรู้หน้าที่ทั้งหมดที่ต้องทำล่วงหน้า…ใช่?

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

    งานทั้งหมดไม่ได้ถูกสร้างขึ้นอย่างเท่าเทียมกัน

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

    พิจารณางานต่อไปนี้ดำเนินการโดยโปรแกรมติดตั้ง:

    1. สร้างโครงสร้างโฟลเดอร์.
    2. ขยายและคัดลอกไฟล์มูลค่า 1 GB.
    3. สร้างรายการรีจิสตรี.
    4. สร้างรายการเมนูเริ่ม.

    ในตัวอย่างนี้ขั้นตอนที่ 1, 3 และ 4 จะเสร็จสมบูรณ์อย่างรวดเร็วในขณะที่ขั้นตอนที่ 2 จะใช้เวลาสักครู่ ดังนั้นแถบความคืบหน้าที่ทำงานกับการนับอย่างง่ายจะข้ามไปที่ 25% อย่างรวดเร็วแผงลอยเล็กน้อยในขณะที่ขั้นตอนที่ 2 ใช้งานได้และจากนั้นข้ามไปที่ 100% เกือบจะในทันที.

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

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

    1. สร้างโครงสร้างโฟลเดอร์ [น้ำหนัก = 1]
    2. ขยายและคัดลอกไฟล์มูลค่า 1 GB [น้ำหนัก = 7]
    3. สร้างรายการรีจิสตรี [น้ำหนัก = 1]
    4. สร้างรายการเมนูเริ่ม [น้ำหนัก = 1]

    เมื่อใช้วิธีนี้แถบความคืบหน้าจะย้ายเพิ่มขึ้น 10% (เนื่องจากน้ำหนักรวมคือ 10) ด้วยขั้นตอนที่ 1, 3 และ 4 ย้ายแถบ 10% เมื่อเสร็จแล้วและขั้นตอนที่ 2 ย้าย 70% ในขณะที่ไม่สมบูรณ์แบบวิธีการเช่นนี้เป็นวิธีที่ง่ายในการเพิ่มความแม่นยำให้กับแถบเปอร์เซ็นต์ความคืบหน้า.

    ผลลัพธ์ที่ผ่านมาไม่รับประกันประสิทธิภาพในอนาคต

    ลองพิจารณาตัวอย่างง่ายๆของฉันที่ขอให้คุณนับถึง 50 ขณะที่ฉันใช้นาฬิกาจับเวลาเพื่อจับเวลาคุณ สมมติว่าคุณนับถึง 25 ใน 10 วินาที มันจะสมเหตุสมผลที่จะสมมติว่าคุณจะนับจำนวนที่เหลืออยู่ในอีก 10 วินาทีดังนั้นแถบความคืบหน้าการติดตามนี้จะแสดง 50% พร้อม 10 วินาทีที่เหลืออยู่.

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

    สำหรับตัวอย่างที่มีประโยชน์มากกว่านี้ให้พิจารณาดาวน์โหลดไฟล์ คุณกำลังดาวน์โหลดไฟล์ 100 MB ในอัตรา 1 MB / s นี่เป็นเรื่องง่ายมากที่จะกำหนดเวลาโดยประมาณที่จะแล้วเสร็จ แต่ 75% ของวิธีการมีความนิยมของเครือข่ายและอัตราการดาวน์โหลดของคุณลดลงถึง 500 KB / s.

    ขึ้นอยู่กับว่าเบราว์เซอร์คำนวณเวลาที่เหลืออยู่ ETA ของคุณสามารถเปลี่ยนจาก 25 วินาทีเป็น 50 วินาทีได้ทันที (ใช้สถานะปัจจุบันเท่านั้น: ขนาดที่เหลืออยู่ / ความเร็วในการดาวน์โหลด) หรือเป็นไปได้มากที่สุดที่เบราว์เซอร์ใช้อัลกอริทึมเฉลี่ยแบบหมุนซึ่งจะปรับสำหรับความผันผวนของความเร็วในการถ่ายโอนโดยไม่แสดงการกระโดดที่น่าทึ่งให้กับผู้ใช้.

    ตัวอย่างของอัลกอริทึมการหมุนที่เกี่ยวข้องกับการดาวน์โหลดไฟล์อาจทำงานได้ดังนี้:

    • ความเร็วในการถ่ายโอนสำหรับ 60 วินาทีก่อนหน้านี้จะถูกจดจำด้วยค่าใหม่ล่าสุดแทนที่ค่าที่เก่าที่สุด (เช่นค่า 61st จะแทนที่ค่าแรก).
    • อัตราการถ่ายโอนที่มีประสิทธิภาพสำหรับจุดประสงค์ในการคำนวณคือค่าเฉลี่ยของการวัดเหล่านี้.
    • เวลาที่เหลือจะคำนวณดังนี้: ขนาดที่เหลืออยู่ / ความเร็วในการดาวน์โหลดที่มีประสิทธิภาพ

    ดังนั้นเมื่อใช้สถานการณ์ของเราด้านบน (เพื่อความเรียบง่ายเราจะใช้ 1 MB = 1,000 KB):

    • ในการดาวน์โหลด 75 วินาทีค่าที่เราจำได้ 60 ค่าจะมีค่า 1,000 KB อัตราการถ่ายโอนที่มีประสิทธิภาพคือ 1,000 KB (60,000 KB / 60) ซึ่งให้เวลาที่เหลือ 25 วินาที (25,000 KB / 1,000 KB).
    • ที่ 76 วินาที (เมื่อความเร็วในการถ่ายโอนลดลงถึง 500 KB) ความเร็วในการดาวน์โหลดที่มีประสิทธิภาพจะอยู่ที่ ~ 992 KB (59,500 KB / 60) ซึ่งให้เวลาที่เหลืออยู่ประมาณ 24.7 วินาที (24,500 KB / 992 KB).
    • ที่ 77 วินาที: ความเร็วที่มีประสิทธิภาพ = ~ 983 KB (59,000 KB / 60) เวลาที่เหลืออยู่ที่ให้ผลของ ~ 24.4 วินาที (24,000 KB / 983 KB).
    • ที่ 78 วินาที: ความเร็วที่มีประสิทธิภาพ = 975 KB (58,500 KB / 60) เวลาที่เหลือในการยอมให้ ~ 24.1 วินาที (23,500 KB / 975 KB).

    คุณสามารถดูรูปแบบที่ปรากฏที่นี่เนื่องจากความเร็วในการดาวน์โหลดจะถูกรวมเข้ากับค่าเฉลี่ยอย่างช้าๆซึ่งจะใช้ในการประมาณเวลาที่เหลืออยู่ ภายใต้วิธีนี้หากจุ่มนานเพียง 10 วินาทีจากนั้นกลับไปที่ 1 MB / s ผู้ใช้จะไม่สังเกตเห็นความแตกต่าง (บันทึกสำหรับแผงลอยเล็ก ๆ น้อย ๆ ในการนับเวลาโดยประมาณ).

    การเดินทางไปสู่ ​​tacks ทองเหลือง - นี่เป็นเพียงวิธีการในการถ่ายทอดข้อมูลไปยังผู้ใช้เพื่อหาสาเหตุที่แท้จริง ...

    คุณไม่สามารถระบุสิ่งที่เป็น Nondeterministic ได้อย่างถูกต้อง

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

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

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

    โดยรวมแล้วเป็นเพียงว่าไม่มีลูกบอลคริสตัล ไม่แม้แต่ระบบเองก็รู้ว่าจะโหลดในเวลาใดในอนาคต.

    ท้ายที่สุดมันไม่สำคัญ

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

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