13

OK、ここに私が欲しいものがあります:

  • 私は可能な限り高速でなければならないいくつかの非常に要求の厳しい関数 (主にビットマップ上で動作するなど) を作成しました。
  • ここで、これらの関数は型によってグループ化されている場合もあれば、関数が操作する変数の型によってグループ化されている場合もあることに注意してください。
  • そして問題は、アルゴリズムの実装そのものとは別に、技術的な観点から、速度を台無しにしないために何をすべきかということです。

そして今、次のシナリオを検討しています

  • それらを単純な関数として作成し、必要なパラメーターを引数として渡すだけです
  • クラスを作成し(「グループ化」/組織化の目的で)、それらを静的として宣言するだけです
  • タイプごとにクラスを作成します。たとえば、ビットマップで作業するためのクラスを作成し、ビットマップごとにそのクラスの新しいインスタンスを作成します (例: Bitmap* myBitmap = newBitmap(1010);、およびその内部メソッドで操作します (例: myBitmap->getFirstBitSet())

では、これらのアプローチのうち、最も速いのはどれでしょうか? 単純な関数とクラスカプセル化されたstatic関数の間に、パフォーマンス上の違いは本当にありますか? 私が言及していない、望ましい他のシナリオはありますか?


補足:clang++ Mac OS X 10.6.8用のコンパイラを使用しています。(それが違いを生むなら)

4

2 に答える 2

23

CPU レベルでは、関数は 1 種類しかなく、C の種類に非常によく似ています。自分で作ることもできますが...

結局のところ、効率を念頭に置いて構築された C++ は、ほとんどの関数を呼び出し命令に直接マップします。

  • 名前空間レベルの関数は通常の C 関数のようなものです
  • 静的メソッドは名前空間レベルの関数に似ています (呼び出しの観点から)
  • 非静的メソッドは静的メソッドと非常に似ていますが、暗黙的thisなパラメーターが他のパラメーター (1 つのポインター) の上に渡される点が異なります。

これら3つはすべて、まったく同じ種類のパフォーマンスを備えています。

一方、virtualメソッドにはわずかなオーバーヘッドがあります。パフォーマンスに関する C++ テクニカル レポートがあり、非仮想メソッドと比較して、空の関数のオーバーヘッドを 10% から 15% (メモリから) と見積もっていました。つまり、肉を内部に持つ関数 (つまり、実際の作業を行う関数) では、オーバーヘッド自体がノイズの中で失われそうになります。virtual実際のコストは、コンパイル時に呼び出しを推測できない限り、インライン化を禁止することから生じます。

于 2012-12-14T07:36:28.107 に答える