私のネイティブの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::vector
のLine
で構成されています。複数のスレッドがこのベクトルの異なるサブセットを管理します。
あなたは 'parse'メソッドで' unique_ptr'を作ろうとしましたか?あなたの 'parse'メソッドは同じ' Line'に対して何回も呼び出されていますか? – krzaq
はマルチスレッドアプリケーションですか?いいえの場合は、静的クラスメンバーを使用できます。 –
@krzaqプロパティをunique_ptrにすることは意味しますか?もしそうなら、なぜですか? Parseは一度だけ呼び出されますが、基本クラスのメソッドも呼び出されます。 – Nick