[zxspectrum] Re: Nuovo turbo

  • From: AntonioS <schianto9001@xxxxxxxxx>
  • To: zxspectrum@xxxxxxxxxxxxx
  • Date: Thu, 31 Jan 2013 02:51:50 +0100

On 01/29/2013 08:25 PM, Antonio S. wrote:

Oppure un altro modo abbastanza facile per velocizzare sarebbe quello di fare in modo di trasmettere più bit 0 che 1, visto che richiedono la metà del tempo. Per esempio si potrebbe trasmettere un byte in più all'inizio del blocco, calcolato opportunamente, da xor-are a tutti i successivi durante il save/load..


Mi rispondo da solo :-)

L'idea dell'ottimizzazione è questa: dato un blocco da salvare, diciamo di lunghezza L, lo si divide in sottoblocchi di lunghezza k<<L. Per ogni blocco si calcolano le otto somme dei corrispondenti bit n-esimi di ogni byte. Per esempio, supponiamo che k=4 e che il blocco sia composto dai byte:

-------76543210
B[0]=0b00110001
B[1]=0b10111101
B[2]=0b10110101
B[3]=0b10111100
     ----------
S[i]=  30442303 <- somme

Si calcola il byte X da XOR-are in questo modo: X[i]= if S[i] > k/2 then 1 else 0
In questo caso si otterrebbe X=0b10110101

Per ogni blocco, la routine di save deve inviare 1+k byte: X e (B[i] xor X); nell'esempio precedente si ha

--------76543210
B'[0]=0b10000100
B'[1]=0b00001000
B'[2]=0b00000000
B'[3]=0b00001001

Qual è il vantaggio di inviare k+1 byte invece di k? Se questi byte contengono più bit 0 che 1, sono spediti più velocemente.

Nella routine di save standard dello Spectrum, infatti, inviare un 1 costa il doppio del tempo di uno 0; supponiamo che questo tempo sia T.

Il blocco B dell'esempio contiene 19 uni e 13 zeri, quindi verrebbe spedito in 19*2T+13T=51T. Il blocco B' invece contiene solo 5 zeri e 27 uni, quindi verrebbe spedito in 5*2T+27T=37T. Un guadagno notevole! Peccato però che bisogna aggiungere anche il byte extra, X: 5 uni e 3 zeri, per un totale di 13T; alla fine si risparmierebbe dunque un solo T! :-)

Quanto si può risparmiare con questo metodo?

Ho provato a calcolarlo per vari valori di k sul tzx di Alien8. Il risultato nella tabella qua sotto:

L=39687(NB. Non ho estratto i blocchi dal tzx...)

  K ,TROM  ,TNEW  ,GAIN ,Tover,Extra
   8,228.03,226.99, 1.04,26.58,4961
  12,228.03,220.33, 7.70,18.02,3308
  16,228.03,217.26,10.77,13.57,2481
  24,228.03,215.08,12.95, 9.09,1654
* 32,228.03,213.54,14.49, 6.83,1241
  48,228.03,213.94,14.09, 4.55,827
  64,228.03,214.49,13.54, 3.41,621
  96,228.03,215.97,12.06, 2.28,414
 128,228.03,218.22, 9.81, 1.73,311
 192,228.03,219.67, 8.36, 1.15,207
 256,228.03,220.40, 7.63, 0.85,156
 512,228.03,222.04, 5.99, 0.42,78
1024,228.03,223.56, 4.47, 0.21,39

Le colonne contengono il valore di K, il tempo di salvataggio con la routine della ROM, quello con il metodo "strano", il guadagno, il tempo necessario per spedire i byte extra (overhead) e infine quanti byte extra vengono spediti. Il valore migliore si ottiene per K=32: si risparmiano 14.5 s su 228, ovvero il 6,35%. Ne vale la pena? Da solo forse no, ma se si associa ad un turbo classico può consentire di grattare qualcosina in più senza perdere in affidabilità.

Un premio a chi mi ha seguito fin qui! :-)

'notte!

Antonio

Other related posts: