|
Performance Questions:
We are resequencing our employee numbers. This requires me to read all
the records in a file and, for every field containing employee number,
see if the number is to be converted. If so, the field is changed, and
the record updated.
Initially, I chained to the conversion file (containing the before and
after employee numbers).
This takes a long time to run (especially over a General Ledger
detail with 100 000 000 records), and we have a limited amount of
downtime in which to run the conversion, so we started looking
for areas that could be optimized.
As a first step, rather than chaining to the conversion file, I
loaded the entire thing into the heap, and used a binary search
to find my conversion values (see note 2):
The version using binary search and the heap runs in *half* the
time of the version using the chain (verified using Performance
Explorer).
My question is why? My conversion file is less than 130K, and we've
got roughly 5G memory - why doesn't the operating system cache the
conversion file, rather than forcing me to do so explicitly?
TIA,
Chris Pando
Notes: (best viewed w/ fixed font)
(note 1)
Read input bufferDS;
DoW (Not %Eof(input));
change = *Off;
For $I = 1 to fldCnt;
QDAID = %SubSt( bufferDS : fldOff($I) : 8 );
Chain QDAID fy81503;
If ( %Found(fy81503) );
%SubSt( bufferDS : fldOff($I) : 8 ) = QDACID;
Change = *On;
EndIf;
EndFor;
If ( change );
Update input bufferDS;
EndIf;
Read input bufferDS;
EndDo;
Rather than use an externally defined file, I read the file
into a an array named buffer (overlaying the data structure
bufferDS).
I have an array named fldOff containing the offset within the
buffer for each field that can contain employee number. The
file FY81503 contains two fields:
QDAID Employee Number, before
QDACID Employee Number, after
(note 2)
Read input bufferDS;
DoW (Not %Eof(input));
change = *Off;
For $I = 1 to fldCnt;
$$@ = bsearch( %Addr(buffer(fldOff($I)))
: heap@
: frmCnt
: 16
: %PAddr('BSEARCHCOMP')
);
If ( $$@ <> *NULL );
change = *On;
%SubSt( bufferDS : fldOff($I) : 8 ) = $$ACID;
EndIf;
EndFor;
If ( change );
Update input bufferDS;
EndIf;
Read input bufferDS;
EndDo;
$$@ is defined as:
d ds Based($$@)
d $$AID 1 8
d $$ACID 9 16
bsearchcomp() is defined as:
p bSearchComp b
d pi 10i 0
d a@ * Value
d b@ * Value
/free
return memcmp( a@
: b@
: 8
);
/end-free
p bSearchComp e
I loaded the heap like this:
heap@ = %Alloc(HEAPALLOCSIZE);
$$@ = heap@;
Read fy81503;
DoW ( Not %Eof(fy81503) );
frmCnt = frmCnt + 1;
$$AID = QDAID;
$$ACID = QDACID;
$$@ = $$@ + 16;
Read fy81503;
EndDo;
As an Amazon Associate we earn from qualifying purchases.
This mailing list archive is Copyright 1997-2025 by midrange.com and David Gibbs as a compilation work. Use of the archive is restricted to research of a business or technical nature. Any other uses are prohibited. Full details are available on our policy page. If you have questions about this, please contact [javascript protected email address].
Operating expenses for this site are earned using the Amazon Associate program and Google Adsense.