On Saturday, April 26, 2008 9:48 PM [GMT+1],
Paolo Basenghi <p.basenghi@xxxxxxxxx> wrote:
Anche considerando un "vecchio" Pentium a 1 Ghz, e considerando un
pacchetto ICMP al secondo generato dal "pingante", la nostra
scatoletta nera preferita ha il tempo di eseguire al massimo 3
milioni e mezzo di istruzioni macchina tra un pacchetto e l'altro,
ciascuna di queste operante al massimo su un byte, mentre il Pentium
ha il tempo di eseguire al massimo 1 miliardo di operazioni macchina,
ciascuna operante potenzialmente su 4 byte. Quindi risulta un fattore
mille di differenza (un po' di più in realtà), cioè nel tempo che lo
specrum impiega per leggere il primo byte dell'header ICMP, il
pentium riesce a fare mille operazioni equivalenti.
Mettiamo pure che Windows XP sia complesso, però....
Si, ammetto che il pentium non scherza, pero` guarda questi dati:
quello che segue e` un ping che ho appena fatto fra due macchine windows: ci
sono 6 bytes di mac address destinazione, 6 mac address sorgente, 14 bytes
di pacchetto IP vero e proprio (di cui gli ultimi due bytes, ovvero A0 1E
sono il checksum), poi segue l'indirizzo IP sorgente (192.168.0.3), IP
destinazione (192.168.0.1), il codice del pacchetto (08 = ping request),
qualche altra menata ed infine un po` di bytes (lettere abcdefg....) che la
macchina pingata dovra` rispedire indietro:
...e questa e` la risposta: i due mac address invertiti (infatti bisogna
rispondere a chi ha mandato la richiesta), struttura abbastanza identica a
prima, codice del pacchetto = 00 (ping reply) seguito dallo stesso blocco
dati (abcdefg....).
Non calcolo quanti cicli macchina impiega uno Z80 programmato in assembler
ad interpretare e rispondere ad una richiesta del genere, ma penso che sia
nell'ordine di grandezza di alcune centinaia di microsecondi. Ovvio che poi
bisogna vedere quanto e` efficiente il trasferimento da e verso l'hardware,
ma si stava facendo una mera considerazione sulla potenza di calcolo di un 8
bit.
Aggiungo anche che rispondere a un ping è una cosa, ma immaginate un
po' il nostro Speccy alle prese con una conversazione HTTP, per
esempio servire la home page (e solo quella) di World of Spectrum! Di
certo non ci si può giocare ad Atic Atac nel frattempo! :-)
Il problema a quel punto diventa l'eventuale collo di bottiglia
rappresentato dalla lettura dei dati da trasmettere, alla fine il grosso del
lavoro consiste nello spostamento di dati fra una memoria di massa ed il
chip ethernet. La capacita` dello Z80 a 3,5MHz non e` poi cosi` schifosa,
considera che un gommoso con la zxmmc o zxmmc+ legge una sdcard ad oltre
200KB al secondo (kbytes), anche grazie a Paolo Ferraris che ha proposto di
usare il code unrolling (16 istruzioni INI da 16 cicli di clock invece di
una INIR da 21), in pratica un byte disponibile ogni 16 clock Z80 compreso
il salvataggio in memoria. Ogni 16 bytes c'e' un ritardo dovuto al salto nel
loop.