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!