2011-02-02 5 views
7

重複するタイトルにぶつかる前に、私がここで尋ねるもの(IMO)にはもう1つの疑問がありませんでした。そう。バーチャルファンクションとパフォーマンスC++

私はアプリケーションで仮想関数を使用して100倍も簡単にしたいと思っています(これはOOPのことではありません))。

CProfiler.cppを:しかし、私は、彼らは時期尚早な最適化の同じ古い不自然誇大広告だけを見ていない、パフォーマンスコストで来たどこかで読ん、私が使用して小型のベンチマークテストでそれを迅速に旋回を与えることにしましたまず

#include "CProfiler.h" CProfiler::CProfiler(void (*func)(void), unsigned int iterations) { gettimeofday(&a, 0); for (;iterations > 0; iterations --) { func(); } gettimeofday(&b, 0); result = (b.tv_sec * (unsigned int)1e6 + b.tv_usec) - (a.tv_sec * (unsigned int)1e6 + a.tv_usec); }; 

main.cppに

#include "CProfiler.h" 

#include <iostream> 

class CC { 
    protected: 
    int width, height, area; 
    }; 

class VCC { 
    protected: 
    int width, height, area; 
    public: 
    virtual void set_area() {} 
    }; 

class CS: public CC { 
    public: 
    void set_area() { area = width * height; } 
    }; 

class VCS: public VCC { 
    public: 
    void set_area() { area = width * height; } 
    }; 

void profileNonVirtual() { 
    CS *abc = new CS; 
    abc->set_area(); 
    delete abc; 
} 

void profileVirtual() { 
    VCS *abc = new VCS; 
    abc->set_area(); 
    delete abc; 
} 

int main() { 
    int iterations = 5000; 
    CProfiler prf2(&profileNonVirtual, iterations); 
    CProfiler prf(&profileVirtual, iterations); 

    std::cout << prf.result; 
    std::cout << "\n"; 
    std::cout << prf2.result; 

    return 0; 
} 

私は100と10000回の反復をした、との結果が心配された:非仮想化のための4msのを、そして250メートルsの仮想化!私はほとんど "nooooooo"の中に入っていましたが、その後私はその反復を約50万に上げました。結果はほとんど完全に同一になります(おそらく、最適化フラグが有効になっていないと5%遅くなります)。

私の質問は、大量に比べて反復回数が少ないこのような大きな変化があったのはなぜですか?純粋に仮想関数が多くの反復でキャッシュ内で暑いからですか?

免責
私は私の「プロファイリング」のコードは完璧ではないことを理解し、それが持っているとして、それは、このレベルで重要なことのすべてであるものの推定値を与えます。また、私はこれらの質問を覚えています。私のアプリケーションを完全に最適化することではありません。

+0

プラットフォームとコンパイラ? – ThomasMcLeod

+2

"(おそらく最適化フラグを有効にしないと5%遅くなります)" - これは、デバッグ/最適化されていないビルドをプロファイリングすることを意味します。そうすることで、通常は役に立たないほどの欠陥があるベンチマークが生まれるでしょう。これは本当ですか? –

+0

ITはUbuntu 10.10で、g ++を使用して、最適化フラグなしの_and_を使用してダウンしました。 – dcousens

答えて

関連する問題