1

私のプログラムでは、いくつかのクラスとそれらを含む多数の関数を使用しています。どちらが速く動作するのか、速度の点で違いがないのかを知りたいです。

1番目:クラス関数

class mex{
  public:
    int length,nof_evaluations,nof_fast_evaluations;
    tree T;
    calc_mex(vector<string>,vector<double>);
}; 

によって呼び出されます

mex m;
vector<string> v1;
vector<double> v2;
m.calc_mex(v1,v2);

2番目:クラスポインタを使用した関数

class mex{
  public:
    int length,nof_evaluations,nof_fast_evaluations;
    tree T;
}; 
calc_mex(mex*,vector<string>,vector<double>);

によって呼び出されます

mex m,*mptr;
mptr=&m;
vector<string> v1;
vector<double> v2;
calc_mex(mptr,v1,v2);

私は自分のプログラムで両方の方法を使用していますが、よりクリーンで整理されているように見えるため、方法1に傾倒しています。また、プログラムの1回の実行で、これらのタイプの関数を10万回呼び出しています。だから私はそれらのどれかがより良いタイミングでうまくいくかどうか疑問に思っています。

ありがとう!

4

3 に答える 3

5

速度よりも、決定要因は、関数が論理的にクラスに属しているかどうかである必要があります。はいの場合は、メンバーにします。そうでない場合は、自立機能にします。

ところで、各メンバー関数には暗黙的にthisポインターが渡されるため、2 つのバージョンに大きな違いはありません。あなたが本当にパフォーマンスを気にしているなら。両方のバージョンでサンプル プログラムを作成し、大規模なデータ セットを使用して環境でプロファイリングします。

于 2013-02-06T16:20:07.320 に答える
3

私は Alok によって与えられた答えを 2 番目にし、Donald Knuth からの声明を繰り返さなければなりません (彼は有名なので、声明は明らかに真実でなければなりません...):

プログラマーは、プログラムの重要でない部分の速度について考えたり心配したりするために膨大な時間を浪費します。これらの効率化の試みは、デバッグやメンテナンスを考慮すると、実際には大きなマイナスの影響を及ぼします。約 97% の確率で、わずかな効率性を忘れる必要があります。時期尚早の最適化は諸悪の根源です。しかし、その重要な 3% の機会を逃してはなりません。

この問題に関する私の 2 セント: 「最適化」がプログラムに利益をもたらすと確信できるまで、何かを測定してください。そうしないと、時間の経過とともに読みにくく、保守しにくくなるコードを作成する傾向があります...

于 2013-02-06T16:27:02.807 に答える
1

C ++では、すべてのメンバー関数(仮想でない限り)は、最初の引数として「this」が渡された独立した関数です。どちらか一方を選択しても速度は向上しません。どちらも関数呼び出しにすぎません。

于 2013-02-06T17:35:04.150 に答える