Meu programa faz um longo processo para percorrer pelos bytes de Arquivos, e eu gostaria de mostrar para o usuário uma estimativa (atualizada a cada segundo ou algo assim) de quanto tempo +/- ainda vai levar pro processamento acabar.
Ou seja, seria mostrar para o usuário uma contagem regressiva que acaba quando o processamento da tarefa acabar.
É comum ver essas estimativas em Downloads:

Eu já tentei dois tipos de algoritmos diferentes que bolei aqui, mas eles são muito imprecisos e fazem saltos estranhos (como ir de 3s para 523s, e de volta para 2s, por exemplo).
Alguem conhece um bom algoritmo para fazer isso?
Eu acho que as Entradas do Algoritmo seriam algo como:
public long estimarTempoRestante(long workDone, long totalWork, long now) { ??? }
E seria usado +/- assim:
for (int i = 0; i <= 1000000; i++) {
long millisRestantes estimador.estimarTempoRestante(i, long 1000000, System.currentTimeMillis());
System.out.println("Falta cerca de "+(millisRestantes/1000)+"s para terminar.");
}