À première vue, il semble que générer une estimation précise du temps devrait être assez facile. Après tout, l'algorithme produisant la barre de progression connaît toutes les tâches qu'il doit faire à l'avance ... pas vrai?
Pour la plupart, il est vrai que l'algorithme source sait ce qu'il doit faire à l'avance. Cependant, l'épinglage du temps nécessaire pour effectuer chaque étape est une tâche très difficile, voire impossible.
La façon la plus simple d'implémenter une barre de progression est d'utiliser un graphique. représentation du compteur de tâches. Où le pourcentage terminé est simplement calculé comme Tâches terminées / Nombre total de tâches . Bien que cela soit cohérent à première vue, il est important de se rappeler que certaines tâches prennent plus de temps à se terminer.
Considérez les tâches suivantes effectuées par un installateur:
Dans cet exemple, les étapes 1, 3 et 4 se termineraient très rapidement alors que l'étape 2 prendrait du temps. Ainsi, une barre de progression fonctionnant sur un simple comptage passerait rapidement à 25%, stagnerait un peu pendant que l'étape 2 fonctionnerait, puis passerait à 100% presque immédiatement.
Ce type d'implémentation est assez courant parmi les barres de progression parce que, comme indiqué ci-dessus, il est facile à mettre en œuvre. Cependant, comme vous pouvez le voir, il est sujet à des tâches disproportionnées faussant le pourcentage de progression réel par rapport au temps restant.
Pour contourner ce problème, certaines barres de progression peuvent utiliser des implémentations pondérées. Considérons les étapes ci-dessus où un poids relatif est attribué à chaque étape:
En utilisant cette méthode, la barre de progression se déplacerait par incréments de 10% (le poids total étant de 10) avec les étapes 1, 3 et 4 déplaçant la barre de 10% à la fin et l'étape 2 70%. Bien qu'elles ne soient pas parfaites, ces méthodes sont un moyen simple d'ajouter un peu plus de précision au pourcentage de la barre de progression.
Considérez un exemple simple de moi demandant de compter jusqu'à 50 J'utilise un chronomètre pour vous chronométrer. Disons que vous comptez 25 en 10 secondes. Il serait raisonnable de supposer que vous compterez les nombres restants dans les 10 secondes suivantes, donc une barre de progression suivrait ce résultat à 50% avec 10 secondes restantes.
Une fois que votre compte atteint 25, je lance des balles de tennis à toi. Probablement, cela va briser votre rythme puisque votre concentration est passée de compter strictement les nombres à esquiver les balles jetées votre chemin. En supposant que vous puissiez continuer à compter, votre rythme a certainement ralenti un peu. Alors maintenant la barre de progression est toujours en mouvement, mais à un rythme beaucoup plus lent avec le temps estimé restant à l'arrêt ou en train de grimper plus haut.
Pour un exemple plus pratique, pensez à télécharger un fichier. Vous téléchargez actuellement un fichier de 100 Mo à raison de 1 Mo / s. C'est très facile de déterminer l'heure estimée d'achèvement. Mais à 75%, un peu de congestion du réseau et votre taux de téléchargement tombe à 500 Ko / s.
Selon la façon dont le navigateur calcule le temps restant, votre ETA peut passer instantanément de 25 secondes à 50 secondes (en utilisant état uniquement: Taille restante / Vitesse de téléchargement ) ou, plus probablement, le navigateur utilise un algorithme de moyenne mobile qui ajusterait les fluctuations de la vitesse de transfert sans afficher de sauts spectaculaires pour l'utilisateur.
Un exemple de L'algorithme de roulement relatif au téléchargement d'un fichier peut ressembler à ceci:
Après 75 secondes de téléchargement, nos 60 valeurs mémorisées seraient chacune de 1 000 Ko. Le taux de transfert effectif est de 1 000 Ko (60 000 Ko / 60), ce qui donne un temps restant de 25 secondes (25 000 Ko / 1 000 Ko).
Vous ne pouvez pas déterminer précisément quelque chose qui n'est pas déterministe
Finalement, l'inexactitude de la barre de progression se réduit au fait temps pour quelque chose qui n'est pas déterministe. Étant donné que les ordinateurs traitent les tâches à la demande et en tâche de fond, il est presque impossible de savoir quelles ressources système seront disponibles à un moment donné - et c'est la disponibilité des ressources système qui est nécessaire pour toute tâche. > En utilisant un autre exemple, supposons que vous exécutez une mise à niveau de programme sur un serveur qui effectue une mise à jour de base de données assez intensive. Au cours de ce processus de mise à jour, un utilisateur envoie ensuite une demande exigeante à une autre base de données exécutée sur ce système. Désormais, les ressources du serveur, en particulier pour la base de données, doivent traiter les demandes à la fois pour votre mise à niveau et pour la requête initiée par l'utilisateur - un scénario qui sera certainement mutuellement préjudiciable au temps d'exécution. En variante, un utilisateur peut lancer une demande de transfert de fichier volumineuse qui taxerait le débit de stockage, ce qui nuirait également aux performances. Ou une tâche planifiée pourrait démarrer qui effectue un processus de mémoire intensive. Vous avez l'idée.
En fin de compte, cela n'a pas vraiment d'importance
La barre de progression a pour but d'indiquer que des progrès ont bel et bien été réalisés et le processus respectif n'est pas accroché. C'est bien quand l'indicateur de progression est précis, mais en général ce n'est qu'une gêne mineure quand ce n'est pas le cas. Pour la plupart, les développeurs ne consacreront pas beaucoup de temps et d'efforts aux algorithmes de la barre de progression car, franchement, il y a beaucoup plus de tâches importantes à passer.
Bien sûr, vous avez le droit d'être ennuyé quand une barre de progression saute automatiquement à 99% et vous fait attendre 5 minutes pour le pourcentage restant. Mais si le programme respectif fonctionne bien dans l'ensemble, rappelez-vous que les priorités du développeur étaient les mêmes.
Quelle est la différence entre Sudo et Su sous Linux?
Si vous êtes un utilisateur Linux, vous avez probablement déjà vu des références à sudo et à su. Les articles ici sur How-To Geek et ailleurs instruisent les utilisateurs d'Ubuntu à utiliser sudo et d'autres utilisateurs de distributions Linux pour utiliser su, mais quelle est la différence? Sudo et su sont deux façons différentes d'obtenir des privilèges root.
7 astuces OS X pour les utilisateurs Windows
Si vous avez récemment acheté un Mac ou si vous avez été obligé d'utiliser un Mac pour le travail, vous pourriez être frustré d'essayer d'utiliser OS X si vous avez été un utilisateur de longue date de Windows. C'est tout à fait compréhensible et Apple ne se soucie vraiment pas de changer leur système d'exploitation pour qu'il corresponde à celui de Windows de sitôt.Apple aime OS