Я провел большую часть недели, пытаясь сделать гладкий, не-икопный индикатор выполнения по очень сложному алгоритму.
У алгоритма было 6 различных шагов. На каждом шаге были временные характеристики, которые в значительной степени зависели от A) обрабатываемых базовых данных, а не только «количество» данных, но также «тип» данных и B) 2 шагов, очень хорошо масштабируемых с увеличением числа процессоров, 2 шага выполнялись в 2 потоках, а 2 этапа были эффективно однопоточными.
Соединение данных эффективно оказало гораздо большее влияние на время выполнения каждого шага, чем количество ядер.
Решение, которое, наконец, сломало его, было действительно простым. Я сделал 6 функций, которые проанализировали набор данных и попытался предсказать фактическое время выполнения каждого этапа анализа. Эвристика в каждой функции анализировала как анализируемые наборы данных, так и количество процессоров. Основываясь на данных о времени выполнения на моем собственном 4-ядерном компьютере, каждая функция в основном возвращала количество миллисекунд, которое оно ожидало принять, на моей машине.
f1 (..) + f2 (..) + f3 (..) + F4 (..) + f5 (..) + f6 (..) = общее время выполнения в миллисекундах
теперь дано эту информацию, вы можете эффективно узнать, какой процент от общего времени выполнения каждого шага должен принимать. Теперь, если вы скажете, что шаг1 должен принимать 40% времени выполнения, вам в основном нужно выяснить, как испускать 40 1% событий из этого алгоритма.Скажем, для-цикл обработки 100000 элементов, вы могли бы, вероятно:
for (int i = 0; i < numItems; i++){
if (i % (numItems/percentageOfTotalForThisStep) == 0) emitProgressEvent();
.. do the actual processing ..
}
Этот алгоритм дал нам шелковистой прогресс бар, который выполнял безупречно. У вашей технологии внедрения могут быть различные формы масштабирования и функции, доступные в индикаторе выполнения, но основной способ мышления о проблеме - то же самое.
И да, на самом деле не имело значения, что эвристические ссылочные номера были обработаны на моей машине - единственная реальная проблема заключается в том, что вы хотите изменить числа при работе на другой машине. Но вы все еще знаете соотношение (это единственная действительно важная вещь здесь), поэтому вы можете видеть, как ваше местное оборудование работает иначе, чем у меня.
Теперь средний читатель SO может удивиться, почему на земле кто-то проведет неделю, делая гладкий индикатор прогресса. Эта функция была запрошена главным продавцом, и я считаю, что он использовал ее в торговых встречах для получения контрактов. Денежные переводы;)
Приобретено для прохлады. – erikprice