Skip to content

Commit 5bf6958

Browse files
author
dosworld
committed
Speed optimization
1 parent d6e6a7f commit 5bf6958

4 files changed

Lines changed: 54 additions & 114 deletions

File tree

DBB.PAS

Lines changed: 11 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -42,9 +42,6 @@ END;
4242
DBBFile = RECORD
4343
f : BFILE;
4444
header : DBB_HDR;
45-
crecno : LONGINT;
46-
needupdate : BOOLEAN;
47-
data : PCHAR;
4845
END;
4946

5047
PROCEDURE dbb_reset(VAR f : DBBFile; fname : STRING; blk_size : WORD);
@@ -72,23 +69,12 @@ CONST
7269
DBB_SIGN = $4244;
7370
DBB_HDR_SIZE = SizeOf(DBB_HDR);
7471

75-
PROCEDURE dbb_update(VAR f : DBBFile);
76-
BEGIN
77-
IF (f.needupdate) AND (f.crecno <> 0) THEN BEGIN
78-
Seek(f.f, DBB_HDR_SIZE + (f.crecno - 1) * f.header.size);
79-
BlockWrite(f.f, f.data^, f.header.size);
80-
END;
81-
f.needupdate := FALSE;
82-
END;
83-
84-
PROCEDURE dbb_go(VAR f : DBBFile; recno : LONGINT);
72+
FUNCTION dbb_go(VAR f : DBBFile; recno : LONGINT) : LONGINT;
73+
VAR r : LONGINT;
8574
BEGIN
86-
IF recno = f.crecno THEN EXIT;
87-
dbb_update(f);
88-
{ FillChar(f.data^, f.header.size, #0); }
89-
f.crecno := recno;
75+
r := DBB_HDR_SIZE + (recno - 1) * f.header.size;
9076
Seek(f.f, DBB_HDR_SIZE + (recno - 1) * f.header.size);
91-
BlockRead(f.f, f.data^, f.header.size);
77+
dbb_go := r;
9278
END;
9379

9480
PROCEDURE dbb_reset(VAR f : DBBFile; fname : STRING; blk_size : WORD);
@@ -105,10 +91,7 @@ BEGIN
10591
dbb_rewrite(f, fname, blk_size);
10692
EXIT;
10793
END;
108-
IF (f.header.sign = DBB_SIGN) AND (f.header.size = blk_size) THEN BEGIN
109-
GetMem(f.data, f.header.size);
110-
FillChar(f.data^, f.header.size, #0);
111-
END ELSE BEGIN
94+
IF (f.header.sign <> DBB_SIGN) OR (f.header.size <> blk_size) THEN BEGIN
11295
Close(f.f);
11396
dbb_rewrite(f, fname, blk_size);
11497
END;
@@ -122,10 +105,6 @@ BEGIN
122105
f.header.records := 0;
123106
f.header.root := 0;
124107
f.header.size := blk_size;
125-
f.crecno := 0;
126-
f.needupdate := FALSE;
127-
GetMem(f.data, f.header.size);
128-
FillChar(f.data^, f.header.size, #0);
129108
Seek(f.f, 0);
130109
BlockWrite(f.f, f.header, DBB_HDR_SIZE);
131110
END;
@@ -154,22 +133,17 @@ END;
154133
PROCEDURE dbb_close(VAR f : DBBFile);
155134
BEGIN
156135
IF NOT IsOpen(f.f) THEN EXIT;
157-
dbb_update(f);
158136
Seek(f.f, 0);
159137
BlockWrite(f.f, f.header, DBB_HDR_SIZE);
160138
Close(f.f);
161-
IF f.data <> NIL THEN FreeMem(f.data, f.header.size);
162139
FillChar(f, SizeOf(DBBFile), #0);
163140
END;
164141

165142
PROCEDURE dbb_free(VAR f : DBBFile; rec : LONGINT);
166143
BEGIN
167144
IF (NOT IsOpen(f.f)) OR (rec = 0) THEN EXIT;
168-
dbb_update(f);
169-
f.crecno := rec;
170-
FillChar(f.data^, f.header.size, #0);
171-
PLONGINT(f.data)^ := f.header.next;
172-
f.needupdate := TRUE;
145+
dbb_go(f, rec);
146+
WriteDWord(f.f, f.header.next);
173147
f.header.next := rec;
174148
END;
175149

@@ -179,12 +153,10 @@ BEGIN
179153
IF f.header.next <> 0 THEN BEGIN
180154
r := f.header.next;
181155
dbb_go(f, r);
182-
f.header.next := PLONGINT(f.data)^;
156+
f.header.next := ReadDWord(f.f);
183157
END ELSE BEGIN
184158
Inc(f.header.records);
185159
r := f.header.records;
186-
dbb_go(f, r);
187-
f.needupdate := TRUE;
188160
END;
189161
dbb_alloc := r;
190162
END;
@@ -193,7 +165,7 @@ PROCEDURE dbb_get(VAR f : DBBFile; rec : LONGINT; VAR b);
193165
BEGIN
194166
IF (NOT IsOpen(f.f)) OR (rec = 0) THEN EXIT;
195167
dbb_go(f, rec);
196-
Move(f.data^, b, f.header.size);
168+
BlockRead(f.f, b, f.header.size);
197169
END;
198170

199171
FUNCTION dbb_add(VAR f : DBBFile; VAR b) : LONGINT;
@@ -203,8 +175,7 @@ BEGIN
203175
IF IsOpen(f.f) THEN BEGIN
204176
res := dbb_alloc(f);
205177
dbb_go(f, res);
206-
Move(b, f.data^, f.header.size);
207-
f.needupdate := TRUE;
178+
BlockWrite(f.f, b, f.header.size);
208179
END;
209180
dbb_add := res;
210181
END;
@@ -213,8 +184,7 @@ PROCEDURE dbb_put(VAR f : DBBFile; rec : LONGINT; VAR b);
213184
BEGIN
214185
IF (NOT IsOpen(f.f)) OR (rec = 0) THEN EXIT;
215186
dbb_go(f, rec);
216-
Move(b, f.data^, f.header.size);
217-
f.needupdate := TRUE;
187+
BlockWrite(f.f, b, f.header.size);
218188
END;
219189

220190
FUNCTION dbb_getroot(VAR f : DBBFile):LONGINT;

DBM.PAS

Lines changed: 36 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -38,19 +38,11 @@ DBM_HDR = RECORD
3838
root : LONGINT;
3939
size : WORD;
4040
END;
41-
DBM_REC = RECORD
42-
next : LONGINT;
43-
size : WORD;
44-
END;
4541

4642
DBMFile = RECORD
4743
f : BFILE;
4844
header : DBM_HDR;
49-
crec : DBM_REC;
50-
crecno : LONGINT;
51-
needupdate : BOOLEAN;
5245
rblk_size : WORD;
53-
data : PCHAR;
5446
END;
5547

5648
PROCEDURE dbm_reset(VAR f : DBMFile; fname : STRING; blk_size : WORD);
@@ -75,36 +67,22 @@ IMPLEMENTATION
7567

7668
CONST
7769
DBM_SIGN = $4D44;
70+
ADDED_DATA = SizeOf(LONGINT) + SizeOf(WORD);
7871

7972
FUNCTION norm_blk_size(blk_size : WORD) : WORD;
8073
BEGIN
81-
blk_size := blk_size + SizeOf(DBM_REC);
74+
blk_size := blk_size + ADDED_DATA;
8275
IF blk_size < SizeOf(DBM_HDR) THEN blk_size := SizeOf(DBM_HDR);
8376
IF (blk_size AND 3) <> 0 THEN blk_size := ((blk_size SHR 2) + 1) SHL 2;
8477
norm_blk_size := blk_size;
8578
END;
8679

87-
PROCEDURE dbm_update(VAR f : DBMFile);
88-
BEGIN
89-
IF (f.needupdate) AND (f.crecno <> 0) THEN BEGIN
90-
Seek(f.f, f.crecno * f.header.size);
91-
BlockWrite(f.f, f.crec, SizeOf(DBM_REC));
92-
BlockWrite(f.f, f.data^, f.rblk_size);
93-
END;
94-
f.needupdate := FALSE;
95-
END;
96-
97-
PROCEDURE dbm_go(VAR f : DBMFile; recno : LONGINT);
80+
FUNCTION dbm_go(VAR f : DBMFile; recno : LONGINT) : LONGINT;
81+
VAR r : LONGINT;
9882
BEGIN
99-
IF recno = f.crecno THEN EXIT;
100-
dbm_update(f);
101-
{ FillChar(f.data^, f.rblk_size, #0); }
102-
f.crec.next := 0;
103-
f.crec.size := 0;
104-
f.crecno := recno;
105-
Seek(f.f, recno * f.header.size);
106-
BlockRead(f.f, f.crec, SizeOf(DBM_REC));
107-
BlockRead(f.f, f.data^, f.rblk_size);
83+
r := recno * f.header.size;
84+
Seek(f.f, r);
85+
dbm_go := r;
10886
END;
10987

11088
PROCEDURE dbm_reset(VAR f : DBMFile; fname : STRING; blk_size : WORD);
@@ -119,30 +97,24 @@ BEGIN
11997
Close(f.f);
12098
dbm_rewrite(f, fname, blk_size);
12199
END ELSE IF (f.header.sign = DBM_SIGN) AND (f.header.size = rblk_size) THEN BEGIN
122-
f.rblk_size := f.header.size - SizeOf(DBM_REC);
123-
GetMem(f.data, f.rblk_size);
124-
FillChar(f.data^, f.rblk_size, #0);
100+
f.rblk_size := f.header.size - ADDED_DATA;
125101
END ELSE BEGIN
126102
Close(f.f);
127103
dbm_rewrite(f, fname, blk_size);
128104
END;
129105
END;
130106

131107
PROCEDURE _dbm_rewrite(VAR f : DBMFile);
108+
VAR i : INTEGER;
132109
BEGIN
133110
IF IsOpen(f.f) THEN BEGIN
134111
f.header.sign := DBM_SIGN;
135112
f.header.next := 0;
136113
f.header.records := 0;
137114
f.header.root := 0;
138-
f.crecno := 0;
139-
f.needupdate := FALSE;
140-
FillChar(f.crec, SizeOf(DBM_REC), #0);
141-
GetMem(f.data, f.rblk_size);
142-
FillChar(f.data^, f.rblk_size, #0);
143115
Seek(f.f, 0);
144116
BlockWrite(f.f, f.header, SizeOf(DBM_HDR));
145-
BlockWrite(f.f, f.data^, f.header.size - SizeOf(DBM_HDR));
117+
FOR i := 1 TO f.header.size - SizeOf(DBM_HDR) DO WriteByte(f.f, 0);
146118
END;
147119
END;
148120

@@ -152,7 +124,7 @@ BEGIN
152124
Assign(f.f, fname);
153125
ReWrite(f.f);
154126
f.header.size := norm_blk_size(blk_size);
155-
f.rblk_size := f.header.size - SizeOf(DBM_REC);
127+
f.rblk_size := f.header.size - ADDED_DATA;
156128
_dbm_rewrite(f);
157129
END;
158130

@@ -161,7 +133,7 @@ BEGIN
161133
FillChar(f, SizeOf(DBMFile), #0);
162134
ReWriteTemp(f.f);
163135
f.header.size := norm_blk_size(blk_size);
164-
f.rblk_size := f.header.size - SizeOf(DBM_REC);
136+
f.rblk_size := f.header.size - ADDED_DATA;
165137
_dbm_rewrite(f);
166138
END;
167139

@@ -173,11 +145,9 @@ END;
173145
PROCEDURE dbm_close(VAR f : DBMFile);
174146
BEGIN
175147
IF NOT IsOpen(f.f) THEN EXIT;
176-
dbm_update(f);
177148
Seek(f.f, 0);
178149
BlockWrite(f.f, f.header, SizeOf(DBM_HDR));
179150
Close(f.f);
180-
IF f.data <> NIL THEN FreeMem(f.data, f.rblk_size);
181151
FillChar(f, SizeOf(DBMFile), #0);
182152
END;
183153

@@ -187,12 +157,11 @@ BEGIN
187157
IF NOT IsOpen(f.f) THEN EXIT;
188158
WHILE rec <> 0 DO BEGIN
189159
dbm_go(f, rec);
190-
n := f.crec.next;
191-
f.crec.next := f.header.next;
192-
f.crec.size := 0;
193-
f.needupdate := TRUE;
160+
n := ReadDWord(f.f);
161+
dbm_go(f, rec);
162+
WriteDWord(f.f, f.header.next);
163+
WriteWord(f.f, 0);
194164
f.header.next := rec;
195-
FillChar(f.data^, f.rblk_size, #0);
196165
rec := n;
197166
END;
198167
END;
@@ -203,15 +172,12 @@ BEGIN
203172
IF f.header.next <> 0 THEN BEGIN
204173
r := f.header.next;
205174
dbm_go(f, r);
206-
f.header.next := f.crec.next;
175+
f.header.next := ReadDWord(f.f);
207176
END ELSE BEGIN
208177
Inc(f.header.records);
209178
r := f.header.records;
210179
END;
211180
dbm_go(f, r);
212-
f.crec.next := 0;
213-
f.crec.size := 0;
214-
f.needupdate := TRUE;
215181
dbm_alloc := r;
216182
END;
217183

@@ -222,8 +188,8 @@ BEGIN
222188
IF IsOpen(f.f) THEN BEGIN
223189
WHILE rec <> 0 DO BEGIN
224190
dbm_go(f, rec);
225-
Inc(r, f.crec.size);
226-
rec := f.crec.next;
191+
rec := ReadDWord(f.f);
192+
Inc(r, ReadWord(f.f));
227193
END;
228194
END;
229195
dbm_size := r;
@@ -237,19 +203,20 @@ BEGIN
237203
p := @b;
238204
WHILE (size <> 0) AND (rec <> 0) DO BEGIN
239205
dbm_go(f, rec);
240-
g := f.crec.size;
206+
rec := ReadDWord(f.f);
207+
g := ReadWord(f.f);
241208
IF g > size THEN g := size;
242-
Move(f.data^, p^, g);
209+
BlockRead(f.f, p^, g);
243210
Dec(size, g);
244211
Inc(p, g);
245-
rec := f.crec.next;
246212
END;
247213
END;
248214

249215
FUNCTION dbm_add(VAR f : DBMFile; VAR b; size : WORD) : LONGINT;
250216
VAR root, prec, crec : LONGINT;
251217
p : PCHAR;
252218
csize : WORD;
219+
i : INTEGER;
253220
BEGIN
254221
root := 0;
255222
IF IsOpen(f.f) THEN BEGIN
@@ -260,18 +227,20 @@ BEGIN
260227
IF root = 0 THEN root := crec;
261228
IF prec <> 0 THEN BEGIN
262229
dbm_go(f, prec);
263-
f.crec.next := crec;
264-
f.needupdate := TRUE;
230+
WriteDWord(f.f, crec);
265231
END;
266-
prec := crec;
267-
dbm_go(f, crec);
268232
csize := f.rblk_size;
269233
IF csize > size THEN csize := size;
270-
Move(p^, f.data^, csize);
271-
f.crec.size := csize;
272-
f.needupdate := TRUE;
234+
dbm_go(f, crec);
235+
WriteDWord(f.f, 0);
236+
WriteWord(f.f, csize);
237+
BlockWrite(f.f, p^, csize);
238+
IF f.rblk_size > csize THEN BEGIN
239+
FOR i := 1 TO f.rblk_size - csize DO WriteByte(f.f, 0);
240+
END;
273241
Dec(size, csize);
274242
Inc(p, csize);
243+
prec := crec;
275244
END;
276245
END;
277246
dbm_add := root;
@@ -282,12 +251,11 @@ VAR crec : LONGINT;
282251
BEGIN
283252
IF NOT IsOpen(f.f) THEN EXIT;
284253
dbm_go(f, rec);
285-
crec := f.crec.next;
286-
f.crec.next := 0;
287-
f.crec.size := 0;
288-
f.needupdate := TRUE;
289-
dbm_free(f, crec);
254+
crec := ReadDWord(f.f);
290255
dbm_go(f, rec);
256+
WriteDWord(f.f, 0);
257+
WriteWord(f.f, 0);
258+
dbm_free(f, crec);
291259
dbm_free(f, rec);
292260
dbm_add(f, b, size);
293261
END;

EXCACHE.PAS

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ BEGIN
120120
lookup_recno := r;
121121
END;
122122

123-
FUNCTION lookup_free(c : PEXCACHE) : INTEGER;
123+
PROCEDURE lookup_free(c : PEXCACHE);
124124
VAR i, r : INTEGER;
125125
BEGIN
126126
r := c^.size;
@@ -132,7 +132,7 @@ BEGIN
132132
END;
133133
Inc(i);
134134
END;
135-
lookup_free := r;
135+
make_top(c, r);
136136
END;
137137

138138
FUNCTION excache_get(c : PEXCACHE; recno : LONGINT; VAR b; VAR count : WORD) : BOOLEAN;
@@ -155,7 +155,7 @@ BEGIN
155155
IF c = NIL THEN excache_put := FALSE
156156
ELSE IF c^.h = 0 THEN excache_put := FALSE
157157
ELSE BEGIN
158-
IF NOT lookup_recno(c, recno) THEN make_top(c, lookup_free(c));
158+
IF NOT lookup_recno(c, recno) THEN lookup_free(c);
159159
c^.items[1].recno := recno;
160160
c^.items[1].count := count;
161161
c^.items[1].is_busy := TRUE;

0 commit comments

Comments
 (0)