Perché gli emulatori sono lenti?
In gran parte, perché l'emulatore è un software che cerca di fingere di essere hardware. Nell'hardware, tutto avviene ad ogni ciclo di clock. Massicciamente parallelo. Nel software, si possono fare alcune cose in parallelo, ma dove una cosa dipende da un'altra, le cose devono essere fatte in sequenza. E devi usare quel software per simulare quello che sta facendo qualche altro hardware.
Prendi, per esempio, come funziona un vecchio Intel 4004. Per un'emulazione digitale pura veramente accurata, dovete simulare 2.300 transistor individuali e come sono collegati tra loro. Farlo a quel livello sarà molto lento. (Non fatemi parlare della modellazione SPICE del layout del circuito).
Potete prendere delle scorciatoie per migliorare la velocità, ma ciò avviene a costo della precisione. Se avete un software progettato per uno specifico pezzo di hardware, e ora quell'hardware viene emulato, tutto ciò che è impreciso sull'hardware finirà per essere fatto in modo impreciso in quel software - prendete, per esempio, ZSNES (un tempo lo "standard" per l'emulazione di SNES, ora largamente ignorato tranne che per le ROM moddate) spesso non faceva correttamente la trasparenza; il vecchio emulatore NESticle non faceva correttamente lo scroll buffering e doveva avere due diverse correzioni per farlo funzionare, ma queste correzioni rompevano altre cose e dovevano essere alternate.
Tornando al 4004, si può prendere la scorciatoia di non emulare a livello di transistor, ma a livello di sottosistema.
(Da Appaloosa, aggiunto a Wikipedia[1])
Ok, ora possiamo emulare ogni singolo pezzo di questo. La maggior parte di questo è una logica abbastanza semplice e non richiede molto codice per blocco; sta tutto in come si collegano i blocchi insieme nel codice. A questo punto è tutto un flusso di dati, quindi dovrete inventarvi come collegare i pezzi.
In hardware, ognuno di questi blocchi sputa fuori qualcosa ogni ciclo di clock. Nel software, sei limitato da quante cose la tua CPU può fare allo stesso tempo.
Hmm... forse c'è qualcosa di più che puoi fare per renderlo più veloce e allo stesso tempo essere ragionevolmente accurato?
Che ne dici di guardare il set di istruzioni e decidere come interpretare ogni istruzione sul tuo sistema?
Il problema è che probabilmente ci sono molte strutture che sono diverse o inesistenti sul tuo sistema, quindi dovrai trovare il modo di inserire qualcosa che funzioni ragionevolmente in modo simile, il che avrà scarse prestazioni.
Inoltre, tradurre ogni istruzione non è gratis. C'è un costo - cercare l'istruzione, chiamare la funzione (e la funzione aggiorna la memoria emulata).
Si è scoperto che ci sono modi per accelerare anche questo, al costo di un breve momento di pausa per fare una quantità maggiore di assemblaggio/compilazione di ciò che viene dalla ROM.
Ma nel complesso, ci vuole molto overhead per emulare l'hardware con il software, al punto che, a meno che non ci sia qualche salsa magica segreta di compatibilità, il vostro sistema emulatore deve essere almeno 10 volte più potente del vostro sistema emulato.
Note
[1] Intel 4004 - WikipediaArticoli simili
- Perché gli hangout di Google+ sono così lenti?
- Perché gli smartphone con micro scheda Sd tendono a diventare lenti nel tempo?
- Perché gli emulatori di Gameboy Advance non possono emulare ROM di Gameboy o Gameboy Color?
- Perché PUBG non blocca gli utenti che lo giocano usando emulatori (su PC), visto che rovina il divertimento a chi lo gioca su mobile?