Ottimizzare il proprio codice (C/AL o AL)

Salve lettore, in questo articolo voglio parlarti di un argomento che sta molto a cuore all’utente finale: le performance dell’applicativo. 

E’ risaputo che la soddisfazione di un utente oltre che per la facilità di utilizzo, è quello di avere un sistema reattivo in qualsiasi condizione. Spesso l’argomento performance è sottovalutato perché spesso lo sviluppo avviene in condizioni ideali (pochi carichi di lavoro, pochi record da processare, ecc.). Tuttavia sviluppare il proprio codice già rispettando alcune semplici regole per ottenere l’ottimizzazione a livello di performance dovrebbe essere buona norma affinché non si incappi in problemi futuri.

Di seguito qualche suggerimento su come ottenere una buona ottimizzazione. Per chi conosce Nav fin dal C/AL alcuni accorgimenti erano già in uso, altri, invece, sono peculiarità di Business Central.

Ad esempio quando è meglio utilizzare FindSet o Find(‘-‘)? Quest’ultima istruzione è stata affiancata da FindSet dalla versione 4 di Nav, è buona norma, però, preferire FindSet(). A livello di prestazioni, se usata con il parametro false non differisce molto da Find(‘-‘) ma se imposti il parametro a true, quando cicli un set di record e vuoi modificarli, questo aiuterà di molto le prestazioni. Esistono anche le istruzioni FindFirst() e FindLast(), ma quelle lasciale solo se devi recuperare un solo record (quindi sconsigliati a livello di performance se seguiti da ciclo repeat until). Ancora meglio di FindFirst() è l’istruzione Get() ma per quest’ultima, è importante sapere che è solo un puntatore al record, ad esempio non va bene se utilizzata per passare un record a pagine o report.

E’ molto importante anche la scelta di SetFilter e SetRange, i tempi non differiscono molto, ma SetRange è preferibile perché non deve interpretare il dato, come invece fa SetFilter, soprattutto se le ricerche non sono su stringhe ma su tipi di dato diversi (integer, decimal, date, ecc).

Con l’introduzione delle ultime versioni di Business Central abbiamo l’istruzione SetLoadFields. Questa istruzione, che nelle versione C/AL non esiste, permette di caricare solo i campi indicati nel parametro della funzione. In questo modo per record con una certa numerosità di campi, non dobbiamo per forza caricare anche i campi che non utilizziamo, ma solo quei che usiamo. Di contro, questa istruzioni non va utilizzata per transazioni di database (inserimento, modifica, cancellazione, rinomina) o per operazioni di TransferFields perché è un’istruzione per le ottimizzazioni solo delle letture. Usandola per le transazioni si produrrà l’effetto contrario, cioè che le prestazioni del codice non sono ottimizzate.

Chi lavora su Nav da molto tempo sa che i flowfields, per essere utilizzati, devono avere l’istruzione CalcFields nell’istruzione di ciclo. Tuttavia, nelle versioni più recenti di Business Central, è possibile utilizzare, prima del ciclo, l’istruzione SetAutoCalcFields con il parametro del (o dei) campo(i) flowfields che vogliamo utilizzare. Tienine conto se vuoi ottimizzare le iterazioni dei record in presenza di campi flowfield.

Se devi fare delle somme di campi e non hai flowfields, oppure semplicemente devi fare filtri su tabelle di dettaglio, è consigliabile utilizzare l’istruzione CalcSums con il campo (o i campi) che si vogliono totalizzare. Di seguito in esempio.

Quando fai controlli, cerca sempre di controllare per primo il caso in cui la condizione capiterà più di rado, o quantomeno cerca di non fare troppe istruzioni and o or per valutare le condizioni di esecuzione di codice.

Se noti, nell’esempio precedente, ho utilizzato l’istruzione IsEmpty(), tale istruzione è molto utile e performante se si desidera sapere solo l’esistenza di un set di dati o meno. Sicuramente è molto meglio di testare if FindSet() o if FindFirst().
Ho testato che è molto utile per le peformance, ad esempio, se dobbiamo invocare un’istruazione DeleteAll(), perché se non c’è nulla da eliminare comunque il sistema passa per l’istruzione DeleteAll(), mentre se facciamo if not IsEmpty(), la farà solo se necessaria.

Infine, quando è possibile, utilizza l’oggetto Query. E’ un oggetto che è già da parecchio tempo presente in Nav prima e ora su Business Central, per elaborazioni di grandi quantitativi di set di record è l’ideale per ottimizzare le letture.

Se vuoi approfondire questi discorsi con la guida in linea ufficiale Microsoft, di seguito i link.

Spero che questo articolo ti abbia dato spunto per ottimizzare il tuo codice ad ottenere performance che soddisfino il cliente.

Leave a Reply