Una volta ho passato la parte migliore di una settimana cercando di eseguire una barra di avanzamento uniforme e non incerta su un algoritmo molto complesso.
L'algoritmo aveva 6 passaggi diversi. Ogni passo aveva caratteristiche temporali che dipendevano seriamente da A) i dati sottostanti in elaborazione, non solo la "quantità" di dati ma anche il "tipo" di dati e B) 2 dei passi scalati estremamente bene con l'aumento del numero di cpus, 2 passaggi sono stati eseguiti in 2 thread e 2 passaggi erano effettivamente a thread singolo.
Il mix di dati ha avuto un impatto molto maggiore sul tempo di esecuzione di ogni passaggio rispetto al numero di core.
La soluzione che alla fine ha risolto era davvero piuttosto semplice. Ho eseguito 6 funzioni che hanno analizzato il set di dati e cercato di prevedere il tempo di esecuzione effettivo di ogni fase di analisi. L'euristica in ciascuna funzione ha analizzato sia i set di dati in analisi che il numero di cpu. In base ai dati di runtime della mia macchina a 4 core, ciascuna funzione ha sostanzialmente restituito il numero di millisecondi previsto, sulla mia macchina.
f1 (..) + f2 (..) + F3 (..) + F4 (..) + F5 (..) + F6 (..) = tempo di esecuzione totale in millisecondi
Ora date queste informazioni, è possibile sapere in modo efficace quale percentuale del tempo di esecuzione totale deve essere assunta da ciascun passaggio. Ora se dici che step1 dovrebbe prendere il 40% del tempo di esecuzione, in pratica devi scoprire come emettere 40 eventi dell'1% da quell'algoritmo.Dicono che il ciclo for sta elaborando 100.000 articoli, probabilmente si potrebbe fare:
for (int i = 0; i < numItems; i++){
if (i % (numItems/percentageOfTotalForThisStep) == 0) emitProgressEvent();
.. do the actual processing ..
}
Questo algoritmo ci ha dato una setosa barra di avanzamento liscia che funzionato in modo impeccabile. La tecnologia di implementazione può avere diverse forme di ridimensionamento e funzionalità disponibili nella barra di avanzamento, ma il modo di pensare basilare sul problema è lo stesso.
E sì, non importava davvero che i numeri di riferimento euristici fossero stati elaborati sulla mia macchina - l'unico vero problema è se si desidera modificare i numeri quando si esegue su una macchina diversa. Ma tu conosci ancora il rapporto (che è l'unica cosa veramente importante qui), così puoi vedere come il tuo hardware locale funziona in modo diverso da quello che avevo.
Ora il lettore di SO medio può chiedersi perché mai qualcuno potrebbe trascorrere una settimana facendo una barra di avanzamento senza problemi. La funzione è stata richiesta dal responsabile commerciale, e credo che l'abbia usata nelle riunioni di vendita per ottenere contratti. Denaro parla;)
In aumento per il fresco. – erikprice