プロジェクト

全般

プロフィール

調査 #4156

未完了

ダイレクトデータポート接続のデータ転送が遅い問題

n-miyamoto さんが7年以上前に追加. 7年以上前に更新.

ステータス:
新規
優先度:
通常
担当者:
-
対象バージョン:
開始日:
2017/08/15
期日:
進捗率:

0%

予定工数:

説明

同一プロセス内でのdirect接続とcorba_cdr接続を比較した結果、corba_cdr接続の方が圧倒的に速いようなので原因の調査を行う。

以下はTimedOctetSeq型のデータで配列のサイズを徐々に大きくした場合の結果


ファイル

directvscorba_cdr.png (27.5 KB) directvscorba_cdr.png n-miyamoto, 2017/08/15 18:22
directvscorba_cdr2.png (20.8 KB) directvscorba_cdr2.png n-miyamoto, 2017/08/16 12:28

n-miyamoto さんが7年以上前に更新

InPort.hのwrite関数内で変数を代入する部分(m_value = data;)で時間を要しているため、以下のようにメモリをコピーすればかなり高速にはなります。


    virtual void write(const DataType& data)
    {

      Guard guard(m_valueMutex);
      DataType& data_ptr = const_cast<DataType&>(data);
      void* tmp = (void*)malloc(sizeof(DataType));

      //m_value = data;
      memcpy(tmp, &m_value, sizeof(DataType));
      memcpy(&m_value, &data, sizeof(DataType));
      memcpy(&data_ptr, tmp, sizeof(DataType));
      free(tmp);

      m_directNewData = true;
    }


※説明に載せているグラフと結果が違いますが、これは変数を値渡しにしている関数があったのが原因なのでこちらのデータが正しい結果です。

void Analyzer::writeData(RTC::TimedOctetSeq data)
{
→
void Analyzer::writeData(const RTC::TimedOctetSeq &data)

他の形式にエクスポート: Atom PDF