2017-03-14 28 views
1

同じアルゴリズムの2つの異なる実装のメモリ使用量を実験的に比較する必要があります。これを行う正しい方法は何ですか?私は両方のバージョンをC++で実装しており、それをLinuxのコマンドラインから実行したいと考えています。メモリ使用量の比較

しかし、私はそれを正確に行う最良の方法が混乱していますか?

+0

[アプリケーションまたはプロセスの実際のメモリ使用量を測定する方法は?](http://stackoverflow.com/questions/131303/how-to-measure-actual-memory-usage-of-an-application-or-プロセス) – Arash

+0

コマンド端末を使用する簡単な方法は、 "htop"コマンドを使用することです。これは、コンピュータで実行しているプロセスを表示し、プログラムの名前に移動して、使用されているRAMの量を調べます。 –

答えて

0

あなたはgprofが好きかもしれません。これはビルドに不可欠なパッケージでインストールされることが多いので、すでにインストールされているかもしれません。 Hereは基本的な使い方です。

本質的に、プログラムを再リンクしてgprofを実行する必要があります。それはあなたが使用する各アルゴリズムを比較することができるテキストレポートを生成します。

2

あなたは、このようにグローバルnewdelete演算子を実装することができます。

#include <stdlib.h> 

static size_t curUsage = 0, maxUsage = 0; 
void* operator new (size_t size) { 
    curUsage += size; 
    if(maxUsage < curUsage) maxUsage = curUsage; 

    size_t* result = (size_t*)malloc(size + sizeof(size_t)); 
    *result = size; 
    return result + 1; 
} 
void operator delete (void *pointer) { 
    size_t* originalPtr = (size_t*)pointer - 1; 
    curUsage -= *originalPtr; 
    free(originalPtr); 
} 

をおgccを使用していると仮定すると、ことができますして出力するだけ、この機能を追加することにより、実行の終了時に最大メモリ使用量:

#include <stdio.h> 
__attribute__ ((destructor)) void printMaxUsage() { 
    printf("max memory usage: %jd bytes\n", maxUsage); 
} 

newdeleteで行われた割り当てをすべてキャッチします。ただし、スタック使用量は考慮されません。それを考慮する必要がある場合(深い再帰や大きな局所変数のため)、別のアプローチを使用する必要があります。しかし、適切な振る舞いのあるコードでは、上記のように十分なはずです。

他のファイルに変更を加える必要はなく、この3つの機能をリンクするだけで出力が得られることに注意してください。

+0

唯一注意しなければならないのはスタックを測定しないため、ローカル変数の数(手作業で簡単に推測できる)やアルゴリズムが再帰的であるかどうかによって違いがあります。 – cbuchart

+1

@cbuchart真実。 'malloc()'によって行われた割り当てを捕まえません。それにもかかわらず、スタック領域の使用量は、malloc()呼び出しよりもC++アプリケーションでより一般的であるため、スタック空間の問題に関するメモを追加しました。あなたがそれを好むことを願っています:-) – cmaster

+0

侵入型(および多くの機能がない場合)は、作成時に独自のアドレス(現在のスタック位置)をとり、その差分を計算するローカルオブジェクト(各関数の冒頭に作成された) (ローカル変数のアドレスを使用して)破壊すると...まあ、ちょうどアイデアを草案するために、メモリアライメントが考慮されるという利点があります。 – cbuchart