Dr.Godfried-Willem RAES
Kursus Experimentele Muziek: Boekdeel 1: Algoritmische Kompositie
Hogeschool Gent : Departement Muziek & Drama
1137:
Wanneer we via de komputer data willen verwerven op een kontinue wijze (samplen dus), dan moeten we in ons programma de binnenkomende gegevens in een geheugenbuffer opslaan.
Daarvoor nu zijn verschillende technieken mogelijk, die echter telkens een andere uitvoeringstijd met zich brengen en ook telkens een verschillende wijze van gegevens benadering vergen.
De meest voor de hand liggende mogelijkheid bestaat erin een array te dimensioneren en dit te laten aangroeien naarmate meer gegevens beschikbaar komen. Het probleem is dat vroeg of laat het geheugen zal vollopen... met een systeemcrash als resultaat. In deze aanpak kunnen we gebruik maken van de konstruktie:
t = UBOUND(dataarray) + 1
REDIM PRESERVE dataarray(t) AS GLOBAL INTEGER
dataarray(t) = nieuwedata
Om de geheugen overflow te vermijden kunnen we ook de diepte van onze buffer beperken. In dit geval zijn we echter verplicht de bestaande data telkens door te schuiven om nieuwe data te kunnen toevoegen. Volgende basic konstruktie laat dit toe:
DIM dataarray(size) AS GLOBAL INTEGER
ARRAY DELETE dataarray(), nieuwe data
Maar ook door een geheugensegment als vaste-lengte string te deklareren kunnen we dit implementeren:
DIM databuf AS GLOBAL STRING * 1024 ' voor 512 integers
De uitvoeringssnelheid van deze aanpakken op eenzelfde machine hebben we opgemeten met volgende tabel als resultaat:
kontruktie | buffer van 256 integers | buffer van 512 integers | buffer van 1024 integers | buffer van 2048 integers |
REDIM PRESERVE | 24 microsec. | 24 microsec | 24 microsec | 24 microsec |
ARRAY DELETE | 10 microsec | 21 microsec | 44 microsec | 82 microsec |
STRING, TAIL | 2.3 microsec | 4.88 microsec | 8 microsec | 13 microsec |
STRING, HEAD | 2 microsec | 3.4 microsec | 5.4 microsec | 10.7 microsec |
Deze metingen werden gedaan op grond van 1000000 cycli.
De kode waarmee we dit maten, tevens een voorbeeld van hoe je het best in een programma kunt implementeren ziet eruit alsvolgt:
FUNCTION PBMAIN ()
LOCAL s AS DWORD
LOCAL i AS DWORD
LOCAL t1 AS DWORD
LOCAL t2 AS DWORD
LOCAL m AS STRING
s = 2047 '1023' 511 '255 '511 '1023 '2047
STATIC sb AS STRING * 4096 '2048 '1024 '512 ' 1024 ' 2048 ' 4096
DIM db(s) AS STATIC INTEGER
STATIC cst AS INTEGER
cst = 1024
PRINT "Timing array delete ... procedure "
i = 0
t1 = TIMER
DO
ARRAY DELETE db(), cst
INCR i
LOOP UNTIL i = 1000000
m = "Duration=" & STR$((TIMER - t1)) & " microsec per cycle" ' 10, 21, 44, 82 microsec.
PRINT m , STR$(db(s))
PRINT "Timing redim preserve construction ... "
i = 0
DIM dbr(0) AS STATIC INTEGER
t2 = TIMER
DO
INCR i
REDIM PRESERVE dbr(i) AS STATIC INTEGER
dbr(i) = cst
LOOP UNTIL i = 1000000
m = "Duration=" & STR$((TIMER - t2)) & " microsec per cycle" ' 24, 24, 24, 24 microsec.
PRINT m , STR$(dbr(i))
PRINT "Timing stringbuf front construction... "
i = 0
sb = ""
t1 = TIMER
DO
sb = CHR$(LOBYT(cst),HIBYT(cst)) & sb ' big endian !
INCR i
LOOP UNTIL i = 1000000
m = "Duration=" & STR$((TIMER - t1)) & " microsec per cycle" ' 2, 3.4, 5.4, 10.7 microsec.
PRINT m , (ASC(RIGHT$(sb,1)) * 256) + ASC(RIGHT$(sb,2))
PRINT "Timing stringbuf tail construction... "
i = 0
sb = ""
s = LEN(sb) -2
t1 = TIMER
DO
sb = MID$(sb,3,s) & CHR$(LOBYT(cst),HIBYT(cst))
INCR i
LOOP UNTIL i = 1000000
m = "Duration=" & STR$((TIMER - t1)) & " microsec per cycle" ' 2.3, 4.9, 8, 13 microsec.
PRINT m , (ASC(RIGHT$(sb,1)) * 256) + ASC(RIGHT$(sb,2))
WAITKEY$
END FUNCTION
Filedate: 2003-02-11
Terug naar inhoudstafel kursus: <Index Kursus> |
Naar homepage dr.Godfried-Willem RAES |