Project

General

Profile

調査 #4156

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

Added by n-miyamoto about 4 years ago. Updated about 4 years ago.

Status:
新規
Priority:
通常
Assignee:
-
Start date:
08/15/2017
Due date:
% Done:

0%

Estimated time:

Description

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

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

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

History

#1 Updated by n-miyamoto about 4 years ago

2532

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)

Also available in: Atom PDF