Τετάρτη, 11 Μαρτίου 2020

The speed of BASIC (μέρος 1ο)

Όλοι πάνω-κάτω γνωρίζουμε την γλώσσα προγραμματισμού BASIC. Και όταν γράφω "γνωρίζουμε" εννοώ ότι γνωρίζουμε την ύπαρξή της, και όχι την γλώσσα αυτή καθαυτή απαραίτητα. Από την εποχή εκείνη, στα τέλη των 70s, και για περίπου 10-12 χρόνια η BASIC αποτελούσε το cornerstone κάθε νέου, οικιακού κυρίως υπολογιστή. Αναφέρομαι στην εποχή που δεν νοείτω home micro χωρίς ενσωματωμένη διάλεκτο της δημοφιλούς αυτής γλώσσας προγραμματισμού, σε τέτοιο μάλιστα βαθμό που η τελευταία να αποτελεί και ένα από τα σημαντικότερα κριτήρια για την επιλογή του computer που θα αποκτούσε κάποιος!

Μπορεί στις μέρες μας να φαίνεται ολίγον τι παράλογο, αλλά οι δυνατότητες της ενσωματωμένης διαλέκτου της γλώσσας BASIC έπαιζαν σημαντικό ρόλο εκείνα τα χρόνια, καθώς ο υπολογιστής ήταν περισσότερο προγραμματιστικό εργαλείο για τον χομπίστα ή τον επαγγελματία, παρά παιχνιδομηχανή, media center, Internet appliance ή social media device όπως έχει γίνει στις μέρες μας. Εντάξει, ίσως για κάποιους να ήταν και παιχνιδομηχανή, αλλά, όσο πάμε προς τα πίσω στον χρόνο - ήτοι στον καιρό που μεσουρανούσαν τα 8bit μηχανήματα - ο αγοραστής υπολογιστής ήταν συνειδητοποιημένος σε ό,τι είχε να κάνει με το μηχάνημα που επρόκειτο να αποκτήσει και την χρήση αυτού. Αν ήθελε μονάχα παιχνίδια και τίποτα άλλο, υπήρχε η φτηνή πλην τίμια λύση του Atari 2600 - κανείς δεν ήταν υποχρεωμένος να δώσει 2πλάσια, 3πλάσια ή και παραπάνω χρήματα μονάχα για να παίζει.


Παρόλο που στις μέρες μας η BASIC ως γλώσσα θεωρείται ξεπερασμένη και περιορισμένων δυνατοτήτων,δεν παύει, ακόμα και σήμερα, να αποτελεί την ευκολότερη στην εκμάθηση γλώσσα προγραμματισμού υψηλού επιπέδου. Μάλιστα, τώρα πια, τα κυριότερα ελαττώματα που την συνόδευαν, δηλαδή η απουσία εντολών δομημένου προγραμματισμού και η έλλειψη ικανοποιητικής ταχύτητας, ανήκουν οριστικά στο παρελθόν. Οποιοσδήποτε κάτσει και δώσει μία ευκαιρία στην FUZE BASIC θα το καταλάβει, καθώς έχουμε να κάνουμε με έναν BASIC interpreter με ταχύτητα που ξεπερνάει κατά πολύ αυτήν της γλώσσας μηχανής των μηχανημάτων των 80s. Είναι φυσικό αυτό, καθώς πλέον η επεξεργαστική ισχύς των υπολογιστών μας  - ακόμα και των πλέον ταπεινών εξ' αυτών, όπως είναι το Raspberry Pi - είναι χιλιάδες φορές μεγαλύτερη αυτής των υπολογιστών των 70s και των 80s.

Μιας όμως και αναφέρθηκα στην ταχύτητα της BASIC, ας πάμε και στο θέμα της σημερινής ανάρτησης που δεν είναι άλλο από το πόσο πραγματικά γρήγορες ήταν οι διάλεκτοι της γλώσσας BASIC που "φορούσαν" οι δημοφιλείς υπολογιστές των παιδικών και των εφηβικών μας χρόνων. Γιατί, ναι μεν σημαντική η πληθώρα εντολών για οποιαδήποτε ανάγκη και χρήση, καλό το εύκολο συντακτικό και το ουσιαστικό και κατανοητό error reporting, καίρια προφανώς η ευκολία στην εκμάθηση, τι γίνεται όμως αν η BASIC του υπολογιστή είναι τόσο αργή που ακόμα και το πλέον απλό πρόγραμμα σέρνεται; Ή, από την άλλη, δεν είναι ιδιαίτερα σημαντικό μία διάλεκτος BASIC να είναι τόσο γρήγορη που να μην χρειάζεται ο χρήστης να καταφύγει σε άλλες γλώσσες, διαλέκτους ή σε compilers προκειμένου να φτιάξει ένα πρόγραμμα που να του κάνει τη δουλειά του;

Με όλα τα παραπάνω κατά νου, το αγγλικό περιοδικό Personal Computer World δημιούργησε στις αρχές της δεκαετίας του '80 8 προγραμματάκια, 8 speed benchmarks, τα οποία δοκίμαζαν διάφορες πτυχές της απόδοσης μίας διαλέκτου BASIC και μπορούν εύκολα και σχεδόν χωρίς την παραμικρή αλλαγή να τρέξουν σε όλα τα home micros. Στη συνέχεια λοιπόν θα δούμε ένα προς ένα αυτά τα benchmarks αλλά και το πώς τα πήγαιναν τα δημοφιλέστερα computers της εποχής σε αυτά. I feel the need, the need for (BASIC) speed!


Benchmark #1

20 FOR k=1 TO 1000
40 NEXT k

Ο υπολογιστής μετράει απλά από το 1 μέχρι το 1000 χωρίς να κάνει κάτι άλλο. Αν το μηχάνημα αργεί εδώ, τότε... βράστα Χαράλαμπε! Εξυπακούεται ότι less is better. Για σύγκριση μπήκε στη δοκιμή και ένα single core PC, για να γίνει κατανοητή η διαφορά που προσφέρει η αυξημένη επεξεργαστική ισχύς των υπολογιστών της τρέχουσας χιλιετίας:

PC (Celeron/2400MHz) (QBASIC) --> 0,007 sec
Acorn BBC Micro model B (6502/2MHz) --> 0,8 sec
Acorn Electron (6502/2MHz) --> 1,11 sec
Amstrad CPC 464 (Z80A/4MHz) --> 1,13 sec
Commodore VIC-20 (6502/1MHz) --> 1,2 sec
Commodore 64 (6510/1MHz) --> 1,2 sec
Commodore Plus/4 (8501/1,76MHz) --> 1,9 sec
Commodore 128 (8502/2MHz) --> 2,2 sec
Atari 800XL (6502/2MHz) --> 2,2 sec
Sinclair ZX Spectrum (Z80A/3,5MHz) --> 4,4 sec
Sinclair ZX81 (Z80A/3,5MHz) (Fast mode) --> 4,5 sec

Βλέπουμε την χαώδη διαφορά ενός "σύγχρονου" μηχανήματος από τα παλαιότερα, και, επίσης, την σαφή υπεροχή του περίφημου BBC micro απέναντι στον ανταγωνισμό,  με μονάχα τον Amstrad CPC και τα μοντέλα της Commodore να βρίσκονται σχετικά κοντά του.



Benchmark #2

20 LET k=0
30 LET k=k+1
50 IF k<1000 THEN GOTO 30

Εδώ το loop γίνεται με τη χρήση της εντολής GOTO και μεσολαβεί και η εξέταση μίας συνθήκης καθώς και μία πρόσθεση, οπότε αναμενόμενα ο χρόνος εκτέλεσης είναι σημαντικά μεγαλύτερος:

PC (Celeron/2400MHz) (QBASIC) --> 0,011 sec
Acorn BBC Micro model B (6502/2MHz) --> 3,1 sec
Amstrad CPC 464 (Z80A/4MHz) --> 3,4 sec
Acorn Electron (6502/2MHz) --> 4,01 sec
Sinclair ZX81 (Z80A/3,5MHz) (Fast mode) --> 6,9 sec
Atari 800XL (6502/2MHz) --> 7,3 sec
Commodore VIC-20 (6502/1MHz) --> 7,9 sec
Sinclair ZX Spectrum (Z80A/3,5MHz) --> 8,2 sec
Commodore 64 (6510/1MHz) --> 9,3 sec
Commodore Plus/4 (8501/1,76MHz) --> 9,3 sec 
Commodore 128 (8502/2MHz) --> 11,7 sec

Απίστευτες ανακατατάξεις εδώ, με τον Commodore 128 να έρχεται τελευταίος, πίσω ακόμα και από τον (πάναργο) ZX Spectrum αλλά και τον - γενικώς αργό - Atari 800XL. Μην σας ξεγελάει ο χρόνος του ZX81, αφού, στο Fast mode "κλείνει" την απεικόνιση στην οθόνη! Ο VIC-20 είναι σημαντικά ταχύτερος από όλους τους υπόλοιπους 8μπιτους Commodore, και ο BBC micro εντυπωσιάζει με την ταχύτητα της BBC BASIC ενώ ο Amstrad CPC, με την πανίσχυρη Locomotive BASIC δείχνει τα δόντια του, ακολουθώντας από απόσταση αναπνοής.



Benchmark #3

20 LET k=0
30 LET k=k+1
40 LET a=k/k*k+k-k
50 IF k<1000 THEN GOTO 30

Στο benchmark αυτό έχουν προστεθεί αφαίρεση, πολλαπλασιασμός, πρόσθεση και διαίρεση στην εντολή 40, για να κάνουν τον υπολογιστή να "βγάλει το ψωμί του", ήτοι να υπολογίσει. Όπως και στα προηγούμενα benchmarks, ο μικρότερος χρόνος είναι ο καλύτερος:

PC (Celeron/2400MHz) (QBASIC) --> 0,024 sec
Acorn BBC Micro model B (6502/2MHz) --> 8,1 sec
Amstrad CPC 464 (Z80A/4MHz) --> 9,4 sec  
Acorn Electron (6502/2MHz) --> 11,12 sec 
Commodore VIC-20 (6502/1MHz) --> 15,2 sec
Sinclair ZX81 (Z80A/3,5MHz) (Fast mode) --> 16,4 sec
Commodore 64 (6510/1MHz) --> 17,6 sec
Commodore Plus/4 (8501/1,76MHz) --> 18,1 sec
Atari 800XL (6502/2MHz) --> 19,7 sec
Sinclair ZX Spectrum (Z80A/3,5MHz) --> 20,0 sec
Commodore 128 (8502/2MHz) --> 22,2 sec

Μία από τα ίδια με το προηγούμενο benchmark, πάνω κάτω: με το που μπαίνουν οι πράξεις στο παιχνίδι οι Commodore καταποντίζονται στα επίπεδα των ZX81 και ZX Spectrum (οι οποίοι έτσι κι αλλιώς έχουν τα θέματά τους με την ταχύτητα). Και ο Atari κάπου ανάμεσά τους. Δεν μπορεί να ισχυριστεί κάποιος ότι φταίει ο επεξεργαστής που "φοράνε" οι 8bit Commodore (όλοι είναι παραλλαγές του 6502) και ο Atari 800XL, γιατί και ο BBC τον ίδιο ακριβώς διαθέτει! Αυτό στο οποίο μπορούμε να καταλήξουμε ως (μάλλον) ασφαλές συμπέρασμα είναι ότι όσο γίνονται πιο περίπλοκα τα πράγματα, η BBC BASIC και η Locomotive BASIC δείχνουν την σαφή τους ανωτερότητα, καθώς, όχι μονάχα είναι πληρέστερες σαν διάλεκτοι, αλλά και σαφέστατα ταχύτερες. Επίσης, ένα εντυπωσιακό στοιχείο προκύπτει από τα 2 τελευταία benchmarks σε ό,τι αφορά τους υπολογιστές της Commodore, όπου η BASIC 2.0 (VIC-20 & Commodore 64) είναι ταχύτερη της πιο πλήρους BASIC 3.5 (Commodore Plus/4) η οποία αφήνει πίσω της την (καλύτερη όλων) BASIC 7.0! Πράγμα που σημαίνει με απλά λόγια ότι ο Commodore 128 ήταν μεν εφοδιασμένος με την πιο πλήρη διάλεκτο της γλώσσας από όλους τους 8μπιτους προγόνους του, αλλά ήταν και αργός σας χελώνα! Amstrad και πάλι Amstrad, θα έλεγε κανείς (και BBC, φυσικά, μην ξεχνιόμαστε!)...

Αυτά για σήμερα, θα συνεχίσουμε σύντομα με το 2ο μέρος, εκεί όπου τα benchmarks θα γίνουν πιο απαιτητικά και, αναμενόμενα, πιο χρονοβόρα. Κάποια στιγμή θα βάλω και τα 16μπιτα στο παιχνίδι (Atari ST, Commodore Amiga, Acorn Archimedes) και εκεί θα δείτε νούμερα που δεν θα τα περιμένετε!

Μέχρι την επόμενη φορά, λοιπόν...

Ενημέρωση: στους πίνακες με τους χρόνους προστέθηκαν και τα αποτελέσματα του Acorn Electron. Ο μικρός αδερφός του BBC Micro αποδεικνύει έμπρακτα ότι βρίσκεται σε μια δική του κλάση, πολύ κοντά στην κορυφή, πλησιάζοντας τον ταχύτατο ομόσταυλό του και τον Amstrad CPC.

6 σχόλια:

  1. Πολύ ενδιαφέροντα όλα αυτά. Προσωπικα δεν περίμενα τόσο μεγάλη απόσταση ανάμεσα σε σπέκτρουμ και αμστραντ λόγω κοινού επεξεργαστή. Οσον αφορα τον bbc micro κάτι ήξεραν οι Βρετανοί που τον επέλεξαν ως κύριο υπολογιστή για τα εκπαιδευτικα ιδρυματα τους στις αρχες των 80'ς! Αναμενω την συνέχεια...

    ΑπάντησηΔιαγραφή
    Απαντήσεις
    1. Να είσαι καλά, Σπύρο! Ναι, ο BBC ήταν σαφώς ανώτερος σχεδόν στα πάντα, πλην όμως μιλάμε για έναν υπολογιστή στον οποίο οι κατασκευαστές του δεν έκαναν σκόντο κάπου προκειμένου να χαμηλώσουν την τιμή: στον Spectrum από την άλλη, συνέβαινε ακριβώς το αντίθετο!

      Ο επεξεργαστής και η ταχύτητά του δεν παίζουν μεγάλο ρόλο, όπως θα δεις και στα υπόλοιπα μέρη: ο βασικότερος παράγοντας είναι η ίδια η διάλεκτος BASIC που χρησιμοποιείται.

      Διαγραφή
  2. Eνδιαφέρον θα είχε να βλέπαμε στο συγκριτικό και ένα MSX πρώτης γενιάς 1983-84 με Z80 στα 3,58 MHz

    ΑπάντησηΔιαγραφή
    Απαντήσεις
    1. Τα αποτελέσματα του Spectravideo SVI-328 που είναι "σχεδόν" MSX είναι τα παρακάτω:

      1,6 5,4 17,9 19,6 20,6 30,7 42,2 236

      με μέσο χρόνο 46,7 sec.

      Διαγραφή

Το σχόλιό σας θα δημοσιευθεί μετά από έλεγχο του διαχειριστή του blog προς αποφυγή spam σχολίων. Σας ευχαριστούμε για την κατανόηση.