現在、共有ライブラリのプロファイルを作成しようとしています。残念ながら、sprof は私のシステムでは動作しないようです。そのため、oprofile を使用しています。
しかし、プロファイリング データを調査すると、ほとんどの時間がテンプレート化された方法で費やされていることが示されます。ほとんどの数値計算はそのメソッドで行われるため、これは当然のことです。ただし、opreport は、このテンプレートの特定の特殊化に時間が費やされていることを示しています。これは、計算が本来よりも遅く見える理由を説明するかもしれません。これらの特殊化には、最適化されたコードが含まれるものと含まれないものがあります。opreport は、最適化されていないバージョンで時間が費やされていることを示しています。共有オブジェクトには、インスタンス化された両方のバージョンが含まれていますが、どちらが取得されるかを決定するコードが正しく機能するかどうかを知る必要があります。
テンプレートにいくつかの s を追加しましcout
た。これらは正しい特殊化が行われたことを示しているようですが、opreport の出力にはまだ戸惑っています。
編集:
ここに私がやっていることの詳細があります。コードは任意の長さの入力に対して実行できる必要がありますが、サイズがわかっている場合は最適化できます。だから私はこのようなことをしています:
template<size_t N>
struct simulator {
static void run(...) // optimized version for known N
};
template<>
struct simulator<0> {
static void run(...) // unoptimized version for any size
};
void simulate(....) {
switch(n) {
case(1):
simulator<1>::run(...);
break;
case(2):
simulator<2>::run(...);
break;
...
default:
simulator<0>::run(...);
}
}
実際のコードでは、いくつかのテンプレート マジックを使用して、コードが として最適化される最大数を許可します#define
が、考え方は同じです。ここで、simulator<0>::run()
呼び出してはならないときに、が実際に呼び出されないようにする必要があります。ただし、opreport は、これだけが実行されていることを示していますが、他のものは実行されていません (cout
同意しません)。