LoginSignup
1
1

More than 5 years have passed since last update.

RTNPARMによるパフォーマンス検証

Posted at

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

●実行結果
2015-12-11_184403.png

実行時間は、約半分になりました。IFSからストリームファイルを読み込む時などに役立ちそうですね。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1