Le variabili dichiarate prima sono più veloci da accedere di quelle dichiarate dopo

Pillole di Basic #3

Questo trucco sembra meno evidente degli altri, ma le variabili dichiarate per prima sono più velocemente accessibili di quelle dichiarate dopo. Una variabile si intende dichiarata la prima volta che viene “nominata” all’interno di un programma, tramite una assegnazione ( es. A = 3 ) oppure tramite il comando DIM ( es. DIM A ).
Il motivo di questa differenza di velocità risiede nel fatto che l’interprete BASIC, durante l’esecuzione di un programma, crea una tabella delle variabili dichiarate man mano che queste si presentano. I dati relativi ad una singola variabile vengono memorizzati all’interno di 7 byte, il contenuto di questi byte è così suddiviso: 2 byte per il nome della variabile, 5 per il valore della stessa (o la posizione in memoria della stringa per le variabili di questo tipo). Le variabili vengono memorizzate a partire dalla locazione di memoria subito dopo la fine del codice del programma.
La memoria quindi si presenta, a partire dall’indirizzo scelto dall’interprete per memorizzare le variabili (nell’esempio 2248), come nella prima figura: ogni 7 byte sono presenti i dati di una nuova variabile.
Quando all’interprete viene richiesto dal programma di trovare il valore di una variabile, questi passa in rassegna la tabella e, quando trova coincidenza tra il nome della variabile cercata e quella presente in quella cella di memoria, legge il valore e lo restituisce. Più in fondo sarà nella tabella la nostra variabile, più tempo impiegherà l’inteprete a fornire il valore al programma.

Nella seconda immagine vengono messi a confronto i tempi di esecuzione di due semplici programmi che all’interno di un ciclo FOR … NEXT sommano a una variabile (F) il valore dell’indice (I) per 5000 volte. I due programmi sono identici, ma la variabile F nel primo programma viede dichiarata dopo un certo numero di altre variabili, mentre nel secondo viene dichiarata per prima tramite l’istruzione DIM della linea 5.
Notare che l’istruzione DIM viene usata in modo improprio perché invece di essere usata, come normalmente si fa, per dichiarare le dimensioni di un’array, qui non svolge nessuna funzione particolare se non quella di dichiarare la variabile per prima. A questo scopo quindi l’istruzione DIM viene usata per dichiarare le variabili in ordine di “importanza” separandole con una virgola:
es. DIM X, Y, A, B, T, P

Per calcolare il tempo di esecuzione del codice scritto alla riga 30 (il ciclo FOR … NEXT) memorizziamo all’interno della variabile T il valore del TIMER del C64 (linea 20), che restituisce (in sessantesimi di secondo) il tempo trascorso dall’avvio della macchina. Sottraendo successivamente (linea 50) il valore del TIMER alla variabile T precedentemente memorizzata, possiamo calcolare il numero di 60mi di secondo trascorsi dall’avvio di quel frammento di codice (linea 30). Dividendo infine per 60 otteniamo il numero di secondi trascorsi. Come si può vedere nel secondo programma c’è un guadagno prestazionale di ben 3 secondi (21 sec -> 18 sec).
Il discorso finora fatto per le variabili, vale anche per i vettori (array) e le matrici (array pluridimensionali), anche se questi vengono memorizzati in altre locazioni di memoria, a partire da dove terminano le variabili.

Have your say