{{htmlmetatags>metatag-robots=()
metatag-title=(Benchmarks sui retrocomputer)
metatag-keywords=(benchmarks,Midres,Commodore 64,Commodore VIC20,Commodore PLUS/4,Commodore 128,Atari)
metatag-description=(Lo scopo di questo saggio è mostrare quale sia la velocità media di trasferimento dati laddove si legga un file sequenzialmente da una memoria di massa ad accesso casuale (disk drive) utilizzando la libreria standard del C.)
metatag-media-og:image=(::benchmarks.png)
metatag-og:title=(Benchmarks sui retrocomputer)
metatag-og:description=(Lo scopo di questo saggio è mostrare quale sia la velocità media di trasferimento dati laddove si legga un file sequenzialmente da una memoria di massa ad accesso casuale (disk drive) utilizzando la libreria standard del C)
}}
====== BENCHMARKS SUI RETROCOMPUTER ======
Lo scopo di questo articolo è mostrare, relativamente alle [[https://github.com/spotlessmind1975/midres/blob/master/docs/targets.md|piattaforme supportate]] dalla [[:it:midres_library|libreria MIDRES]], quale sia la velocità media di trasferimento dati laddove si legga un file sequenzialmente da una memoria di massa ad accesso casuale (disk drive) utilizzando la libreria standard del C((Il codice sorgente di test è stato compilato con il compilatore cc65.exe versione 2.18 (git 0981c02). I risultati di questo test potrebbero cambiare se si utilizzano altre versioni e/o altri compilatori. Allo scopo della misurazione, i [[https://github.com/spotlessmind1975/midres|sorgenti della libreria MIDRES]] sono del tutto portabili su altri compilatori, essendo scritti in C puro.)). Per ogni piattaforma viene quindi testato un modello tra quelli forniti dall'emulatore, con il medesimo processo e le medesime dimensioni.
===== PREMESSA =====
Questo articolo prende le mosse dalla necessità di espandere la memoria accessibile al software per riprodurre **filmati isomorfi ([[:it:iav|IAV]])**, di modo che fosse possibile vederla e sfruttarla tanto dalla macchina hardware che con un emulatore.
La [[:it:iav|versione attuale del software]], che gira già su tutte le piattaforme, utilizza (se disponibile) una espansione di memoria. Attualmente l'unica disponibile e documentata è la [[https://it.wikipedia.org/wiki/Commodore_REU|REU]] per il Commodore 64/128. Questa fornisce una memoria RAM aggiuntiva con accesso paginato e (sugli emulatori) viene data la possibilità di "precaricare" una immagine della memoria dall'esterno dell'emulatore, che sarà quindi accessibile da qualsiasi programma (BASIC, C oppure ASM) che andrà in esecuzione successivamente.
Avendo svolto, sui vari gruppi Facebook, una ricerca per dei modelli di espansione di memoria della linea Commodore 264, ho mio malgrado scoperto che tale concetto non è molto diffuso sui computer a 8 bit della Commodore. Ragion per cui ho deciso di verificare se l'accesso ad una periferica disco fosse sufficientemente veloce da essere vista come una "espansione" di memoria.
===== METODOLOGIA =====
Come prima cosa si è prodotto un semplice file dati vuoto, di dimensioni sufficienti a poterne leggere dei blocchi in sequenza. Per produrre tale file è stato sufficiente utilizzare l'utilità ''dd'' del sistema operativo Linux, eseguito con queste opzioni:
dd if=/dev/zero bs=1024 count=25 of=zdata.dat
Le opzioni sono:
- ''if=/dev/zero'' : nome del file origine dei dati da produrre (''/dev/zero'' è un file speciale che genera una illimitata serie di zeri);
- ''bs=1024'' : dimensione del blocco da generare (1024 bytes);
- ''count=25'' : numero di blocchi da generare (25);
- ''ofs=zdata.dat'' : nome del file destinazione dei dati prodotti.
Con tale comando è stato generato [[https://github.com/spotlessmind1975/midres/blob/master/data/zdata.dat|un file di 25 KB]].
In seguito è stato scritto [[https://github.com/spotlessmind1975/midres/blob/master/src/utility_benchmarks.c|un breve programma in C]] che si occupa di effettuare tre letture sequenziali di questo file, utilizzando di volta in volta una dimensione del blocco doppia rispetto alla precedente.
In particolare sono state utilizzate le seguenti dimensioni:
- 256 bytes
- 512 bytes
- 1024 bytes
- 2048 bytes
Il tempo viene misurato utilizzando il clock interno chiamato [[https://en.wikipedia.org/wiki/Jiffy_(time)|jiffy clock]]. Questo timer viene incrementato con una frequenza propria del sistema e, contando il numero di incrementi, è possibile misurare con una certa approssimazione il tempo trascorso.
Poiché il numero di "tick" del jiffy clock è un multiplo della frequenza di aggiornamento dello schermo, è possibile che le misure del tempo possano non essere "intere". Cioè, la durata di 1 secondo potrebbe essere approssimata, ad esempio, a 960 millisecondi oppure a 1025 millisecondi.
Per ovviare a tale approssimazione è stata eseguita una misura di riferimento per 1 secondo tramite il comando ''mr_wait'', per garantire la taratura iniziale: questo ha comportato l'estrazione di uno specifico fattore moltiplicativo, che è stato applicato a tutti i risultati della misura.
Infine è stato adeguato il ''[[https://github.com/spotlessmind1975/midres/tree/master/makefile|makefile]]'' della libreria MIDRES affinché fosse generato una immagine disco per ogni piattaforma che dispone di una periferica di questo tipo e per ogni tipo di periferica che l'emulatore permette di simulare.
===== COMBINAZIONI HARDWARE TESTATE ======
Below is a list of all the combinations generated:
- Commodore 64 (''c64'');
- Disk Drive C=1541 (''*.d64''); **[[https://github.com/spotlessmind1975/midres/releases/download/v2.3/benchmarks.c64.d64|immagine disco]]**
- Disk Drive C=1571 (''*.d71''); **[[https://github.com/spotlessmind1975/midres/releases/download/v2.3/benchmarks.c64.d71|immagine disco]]**
- Disk Drive C=1581 (''*.d81''); **[[https://github.com/spotlessmind1975/midres/releases/download/v2.3/benchmarks.c64.d81|immagine disco]]**
- Commodore 128 (''c128'');
- Disk Drive C=1541 (''*.d64''); **[[https://github.com/spotlessmind1975/midres/releases/download/v2.3/benchmarks.c128.d64|immagine disco]]**
- Disk Drive C=1571 (''*.d71''); **[[https://github.com/spotlessmind1975/midres/releases/download/v2.3/benchmarks.c128.d71|immagine disco]]**
- Disk Drive C=1581 (''*.d81''); **[[https://github.com/spotlessmind1975/midres/releases/download/v2.3/benchmarks.c128.d81|immagine disco]]**
- Commodore 16 (''c16'');
- Disk Drive C=1541 (''*.d64''); **[[https://github.com/spotlessmind1975/midres/releases/download/v2.3/benchmarks.c16.d64|immagine disco]]**
- Disk Drive C=1571 (''*.d71''); **[[https://github.com/spotlessmind1975/midres/releases/download/v2.3/benchmarks.c16.d71|immagine disco]]**
- Disk Drive C=1581 (''*.d81''); **[[https://github.com/spotlessmind1975/midres/releases/download/v2.3/benchmarks.c16.d81|immagine disco]]**
- Commodore PLUS/4 (''plus4'');
- Disk Drive C=1541 (''*.d64''); **[[https://github.com/spotlessmind1975/midres/releases/download/v2.3/benchmarks.plus4.d64|immagine disco]]**
- Disk Drive C=1571 (''*.d71''); **[[https://github.com/spotlessmind1975/midres/releases/download/v2.3/benchmarks.plus4.d71|immagine disco]]**
- Disk Drive C=1581 (''*.d81''); **[[https://github.com/spotlessmind1975/midres/releases/download/v2.3/benchmarks.plus4.d81|immagine disco]]**
- Commodore VIC-20 espanso (''vic-2024'');
- Disk Drive C=1541 C=1540 (''*.d64''); **[[https://github.com/spotlessmind1975/midres/releases/download/v2.3/benchmarks.vic2024.d64|immagine disco]]**
- Disk Drive C=1571 (''*.d71''); **[[https://github.com/spotlessmind1975/midres/releases/download/v2.3/benchmarks.vic2024.d71|immagine disco]]**
- Disk Drive C=1581 (''*.d81''); **[[https://github.com/spotlessmind1975/midres/releases/download/v2.3/benchmarks.vic2024.d81|immagine disco]]**
- ATARI 8 bit (''atari'');
- Disk Drive con disco a singola densità (90 KB); **[[https://github.com/spotlessmind1975/midres/releases/download/v2.3/benchmarks.atari.atr|immagine disco]]**
- Disk Drive con disco a densità estesa (130 kb). **[[https://github.com/spotlessmind1975/midres/releases/download/v2.3/benchmarks.atari.ed.atr|immagine disco]]**
Ognuna di queste immagini è stata quindi caricata sul relativo emulatore, lasciando quindi che lo stesso individuasse automaticamente il formato e la dimensione del supporto, e ne è stato lanciato il benchmark relativo.
\adsense\
===== RISULTATI =====
Questo diagramma sintetizza, in breve, il risultato dei test:
{{ ::benchmarks_result_platforms2.png?nolink |}}
Come si può notare, tra la configurazione più lenta (VIC-20 espanso con C=1571) e quella più veloce (C=128 con C=1581) vi è un rapporto di 1:4, con la velocità massima di circa 1653 bytes al secondo. Il C=128 è comunque il computer che presenta la performance migliore dal confronto diretto.
{{ ::benchmarks_drives_speed.png?nolink |}}
Il Commodore 1541 si dimostra uno dei migliori tra quelli prodotti dalla Commodore, mentre il più veloce in assoluto rimane il drive dell'ATARI.
{{ :benchmarks_platforms.png?nolink |}}
Il Commodore 128 è il modello di home computer con le performance migliori in assoluto, seguito dal computer ATARI. Il peggiore rimane, invece, il VIC-20.
===== SORGENTE E DATI =====
* ''[[https://github.com/spotlessmind1975/midres/blob/master/src/utility_benchmarks.c|utility_benchmarks.c]]'' on the [[https://github.com/spotlessmind1975/midres|official repository]] of [[:midres_library|midres library]].
* {{ ::retroprogramming.iwashere.eu-benchmarks-20210213.pdf | retroprogramming.iwashere.eu-benchmarks-20210213.pdf }} - i dati complessivi (raccolti dagli snapshots)
* [[:it:benchmarks:data|Vari snapshot dei dati raccolti]]
===== POWERED BY =====
[[:midres_library|{{ :midres-logo.png?nolink&600 |}}]]