前のトピック: ケース スタディ 17: 組み込み機能

次のトピック: ケース スタディ 19: ファイル ベースのデータ ソースの場合のアダプタ ウィザード

ケース スタディ 18: 登録

ビジネス ロジックは、計算中に使用されるメトリックのリソース構造体のマップを維持するように多くの場合記述されます。 リソース構造体は時間の経過に従って変更されるため、そのようなビジネス ロジックは、リソース構造体が変更されたときに、マップ内の構造体を更新する必要があります。

リソース構造体が変更されると、OnRegistration メソッドが呼び出されます。このメソッドは、リソース構造体の変更に伴う登録およびクラスタの変更に対応するエンジンの動作の管理を担っているためです。 リソース構造体が変更されるたびにこのメソッドが呼び出されることは、前述のマップの更新を行うためには良いタイミングです。 ただし、マップを満たすことは登録処理とは無関係です。 これは、マップを満たすために OnRegistration 関数のパフォーマンスが悪化することを意味します。 通常、これは頻繁には発生しないため、実行中は重要ではありません。 ただし、OnRegistration メソッドは、エンジンのインフラストラクチャ処理プロセス中にも呼び出されます。このプロセスでは、そのインスタンスが担当する特定の各メトリックの登録に、リソース構造体の変更が関連しているかどうかをシステムが判別します。 このプロセスでは、構造体の変更が現在のメトリックに関連していなくても、リソース構造体のすべての変更に対して OnRegistration メソッドが呼び出されます。 これは、1 つのメトリックでこのメソッドが大量に呼び出される場合があることを意味します。

そのようなロジックが OnRegistration メソッドに実装されていると、実行中のパフォーマンスが少し低下することにより、インフラストラクチャ処理中のパフォーマンスが非常に大きく低下する場合があります。

この問題を解決するために、リソース構造体の変更が発生したときに行う必要があるが登録に関連しないマップの設定およびその他の初期化を、以下の 2 つの方法で行うことができます。

ディスパッチャ オブジェクトの IsRunTimeMode プロパティを使用する

このプロパティを使用すると、現在の実行が計算の実行であるかどうかを判別して、実行中にのみ実行される「if」ステートメントに、登録に関連しないロジックを埋め込むことができます。

以下の例で、青でマークされている部分は、登録に関連していて、常に実行する必要があるビジネス ロジックの部分です。 緑でマークされている部分は、登録に関連しておらず、新しい「if」ステートメントに埋め込むことができます。

Sub OnRegistration (dispatcher)
     Dim MyResource
     MyResource = Context.ClusterItem
     Dispatcher.RegisterByResource “OnEvent”, “My Event Type”, MyResource
     Dim ThisResourceMap
     Set GlobalResourceVector= CreateObject("SlalomVector.Vector")
     Dim resource
     Set ThisResourceMap = Context.ResourcesOfResourceGroup(Context.ClusterItem)
     For Each resource In ThisResourceMap
          GlobalResourceVector.Add resource
     次へ
End Sub

このコードは、以下のように変更することにより改善できます。

Sub OnRegistration (dispatcher)
     Dim MyResource
     MyResource = Context.ClusterItem
     Dispatcher.RegisterByResource “OnEvent”, “My Event Type”, MyResource
     If Dispatcher.IsRunTimeMode Then
          Dim ThisResourceMap
          Set GlobalResourceVector= CreateObject("SlalomVector.Vector")
          Dim resource
          ThisResourceMap = Context.ResourcesOfResourceGroup(Context.ClusterItem)
          For Each resource In ThisResourceMap
               GlobalResourceVector.Add resource
          Next
     End If
End Sub

OnResourceStructureChanged メソッドを使用する

このメソッドは OnRegistration メソッドの直後に実行されるため、元の方法と同じ機能が提供されますが、実行中にのみ実行されます。 このメソッドは、インフラストラクチャ処理では呼び出されないため、パフォーマンスは損なわれません。

以下の例で、青でマークされている部分は、登録に関連していて、OnRegistration メソッドに残す必要があるビジネス ロジックの部分です。 緑でマークされている部分は、登録に関連しておらず、新しい関数に移動できます。

Sub OnRegistration (dispatcher)
     Dim MyResource
     MyResource = Context.ClusterItem
     Dispatcher.RegisterByResource “OnEvent”, “My Event Type”, MyResource
     Dim ThisResourceMap
     Set GlobalResourceVector= CreateObject("SlalomVector.Vector")
     Dim resource
     Set ThisResourceMap = Context.ResourcesOfResourceGroup(Context.ClusterItem)
     For Each resource In ThisResourceMap
          GlobalResourceVector.Add resource
     Next
End Sub

このコードは、以下のように変更することにより改善できます。

Sub OnRegistration (dispatcher)
     Dim MyResource
     MyResource = Context.ClusterItem
     Dispatcher.RegisterByResource “OnEvent”, “My Event Type”, MyResource
End Sub

Sub OnResourceStructureChanged(time)
     Dim ThisResourceMap
     Set GlobalResourceVector= CreateObject("SlalomVector.Vector")
     Dim resource
     Set ThisResourceMap = Context.ResourcesOfResourceGroup(Context.ClusterItem)
     For Each resource In ThisResourceMap
          GlobalResourceVector.Add resource
     Next
End Sub