Der letzte Beitrag wurde sehr gut angenommen – herzlichen Dank! – und unter der Hand bekam ich sogar Insider-Tips, was ich noch ausprobieren könnte, um der
Mac-Rakete noch etwas Extraschub zu verpassen, damit sie sich vielleicht sogar asymptotisch der Photonengeschwindigkeit annähert. Neue Universen kämen dann in Reichweite!
Aus dem geheimen Schreiben destillierte ich drei Ideen, die ich hier ausprobieren möchte:
- Nicht direkt in das R-Basic-VRAM mit poke und doke schreiben, sondern erstmal in eine Struktur schreiben und diese dann auf einen Schlag ins VRAM übertragen.
- Die Zählvariablen nicht manuell, sondern mittels der R-Basic-Befehle incr und decr rauf- bzw. runterzählen.
- Das Schreiben der Bytes mit dem Aktualisieren der Zählvariablen zu einer Befehlszeile zusammenfassen. Das geschieht in R-Basic mittels Doppelpunkt in der Form befehl1 : befehl2.
Zuerst ergänzte ich den gestrigen Programm-Code um eine neue Variante, bei der die entpackten Bytes nicht direkt ins VRAM, sondern in eine Struktur geschrieben werden. Ist die Zeile komplett, wird die Struktur mittels
spoke ins VRAM übertragen und von dort in die Bitmap.
|
Quellcode
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
if wiederholungsmodus = true then
if anzahl = 72 and byteValue = 0 then
struktur_zeile = struktur_weiße_Zeile
adresse = adresse + 72
else
for n = 1 to anzahl
struktur_zeile(adresse) = byteValue
adresse = adresse + 1
next n
end if
else
for n = 1 to anzahl
byteValue = readNextByte()
struktur_zeile(adresse) = byteValue
adresse = adresse + 1
next n
end if
if zeile = komplett then
spoke 0, struktur_zeile
bitmap.peekline 0, zeilennummer
end if
|
Dieser kurz-knackige Code gefiel mir so gut, daß ich ihn auch (zwecks erweiterter Vergleichbarkeit) für eine weitere, reine poke-Variante übernahm.
|
Quellcode
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
if wiederholungsmodus = true then
if anzahl = 72 and byteValue = 0 then
spoke adresse, struktur_weiße_Zeile
adresse = adresse + 72
else
for n = 1 to anzahl
poke adresse, byteValue
adresse = adresse + 1
next n
end if
else
for n = 1 to anzahl
byteValue = readNextByte()
poke adresse, byteValue
adresse = adresse + 1
next n
end if
if zeile = komplett then bitmap.peekline 0, zeilennummer
|
Ich entschied mich, die benötigte Zeit in sechs Szenarien zu messen: in der reinen
poke-, der optimierten
poke/doke- und der Strukturvariante. Und jeweils mit der weißen Bildzeile auf einen Schlag (siehe gestern) und einmal ohne, weil dieser Trick nicht neutral, sondern stark vom Bildinhalt abhängig ist.
Die unter unbestechlichen Zeugen (einer kleiner Statue) festgestellten, quasi amtlichen Ergebnisse lauten:
- Variante pures poke: 16,7 s
- Variante poke/doke: 12,2 s
- Variante Struktur: 17,2 s
- Variante pures poke mit weißer Zeile: 10,2 s
- Variante poke/doke mit weißer Zeile: 9,1 s
- Variante Struktur mit weißer Zeile: 10,3 s
Diese Ergebnisse würde ich so interpretieren:
- Das Lesen und Schreiben von Strukturen ist in etwa zeitäquivalent zum Lesen und Schreiben des VRAMs.
Die VRAM-Variante hat dabei den Vorteil – der ihr die entscheidende Nasenspitze verlängert haben könnte –, daß die Daten gleich am gewünschten Ort sind, während die Struktur noch mit einem zusätzlichen Befehl ins VRAM übertragen werden muß.
- Es lohnt sich, Schleifendurchläufe zu minimieren. Deswegen ist die doke-Variante um Etliches schneller. Deswegen hat die weiße Bildzeile einen großen Effekt bei den anderen beiden Varianten, weil hier die hohe Schleifenzahl drastisch verringert wird.
Deswegen waren es gestern auch 8,8 s statt der heutigen 9,1 s, weil es da noch zusätzlichen Code – den ich nonchalant verschwieg – für den Fall anzahl = 8 gab. Dort stand dann keine Schleife, sondern vier doke-Befehle. Das hatte ich schon früher festgestellt, daß sich mehr Code oft lohnt, wenn er Schleifen verkürzt.
Weiter geht’s im nächsten Teil!