Pourquoi les barres de progression sont-elles si inexactes? [fermé]

8

Les ordinateurs et les langages de programmation ont tendance à être déterministes et prévisibles. Pourtant, les barres de progression semblent le contraire, surtout si l'opération est complexe. Même pour les produits professionnels de classe mondiale, certaines barres de progression ne reflètent pas vraiment la progression réelle d'une opération. Je les ai vu passer de 10% à 90% d'un bond après n'avoir rien fait pendant 4 heures. J'ai même vu certains reculer, suggérant qu'un traitement inattendu supplémentaire a été découvert.

Certes, il peut y avoir des opérations de base de données, le traitement du réseau et des opérations parallèles, mais il semble que cela pourrait être quantifié d'une certaine manière et un pourcentage estimé. Après tout, il doit y avoir une quantité finie d'instructions exécutées pour terminer une opération. Est-ce simplement un mauvais codage, ou y a-t-il une raison fondamentale pour laquelle le progrès est difficile?

Paul Uszak
la source
1
Cela n'a rien à voir avec l' ordinateur la science .
Raphael
1
J'ai essayé de le rapprocher d'un cadrage scientifique dans ma réponse. Hélas.
André Souza Lemos
@Raphael Évidemment, les 5 lecteurs qui ont posté des réponses diffèrent selon votre opinion. Il ne s'agit pas de locomotion à vapeur, n'est-ce pas?
Paul Uszak
Non, il s'agit de défaillances dans la conception de l'interface utilisateur. Ce qui est hors sujet. Il peut y avoir des questions informatiques là-dedans, mais pas dans sa forme actuelle. (Notez que votre hypothèse est subtilement erronée. Alors que les vrais ordinateurs sont prévisibles à proprement parler, le calcul d' une prédiction n'est généralement pas moins cher que le calcul lui-même. De plus, qui fait la prédiction? Les applications ne contrôlent pas la machine, donc toute prédiction est reposait sur l'hypothèse que "j'obtiendrai autant de ressources que j'en ai obtenu" - pas du tout une hypothèse solide!)
Raphael

Réponses:

2

Pour ajouter aux réponses plus générales jusqu'à présent, je peux donner quelques exemples de mon domaine où les barres de progression ne fonctionnent pas et pourquoi;

Programmes de conception assistée par ordinateur - les programmes qui effectuent l'analyse thermique ou la mécanique des fluides peuvent être généralement terribles avec des barres de progression. Ils sautent en avant, en arrière, prennent des mesures incohérentes et il est presque inutile de les regarder. Cela est dû à la nature itérative de ces types de simulations et à la nécessité de trouver une convergence. Ceci est mieux vu non pas par une barre de progression mais par un tracé d'itération contre convergence.

Simulations complexes - J'ai écrit un programme qui simule un environnement complexe avec de nombreux facteurs croisés. C'était pour une chronologie fixe, donc la barre de progression pourrait être le bon moment? Dans mon cas, la simulation est trop longue à chaque nouveau pas de temps, ce qui signifie que la barre de progression devient de plus en plus lente - pas terrible. J'ai trouvé une autre mesure pour combien de temps la simulation moyenne prend en fonction du nombre d'éléments dans la simulation qui était plus proche de la précision - mais pas idéal car parfois la barre de processus n'a jamais été remplie (simulation arrêtée auparavant) ou atteint 100% trop tôt (simulation exécutée plus longtemps que prévu).

Dans les deux cas, une barre complète de progression pure serait impossible de calculer le maximum pour au préalable (cas 1) ou pas linéaire et donc pas très utile (cas 2)

user6916458
la source
1
Merci pour votre réponse. Je voudrais encourager à vérifier si la question est d'abord sur le sujet.
Evil
@Evil hélas, la version mobile de SO n'avait pas mis à jour que la question avait été votée hors sujet lorsque j'ai écrit cette réponse.
user6916458
3

Tous les deux. Parfois, il est juste difficile d'estimer le temps qu'une opération prendra, car vous ne savez pas à l'avance combien de travail doit être fait. Parfois, ses estimations simplistes et inexactes.

Exemple: je télécharge quatre fichiers simultanément. Quelqu'un sait à quel point chaque fichier est volumineux, combien a été téléchargé et combien de mégaoctets par seconde ont été téléchargés pour chaque fichier. Semble facile de prévoir combien de temps cela prendra. Cependant, je sais qu'après le téléchargement d'un fichier, les autres se téléchargent plus rapidement. Encore plus après le téléchargement de 3 fichiers; le dernier téléchargera quatre fois plus vite. Je n'ai jamais vu de barre de progression en tenir compte.

Exemple: vous copiez un gros dossier. La barre de progression suppose que vous copiez X mégaoctets par seconde, sait combien de mégaoctets il y a et votre vitesse moyenne jusqu'à présent. Le problème est que "mégaoctets par seconde" est très imprécis - en pratique, cela prend x millisecondes par fichier, plus y millisecondes par mégaoctet. De nombreux petits fichiers prennent donc beaucoup plus de temps que ne le prévoit la barre de progression.

Le problème est que les développeurs de logiciels peuvent s'en soucier, mais leurs gestionnaires ne le font pas tant que votre ordinateur ne plante pas.

gnasher729
la source
3

Je pense que la réponse globale est qu'il est souvent trop complexe (ou impossible) de calculer le temps qu'il faudra.

Parfois, il s'agirait simplement de réduire le temps de calcul pour mieux estimer la quantité de travail requise (par exemple, effectuer une meilleure analyse des fichiers à copier ou appliquer un calcul plus complexe pour mieux estimer le nombre d'étapes nécessaires pour effectuer une simulation).

D'autres fois, c'est plutôt indéterminé. Lorsque votre système installe un nouveau programme, il a souvent de nombreuses dépendances à vérifier sont installées. Et généralement, il n'a pas une idée du temps que chacun prendra et des dépendances dont ceux-ci pourraient à leur tour avoir besoin. Toutes les dépendances peuvent déjà être installées et cela peut prendre 30 secondes, ou il peut en manquer des dizaines et cela peut prendre des heures. Difficile de donner une idée juste de cela, surtout lorsque chaque situation sera unique.

De plus, d'autres drains sur le système peuvent changer au fil du temps (en raison de ce que l'utilisateur fait ... ou des processus d'arrière-plan / planifiés).

Parfois, l'estimation pourrait être améliorée si le programmeur y mettait un peu plus de travail. Mais c'est une autre réalité que ce n'est probablement pas la principale préoccupation des développeurs, par rapport à l'avancement des tâches productives réelles que l'application peut accomplir.

En fin de compte, en ce moment, je pense que c'est souvent une estimation linéaire - un aperçu du nombre de tâches de base requises que le programme a accomplies. Il s'agit donc en fait d'une estimation très approximative, et vous devriez généralement la considérer comme telle.


Une bonne analogie pourrait être lorsque vous lisez un livre.
Et vous décidez que vous souhaitez avoir une idée du temps qu'il faudra pour terminer le livre ...
Vous pouvez vérifier le nombre de pages et obtenir une estimation rapide en fonction du rythme jusqu'à présent.
Cela peut être une mauvaise estimation si vous venez de commencer à lire, car votre vitesse n'est peut-être pas encore typique. Mais souvent, ce serait une estimation approximative.
Ou vous pouvez également parcourir le livre, avoir une idée approximative du nombre d'images et de l'espacement du texte. Et puis avoir une meilleure idée de ce à quoi vous êtes confronté.
Mais il peut toujours s'agir d'une mauvaise estimation si, par exemple, la lisibilité du texte diminue, passant peut-être d'une prose simple à une prose complexe. Ou l'estimation peut se terminer de manière erronée car vous n'avez pas anticipé une autre tâche qui détournera votre attention.
Vous pouvez obtenir une excellente estimation en appliquant une grande partie du temps pour analyser soigneusement ce qui reste dans le livre page par page, et vous pouvez également l'améliorer en vérifiant votre calendrier et en conservant une liste des pas de lecture passés à long terme pour divers livres.
Mais en fin de compte, le temps qu'il faut pour le faire vaut-il le temps de lire le livre?


Nous aimerions tous de meilleurs indicateurs. Mais en l'état, nous devrons probablement nous contenter d'estimations approximatives, au moins jusqu'à ce que les ordinateurs dans leur ensemble obtiennent des algorithmes standardisés améliorés et soient capables de peser "intelligemment" et d'anticiper les facteurs dynamiques (tels que vos voies)!

Et la barre de progression est peut-être bloquée à 5% en ce moment. Il faudra juste voir comment ça se passe 8-)

JeopardyTempest
la source
1
Merci pour votre réponse. Je voudrais encourager à vérifier si la question est sur le sujet avant de répondre.
Evil
Merci d'avoir pris la peine de répondre à ma question de manière aussi complète - ignorez simplement le commentaire du Dr Evil ci-dessus.
Paul Uszak
1
L'analogie de votre livre est à la fois bonne et mauvaise. Oui, c'est comme lire un livre, mais n'oubliez pas que le livre a déjà été lu (par les développeurs). Il devrait être possible de produire une sorte de carte d'exécution, des déclarations d'étape ou des procédures critiques terminées, puis de les renvoyer à l'utilisateur. Je me concentre sur les logiciels commerciaux qui ont déjà été testés pour des choses comme la performance de toute façon. Si vous pouvez comparer les performances opérationnelles / l'allocation des ressources, il s'ensuit que vous devriez pouvoir comparer les performances de l'installation si l'algorithme a déjà été exécuté.
Paul Uszak
1

J'ajouterais à la réponse de @ gnasher729 qu'il s'agit d'une autre conséquence cachée de l'indécidabilité du problème d'arrêt.

Si l'on met de côté l'imprévisibilité inhérente aux calculs interactifs, même ceux qui peuvent être isolés peuvent avoir un temps d'exécution (et un "rythme"), dont la prévisibilité ne peut être approchée par une méthode générale.

Malheureusement, une barre de progression est souvent une métaphore inutile. Quelles seraient les alternatives, vous pourriez vous demander. Si l'utilisateur est au courant de ce qui se passe "sous le capot", l'ajout de certaines informations sémantiques à l'interface peut être une option, en passant à une exécution de type trace. Sinon, créer une atmosphère calme qui réduit les attentes.

Eduquer l'utilisateur à comprendre nos limites est une troisième option à long terme.

André Souza Lemos
la source
1
Je dois faire objection à votre caractérisation de l' utilisateur . Un utilisateur peut mettre à niveau la suite Oracle Enterprise Business pour une banque commerciale, ce qui n'est pas comme installer Space Invaders. L'affichage d'une barre de progression n'est pas là pour réduire les attentes. mais à la rétroaction à l'équipe de projet combien de temps le système commercial sera en panne. Et je ne suis pas sûr que ce soit un exemple du problème d'arrêt, car une banque pourrait ne pas vouloir démarrer une mise à niveau qui n'est pas garantie de se terminer ...
Paul Uszak
1
Je ne vois aucune raison pour que ce phénomène, en général, soit attribué à Turing-complétude. De nombreux processus qui nécessitent des barres de progression sont des séquences finies de sous-processus se terminant définitivement.
Rhymoid
1
Le nombre de fois qu'un sous-programme devra s'exécuter est une propriété non triviale de l'exécution d'un programme, qui affecte sa durée estimée d'achèvement. Le théorème de Rice montre qu'il s'agit de problèmes indécidables, par réduction au problème d'arrêt. Concrètement, il n'est généralement pas possible de modéliser le comportement d'un programme de manière à rendre une barre de progression fidèle à ce qui se passe réellement, pour des raisons pratiques.
André Souza Lemos
@PaulUszak Combien de fois avons-nous désespérément attendu la fin des programmes (mises à niveau, peu importe)? Des gens, des banques, des pilotes d'avion, des gouvernements ...?
André Souza Lemos
@ AndréSouzaLemos C'est complètement hors de propos. Il s'agit d'une observation sur la pratique. En pratique, le nombre de fois que le sous-programme devra s'exécuter est connu dans une limite étroite, tandis que le temps à y consacrer n'est généralement pas connu à l'avance car il dépend des E / S. La logique derrière les barres de progression est toujours créée pour des applications spécifiques et n'est pas générée par l'analyse de programme ou autre chose où la théorie de la calculabilité ferait son apparition.
Rhymoid
1

Les barres de progression sont dessinées en fonction du nombre de sous-tâches terminées plutôt que du temps écoulé / requis pour l'achèvement.

Par exemple, supposons qu'une opération X comporte quatre sous-étapes différentes, à la fin de chaque étape, vous augmentez la barre de progression de 25%. Si une étape prenait plus de temps à exécuter, vous verriez probablement le comportement que vous avez décrit - 1 à 90% en une fois et des heures pour le reste.

La logique derrière l'utilisation du nombre de sous-tâches comme une unité plutôt que du temps est que ce dernier est imprévisible. Même dans le cas du téléchargement d'un fichier, la connexion peut chuter, par conséquent le temps ne peut pas être utilisé comme une unité. Vous préférez utiliser la quantité d'octets téléchargés et non le temps requis comme unité de progression.

Codeurs extrêmes
la source
1
Merci pour votre réponse. Je voudrais encourager à vérifier si la question est d'abord sur le sujet.
Evil