Indice

OTTIMIZZAZIONI PER ugBASIC

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.

Inizializzazione con costanti

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

Usare le costanti

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

Usare i vettori

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

Preferire la forma prefissa

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 *