Dr.Godfried-Willem RAES

Kursus Experimentele Muziek: Boekdeel 1: Algoritmische Kompositie

Hogeschool Gent : Departement Muziek & Drama


<Terug naar inhoudstafel kursus>

   

1137:

I/O buffers

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