sostituzione delle variabili più veloce di numero intero in linea a Vic-20 di base?

StackOverflow https://stackoverflow.com/questions/3568967

  •  01-10-2019
  •  | 
  •  

Domanda

I seguenti due programmi (funzionalmente equivalenti) sono prese da un vecchio numero di Gazette di Compute. La differenza principale è che il programma 1 mette le locazioni di memoria di base di destinazione (7680 e 38400) in linea, considerando che il programma 2 li assegna a una variabile prima.

Programma 1 gestisce circa il 50% più lento di programma 2. Perché? Vorrei pensare che il recupero variabile in più aggiungerebbe tempo, non sottrarre esso!

10 PRINT"[CLR]":A=0:TI$="000000"
20 POKE 7680+A,81:POKE 38400+A,6:IF A=505 THEN GOTO 40
30 A=A+1:GOTO 20
40 PRINT TI/60:END

Programma 1

10 PRINT "[CLR]":A=0:B=7600:C=38400:TI$="000000"
20 POKE B+A,81:POKE C+A,6:IF A=505 THEN GOTO 40
30 A=A+1:GOTO 20
40 PRINT TI/60:END

Programma 2

È stato utile?

Soluzione

Il motivo è che BASIC è completamente interpretato qui, quindi le stringhe "7680" e necessità "38400" per essere convertiti in interi binari si raggiunge OGNI VOLTA linea 20 (506 volte in questo programma). In programma 2, sono convertiti una volta e memorizzati in B. Quindi, fintanto che la ricerca-per-e-fetch di B è più veloce di convertire-string-to-binario, programma 2 sarà più veloce.

Se si sceglie di usare un compilatore BASIC (non so se ne esiste una per VIC-20, ma sarebbe un progetto fresco retro-programmazione), quindi i programmi sarebbe probabilmente la stessa velocità, o forse 1 potrebbero essere leggermente più veloce, a seconda di ciò ottimizzazioni del compilatore ha fatto.

Altri suggerimenti

E 'a partire da pagina 76 di questo numero: http : //www.scribd.com/doc/33728028/Compute-Gazette-Issue-01-1983-Jul

Mi piaceva questa rivista. In realtà, dice un miglioramento del 30%. Guardate cosa sta succedendo nel programma 2 e diventa chiaro, perché si sta looping molto variabili utilizzando il programma sta facendo tutto in anticipo l'allocazione di memoria per calcolare indirizzi di memoria. Quando si esegue l'approccio più lento ogni iterazione deve assegnare memoria per l'evidenziato di seguito come parte di calcolare l'indirizzo di memoria:

POKE 7680 + A, 81: POKE 38400 + A

Questa è solo la natura del BASIC Interpreter sul VIC.

Accesso alla variabile prima definito sarà veloce; il secondo sarà un po 'più lento, ecc Parsing costanti più cifre richiede l'interprete effettuare ripetute moltiplicazione per dieci. Non so che cosa i compromessi esatte sono tra le variabili e costanti, ma i nomi breve variabile USE meno spazio rispetto costanti a più cifre. Per inciso, la costante zero può essere analizzato più rapidamente se scritto come un singolo punto decimale (senza cifre) rispetto scritta come cifra zero.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top