Today I was troubleshooting the performance of calling a procedure (CallThis.p) in a loop that had an INPUT-OUTPUT dataset:

{app/Production/Maintenance/Bom/Assembly/AsmBomData.i } 
 

DEFINE INPUT-OUTPUT  PARAMETER DATASET FOR DS_AsmBom.

I *always* call this procedure with "BY-REFERENCE" like so:

         RUN app/Production/ReadBomHeader.p ( 
            INPUT-OUTPUT DATASET DS_AsmBom BY-REFERENCE).

Given that I always call the procedure with a BY-REFERENCE dataset, it didn't seem important that the dataset declared in the called program, CallThis.p, was defined without using the additional keyword "REFERENCE-ONLY".  IE. I assumed that the runtime would skip over the redundant dataset in CallThis.p.  It isn't needed when another "BY-REFERENCE" dataset has been provided as a parameter.

However it turns out that there is a penalty that is paid by omitting REFERENCE-ONLY.  It appears to be about a tenth of a millisecond on every call to the procedure.  Perhaps the runtime is still allocating and disposing of the additional dataset .  This is something to remember when calling a procedure numerous times with a "BY-REFERENCE" data parameter!  You may want still want to modify the program that is being called - so that it never allocates its own data.