RPG

334. パフォーマンス監視リストの使い方 (3)

それではいよいよパフォーマンスのモニターを開始しよう。

  1. STRPEX でモニターを開始する。

    コマンド入力行にセッション ID: AUTOWEB に対して

    STRPEX SSNID(AUTOWEB) DFN(AUTOWEB) + [実行キー]
    

    何もエラーが出力されなければモニター開始は OK である。

  2. 実際にモニター対象のプログラムを動作させてみる。

    実際にプログラムを操作させてみる。
    改善効果を調べるには改善テストのために繰り返す操作は同じ操作に
    しなければならない。
    後でパフォーマンス報告書の内容を改善前と後を比較してみても
    同じ操作で比較しないと比較にならないからである。

  3. ENDPEX でモニターを終了する。

    コマンド入力行において

    ENDPEX SSNID(AUTOWEB) RPLDTA(*YES) + [実行キー]
    

    でモニターを終了する。

  4. パフォーマンス監視リスト( PERFORMANCE EXPLORER )を
    印刷する

    PRTPEXRPT MBR(AUTOWEB) TYPE(*PROFILE) PROFILEOPT(*SAMPLECOUNT *PROCEDURE) TASKINF(*NONE)
    

    によって報告書を印刷する。

次が報告書の一部である。

                                      PERFORMANCE EXPLORER 報告書    
                                                      :
           ヒストグラム      ヒット   ヒット   CUM    開始             マップ     STMT    名前
                       CNT   %     %     アドレス            フラグ      番号       
*****************      208  47.7  47.7 37813A914E009A80   SS        11  VTBASE5_D  VTBASE5/IsWEBENV         
             ****       51  11.7  59.4 0D6A29F521019F88   SS         0  VT5250_D   VT5250/Data              
                *       22   5.0  64.4 032B8EC71A013894   SS        21  CVT5250_D  CVT5250/setItem          
                *       18   4.1  68.6 032B8EC71A010AEC   SS        16  CVT5250_D  CVT5250/replace_         
                        11   2.5  71.1 032B8EC71A021920   SS        44  CVT5250_D  CVT5250/setText          
                         9   2.1  73.2 37813A914E011C78   SS         0  VTBASE5_D  VTBASE5/to_UTF8sub       
                         8   1.8  75.0 032B8EC71A00F7EC   SS         1  CVT5250_D  CVT5250/memstr           
                         8   1.8  76.8 032B8EC71A0352D0   SS       146  CVT5250_D  CVT5250/sendHTML         
                         7   1.6  78.4 37813A914E011610   SS         3  VTBASE5_D  VTBASE5/doIconvSISO      
                         6   1.4  79.8 0D6A29F52102A95C   SS        92  VT5250_D   VT5250/receiveDisplay    
                         6   1.4  81.2 032B8EC71A02D95C   SS         0  CVT5250_D  CVT5250/Data             
                         5   1.1  82.3 37813A914E01D754   SS         0  VTBASE5_D  VTBASE5/from_UTF8sub     
                         4   0.9  83.3 032B8EC71A036398   SS        11  CVT5250_D  CVT5250/Cvt5250          
                         4   0.9  84.2 37813A914E011B1C   SS         2  VTBASE5_D  VTBASE5/doIconv          
                         4   0.9  85.1 37813A914E009808   SS         0  VTBASE5_D  BINDERGLUEMOD/_BN_EXT_CAL
                         4   0.9  86.0 37813A914E00EFFC   SS         0  VTBASE5_D  VTBASE5/getColorCode     
                         4   0.9  86.9 032B8EC71A013504   SS         3  CVT5250_D  CVT5250/calcDDSFieldPos  
                         4   0.9  87.8 032B8EC71A00E994   SS         0  CVT5250_D  BINDERGLUEMOD/_BN_EXT_CAL
                         3   0.7  88.5 032B8EC71A01E394   SS         0  CVT5250_D  CVT5250/nextDynamicTag   
                         3   0.7  89.2 032B8EC71A032DD8   SS        38  CVT5250_D  CVT5250/addMenuItem      
                         2   0.5  89.7 0D6A29F5210155D4   SS        23  VT5250_D   VT5250/FieldStart        
                         2   0.5  90.1 37813A914E010FEC   SS        16  VTBASE5_D  VTBASE5/RtvDspfFkeys     
                         2   0.5  90.6 37813A914E0124BC   SS         1  VTBASE5_D  VTBASE5/to_UTF8          
                         2   0.5  91.1 0D6A29F52102D224   SS        75  VT5250_D   VT5250/main              
                         2   0.5  91.5 37813A914E00F2C4   SS         4  VTBASE5_D  VTBASE5/GetWEBENV        
                         2   0.5  92.0 29E10FAB6F004E88   SS       211  RTVDSPKW_D RTVDSPKW/getFieldInfo    
                         2   0.5  92.4 0D6A29F5210145E8   SS         0  VT5250_D   VT5250/InsertCursor      
                         2   0.5  92.9 032B8EC71A01BD54   SS       227  CVT5250_D  CVT5250/setField         
                         2   0.5  93.3 032B8EC71A019F7C   SS         0  CVT5250_D  CVT5250/createFLDStyle   
                         1   0.2  93.6 37813A914E021730   SS        25  VTBASE5_D  VTBASE5/to_ASCID         
                         1   0.2  93.8 032B8EC71A02AC78   SS         0  CVT5250_D  BINDERGLUEMOD/_BN_EXT_CAL
                         1   0.2  94.0 032B8EC71A010898   SS         0  CVT5250_D  BINDERGLUEMOD/_BN_EXT_CAL
                         1   0.2  94.3 032B8EC71A00DB7C   SS        67  CVT5250_D  CVT5250/INZSR            

この報告書で重要であるのは ヒット% という欄であり最上位の「VTBASE5 / IsWEBENV」
つまり VTBASE5 という名前のサービス・プログラムの IsWEBENV という関数の実行に
全体の 47.7% の時間が費やされていることがわかる。
端的に言えば実行時間の約半分近くが IsWEBENV という関数の処理に費やされている
ことになる。
そこでこの後 IsWEBENV の内部処理のパフォーマンス・チューニングを行ったところ
大幅な時間短縮を計ることができました。
さらに再統計して次々と問題のある関数を発見してパフォーマンスを向上させることに
成功した。
このパフォーマンス監視リストを利用することによって開発者の感覚的なものに
頼るのではなく具体的にパフォーマンスに問題のある関数(プロシージャー)を
数字を示して抽出できたことは科学的なアプローチによるパフォーマンス・チューニング
であると言える。
この方法にパフォーマンス・チューニングによる効果は大きくプログラム・ロジックを
変えずにパフォーマンスだけを向上させることができるのだからこれほどよい手法はない。

最後にこの例は弊社の C 言語によるプログラムで実験した結果であるが ILE-RPG でも
同じような結果が得られるはずである。
現在の WRKACTJOB の実行スタックは ILE のプロシージャー単位が実行スタックである。
ILE-RPG が発表されたのは何と 15 年以上前の Ver3.2 のころである。
RPG Ⅲ の資産が多いのは理解できるが新規の開発はやはり ILE-RPG とすべきだろう。