(前頁)<<      >>(次頁)          (Up)

5章 要素モデルの計算速度調整
      〜 その他 〜


 
(5)その他

 その他 計算速度に関連すると思われる項目について触れます。
 
  計算中にSleep を行うことは無いと思いますが、試しに Sleep 時間を0に設定して System.Threading.Thread.Sleep を呼ぶだけでもかなりの時間ロスになります。
 例えば、Calculateメソッド内に下記メソッドを追加してみます。 Sleep時間ゼロとしてSystem.Threading.Thread.Sleep( ) メソッドをコールする場合と、 System.Threading.Thread.Sleep( ) メソッドを コメントアウトした場合との比較を行なってみます。 
 
protected override long Calculate(long lInputDataNum, ref McReceiveCellDataIF[] csInputCellData)
{
           for (long i = 0; i < 1000; i++)
            {
                System.Threading.Thread.Sleep(0);
            }
}

 要素モデルを1個とし、計算期間を1ヶ月として計算した場合、計算に要する時間を測定すると以下の様な結果が得られました。

コーディング

 計算時間(秒)

System.Threading.Thread.Sleep( 0 )

  46秒

// System.Threading.Thread.Sleep( 0 )  <-- コメントアウト

 <2秒



 スリープ時間ゼロなので 影響無いと思われるかもしれませんが、実際には相当の影響があります。
 実際のコーディングの場合には、実際にテストしてみると思いもよらない所で 時間を消費している箇所が発見できるかもしれません。



 その他、Calculate()、DataFusion() の中で毎回同じ判定等が行われる場合には、最初に呼ばれる ReceiveConnectionCheck()、SendConnectionCheck() メソッド内で判定を行っておき、繰り返し計算中に呼ばれる、Calculate()、DataFusion() メソッド内では、その結果を使用する等の工夫が必要かもしれません。
 
 例として、CommonMPでダウンロードした時に一緒にダウンロードされる 「\CommonMP\Source\HYMCO\OptionImpl\McModelSample」内の 「McSampleKinematicWave」 クラスは ReceiveConnectionCheck()、SendConnectionCheck() 内で、各接続線が どの受信パターン/送信パターンに対応するかを調べておき、Calculate()、DataFusion()内では、その結果を使用する様にコーディングされています。 元々のソースは、同ファイル内の「McPrimitiveKinematicWave.cs」にあります。

 


 この章で作成した要素モデル開発プロジェクト(Ex10_MyExerciseModel.lzh

 ダウンロードしたら解凍して生成されたフォルダー「MyExerciseModel」を \CommonMP\Source\HYMCO\OptionImpl\ 下に置きます。   
 解凍して生成されたプロジェクト:MyExerciseModel.csproj を ディバッグ用ソリューションに追加し、スタートアッププロジェクト(TestModelDeveloperMainExp)の依存関係に追加します。

 

 またテスト用のCommonMP計算プロジェクト(Ex10_MyExerciseStep1.lzh

 解凍して生成された、「MyExerciseStep1」フォルダーを \CommonMP\CommonMPData\ 下に置きます。

 




(前頁)<<      >>(次頁) 

初版:2013/06/29 |