1

C++ プロジェクトで C で記述された高性能/並列グラフ ライブラリを使用しています。構造体stinger(グラフのデータ構造) と次のような操作を提供します。

int stinger_insert_edge_pair (struct stinger *G,
                          int64_t type, int64_t from, int64_t to,
                          double weight, int64_t timestamp) { .... }

ただし、ほとんどの場合、タイムスタンプ、重み、または型を指定したくありません。デフォルトのパラメータはいいでしょう。また、OOP のようなインターフェースがあればいいでしょう:G->insertEdge(u, v)の代わりにinsert_edge_pair(G, u, v, ...).

だから私は次のようなアダプタークラスを作成することを考えていました

class Graph {

protected:

    stinger* stingerG;

public:

    /** default parameters ***/

    double defaultEdgeWeight = 1.0;


    /** methods **/

    Graph(stinger* stingerG);

     virtual void insertEdge(node u, node v, double weight=defaultEdgeWeight);

   };

このメソッドは、適切なパラメーターを指定してinsertEdge(...)呼び出すだけです。stinger_insert_edge_pair(this->stingerG, ...)

ただし、ここではパフォーマンスが重要な側面です。このようなアダプター クラスの使用に関連するパフォーマンスの低下はどのようなものですか? 「ネイキッド」ライブラリを使用する場合と比較して、パフォーマンスが低下することは予想できますか?

4

3 に答える 3

1

単純なメソッドを使用する場合inline、コンパイラは呼び出し時にそれらをインライン化する必要があるため、パフォーマンスが低下することはありません。ただし、これには仮想関数を使用しないでください。

于 2012-11-28T12:19:08.367 に答える
1

insertEgde が stinger_insert_edge_pair への呼び出しを転送するだけの場合、(おそらく) stinger_insert_edge_pair への単純な呼び出しと g->insertEdge (仮想指定子を削除した場合) の間で生成されるコードに違いはありません。通常の呼び出しとアダプター呼び出しによって生成されたアセンブリ コードを比較すると、アダプターがもたらすオーバーヘッドについて公正な情報が得られます。

insertEdge は仮想である必要がありますか? Graph のサブクラスを作成する予定はありますか? ただし、仮想関数呼び出しのコストは、関数実行自体の実際のコストと比較してほとんど無視できます。

于 2012-11-28T12:19:26.073 に答える
1

通常、仮想関数はインライン化できないため、関数呼び出しから同じ量のオーバーヘッドが発生します (スタックにパラメーターをプッシュする、パイプラインとキャッシュが中断される可能性があるなど)。実際には、ルーチンの関数呼び出しは非常に高速です (クロック サイクルのオーダー)。これが適切かどうかを確実に知る唯一の方法は、独自のアプリケーションでテストすることです。

于 2012-11-28T12:17:02.973 に答える