Perché le barre di avanzamento sono così imprecise? [chiuso]


8

Computer e linguaggi di programmazione tendono ad essere deterministici e prevedibili. Tuttavia, le barre di avanzamento sembrano l'opposto, soprattutto se l'operazione è complessa. Anche per i prodotti professionali di livello mondiale, alcune barre di avanzamento fanno ben poco per riflettere il reale progresso di un'operazione. Li ho visti passare dal 10% al 90% in un balzo dopo aver fatto nulla per 4 ore. Ho anche visto alcuni passi indietro, suggerendo che è stata scoperta un'elaborazione inaspettata extra.

Concesso che potrebbero esserci operazioni su database, elaborazione di rete e operazioni parallele, ma sembra che ciò possa essere quantificato in qualche modo e una percentuale stimata. Dopotutto, ci deve essere una quantità finita di istruzioni eseguite per completare un'operazione. È semplicemente una codifica scadente o c'è qualche motivo fondamentale che rappresenta il progresso è difficile?


1
Questo non ha nulla a che fare con il computer science .
Raffaello

1
Ho cercato di avvicinarlo a una cornice scientifica nella mia risposta. Ahimè.
André Souza Lemos,

@Raphael Ovviamente i 5 lettori che hanno pubblicato le risposte differiscono dalla tua opinione. Non si tratta di locomozione a vapore, vero?
Paul Uszak,

No, si tratta di errori nella progettazione dell'interfaccia utente. Che è offtopico. Ci possono essere domande di informatica, ma non nella sua forma attuale. (Nota che il tuo presupposto è leggermente imperfetto. Mentre i computer reali sono prevedibili, a rigor di termini, calcolare una previsione non è in genere più economico del calcolo stesso. Inoltre, chi fa la previsione? Le applicazioni non controllano la macchina, quindi qualsiasi previsione è si basava sul presupposto che "Avrò tutte le risorse che ho ottenuto" - per nulla un presupposto valido!)
Raffaello

Risposte:


2

Per aggiungere alle risposte più generali finora posso fornire alcuni esempi dal mio campo in cui le barre di avanzamento non funzionano e perché;

Programmi di progettazione assistita da computer: i programmi che eseguono analisi termiche o la meccanica dei fluidi possono essere generalmente terribili con le barre di avanzamento. Saltano in avanti, indietro, fanno passi incoerenti e non c'è quasi nulla a guardarli. Ciò è dovuto alla natura iterativa di questi tipi di simulazioni e alla necessità di trovare convergenza. Questo è meglio visto non da una barra di avanzamento ma da un diagramma di iterazione v convergenza.

Simulazioni complesse: ho scritto un programma che simula un ambiente complesso con molti fattori correlati. Era per una linea temporale fissa, quindi la barra di avanzamento potrebbe essere il momento giusto? Nel mio caso la simulazione è troppo lunga con ogni nuovo passo temporale, quindi la barra di avanzamento diventa sempre più lenta - non eccezionale. Ho trovato un'altra metrica per quanto tempo impiega la simulazione media in base al numero di elementi nella simulazione che era più vicino all'accurata, ma non ideale poiché a volte la barra del processo non si riempiva mai (la simulazione si era fermata prima) o raggiungeva il 100% all'inizio (simulazione eseguita più del previsto).

In entrambi i casi, una barra completa di avanzamento puro sarebbe impossibile calcolare il massimo in anticipo (caso 1) o nessuno lineare e quindi non molto utile (caso 2)


1
La ringrazio per la risposta. Vorrei incoraggiare a verificare se la domanda è prima in tema.
Male

@Evil ahimè la versione mobile di SO non aveva aggiornato che la domanda era stata votata fuori tema quando ho scritto questa risposta.
user6916458

3

Tutti e due. A volte è difficile stimare quanto tempo ci vorrà per un'operazione, perché non si sa in anticipo quanto lavoro deve essere fatto. A volte le sue stime semplicistiche e imprecise.

Esempio: sto scaricando quattro file contemporaneamente. Qualcuno sa quanto è grande ogni file, quanto è stato scaricato e quanti megabyte al secondo sono stati scaricati per ogni file. Sembra facile prevedere quanto tempo ci vorrà. Tuttavia, so che dopo aver scaricato un file, gli altri verranno scaricati più velocemente. Ancora di più dopo aver scaricato 3 file; l'ultimo verrà scaricato quattro volte più velocemente. Non ho mai visto alcuna barra di avanzamento che ne tenga conto.

Esempio: stai copiando una cartella grande. La barra di avanzamento presuppone che copiate X megabyte al secondo, sappia quanti megabyte ci sono e la vostra velocità media finora. Il problema è che "megabyte al secondo" è molto impreciso: in pratica, ci vogliono x millisecondi per file, più y millisecondi per megabyte. Quindi molti file di piccole dimensioni impiegano molto più tempo di quanto anticipato dalla barra di avanzamento.

Il problema è che gli sviluppatori di software potrebbero interessarsene, ma i loro gestori non si fermano finché il computer non si arresta in modo anomalo.


3

Penso che la risposta generale sia che spesso è troppo complesso (o impossibile) calcolare il tempo necessario.

A volte sarebbe solo una questione di ridurre i tempi di elaborazione per stimare meglio la quantità di lavoro richiesta (ad esempio, fare una migliore analisi dei file da copiare o applicare un calcolo più complesso per stimare meglio il numero di passaggi necessari per completa una simulazione).

Altre volte è piuttosto indeterminato. Quando il tuo sistema installa un nuovo programma, spesso ha molte dipendenze da verificare se sono installate. E generalmente non ha idea di quanto tempo impiegherà ognuno e di quali dipendenze potrebbero avere bisogno a loro volta. Potresti avere già tutte le dipendenze installate e potrebbero essere necessari 30 secondi, oppure potresti mancarne dozzine e potrebbero volerci ore. Difficile dare un campo di gioco equo, soprattutto quando ogni situazione sarà unica.

Inoltre, altri scarichi nel sistema possono cambiare nel tempo (a causa di ciò che l'utente fa ... o in background / processi pianificati).

A volte la stima potrebbe essere migliorata se il programmatore vi dedicasse un po 'più di lavoro. Ma poi è un'altra realtà che questa probabilmente non è la preoccupazione principale della maggior parte degli sviluppatori, rispetto a promuovere le attività produttive effettive che l'applicazione può svolgere.

Alla fine, in questo momento, credo che abbastanza spesso sia solo una stima lineare - uno sguardo a quante delle attività di base richieste ha completato il programma. Quindi tende davvero ad essere una stima molto approssimativa, e dovresti generalmente considerarla come tale.


Una buona analogia potrebbe essere quando stai leggendo un libro.
E decidi che vorresti avere un'idea di quanto tempo ci vorrà per finire il libro ...
Puoi controllare il conteggio delle pagine e ottenere una rapida stima in base al ritmo finora.
Potrebbe essere una cattiva stima se hai appena iniziato a leggere, perché la tua velocità potrebbe non essere ancora tipica. Ma spesso sarebbe una supposizione approssimativa.
Oppure potresti anche sfogliare il libro, avere un'idea approssimativa di quante immagini ci sono e della spaziatura del testo. E poi avere un'idea migliore di ciò che devi affrontare.
Ma può essere ancora una stima scadente se, ad esempio, la leggibilità del testo diminuisce, forse passando da una prosa semplice a una complessa. Oppure la stima potrebbe finire in modo errato perché non sei riuscito ad anticipare un'altra attività che distoglierà la tua attenzione.
Potresti ottenere una grande stima applicando una grande quantità di tempo per analizzare attentamente ciò che rimane nel libro pagina per pagina, e allo stesso modo puoi migliorarlo controllando il tuo calendario e mantenendo un elenco di passi di lettura a lungo termine per vari libri.
Ma alla fine, è il tempo necessario per farlo, vale la pena aspettare solo a leggere il libro?


Tutti ameremmo indicatori migliori. Ma com'è, probabilmente dovremo fare i conti con stime approssimative, almeno fino a quando i computer nel loro insieme non inizieranno a migliorare gli algoritmi standardizzati, e saranno abili nel pesare "in modo" intelligente e nell'anticipare i fattori dinamici (come i tuoi modi)!

E la barra di avanzamento su questo è forse bloccata al 5% in questo momento. Dovremo solo vedere come va Cool Cool


1
La ringrazio per la risposta. Vorrei incoraggiare a verificare se la domanda è in argomento prima di rispondere.
Evil

Grazie per il disturbo di rispondere alla mia domanda in modo così completo - ignora il commento del Dr. Evil sopra.
Paul Uszak,

1
L'analogia del tuo libro è sia buona che cattiva. Sì, è come leggere un libro, ma non dimenticare che il libro è già stato letto (dagli sviluppatori). Dovrebbe essere possibile produrre una sorta di mappa di esecuzione, dichiarazioni di pietre miliari o procedure critiche completate e quindi restituirle all'utente. Mi sto concentrando su software commerciale che è già stato contrassegnato per cose come le prestazioni. Se è possibile eseguire il benchmark delle prestazioni operative / allocazione delle risorse, ne consegue che dovrebbe essere possibile eseguire il benchmark delle prestazioni di installazione se l'algoritmo è stato eseguito in precedenza.
Paul Uszak,

1

Aggiungerei alla risposta di @ gnasher729 che questa è un'altra conseguenza nascosta dell'indecidibilità del problema di arresto.

Mettendo da parte l'imprevedibilità intrinseca dei calcoli interattivi, anche quelli che possono essere isolati possono avere un tempo di esecuzione (e "ritmo"), la cui prevedibilità non può essere affrontata con un metodo generale.

Purtroppo, una barra di avanzamento è spesso una metafora inutile. Quali sarebbero le alternative, potresti chiedere. Se l'utente è consapevole di ciò che sta succedendo "sotto il cofano", l'aggiunta di alcune informazioni semantiche all'interfaccia può essere un'opzione, passando a un'esecuzione simile alla modalità traccia. In caso contrario, creare un'atmosfera calma che riduce le aspettative.

Educare l'utente a comprendere i nostri limiti è - a lungo termine - la terza opzione.


1
Devo fare un'eccezione alla tua caratterizzazione dell'utente . Un utente potrebbe aggiornare la suite Oracle Enterprise Business per una banca commerciale che non è come installare Space Invaders. La visualizzazione di una barra di avanzamento non è disponibile per ridurre le aspettative. ma per dare un feedback al team del progetto per quanto tempo il sistema di trading rimarrà inattivo. E non sono sicuro che questo sia un esempio del problema di arresto, dal momento che una banca potrebbe non voler avviare un aggiornamento che non è garantito il completamento ...
Paul Uszak,

1
Non vedo alcun motivo per cui questo fenomeno, in generale, debba mai essere attribuito alla completezza di Turing. Molti processi che richiedono barre di avanzamento sono sequenze finite di sottoprocessi che terminano definitivamente.
Rhymoid,

1
Quante volte dovrà essere eseguito un sottoprogramma è una proprietà non banale dell'esecuzione di un programma, che influisce sul tempo stimato di completamento. Il teorema di Rice mostra che questi sono problemi indecidibili, riducendo il problema dell'arresto. Concretamente, modellare il comportamento di un programma in modo tale da rendere fedele una barra di progresso a ciò che sta realmente accadendo, per motivi pratici.
André Souza Lemos,

@PaulUszak Quante volte abbiamo aspettato senza speranza che i programmi (aggiornamenti, qualunque cosa) finissero? Persone, banche, piloti di aerei, governi ...?
André Souza Lemos,

@ AndréSouzaLemos Questo è completamente oltre il punto. Questa è una domanda su un'osservazione sulla pratica. In pratica, il numero di volte che il sottoprogramma dovrà essere eseguito è noto in un limite ristretto, mentre il tempo da dedicare ad esso di solito non è noto in anticipo perché dipende dall'I / O. La logica dietro le barre di avanzamento è sempre definita per applicazioni specifiche e non viene generata attraverso l'analisi del programma o qualcos'altro in cui la teoria della computabilità potrebbe sollevare la testa.
Rhymoid,

1

Le barre di avanzamento vengono disegnate in base al numero di attività secondarie completate anziché al tempo trascorso / richiesto per il completamento.

Ad esempio, supponiamo che un'operazione X abbia quattro diversi passaggi secondari, alla fine di ogni passaggio aumenti la barra di avanzamento del 25%. Se l'esecuzione di un passaggio richiede più tempo, è probabile che tu veda il comportamento che hai descritto: dall'1 al 90% in una volta e ore per il resto.

La logica dietro l'utilizzo del numero di attività secondarie come unità piuttosto che nel tempo è che quest'ultima è imprevedibile. Anche nel caso del download di un file, la connessione potrebbe interrompersi, quindi il tempo non può essere utilizzato come unità. Preferiresti utilizzare la quantità di byte scaricati e non il tempo richiesto come unità di avanzamento.


1
La ringrazio per la risposta. Vorrei incoraggiare a verificare se la domanda è prima in tema.
Male
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.