2016-10-21 11 views
7

私のネイティブのWindows C++アプリケーションで使用されているメモリを、パフォーマンスを損なうことなく、減らす必要があります。このパフォーマンスが低下するのはなぜですか?

私の主なデータ構造は、以下のLineクラスで、動的に割り当てられたインスタンスの数千、によって構成されています

struct Properties 
{ 
    // sizeof(Properties) == 28 
}; 


// Version 1 
class Line 
{ 
    virtual void parse(xml_node* node, const Data& data) 
    { 
     parse_internal(node, data); 
     create(); 
    } 

    virtual void parse_internal(xml_node*, const Data&); 
    void create(); 

    Properties p; 
}; 

しかし、私は私だけので、私は、クラスのメンバpを取り除くことができることに気づくので、 parseメソッド以内にそれを必要とする、私はLine実装を変更:

// Version 2 
class Line 
{ 
    virtual void parse(xml_node* node, const Data& data) 
    { 
     Properties p; 

     parse_internal(node, data, &p); 
     create(&p); 
    } 

    virtual void parse_internal(xml_node*, const Data&, Properties*); 
    void create(Properties*); 
}; 

これは、数メガバイトの割り当てられたメモリを低減し、それは以上に経過時間を増加しました50ミリ秒。

アプリケーションが速度最適化を完全に有効にしたリリースバージョン用にコンパイルされていることを考えれば、これはどのように考えられますか?引数が渡されているからでしょうか?それは私のstruct Propertiesのスタック割り当てによるものですか?

更新:インスタンスごとに一度だけ呼ばれるLine::parse

方法。データ構造はstd::vectorLineで構成されています。複数のスレッドがこのベクトルの異なるサブセットを管理します。

+0

あなたは 'parse'メソッドで' unique_ptr'を作ろうとしましたか?あなたの 'parse'メソッドは同じ' Line'に対して何回も呼び出されていますか? – krzaq

+0

はマルチスレッドアプリケーションですか?いいえの場合は、静的クラスメンバーを使用できます。 –

+0

@krzaqプロパティをunique_ptrにすることは意味しますか?もしそうなら、なぜですか? Parseは一度だけ呼び出されますが、基本クラスのメソッドも呼び出されます。 – Nick

答えて

0

parse_internalは再帰的です。つまり、元の2つではなく、変更されたバリアントで3つの引数を取得し、再帰的に数回呼び出されます。

また、要素の逆参照ではなくポインタ構文を使用してメンバーにアクセスしなければなりません(また、プロパティポインタがnullでないことを確認することもできます)。ポインタの問題を解消するには、parse_internalへの参照引数を使用できます。

仮想メンバー関数としてparse_internalを使用する理由はありますか、またはそれを変更したバリアントで静的に変更することはできますか?

関連する問題