I have resolved the issue. Did a series of timing tests to solve the issue.
First determined that the following was using a binary lookup.
dcl-ds ExcTariffDs Based(ptrExcTariffDs);
ExcTariffArr Dim(32766) Ascend;
Exchange Zoned(6:0) Overlay(ExcTariffArr:*Next);
Tariff Char(3) Overlay(ExcTariffArr:*Next);
end-ds;
Doing 100,000 loops doing 5 lookups over 2,300 items loaded in a sorted
order. It took 119 microseconds per loop without the ASCEND keyword. Put
the ASCEND keyword on the declaration and it took 5 microseconds per loop
so clearly it is doing a binary search.
I also, determined that the following does not do a binary lookup.
Hopefully IBM will be providing a way to specify the ASCEND keyword on a
data structure with the DIM keyword. It took 120 microseconds per loop.
dcl-ds ExcTariffDs Qualified Dim(32766) Based(ptrExcTariffDs);
Exchange Zoned(6:0);
Tariff Char(3);
end-ds;
Idx - %Lookup(971153: ExcTariffDs.Exchange:1:LoadedCount);
// four more lookup.
I also did a binary search using the "bsearch" C Api and it took 3
microseconds per loop so the C api seems to be the fastest.
Partial code
dcl-pr FindBinaryApi Pointer
ExtProc('bsearch');
PR_PtrLookForValue Pointer
Value;
PR_PtrArrayElement Pointer
Value;
PR_NumberOfElements Uns(10)
Value;
PR_SizeOfEachElement Uns(10)
Value;
PR_PtrCompareProcedure Pointer(*Proc)
Value;
end-pr;
dcl-ds TD_ExcTariffDs Qualified
Template;
Exchange
Zoned(6:0);
Tariff
Char(3);
end-ds;
dcl-ds ExcTariffDs LikeDs(TD_ExcTariffDs)
Dim(32766)
Based(ptrExcTariffDs);
dcl-ds LookFor LikeDs(TD_ExcTariffDs);
LookFor.Exchange = InLookFor;
Return FindBinaryApi(%Addr(LookFor):
ptrExcTariffDs:
g_LoadedCount:
%Size(TD_ExcTariffDs):
%PAddr('BSEARCHCOMPARE'));
end-proc;
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
* BSearchCompare
* Binary Search Compare Routine.
* In - Pointer to Look for Value Mapped to Look For
* Pointer to Array Element Mapped to Array Element
* In/Out - None
* Out - None
* Returns - Result of Compare
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
dcl-proc BSearchCompare;
dcl-pi *N Int(10);
InLookFor LikeDs(TD_ExcTariffDs) Const;
InArrayElement LikeDs(TD_ExcTariffDs) Const;
end-pi;
dcl-c LESS_THAN -1;
dcl-c EQUAL_TO 0;
dcl-c GREATER_THAN 1;
// Note: Values are passed as pointers by value so
// changing to by const is same thing.
Select;
When InLookFor.Exchange < InArrayElement.Exchange;
Return LESS_THAN;
When InLookFor.Exchange > InArrayElement.Exchange;
Return GREATER_THAN;
When InLookFor.Exchange = InArrayElement.Exchange;
Return EQUAL_TO;
EndSl;
end-proc;
On Fri, Nov 27, 2015 at 5:21 PM, Jon Paris <jon.paris@xxxxxxxxxxxxxx> wrote:
Yup - Ascend/Descend is a promise by _YOU_ that the data will be in
sequence. Not by IBM.
On Nov 26, 2015, at 6:08 PM, Booth Martin <booth@xxxxxxxxxxxx> wrote:
Thank you for the response. It cleared my confusion. My confusion laid
with the ASCEND/DESCEND keyword. It never dawned on me that IBM would
allow an ASCEND/DESCEND array to be populated in any order other than as
defined.
On 11/26/2015 8:32 AM, Jon Paris wrote:
No idea where you got that idea Booth. It has always worked the same
way as LOOKUP _except_ when Ascend/Descend is specified and then it
switches to binary search.
See this
http://www.ibmsystemsmag.com/ibmi/developer/rpg/iSeries-EXTRA--Look-Before-You--Lookup/
from 2002.
--
This is the RPG programming on the IBM i (AS/400 and iSeries) (RPG400-L)
mailing list
To post a message email: RPG400-L@xxxxxxxxxxxx
To subscribe, unsubscribe, or change list options,
visit: http://lists.midrange.com/mailman/listinfo/rpg400-l
or email: RPG400-L-request@xxxxxxxxxxxx
Before posting, please take a moment to review the archives
at http://archive.midrange.com/rpg400-l.
Jon Paris
www.partner400.com
www.SystemiDeveloper.com
--
This is the RPG programming on the IBM i (AS/400 and iSeries) (RPG400-L)
mailing list
To post a message email: RPG400-L@xxxxxxxxxxxx
To subscribe, unsubscribe, or change list options,
visit: http://lists.midrange.com/mailman/listinfo/rpg400-l
or email: RPG400-L-request@xxxxxxxxxxxx
Before posting, please take a moment to review the archives
at http://archive.midrange.com/rpg400-l.
As an Amazon Associate we earn from qualifying purchases.