Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
1
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

@ushiday

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

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からストリームファイルを読み込む時などに役立ちそうですね。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
1
Help us understand the problem. What are the problem?