{{htmlmetatags>metatag-robots=() metatag-title=(Ottimizzazioni | ugBASIC) metatag-keywords=(ugBASIC,Commodore 64,Commodore PLUS/4,ZX Spectrum) metatag-description=(Ottimizzazioni per ugBASIC) metatag-media-og:image=(:ugbasic:logo-ugbasic-fb.png) metatag-og:title=(Ottimizzazioni | ugBASIC) metatag-og:description=(Ottimizzazioni per ugBASIC) }} ====== OTTIMIZZAZIONI PER ugBASIC ====== Questa pagina nasce per raccogliere, nel tempo, tutti i suggerimenti che sono stati proposti su [[https://github.com/spotlessmind1975/ugbasic/discussions|github]] e sul [[https://www.facebook.com/groups/867151224158600|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|Inizializzazione con costanti]]** * **[[#usare_le_costanti|Usare le costanti]]** * **[[#usare_i_vettori|Usare i vettori]]** * **[[#preferire_la_forma_prefissa|Preferire la forma prefissa]]** ===== 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 | * |