Une fois, j'ai passé une bonne partie de la semaine à essayer de faire une barre de progression lisse et non-hiccupy sur un algorithme très complexe.
L'algorithme avait 6 étapes différentes. Chaque étape avait des caractéristiques temporelles qui dépendaient sérieusement de A) les données sous-jacentes traitées, non seulement la "quantité" de données mais aussi le "type" de données et B) 2 des étapes mises à l'échelle extrêmement bien avec un nombre croissant de cpus, 2 étapes ont couru dans 2 discussions et 2 étapes ont été effectivement mono-thread.
Le mélange de données a effectivement eu un impact beaucoup plus important sur le temps d'exécution de chaque étape que le nombre de cœurs.
La solution qui a finalement craqué était vraiment très simple. J'ai fait 6 fonctions qui ont analysé l'ensemble de données et essayé de prédire l'exécution réelle de chaque étape d'analyse. L'heuristique dans chaque fonction analysait à la fois les ensembles de données analysés et le nombre de cpus. Basé sur les données d'exécution de mon propre ordinateur 4 core, chaque fonction a fondamentalement renvoyé le nombre de millisecondes qu'il était prévu de prendre, sur ma machine.
f1 (..) + f2 (..) + f3 (..) + f4 (..) + f5 (..) + f6 (..) = durée totale en millisecondes
maintenant donné cette information, vous pouvez effectivement savoir quel pourcentage du temps total d'exécution chaque étape est censée prendre. Maintenant, si vous dites que l'étape 1 est censée prendre 40% du temps d'exécution, vous devez essentiellement savoir comment émettre 40 événements 1% à partir de cet algorithme.Dites la boucle for est en train de traiter 100.000 articles, vous pourriez probablement faire:
for (int i = 0; i < numItems; i++){
if (i % (numItems/percentageOfTotalForThisStep) == 0) emitProgressEvent();
.. do the actual processing ..
}
Cet algorithme nous a donné une barre de progression douce et soyeuse qui a fonctionné parfaitement. Votre technologie d'implémentation peut avoir différentes formes de mise à l'échelle et de fonctionnalités disponibles dans la barre de progression, mais la façon de penser de base du problème est la même.
Et oui, cela n'a pas vraiment d'importance que les numéros de référence heuristiques aient été élaborés sur ma machine - le seul vrai problème est si vous voulez changer les numéros en cours d'exécution sur une machine différente. Mais vous connaissez toujours le ratio (qui est la seule chose vraiment importante ici), donc vous pouvez voir comment votre matériel local fonctionne différemment de celui que j'avais.
Maintenant, le lecteur moyen de SO peut se demander pourquoi quelqu'un aurait passé une semaine à faire une barre de progression en douceur. La fonctionnalité a été demandée par le vendeur en chef, et je crois qu'il l'a utilisé dans les réunions de vente pour obtenir des contrats. Money talks;)
Renversé pour la fraîcheur. – erikprice