Gestione di lunghe stringhe in memoria

Durante lo sviluppo di un nuova nuova funzione Uniface mediante l’utilizzo del solo “Proc Script” ho dovuto testarla rispetto ai possibili valori. Mi sono trovato a voler generare un file di log su un doppio loop annidato, qualcosa simile a queste poche righe di codice:

cTab = ” ”
cCR = “%%^”
vLog = “i j k”
for i = -180 to 180 step 1
for j = -181 to 181 step 1
; calcolo k con la mia nuova funzione
k = shiftMap(i, j)
; memorizzo i valori sulla stringona che al termine scaricherò su file
vLog = $concat(vLog, i, cTab, j, $concat(cTab, k, cCR))
endfor
endfor
filedump/nobom vLog, “myLog.txt”

Eseguendo questo codice ho constatato un progressivo rallentamento mano a mano che il ripetersi delle singole concatenazioni ampliava la dimensione della stringa vLog in memoria. Il punto di loop con i = -180 aveva impiegato pochi centesimi di secondo mentre il punto di loop con i = 180 aveva impiegato parecchi secondi (il codice reale è un poco più complesso…); una differenza ed un rallentamento progressivo di questa importanza mi ha spinto a cercare una soluzione alternativa che migliorasse le prestazioni.
Ho provato a concatenare sulla stringa vLog nel loop esterno i pezzettoni di stringa derivanti dal loop interno mediante l’aggiunta di una seconda variabile temporanea; quindi la variabile vTmp gestisce il solo loop interno e all’uscita del medesimo il risultato viene concatenato nella variabile vLog come in precedenza. Quella che segue è la nuova versione del codice utilizzato:

cTab = ” ”
cCR = “%%^”
vLog = “i j k”
for i = -180 to 180 step 1
vTmp = “”
for j = -181 to 181 step 1
; calcolo k con la mia nuova funzione
k = shiftMap(i, j)
; memorizzo i valori sulla stringa temporanea
vTmp = $concat(vTmp, i, cTab, j, $concat(cTab, k, cCR))
endfor
; memorizzo i valori sulla stringona che al termine scaricherò su file
vLog = $concat(vLog, vTmp)
endfor
filedump/nobom vLog, “myLog.txt”

Il risultato è stato entusiasmante! A parità di funzionalità (il file scaricato è identico!) il tempo si è quasi ridotto di 100 volte. Nel primo caso il tempo impiegato è stato di 27 minuti 08 secondi e 20 centesimi ossia 1628.20 secondi mentre nel secondo caso è stato di 16.77 secondi.
Nel mio caso stavo lavorando su una form ma questa tecnica risulta valida anche in un servizio o in un report.
Conclusione:
NON sempre la prima versione di codice funzionante o la più semplice è la migliore!

Comments are closed.