2017-08-03 8 views
0

私はPCLライブラリを使ってポイントクラウド登録のためのインターフェイスクラスを作成しています。これは、ほとんどの場合、テンプレート化されたクラスを使用する必要があることを意味します。しかし、私は、ユーザーが実行前に使用したいデータの種類を知りません。メモリ使用量に意味のある影響を与えるにはあまりにも少なく、クラスのオブジェクトが1つしかないため、使用する必要のないデータやオブジェクトへのNULLポインタをいくつか格納する必要はありません。 PCLの根底にあるテンプレートコードを使用しようとしているので、オーバーロードされたテンプレート化された関数からの余分な未使用コードの影響?

しかし、私はまた、私のコード一つの方法または別の一部を複製する必要があります。例えば、私は、実行時まで不明なタイプを扱うことができるように、この機能(とカップル他)の3-4インスタンス化を必要とするつもりだ、次の

template<typename PointT> 
process_cloud(pcl::PointCloud<PointT> &input_cloud); 

が必要になる場合があります。しかし、私はそれらのうちの1つだけを使用して終了します。これらの関数のサイズが自明でない場合、パフォーマンスにどのような影響を与えることができますか?

無視できない場合は、どうすればよいですか?私は重複したコードを必要としない方法を見つけようとしましたが、私自身のテンプレートコードを書かずにテンプレートコードを多態的に扱う方法を見つけることはできません。

私は、この設計で間に合わしている場合は、キャッシュ・ミスのパフォーマンスヒットを最小限に抑えるように、メモリレイアウトを最適化する方法はありますか?たとえば、私の普遍的に必要とされる機能が、緊密に統合され、潜在的にはインスタンシエーションと呼ばれることのない潜在的なものではないことを保証できますか?

私はクラス全体をテンプレート化することを考えました。これは、コードをよりローカルにします。なぜなら、それぞれのisntantiationは、タンデム(同じデータ型)で呼び出される関数をグループ化するからです。また、テンプレート化する必要のないコードのコピーを作成することで、より多くのコードを膨らませることができます。この余分な肥大化を避けるために、私が思い付くことができる最高のは、これは概念的である:

template<typename PointT> 
class Processor { 
    public: 
     process_cloud(pcl::PointCloud<PointT> &input_cloud); 
     ... 
} 

class Interface { 
    public: 
     // ... 
     // bunch of common functions 
     // ... 

     // Instantiations I'm going to need. Pointers to save space. 
     // Could also be std::optional if pointers turn out to be unneeded 
     std::unique_ptr<Processor<pcl::PointXYZ>> p1; 
     ... 
} 

これは、彼らがInterfaceで定義されているので、共通の機能が一緒にグループ化されているメモリのレイアウトを作成する必要があります。すべてのポイントタイプには、別々のクラスで定義されているため、一緒にグループ化された関数もあります。しかし、少し読みにくいです。コンパイラが同じ引数を使用してテンプレートのインスタンス化を行う際に、並列で使用されることを理解するのに役立つ、よりクリーンな方法はローカルでなければなりません。おそらくそれは実現し、自動的に行うのだろうか?

+1

*通常の方法で重大なパフォーマンス上の問題が発生しているという証拠はありますか?早すぎる最適化を避ける。 – Sneftel

+0

あなたは良いアドバイスをしたいと思っていますが、私はそれに執着しないことを知っています。避けられないことに、複数の関数呼び出しを含むパフォーマンスクリティカルなコードで同様のことが起きる可能性があるため、現在のプロジェクトで重要なのかどうかにかかわらず答えが必要です。 – patatahooligan

+1

あなたが考えるかもしれないことは興味深い質問ではありません。コンパイラは、ただちにすべてのメンバ関数のコードを生成するだけでなく、リンカはそれらを単なる行に入れません。関連する機能を「よりローカルに」することは、一般に非常に限られた利益しかありません。そのようなコードを並べ替えることは、コンパイラ/リンカが(あなたが何をしているのかというよりも、何が最善のことをしようとしているのかによって)あなたが望むことを行うことを保証するものではありません。 – Sneftel

答えて

0

あなたは、同じコンパイル単位でそれらのすべてを置く対分割コンパイル単位で明示的なインスタンスを置くことによって、それを試すことができます。

私の推測では、唯一の違いはITLBミスになりますよう差が大きくなりませんです。

コードがよりローカルになっているため、別のケースではそれほど少なくなりません。 コードが少しずつ増えますが、1つのインスタンスしか使用しない場合は、キャッシュを汚染することがなく、しばらくの間スワップアウトされる可能性があるため、残りはランタイムに影響しません。

コンパイラとリンカは、彼らがマングルされた名前で、または何らかのわずかに良い理由で第三の手紙の後に関数をソートすることを決定していない場合。

関連する問題