操作
調査 #4156
未完了ダイレクトデータポート接続のデータ転送が遅い問題
開始日:
2017/08/15
期日:
進捗率:
0%
予定工数:
説明
同一プロセス内でのdirect接続とcorba_cdr接続を比較した結果、corba_cdr接続の方が圧倒的に速いようなので原因の調査を行う。
以下はTimedOctetSeq型のデータで配列のサイズを徐々に大きくした場合の結果
ファイル
操作
n-miyamoto さんが7年以上前に追加. 7年以上前に更新.
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 |
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)