V7R1からは、RTNPARMオプションをプロシージャに使用する事で、割合大きめサイズの戻り値を返す際にパフォーマンスで有利になるようなので検証してみました。
特に、戻り値の最大サイズは大きいが、実際に返す値が小さい時に有利に働くようです。
サンプルは、1000万回ループで、大きめサイズの戻り値に、3バイトの文字列を返してみました。
USR407.rpgle
H****************************************************************
H*-------------------------------*
H*----<<日付・著作権 >>-----*
H*-------------------------------*
H DATEDIT(*YMD)
H COPYRIGHT('(C) ushiday - ')
H*-------------------------------*
H*----<<コンパイル条件 >>-----*
H*-------------------------------*
H DFTACTGRP(*NO) ACTGRP(*NEW)
D*
D print PR EXTPROC('print') 標準出力関数
D msg 1000A VARYING CONST
D*定数
D MAX_COUNT C 10000000
D*変数
D RTN_STR S 65535A INZ
D*カウンタ
D IX S 9S 0 INZ
D*タイムスタンプ
D WTIMESTAMP_S S Z
D WTIMESTAMP_E S Z
C*-------------------------------*
C*----<<メインルーチン >>-----*
C*-------------------------------*
/FREE
print ( '---- PROGRAM START ----') ;
WTIMESTAMP_S = %TIMESTAMP() ;
FOR IX = 1 TO MAX_COUNT;
RTN_STR = GET_STRING1();
ENDFOR ;
WTIMESTAMP_E = %TIMESTAMP() ;
print ( 'RTNPARMなしは'
+ %CHAR(%DIFF(WTIMESTAMP_E : WTIMESTAMP_S : *SECONDS ) )
+ '秒かかりました');
WTIMESTAMP_S = %TIMESTAMP() ;
FOR IX = 1 TO MAX_COUNT;
RTN_STR = GET_STRING2();
ENDFOR ;
WTIMESTAMP_E = %TIMESTAMP() ;
print ( 'RTNPARMありは'
+ %CHAR(%DIFF(WTIMESTAMP_E : WTIMESTAMP_S : *SECONDS ) )
+ '秒かかりました');
EXSR @END ;
//終了
BEGSR @END ;
print ( '---- PROGRAM END ----') ;
*INLR = *ON ;
RETURN ;
ENDSR ;
/END-FREE
P****************************************************************
P** < GET_STRING1 >: 文字列取得RTNPARMなし **
P****************************************************************
P GET_STRING1 B
D GET_STRING1 PI 65535A VARYING
D*----<<変数定義 >>-----*
/FREE
RETURN 'ABC' ;
/END-FREE
P E
P****************************************************************
P** < GET_STRING2 >: 文字列取得RTNPARMあり **
P****************************************************************
P GET_STRING2 B
D GET_STRING2 PI 65535A VARYING
D RTNPARM
D*----<<変数定義 >>-----*
/FREE
RETURN 'ABC' ;
/END-FREE
P E
実行時間は、約半分になりました。IFSからストリームファイルを読み込む時などに役立ちそうですね。