調査 #4156
ダイレクトデータポート接続のデータ転送が遅い問題
Start date:
08/15/2017
Due date:
% Done:
0%
Estimated time:
Description
同一プロセス内でのdirect接続とcorba_cdr接続を比較した結果、corba_cdr接続の方が圧倒的に速いようなので原因の調査を行う。
以下はTimedOctetSeq型のデータで配列のサイズを徐々に大きくした場合の結果
History
#1 Updated by n-miyamoto over 5 years ago
- File directvscorba_cdr2.png directvscorba_cdr2.png added
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)