利用規約の変更について

自分で開発しているプログラムのメモリ消費量を測定したいと考えています。

このプログラムはC++言語で記述し、Linux環境でGCCを利用して開発しています。以前、プロセスのメモリ消費量を確認してみたところプログラムのメモリ消費量が少ないせいか、プロセスの最小メモリ消費のような値のまま大きな変化はありませんでした。

このようにメモリ消費量が小さなプログラムの測定を行なう方法を教えてください。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

sizeコマンドを使えば、各セクションのサイズが分かります。


ただし、mallocや大域的newなどで動的に割り付けたメモリの使用量は分かりません。
    • good
    • 0
この回答へのお礼

sizeで静的なメモリ消費については確認できるんですね、
sizeコマンドすら把握していなかったので大変参考になりました。

質問に記述していないので私が悪いのですが、
最終的には動的なメモリ消費も含めた値を測定したいと思っています。

しかし、sizeコマンドである程度のメモリ消費を把握できたので助かりました。
回答ありがとうございました。

お礼日時:2008/01/04 17:07

プログラムの終了間際の所で


getrusage
を呼び出して計測するのが一番正確かな?

詳しくはgetrusageのマニュアルを読んでください。
/usr/bin/time コマンドでも判るはずなのですが、手元のdebianで調べてみたら小さなプログラムでは 0 になるだけでした。
    • good
    • 0
この回答へのお礼

お礼が遅くなりました。
回答ありがとうございます。

getrusageを使って色々と値を測定することができました。
ありあがとうございました。

お礼日時:2008/01/29 18:42

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qプログラムの最大メモリ消費量の計測について

C言語あるいはC++でプログラムの最大メモリ消費量を測定するには
どうしたらよいのでしょうか。

計算機実験で測定が必要なのですが、なかなか情報がなくて困っています。

OSはWindows7でVC++で開発しています。

ご回答よろしくお願いします。

Aベストアンサー

バッチだと

@echo off
:LOOP
tasklist /fi "imagename eq explorer.exe" >> log.txt
sleep 1
cls
goto :LOOP

こんな風にしてメモリ使用量を取得できることから、
tasklistコマンドを叩いて、結果を解析するというような
プログラムを組めばよいのでは。

Qプロセスのメモリ使用量の確認方法

プロセスのメモリ使用量の確認方法についての質問です。
#実際にプログラミングされている人の方が詳しいかと思い、こちらのカテゴリに
#質問させて頂きます。

プロセスのメモリ使用量を確認するために、パフォーマンスモニタを使おうと
考えています。
「オブジェクト」に「Process」を指定したときの、「カウンタ」では
何を選択すれば確認できるでしょうか。
カウンタごとの説明は読んだのですが、明確に理解することができませんでした。
識者の方、ご教授願います。
また、その他のツールを使った方法があれば教えてください。

Aベストアンサー

私は以下の方法を使用しています。

WindowsNT系でしたら、タスクマネージャーでプロセス一覧&メモリ使用量が分かります。

95(95~Me)系の場合は、物理メモリに余裕をもたせた状態でシステムモニタを監視しつつプロセスを起動します。(減った分がプロセスの大体のメモリ使用量)

UNIX系だったらコマンド一発レベルで分かるんですけどね~。

QLinuxのgccのインクルードパス?

Linuxのgccで、インクルードファイルやライブラリのパスを設定する方法が知りたいのですが、gccについて詳しい書籍やサイトがありましたら、教えてください。

gccとccの違いも知りたいです。

例)
#include "example.h"

このままだと、example.hが無いと表示されます。

Aベストアンサー

標準ライブラリのパスは、gccのインストール時に指定して、Cプリプロセッサの中に組み込まれます。

#include "example.h"
は、まずカレントディレクトリを探し、次に gccコマンドラインの -I オプションで指定したディレクトリを探し、最後に標準ライブラリが探されます。

#include <example.h>
は、カレントディレクトリを探さない点が異なります。

ccも基本的には同じですが、Unixの種類によって機能が異なる可能性があります。Linuxの場合はcc=gccです。

Qファイルやディレクトリの存在確認を行う方法

ファイルをオープンするのはfopenでOKですが、ファイルやディレクトリの存在確認を行う方法が知りたいです。

何か組み合わせて作るものなのでしょうか?
perlとか便利な演算子があるのですが、C/C++って器用ではないですね。
これは処理系?依存の内容ですか?

私の環境は VC6, VC2005 Windows2000です。

Aベストアンサー

int access(const char* path, int mode);
int stat(const char* path, struct stat* sb);

かな?
MSDN を引くと _access_s() を使えとか書いてあるけど。

Qメモリのセグメント違反の解決方法を教えてください。

こんにちわ,
現在プログラムを作成しているのですが,Segmentation Faultが出て困っています。

そのセグメント違反が出ているのがmallocの中(PCインナーの関数)で普通ならmallocの返り値がNULLかそれ以外かということになりますが,それ自体も中でセグメント違反が起こるので帰ってきません。

MALLOC_CHECK_=1によってその触っているポインターを見ると,
free(): invalid pointer 0x93c5380!
free(): invalid pointer 0x93c5c18!
とでるので,おそらくmallocのなかで必要なくなったポインターをフリーをしていると考えられるのですが,
gdbのwatchpointでそのアドレスを指定してみてみると,メインに入る前にそのポインタ自体をいじっている関数も内部的な関数みたいでどこをなおすとセグメント違反が直るのかわかりません。

このようなメモリ問題がおきたときどのようなツールや解決法があるのでしょうか。

よろしくお願いします。

Aベストアンサー

> このようなメモリ問題がおきたときどのようなツールや解決法があるのでしょうか。

このようなメモリ問題は起こしてはいけません。いや、冗談ではなく、本当に。
プログラムの、全然関係の無い場所で破壊が起きていたら、突き止めるのは非常に
困難です。追跡するとしたら、malloc()とfree()の呼び出しの都度、その情報を
吐き出して、後で対照させてみるといったところでしょうか。

重要なのは予防です。とりあえず、心がけることとしては、
・グローバル変数を多用しない。特に、ポインタはグローバル変数にしない。
・自動変数(内部変数)のアドレスを外部に持ち出さない。
・free()したポインタ変数は、すぐにNULLで初期化しておく。
あたりでしょうか。

すみません。ツールはあるかもしれませんが、知りません。

Qgcc: incompatible pointer type

以下のCソースでコンパイルすると、warning: passing arg 1 of `func_b' from incompatible pointer type
となります。
void (*p_func)() は、引数を省略しているので int として扱われるということでしょうか?

#include <stdio.h>
#include <stdlib.h>
void func_a( unsigned char x ){
printf( "x=%d\n", x ) ;
}
void func_b( void (*p_func)() ){
p_func( 1 ) ;
}
int main(){
func_b( func_a ) ;
return 0 ;
}

Aベストアンサー

まずは訂正から。

「関数や関数へのポインタを宣言するときに仮引数リストを空にすると、仮引数はないものとして扱われます。」と書きましたが、今の C の規格では
「関数を定義するときに仮引数リストを空にすると、仮引数はないものとして扱われます。これに対し、関数の(定義ではない)宣言や関数へのポインタの宣言(定義を含む)の場合には、引数の個数や型について一切情報が与えられないことを意味します。」くらいに解釈されます。将来的には変更されるはずですが。

今の場合 void (*p_func)() となっているので「p_func は void を返す関数で、その引数の個数や型は不明」ということになります。

ではなぜ unsigned char や unsigned short のときには warning が出るのに int や char * や long では出るのかという点に移るのですが、これはおそらく過去との互換性だと思います。ANSI/ISO C 以前、つまりいわゆる K&R の時代にはプロトタイプ宣言が存在しませんでした。この時代、char 及び short の引数は int に、また float の引数は double に自動的に変更されていました。つまり、関数の仮引数として char、short、float は許されていませんでした。

今考えている例では p_func に引数の情報が与えられていないため、その引数として char、short 及び float は許されず、その結果これらの型を持つ仮引数があるような関数を渡そうとすると warning が出るのだと思います。

まずは訂正から。

「関数や関数へのポインタを宣言するときに仮引数リストを空にすると、仮引数はないものとして扱われます。」と書きましたが、今の C の規格では
「関数を定義するときに仮引数リストを空にすると、仮引数はないものとして扱われます。これに対し、関数の(定義ではない)宣言や関数へのポインタの宣言(定義を含む)の場合には、引数の個数や型について一切情報が与えられないことを意味します。」くらいに解釈されます。将来的には変更されるはずですが。

今の場合 void (*p_func)() となっ...続きを読む

Qアプリケーションの最大メモリサイズを調べる方法

お世話になります。

RedhatEnterpriseLinux ES4およびAS3において
各アプリケーション用に割り当てられている
最大のメモリサイズを調べるにはどのようにすれば良いでしょうか?

Aベストアンサー

「各アプリケーション用に割り当てられている最大のメモリサイズ」とは違うかも知れませんが…
動作中のプロセスのPIDをpsコマンドなどで調べた上で、
/proc/PID/statusを見ると、VmPeakというのがあります。
おそらく最大使用メモリ…かと思われます。

# アドレス空間というコトであれば、各プロセスともに32Bitだと4G、うち1G前後がカーネル空間だったかと。

Qfloat型とdouble型の変数の違いを教えてほしいです

float型とdouble型の変数の違いを教えてほしいです
2Dゲームを作っててdoubleの変数を使ってたんですが使ってはだめだと先輩に言われたんです。
理由を聞いたら、先生が「doubleは使わないほうがいい」と言われたらしくてちゃんとした理由がわかりませんでした。
それを知って何をするということではないんですが、気になって調べても出てこなかったので質問させてください。
まだゲーム作りを始めたばっかりでぜんぜん詳しくないですが教えてくれたら助かります。

Aベストアンサー

doubleとfloatでは、精度が違い、そのためメモリに占める大きさも違います。
また、一般的には、桁が多いとその分計算時間がかかります。
ですから、精度が必要ない場面では、floatを使う、というのも一つの考えかたです。

ですが、実際には「一概に言えない、処理系依存」です。

以前は全てCPUで計算していたので、精度=計算量でした。
しかし、最近では浮動小数点演算専用の回路が付いているケースが多く、計算時間は同じだったり、doubleに変換が必要でその分floatの方が遅かったり、floatでの演算はより高速にできたり、と様々です。
32bitCPUでは、32bitのfloatの方が扱いやすいでしょうが、64bitCPUでは64bitのdoubleの方が扱いやすいかもしれません。
Cのmath.hで使える標準関数はdouble型のものがほとんどです。三角関数は2Dのゲームでも使う機会が多いのではないでしょうか。sinもcosもdouble型です。内部演算は当然doubleですので、変数にfloatを使ったからと早くはならず、むしろfloat型の変数に入れるときに暗黙の型変換が発生する分遅くなる可能性もあります。

そういった背景を考え検討した結果、floatを使う方がよい、と判断したのならいいのですが、「先生に言われた」では理由になりません。
聞けるのなら、その先生に理由を聞いてください。真意がわからないうちは、鵜呑みしないことです。

doubleとfloatでは、精度が違い、そのためメモリに占める大きさも違います。
また、一般的には、桁が多いとその分計算時間がかかります。
ですから、精度が必要ない場面では、floatを使う、というのも一つの考えかたです。

ですが、実際には「一概に言えない、処理系依存」です。

以前は全てCPUで計算していたので、精度=計算量でした。
しかし、最近では浮動小数点演算専用の回路が付いているケースが多く、計算時間は同じだったり、doubleに変換が必要でその分floatの方が遅かったり、floatでの演算はより高速...続きを読む

Qfgetsで拾われる改行文字を削除したい

お世話になります

 C言語初心者のものです。今課題でC言語を用いたプログラミングを
Fedora上でやっています。問題は、fgetsでテキストファイルから、取得
した文字列の中から改行文字を削除できないことです。文字変数のアド
レスはわかっているのですが、終端文字に置換しようとすると、セグメ
ントエラーになってしまいます。これは如何にして解決すべきでしょう
か。よろしくお願いします。

Aベストアンサー

ポインタとかアドレスとか、C言語の用語としてあるものを別の意味に使うとまぎらわしいです。

「ポインタ」「アドレス」と言われたら、 この例なら str, str+i が思い浮びます。
「文字変数のアドレス」だと
char c ;
に対しての
&c
が思い浮びます。

配列なら「添字」、意味的には「x文字目」ですね。

> for(i=0;;i++){
> if(*(str+i)=='/n') {
> *(str+i)='\0';
> break;
> }
> }
/nが\nの間違いなら、この方法で半分正解です。もう少し広い範囲(可能なら全体)で見ないことにはなんとも言えません。
fgetsが最大文字数に達したり、ファイルの最後になったりで、strに改行文字が含まれない場合には、このループは止まりません(Segmentension Falutになって止まる)

・そのような状態になってないか、予めチェックする
・ループを終了させる仕組みを用意しておく
: forの終了条件を記述する、for中で if(*(str+i)=='\0') { break;} 等としておく、等
といった対策が必要です。


あと細かいところを言えば
・strを配列で用意したなら *(s+i)じゃなくてs[i]でいいんじゃないかな
・あるいは char *pみたいにしておいて、 iのループでなく pでループを組む( for(p=str;*p!='\0';p++) )とか。

ポインタとかアドレスとか、C言語の用語としてあるものを別の意味に使うとまぎらわしいです。

「ポインタ」「アドレス」と言われたら、 この例なら str, str+i が思い浮びます。
「文字変数のアドレス」だと
char c ;
に対しての
&c
が思い浮びます。

配列なら「添字」、意味的には「x文字目」ですね。

> for(i=0;;i++){
> if(*(str+i)=='/n') {
> *(str+i)='\0';
> break;
> }
> }
/nが\nの間違いなら、この方法で半分正解です。もう少し広い範囲(可能なら全体)で見ないことにはなんとも言えません。
fgetsが...続きを読む

Q#ifdef の使い方

組み込み系のプログラムを現在勉強しています。
#ifdefについて質問させて頂きます。

下記コードの場合

#ifdef A
---- (1) Y = Z;
#else
-----#if B
------- (2) X = Z;
----#endif
#endif

("-"は空白と思ってください。)

この場合、Aが定義されていれば(1)が実行しコンパイル終了(#endif)。
Aが定義されていない場合、#else に行き、Bが定義されている場合は
(2)を実行してコンパイル終了(#endif)という理解であっていますか?

またこうした方が分かりやすいなど、アドバイス頂けると幸いです。
ご返答よろしくお願いします。

Aベストアンサー

言葉の使い方に若干の不安を覚えます。

> Aが定義されていれば(1)が実行しコンパイル終了(#endif)。

「Aが定義されていれば(1)の部分のみがコンパイルされる」と言うべきでしょう。コンパイル時には(1)を実行しませんし、#endifでコンパイルが終了するわけでもありません。

> Bが定義されている場合は

#ifdef Bではなく#if Bなので、「Bが真であれば」が正しいです。

> またこうした方が分かりやすいなど

質問文にあるコードなら、下記のようにすると少し見やすくなります。

#ifdef A
---- (1) Y = Z;
#elif B
---- (2) X = Z;
#endif


人気Q&Aランキング

おすすめ情報