Questa pagina nasce per raccogliere, nel tempo, tutti i suggerimenti che sono stati proposti su github e sul gruppo Facebook di riferimento. Costituiscono, quindi, una interessante e pratica guida su come ottimizzare lo spazio o il tempo programmando con ugBASIC.
In ugBASIC tutte le assegnazioni innescano una assegnazione per copia: il valore a destra, diretto o calcolato, viene copiato nel “contenitore” di sinistra. Questo è vero anche per i valori iniziali delle variabili, il che significa che (senza volerlo) state creando delle variabili temporanee per inizializzare delle variabili vere e proprie.
Per esempio, questo codice:
mapH = 9
sarà tradotto (in pseudo assembly) come:
MOVE 9 TO temp MOVE temp TO mapH
Per ottimizzare questo punto è sufficiente utilizzare il carattere cancelletto (#
), da anteporre al valore che volete sia considerato una costante. In tal modo, il valore NON sarà implicitamente convertito in una variabile temporanea ma utilizzato AS IS.
Ancora:
mapH = # 9
sarà tradotto (in pseudo assembly) come:
MOVE 9 TO mapH
Il linguaggio ugBASIC consente di definire costanti, da utiizzare al posto di valori fissi o di espressioni che saranno valutate una volta per tutte. Il vantaggio di usare le costanti sta tutto nel fatto che è il compilatore, e non il retro computer, ad effettuare i calcoli. Comodo!
Prendiamo questo codice:
north=1: x = north
Sarà tradotto (in pseudo assembly):
MOVE 1 TO temp MOVE temp TO north MOVE north TO x
Invece, se è definito come una costante:
CONST north=1: x = #north
Sarà invece tradotto (in pseudo assembly.
MOVE 1 TO x
In generale, l'accesso agli array bidimensionali o pluridimensionali è abbastanza lento sotto ugBASIC, perché richiede di calcolare l'offset preciso dove si trova l'elemento a cui si vuole accedere. Si tratta di un calcolo complesso, con molte addizioni e moltiplicazioni, e prende molto tempo. Se si può evitare, quindi, è meglio usare i vettori (array monodimensionali) che garantiscono, nel caso abbiamo meno di 256 elementi, un accesso rapido. In alternativa, ridurre il numero di dimensioni aiuta a diminuire la dimensione dell'eseguibile complessivo.
Prendiamo questo codice:
DIM a(3,4) a(1,1) = 42 a(2,2) = 84
Sarebbe meglio scriverlo come:
DIM a0(4), a1(4), a2(4) a1(1) = 42 a2(2) = 84
Per tutte le operazioni aritmetiche in cui la destinazione dell'operazione è uno degli operandi, ugBASIC supporta sia la forma infissa (x=x+y
) che la forma pre-fissa (ADD x,y
). Tuttavia, la forma pre-fissa è decisamente più veloce perché viene tradotta senza valori temporanei e, spesso, con l'opcode assembly corrispondente.
Prendiamo questo codice:
x = x + y
sarà tradotto (in pseudo assembly) come;
MOV x TO temp ADD y TO temp MOV temp TO x
Invece questo codice:
ADD x, y
sarà tradotto (in pseudo assembly) come;
ADD y TO x
Questa è la tabella degli operatori, prefissi e infissi:
operazione | prefissa | infissa |
---|---|---|
somma | ADD | + |
differenza | SUB | - |
divisione | DIV | / |
moltiplicazione | MUL | * |