Ho visto ma non mi è molto chiaro il principio di funzionamento che hai applicato e qual è l'obiettivo finale.
Non capisco in quale contesto tu abbia bisogno di usare un timer (che normalmente non ha un termine, altrimenti sarebbe un conto alla rovescia) impostandolo però con un valore percentuale.
Prima di capire come puoi snellire il tutto vorrei capire come hai previsto che funzioni.
In particolare, per il calcolo di un valore percentuale c'è bisogno di due valori che stabiliscano un intervallo (inizio e fine) e di un terzo valore variabile che può spostarsi all'interno di questo intervallo e per il quale può essere calcolato il valore percentuale. Nella funzione ottieniPercentuale vedo però che hai usato solo due valori (cioè le due date), calcolando la differenza tra quello che dovrebbe essere il valore attuale meno il valore iniziale, non capisco dove sta il valore finale; poi hai messo un valore fisso (50) che non capisco cosa dovrebbe fare.
codice:
var progresso = 50 + (ms * 0.01) / 1000;
... a parte che già questa espressione può essere ridotta così:
codice:
var progresso = 50 + ms / 100000;
... quel 50 significa che parti sempre da un valore di base del 50%?!
Da quel che ho provato, vedo che ogni 100 secondi si incrementa di 1%, ma mi sfugge qualcosa. Quale dovrebbe essere il contesto di utilizzo; puoi chiarire?
A parte questo, vari punti possono essere ottimizzati sia usando delle forme sintattiche più stringate, sia proprio nell'architettura dell'elaborato. Ad esempio, nelle tre funzioni hai usato parti di codice molto simili se non uguali, per cui c'è una certa ridondanza; questo può essere evitato riformulando delle specifiche funzioni per ogni processo che intendi riusare più volte e ridurre quindi la stesura dello script oltre a risparmiare (anche se in modo minimo) l'utilizzo delle risorse durante l'esecuzione.
Eventualmente potrei fornirti delle indicazioni più specifiche ma nel caso vorrei avere più chiaro il primo punto.
Se poi vuoi ottenere un codice ancora più funzionale ed ottimale, dovresti adoperare un approccio di programmazione orientata agli oggetti; creare quindi un oggetto (classe) dove racchiudere i metodi e le proprietà così da poterlo rendere istanziabile (ad esempio per poterlo applicare magari in modo parametrico a più elementi sulla pagina), oltre a poter sfruttare quelle caratteristiche di riusabilità, astrazione, estensibilità, proprie della programmazione ad oggetti.
Inoltre, se vuoi realizzare una risorsa che sia distribuibile, puoi svilupparla sotto forma di plugin, ad esempio per jQuery... ma forse questo è già oltre le tue esigenze.
Fai sapere, buon proseguimento