home *** CD-ROM | disk | FTP | other *** search
- MODULE Garbage;
- (* Garbage.Test testet die Geschwindigkeit des G Collectors *)
-
- IMPORT
- Out, Oberon, Kernel;
-
- CONST
- THRESHOLD= 65536; (* Bytes freilassen *)
- TICKS= 300; (* je Sekunde *)
-
- PROCEDURE Info(VAR t: LONGINT);
- BEGIN
- Out.Int(Kernel.Available(), 1);
- Out.String(" Bytes frei. ");
- IF t # 0 THEN
- Out.Int((Oberon.Time() - t) * 100 DIV TICKS, 1);
- Out.String("/100 Sekunden vergangen.");
- END;
- t := Oberon.Time();
- Out.Ln;
- END Info;
-
- PROCEDURE CallGC(VAR t: LONGINT);
- BEGIN
- (* Information *)
- Kernel.GC;
- Out.String("Nach GC-Aufruf: ");
- Info(t);
- END CallGC;
-
- PROCEDURE Test*;
- VAR
- time: LONGINT;
-
- PROCEDURE Liste;
- TYPE
- aRec= POINTER TO aDesc;
- aDesc= RECORD link, back: aRec END;
- VAR
- root, e: aRec;
- i: LONGINT;
- BEGIN
- (* Liste erzeugen *)
- NEW(root); e := root; i := 0;
- WHILE Kernel.Available() > THRESHOLD DO
- NEW(e.link); INC(i); (* Vorwärts- *)
- e.link.back := e; (* Ràckwärts-Verkettung *)
- e.link.link := NIL; (* Vorwärts-Init *)
- e := e.link; (* Der nächste... *)
- END;
-
- (* Elemente entfernen (FIFO) *)
- WHILE root # NIL DO
- root := root.link;
- END;
- e := NIL; (* => alle Referenzen auf die Liste gelöst *)
-
- (* Information *)
- Out.Int(i, 1);
- Out.String(" Elts eingefügt, wieder geläscht: ");
- Info(time);
- END Liste;
-
- PROCEDURE Zirkel;
- CONST
- N= 7;
- TYPE
- aRec= POINTER TO aDesc;
- aDesc= RECORD link: ARRAY N OF aRec END;
- VAR
- e: aRec;
- i: LONGINT;
- j: INTEGER;
- BEGIN
- (* Zirkel-Records (selbstverweisend) erzeugen *)
- i := 0;
- WHILE Kernel.Available() > THRESHOLD DO
- NEW(e); INC(i);
- j := 0;
- WHILE j < N DO e.link[j] := e; INC(j) END;
- END;
- e := NIL;
-
- (* Information *)
- Out.Int(i, 1);
- Out.String(" Zirkel-Records erzeugt: ");
- Info(time);
- END Zirkel;
-
- BEGIN
- time := 0; CallGC(time);
- Liste; CallGC(time);
- Zirkel; CallGC(time);
- END Test;
-
- BEGIN
- END Garbage.
-