Αρχική σελίδα » πως να » Γιατί είναι τόσο ανακριβείς οι γραμμές προόδου;

    Γιατί είναι τόσο ανακριβείς οι γραμμές προόδου;

    Κατά την πρώτη σκέψη, φαίνεται ότι η δημιουργία μιας ακριβούς εκτίμησης του χρόνου θα πρέπει να είναι αρκετά εύκολη. Μετά από όλα, ο αλγόριθμος που παράγει την γραμμή προόδου γνωρίζει όλα τα καθήκοντα που πρέπει να κάνει πριν από το χρόνο ... σωστά?

    Ως επί το πλείστον, είναι αλήθεια ότι ο αλγόριθμος πηγής γνωρίζει τι πρέπει να κάνει μπροστά από το χρόνο. Ωστόσο, ο καθορισμός του χρόνου που θα χρειαστεί για την εκτέλεση κάθε βήματος είναι ένα πολύ δύσκολο, αν όχι αδύνατο, καθήκον.

    Όλες οι εργασίες δεν δημιουργούνται ίσες

    Ο απλούστερος τρόπος υλοποίησης μιας γραμμής προόδου είναι να χρησιμοποιήσετε μια γραφική αναπαράσταση του μετρητή εργασιών. Όπου το ποσοστό πλήρους υπολογίζεται απλά ως Ολοκληρωμένες εργασίες / Συνολικός αριθμός εργασιών. Αν και αυτό κάνει λογική λογική στην πρώτη σκέψη, είναι σημαντικό να θυμόμαστε ότι (προφανώς) κάποια καθήκοντα χρειάζονται περισσότερο χρόνο για να ολοκληρωθεί.

    Εξετάστε τις ακόλουθες εργασίες που εκτελούνται από έναν εγκαταστάτη:

    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.

    Ανάλογα με τον τρόπο με τον οποίο το πρόγραμμα περιήγησης υπολογίζει τον υπόλοιπο χρόνο, η ΕΤΑ σας θα μπορούσε να μεταβεί άμεσα από 25 δευτερόλεπτα σε 50 δευτερόλεπτα (χρησιμοποιώντας μόνο την παρούσα κατάσταση: Μέγεθος που απομένει / Λήψη ταχύτητας) ή, κατά πάσα πιθανότητα, το πρόγραμμα περιήγησης χρησιμοποιεί έναν αλγόριθμο τροχαίου μέσου ο οποίος θα προσαρμόζεται για διακυμάνσεις της ταχύτητας μεταφοράς χωρίς να εμφανίζει δραματικές αναπηδήσεις στο χρήστη.

    Ένα παράδειγμα κυλιόμενου αλγορίθμου σχετικά με τη λήψη ενός αρχείου μπορεί να λειτουργήσει ως εξής:

    • Η ταχύτητα μεταφοράς για τα προηγούμενα 60 δευτερόλεπτα θυμάται με τη νέα τιμή που αντικαθιστά το παλαιότερο (π.χ. η 61η τιμή αντικαθιστά την πρώτη).
    • Ο πραγματικός ρυθμός μεταφοράς για τον υπολογισμό είναι ο μέσος όρος αυτών των μετρήσεων.
    • Ο χρόνος που απομένει υπολογίζεται ως εξής: Μέγεθος που απομένει / αποτελεσματική ταχύτητα λήψης

    Χρησιμοποιώντας έτσι το σενάριο παραπάνω (για λόγους απλότητας, θα χρησιμοποιήσουμε 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.700 δευτερόλεπτα (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, ο χρήστης είναι απίθανο να παρατηρήσει τη διαφορά (εκτός από ένα πολύ μικρό χρονικό διάστημα κατά την αναμενόμενη αντίστροφη μέτρηση χρόνου).

    Να φτάσουμε στο μπρούντζο - αυτό είναι απλώς μεθοδολογία για την αναμετάδοση πληροφοριών στον τελικό χρήστη για την πραγματική υποκείμενη αιτία ...

    Δεν μπορείτε να προσδιορίσετε με ακρίβεια κάτι που δεν είναι καθοριστικό

    Τελικά, η ανακρίβεια της γραμμής προόδου μειώνεται στο γεγονός ότι προσπαθεί να προσδιορίσει έναν χρόνο για κάτι που δεν είναι καθοριστικό. Επειδή οι υπολογιστές επεξεργάζονται εργασίες τόσο κατά παραγγελία όσο και στο παρασκήνιο, είναι σχεδόν αδύνατο να γνωρίζουμε ποιοι πόροι του συστήματος θα είναι διαθέσιμοι σε οποιοδήποτε σημείο στο μέλλον - και είναι η διαθεσιμότητα των πόρων του συστήματος που απαιτούνται για την ολοκλήρωση οποιασδήποτε εργασίας.

    Χρησιμοποιώντας ένα άλλο παράδειγμα, ας υποθέσουμε ότι εκτελείτε μια αναβάθμιση προγράμματος σε ένα διακομιστή ο οποίος εκτελεί μια αρκετά εντατική ενημέρωση βάσης δεδομένων. Κατά τη διάρκεια αυτής της διαδικασίας ενημέρωσης, ένας χρήστης στη συνέχεια στέλνει ένα απαιτητικό αίτημα σε μια άλλη βάση δεδομένων που εκτελείται σε αυτό το σύστημα. Τώρα, οι πόροι του διακομιστή, ειδικά για τη βάση δεδομένων, πρέπει να επεξεργαστούν αιτήματα τόσο για την αναβάθμισή σας όσο και για το ερώτημα που ξεκίνησε το χρήστη - ένα σενάριο που ασφαλώς θα είναι αμοιβαία επιζήμιο για το χρόνο εκτέλεσης. Εναλλακτικά, ένας χρήστης θα μπορούσε να ξεκινήσει ένα μεγάλο αίτημα μεταφοράς αρχείων, το οποίο θα φορολογούσε τη χωρητικότητα αποθήκευσης, η οποία θα μείωνε και την απόδοση. Ή θα μπορούσε να ξεκινήσει μια προγραμματισμένη εργασία που εκτελεί μια διαδικασία που απαιτεί μνήμη. Έχετε την ιδέα.

    Ως ίσως μια πιο ρεαλιστική παρουσία για έναν καθημερινό χρήστη - μπορείτε να χρησιμοποιήσετε το Windows Update ή μια σάρωση ιών. Και οι δύο αυτές λειτουργίες εκτελούν πράξεις έντασης πόρων στο παρασκήνιο. Ως αποτέλεσμα, η πρόοδος που γίνεται κάθε φορά εξαρτάται από το τι κάνει ο χρήστης εκείνη τη στιγμή. Εάν διαβάζετε το ηλεκτρονικό ταχυδρομείο σας ενώ αυτό τρέχει, πιθανότατα η ζήτηση για πόρους του συστήματος θα είναι χαμηλή και η γραμμή προόδου θα μετακινηθεί με συνέπεια. Από την άλλη πλευρά, αν κάνετε επεξεργασία γραφικών τότε η ζήτησή σας για τους πόρους του συστήματος θα είναι πολύ μεγαλύτερη, πράγμα που θα προκαλέσει την κίνηση της μπάρας προόδου να είναι σχιζοφρενική.

    Συνολικά, είναι απλά ότι δεν υπάρχει κρυστάλλινη σφαίρα. Ούτε το ίδιο το σύστημα ξέρει τι φορτίο θα βρεθεί σε οποιοδήποτε σημείο στο μέλλον.

    Τελικά, δεν έχει σημασία

    Η πρόθεση της γραμμής προόδου είναι να δηλώσει ότι πράγματι σημειώνεται πρόοδος και ότι η αντίστοιχη διαδικασία δεν είναι κρεμασμένη. Είναι ωραίο όταν ο δείκτης προόδου είναι ακριβής, αλλά συνήθως είναι μόνο μια μικρή ενόχληση όταν δεν είναι. Ως επί το πλείστον, οι προγραμματιστές δεν πρόκειται να αφιερώσουν πολύ χρόνο και προσπάθεια σε αλγόριθμους προόδου, επειδή, ειλικρινά, υπάρχουν πολύ πιο σημαντικά καθήκοντα για να περάσετε χρόνο.

    Φυσικά, έχετε κάθε δικαίωμα να ενοχλείτε όταν μια μπάρα προόδου πέσει στο 99% ολοκληρωθεί αμέσως και στη συνέχεια σας κάνει να περιμένετε 5 λεπτά για το υπόλοιπο ένα τοις εκατό. Αλλά αν το αντίστοιχο πρόγραμμα λειτουργεί καλά συνολικά, απλά θυμηθείτε ότι ο κύριος του έργου είχε τις προτεραιότητές του ευθεία.