実験

ここでは各RTCが独立した実行コンテキストで実行される場合(非同期並列実行)、複合コンポーネントの実行コンテキストで直列に実行される場合、MultipleOrderedECで複合コンポーネントの実行順序を設定して実行する場合(同期順序指定実行)を比較します。

実験用に以下のRTシステムを作成しました。

この内、Rotate、Translate、FlipmScale、SepiaはOpenRTM-aistに付属している画像処理サンプルRTCです。
ImageOutput0、ImageOutput1はコンフィギュレーションパラメータで指定した画像ファイルの画像データを出力するRTCです。
TestImageはin0、in1の両方に入力があった場合に、前回の両方に入力があったときからの時間を測定するRTCです。

このRTシステムはImageOutput0、ImageOutput1から256×256pixelの画像データを出力してTestImageの両方のDataInportにデータが到達するまでの時間を測定するためだけに作成したものです。

同期順序指定実行の実行順序は以下のように設定しました。

以下が実験結果です。TestImageで1000回時間を計測して平均を出しています。括弧内は実行コンテキストの実行周期です。

非同期実行(1000Hz) 0.032022
非同期実行(100Hz) 0.020500
同期直列実行(1000Hz) 0.010008
同期順序指定実行(1000Hz) 0.008004

非同期実行ではImageOutput0、ImageOutput1以外のRTCで実行周期を大幅に超過するものがあるため、ImageOutput0、ImageOutput1の実行回数が増えてCPUへの負荷が大きくなっているみたいです。
100Hzに実行周期を設定すると多少ましにはなりますが、それでもin0側とin1側の実行が同期していないので、in0側の実行回数が多くなってCPUへの負荷が大きくなるみたいです。

同期直列実行より同期順序指定実行の方が時間が短いですが、これはin0側とin1側が並列に実行されている分だと思います。

ただ、低スペックのPCだからこの結果になったのであって、コア数の多いPCならば非同期実行も速いと思います。

効率よく使おうと思ったらMultipleOrderedECを使えば良いのであって、使わなくてもいい場合もあります。