Many of these tips I have learnt over the years and quite a lot have been sent to me by interested parties around the world. A big thank you to you all.
I will publish the complete documents on the 2E wiki (soon) with full acknowledgements. (See my links section below).
In the meantime I will publish some selected extracts on this blog just to get your thought processes flowing.
Performance
There are many considerations when programming for performance in CA 2e. A few are highlighted here. This is by no means an exhaustive list. My next technical post will relate to Defensive Programming techniques......
I'd be interested to hear of others from the community in general and would be happy to include them on this blog and the final wiki document.
Drop unused relations where possible and set others to appropriate level. i.e. OPTIONAL or USER etc. This cuts down unneccessary code and processing as well as making your action diagrams more easily navigable.
Avoid FLD for passing parameters for non command line type programs. Will use less PAGs.
Tactically use *QUIT to reduce I/O. Especially when programs have lots of nested validation logic. Very useful when validating. Use the *QUIT inside subroutines to halt further processing. Provides cleaner message feedback to end user and reduces response times.
Avoid Dynamic Selection Access Paths.
Avoid Virtuals, especially Virtuals with relations to files with Virtuals. Virtuals have their place. Query access paths or in scenarios where they are always used. Best practice in this area is to avoid virtuals and to get data as appropriate.
Ensure programs do not close down if called iteratively.e.g. in a loop or inside USER: Process Record etc for a RTVOBJ or PRTFIL etc. Typically used for externalised RTVOBJs.
Consider sharing ODPs.(Open Data Paths)
Consider usage of shared subroutines. Minimise the amount of code and reduces object size and makes debugging easier.
Consider usage of Null Update Suppression within your CHGOBJs. Very useful for batch programs.
Avoid unnecessary selector/position fields on subfile selectors.
Avoid contains (CT) selection on control panels
Ensure arrays are appropriately sized. Too large they will consume more memory.
Reduce file I/O by loading small reference files that are regularly read into arrays upon opening the program. Good examples here wsould be files like TRANSACTION TYPE or XYZ RULES.
Reduce I/O by only getting reference data only on key change. This will depend on the chosen access path of course.
When writing to an IFS write fewer larger chunks of data rather than multiple small chunks. Overhead is opening, positioning and closing the IFS file.
Pass reference data down through call stack rather than re-retrieve in the lower level function.
Consider physical file access paths for fix programs (version 7.0+) or write SQL to perform the basic updates.
Use OS/400 default values to initialise fields on a database file rather than write a program.
CHG/CRT v CRT/CHG. Use the appropriate one depending on likelihood of the records existence.
Avoid *CONCAT and *SUBSTRING native in 2e for long string manipulation. If concatenating for long strings it is possible to keep a counter of where you are to save the concatenation operation time to identify the current position in the string.
Avoid RTV message to build strings with high usage.
Consider DSPFIL instead of DSPTRN, especially true if de-normalisation is designed in the database with any total duplicated into the header record.
Do not perform a *RTVCND for blanks. Check for blank first in the action diagram.
Consider a database file field for *RTVCND if approriate.
Be aware of the affect of a scan limit for strict selection criteria as the screen will not pause load processing until the subfile if full or EOF reached. Particularly for large files.
Consider the naming conventions of your access paths to ensure that underlying indexes can be shared when key subsets are apparent and ensure that are built and implemented in the correct order to reduce indexes.
Ensure access paths have correct maintenance option i.e. *IMMED, *DLY or *REBLD.
Thanks for reading.
Lee.